30#include "llvm/Support/ConvertUTF.h"
48 if (Strings.size() != 1) {
53 for (
Expr *E : Strings) {
73 assert(CAT &&
"String literal not of constant array type!");
74 QualType StrTy = Context.getConstantArrayType(
75 CAT->
getElementType(), llvm::APInt(32, StrBuf.size() + 1),
nullptr,
78 false, StrTy, StrLocs);
95 QualType Ty = Context.getObjCConstantStringInterface();
97 Ty = Context.getObjCObjectPointerType(Ty);
100 std::string StringClass(
getLangOpts().ObjCConstantStringClass);
102 if (StringClass.empty())
103 NSIdent = &Context.Idents.get(
"NSConstantString");
105 NSIdent = &Context.Idents.get(StringClass);
110 Context.setObjCConstantStringInterface(StrIF);
111 Ty = Context.getObjCConstantStringInterface();
112 Ty = Context.getObjCObjectPointerType(Ty);
118 Ty = Context.getObjCIdType();
125 Context.setObjCConstantStringInterface(StrIF);
126 Ty = Context.getObjCConstantStringInterface();
127 Ty = Context.getObjCObjectPointerType(Ty);
133 Ty = Context.getObjCNSStringType();
137 Context.getTranslationUnitDecl(),
140 Ty = Context.getObjCInterfaceType(NSStringIDecl);
141 Context.setObjCNSStringType(Ty);
143 Ty = Context.getObjCObjectPointerType(Ty);
157 S.
Diag(Loc, diag::err_undeclared_boxing_method) << Sel << Class->getName();
162 QualType ReturnType = Method->getReturnType();
164 S.
Diag(Loc, diag::err_objc_literal_method_sig)
166 S.
Diag(Method->getLocation(), diag::note_objc_literal_method_return)
177 switch (LiteralKind) {
195 llvm_unreachable(
"LiteralKind can't be converted into a ClassKind");
208 S.
Diag(Loc, diag::err_undeclared_objc_literal_class)
209 << II->
getName() << LiteralKind;
211 }
else if (!
Decl->hasDefinition() && !S.
getLangOpts().DebuggerObjCLiteral) {
212 S.
Diag(Loc, diag::err_undeclared_objc_literal_class)
213 <<
Decl->getName() << LiteralKind;
250 bool isLiteral =
false,
252 std::optional<NSAPI::NSNumberLiteralMethodKind> Kind =
253 S.
NSAPIObj->getNSNumberFactoryMethodKind(NumberType);
257 S.
Diag(Loc, diag::err_invalid_nsnumber_type)
290 if (!Method && S.
getLangOpts().DebuggerObjCLiteral) {
305 NumberType,
nullptr,
SC_None,
nullptr);
322 if (!LangOpts.ObjCConstantLiterals)
342 "The current ABI doesn't support the constant CFBooleanTrue "
344 const bool IsBoolType =
351 if (!LangOpts.ConstantNSNumberLiterals)
362 APFloat FloatValue(0.0);
366 if (&FloatValue.getSemantics() == &APFloat::IEEEsingle())
368 if (&FloatValue.getSemantics() == &APFloat::IEEEdouble())
372 "NSNumber only supports `float` or `double` floating-point types.");
388 switch (Char->getKind()) {
391 NumberType = Context.CharTy;
395 NumberType = Context.getWideCharType();
399 NumberType = Context.Char16Ty;
403 NumberType = Context.Char32Ty;
424 Number = ConvertedNumber.
get();
426 const bool IsConstInitLiteral =
429 auto *NumberLiteral =
new (Context)
434 return SemaRef.MaybeBindToTemporary(NumberLiteral);
442 Inner =
SemaRef.ActOnCXXBoolLiteral(ValueLoc,
443 Value ? tok::kw_true : tok::kw_false);
447 Inner =
SemaRef.ActOnIntegerConstant(ValueLoc,
Value ? 1 : 0);
448 Inner =
SemaRef.ImpCastExprToType(Inner.
get(), Context.BoolTy,
449 CK_IntegralToBoolean);
459 bool ArrayLiteral =
false) {
465 if (Result.isInvalid())
467 Element = Result.get();
479 return Seq.Perform(S, Entity, Kind, Element);
482 Expr *OrigElement = Element;
486 if (Result.isInvalid())
488 Element = Result.get();
493 bool Recovered =
false;
514 if (Result.isInvalid())
517 Element = Result.get();
522 else if (
StringLiteral *String = dyn_cast<StringLiteral>(OrigElement)) {
523 if (String->isOrdinary()) {
530 if (Result.isInvalid())
533 Element = Result.get();
546 dyn_cast<ObjCStringLiteral>(OrigElement)) {
548 unsigned numConcat = SL->getNumConcatenated();
551 bool hasMacro =
false;
552 for (
unsigned i = 0; i < numConcat ; ++i)
553 if (SL->getStrTokenLoc(i).isMacroID()) {
559 diag::warn_concatenated_nsarray_literal)
590 const bool IsConstInitLiteral =
593 ValueExpr = RValue.
get();
597 if (Context.hasSameUnqualifiedType(PointeeType, Context.CharTy)) {
611 if (
auto *CE = dyn_cast<ImplicitCastExpr>(ValueExpr))
612 if (CE->getCastKind() == CK_ArrayToPointerDecay)
614 dyn_cast<StringLiteral>(CE->getSubExpr()->IgnoreParens())) {
615 assert((SL->isOrdinary() || SL->isUTF8()) &&
616 "unexpected character encoding");
617 StringRef Str = SL->getString();
618 const llvm::UTF8 *StrBegin = Str.bytes_begin();
619 const llvm::UTF8 *StrEnd = Str.bytes_end();
621 if (llvm::isLegalUTF8String(&StrBegin, StrEnd)) {
628 Diag(SL->getBeginLoc(), diag::warn_objc_boxing_invalid_utf8_string)
634 Selector stringWithUTF8String = Context.Selectors.getUnarySelector(II);
637 BoxingMethod =
NSStringDecl->lookupClassMethod(stringWithUTF8String);
638 if (!BoxingMethod &&
getLangOpts().DebuggerObjCLiteral) {
654 &Context.Idents.get(
"value"),
655 Context.getPointerType(ConstCharType),
663 stringWithUTF8String, BoxingMethod))
672 std::optional<NullabilityKind> Nullability =
676 Context.getAttributedType(*Nullability, BoxedType, BoxedType);
678 }
else if (ValueType->isBuiltinType()) {
686 dyn_cast<CharacterLiteral>(ValueExpr->
IgnoreParens())) {
689 switch (Char->getKind()) {
692 ValueType = Context.CharTy;
696 ValueType = Context.getWideCharType();
700 ValueType = Context.Char16Ty;
704 ValueType = Context.Char32Ty;
711 }
else if (
const auto *ED = ValueType->getAsEnumDecl()) {
712 if (!ED->isComplete()) {
713 Diag(Loc, diag::err_objc_incomplete_boxed_expression_type)
720 }
else if (ValueType->isObjCBoxableRecordType()) {
738 const IdentifierInfo *II[] = {&Context.Idents.get(
"valueWithBytes"),
739 &Context.Idents.get(
"objCType")};
740 Selector ValueWithBytesObjCType = Context.Selectors.getSelector(2, II);
743 BoxingMethod =
NSValueDecl->lookupClassMethod(ValueWithBytesObjCType);
744 if (!BoxingMethod &&
getLangOpts().DebuggerObjCLiteral) {
763 &Context.Idents.get(
"bytes"),
764 Context.VoidPtrTy.withConst(),
767 Params.push_back(
bytes);
773 &Context.Idents.get(
"type"),
774 Context.getPointerType(ConstCharType),
777 Params.push_back(
type);
784 ValueWithBytesObjCType, BoxingMethod))
790 if (!ValueType.isTriviallyCopyableType(Context)) {
791 Diag(Loc, diag::err_objc_non_trivially_copyable_boxed_expression_type)
801 Diag(Loc, diag::err_objc_illegal_boxed_expression_type)
806 SemaRef.DiagnoseUseOfDecl(BoxingMethod, Loc);
809 if (ValueType->isObjCBoxableRecordType()) {
811 ConvertedValueExpr =
SemaRef.PerformCopyInitialization(
816 ValueExpr = ConvertedValueExpr.
get();
817 }
else if (BoxingMethod->
parameters().size() > 0) {
827 ValueExpr = ConvertedValueExpr.
get();
831 ObjCBoxedExpr(ValueExpr, BoxedType, BoxingMethod, IsConstInitLiteral, SR);
833 return SemaRef.MaybeBindToTemporary(BoxedExpr);
841 assert(!
getLangOpts().isSubscriptPointerArithmetic());
847 "base or index cannot have dependent type here");
865 getterMethod, setterMethod, RB);
882 QualType IdT = Context.getObjCIdType();
891 Context.getTranslationUnitDecl(),
false ,
900 &Context.Idents.get(
"objects"),
901 Context.getPointerType(IdT),
904 Params.push_back(objects);
908 &Context.Idents.get(
"cnt"),
909 Context.UnsignedLongTy,
912 Params.push_back(cnt);
913 Method->setMethodParams(Context, Params, {});
927 diag::note_objc_literal_method_param)
929 << Context.getPointerType(IdT.
withConst());
934 if (!
Method->parameters()[1]->getType()->isIntegerType()) {
938 diag::note_objc_literal_method_param)
940 <<
Method->parameters()[1]->getType()
954 bool ExpressibleAsConstantInitLiteral = LangOpts.ConstantNSArrayLiterals;
957 if (ExpressibleAsConstantInitLiteral &&
958 llvm::any_of(Elements,
960 ExpressibleAsConstantInitLiteral =
false;
963 if (LangOpts.ObjCConstantLiterals && Elements.size() == 0) {
965 "The current ABI doesn't support an empty constant NSArray "
967 ExpressibleAsConstantInitLiteral =
true;
972 Expr **ElementsBuffer = Elements.data();
973 for (
unsigned I = 0, N = Elements.size(); I != N; ++I) {
975 SemaRef, ElementsBuffer[I], RequiredType,
true);
979 ElementsBuffer[I] = Converted.
get();
983 if (ExpressibleAsConstantInitLiteral &&
985 !ElementsBuffer[I]->isConstantInitializer(Context,
false)))
986 ExpressibleAsConstantInitLiteral =
false;
990 = Context.getObjCObjectPointerType(
995 ExpressibleAsConstantInitLiteral, SR);
997 return SemaRef.MaybeBindToTemporary(ArrayLiteral);
1005 if (Literal->isValueDependent() || Literal->isTypeDependent())
1011 struct APSIntCompare {
1012 bool operator()(
const llvm::APSInt &LHS,
const llvm::APSInt &RHS)
const {
1013 return llvm::APSInt::compareValues(LHS, RHS) < 0;
1017 llvm::DenseMap<StringRef, SourceLocation> StringKeys;
1018 std::map<llvm::APSInt, SourceLocation, APSIntCompare> IntegralKeys;
1020 auto checkOneKey = [&](
auto &Map,
const auto &Key,
SourceLocation Loc) {
1021 auto Pair = Map.insert({Key, Loc});
1023 S.
Diag(Loc, diag::warn_nsdictionary_duplicate_key);
1024 S.
Diag(Pair.first->second, diag::note_nsdictionary_duplicate_key_here);
1028 for (
unsigned Idx = 0, End = Literal->getNumElements(); Idx != End; ++Idx) {
1029 Expr *Key = Literal->getKeyValueElement(Idx).Key->IgnoreParenImpCasts();
1031 if (
auto *StrLit = dyn_cast<ObjCStringLiteral>(Key)) {
1032 StringRef Bytes = StrLit->getString()->getBytes();
1034 checkOneKey(StringKeys, Bytes, Loc);
1037 if (
auto *BE = dyn_cast<ObjCBoxedExpr>(Key)) {
1038 Expr *Boxed = BE->getSubExpr();
1043 checkOneKey(StringKeys, Str->getBytes(), Loc);
1050 checkOneKey(IntegralKeys, Result.Val.getInt(), Loc);
1071 QualType IdT = Context.getObjCIdType();
1079 nullptr , Context.getTranslationUnitDecl(),
1089 &Context.Idents.get(
"objects"),
1090 Context.getPointerType(IdT),
1093 Params.push_back(objects);
1097 &Context.Idents.get(
"keys"),
1098 Context.getPointerType(IdT),
1101 Params.push_back(keys);
1105 &Context.Idents.get(
"cnt"),
1106 Context.UnsignedLongTy,
1109 Params.push_back(cnt);
1110 Method->setMethodParams(Context, Params, {});
1121 !Context.hasSameUnqualifiedType(PtrValue->
getPointeeType(), IdT)) {
1125 diag::note_objc_literal_method_param)
1127 << Context.getPointerType(IdT.
withConst());
1145 Context.ObjCBuiltinIdTy, {},
1159 diag::note_objc_literal_method_param)
1161 << Context.getPointerType(IdT.
withConst());
1172 diag::note_objc_literal_method_param)
1189 bool HasPackExpansions =
false;
1193 bool ExpressibleAsConstantInitLiteral = LangOpts.ConstantNSDictionaryLiterals;
1198 if (!ExpressibleAsConstantInitLiteral)
1200 if (Elem.Key->isValueDependent() || Elem.Value->isValueDependent())
1201 ExpressibleAsConstantInitLiteral =
false;
1205 if (LangOpts.ObjCConstantLiterals && Elements.size() == 0) {
1207 "The current ABI doesn't support an empty constant NSDictionary "
1209 ExpressibleAsConstantInitLiteral =
true;
1222 if (
Value.isInvalid())
1225 Element.Key = Key.
get();
1226 Element.Value =
Value.get();
1228 if (ExpressibleAsConstantInitLiteral &&
1229 !Element.Key->isConstantInitializer(Context,
false))
1230 ExpressibleAsConstantInitLiteral =
false;
1233 if (ExpressibleAsConstantInitLiteral &&
1235 ExpressibleAsConstantInitLiteral =
false;
1239 if (ExpressibleAsConstantInitLiteral &&
1241 !Element.Value->isConstantInitializer(Context,
false)))
1242 ExpressibleAsConstantInitLiteral =
false;
1244 if (Element.EllipsisLoc.isInvalid())
1247 if (!Element.Key->containsUnexpandedParameterPack() &&
1248 !Element.Value->containsUnexpandedParameterPack()) {
1249 Diag(Element.EllipsisLoc,
1250 diag::err_pack_expansion_without_parameter_packs)
1252 Element.Value->getEndLoc());
1256 HasPackExpansions =
true;
1259 QualType Ty = Context.getObjCObjectPointerType(
1264 ExpressibleAsConstantInitLiteral, SR);
1268 return SemaRef.MaybeBindToTemporary(DictionaryLiteral);
1278 StrTy = Context.DependentTy;
1282 if (
SemaRef.RequireCompleteType(AtLoc, EncodedType,
1283 diag::err_incomplete_type_objc_at_encode,
1289 Context.getObjCEncodingForType(EncodedType, Str,
nullptr, &NotEncodedT);
1290 if (!NotEncodedT.
isNull())
1291 Diag(AtLoc, diag::warn_incomplete_encoded_type)
1292 << EncodedType << NotEncodedT;
1296 StrTy = Context.getStringLiteralArrayType(Context.CharTy, Str.size());
1299 return new (Context)
ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc);
1312 TInfo = Context.getTrivialTypeSourceInfo(
1313 EncodedType,
SemaRef.getLocForEndOfToken(LParenLoc));
1325 bool Warned =
false;
1328 if (MatchingMethodDecl == Method ||
1330 MatchingMethodDecl->
getSelector() != Method->getSelector())
1336 S.
Diag(AtLoc, diag::warn_multiple_selectors)
1339 S.
Diag(Method->getLocation(), diag::note_method_declared_at)
1340 << Method->getDeclName();
1342 S.
Diag(MatchingMethodDecl->
getLocation(), diag::note_method_declared_at)
1353 bool WarnMultipleSelectors) {
1354 if (!WarnMultipleSelectors ||
1357 bool Warned =
false;
1358 for (SemaObjC::GlobalMethodPool::iterator
b = S.
ObjC().
MethodPool.begin(),
1364 Method, InstMethList))
1370 Method, ClsMethList) || Warned)
1386 assert(Method->getSelector() == Sel &&
"Method with wrong selector in method list");
1387 if (Method->isDirectMethod()) {
1389 DirectMethod = Method;
1394 return DirectMethod;
1409 S, Sel, Iter->second.first, onlyDirect, anyDirect);
1411 S, Sel, Iter->second.second, onlyDirect, anyDirect);
1413 return DirectInstance ? DirectInstance : DirectClass;
1442 bool WarnMultipleSelectors) {
1451 Selector MatchedSel = OM->getSelector();
1454 Diag(SelLoc, diag::warn_undeclared_selector_with_typo)
1455 << Sel << MatchedSel
1459 Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
1462 WarnMultipleSelectors);
1464 bool onlyDirect =
true;
1465 bool anyDirect =
false;
1470 Diag(AtLoc, diag::err_direct_selector_expression)
1471 <<
Method->getSelector();
1472 Diag(
Method->getLocation(), diag::note_direct_method_declared_at)
1473 <<
Method->getDeclName();
1474 }
else if (anyDirect) {
1480 if (LikelyTargetMethod && LikelyTargetMethod->
isDirectMethod()) {
1481 Diag(AtLoc, diag::warn_potentially_direct_selector_expression) << Sel;
1483 diag::note_direct_method_declared_at)
1485 }
else if (!LikelyTargetMethod) {
1488 Diag(AtLoc, diag::warn_strict_potentially_direct_selector_expression)
1491 diag::note_direct_method_declared_at)
1498 Method->getImplementationControl() !=
1500 !
SemaRef.getSourceManager().isInSystemHeader(
Method->getLocation()))
1512 Diag(AtLoc, diag::err_arc_illegal_selector) <<
1529 QualType Ty = Context.getObjCSelType();
1542 Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
1546 Diag(ProtoLoc, diag::err_objc_non_runtime_protocol_in_protocol_expr)
1549 Diag(ProtoLoc, diag::err_atprotocol_protocol) << PDecl;
1555 QualType Ty = Context.getObjCProtoType();
1558 Ty = Context.getObjCObjectPointerType(Ty);
1559 return new (Context)
ObjCProtocolExpr(Ty, PDecl, AtLoc, ProtoIdLoc, RParenLoc);
1580 if (
auto nullability = AttributedType::stripOuterNullability(T)) {
1581 if (T == Context.getObjCInstanceType()) {
1582 return Context.getAttributedType(*nullability, Context.getObjCIdType(),
1583 Context.getObjCIdType());
1589 if (T == Context.getObjCInstanceType())
1590 return Context.getObjCIdType();
1603 bool isClassMessage,
1604 bool isSuperMessage) {
1605 assert(Method &&
"Must have a method");
1606 if (!Method->hasRelatedResultType())
1607 return Method->getSendResultType(ReceiverType);
1615 if (
auto nullability =
1616 Method->getSendResultType(ReceiverType)->getNullability()) {
1618 (void)AttributedType::stripOuterNullability(
type);
1621 return Context.getAttributedType(*nullability,
type,
type);
1631 if (Method->isInstanceMethod() && isClassMessage)
1633 Method->getSendResultType(ReceiverType));
1637 if (isSuperMessage) {
1640 return transferNullability(
1641 Context.getObjCObjectPointerType(
1642 Context.getObjCInterfaceType(Class)));
1648 return transferNullability(Context.getObjCObjectPointerType(ReceiverType));
1654 Method->getSendResultType(ReceiverType));
1659 return transferNullability(ReceiverType);
1665 bool isClassMessage,
1666 bool isSuperMessage) {
1670 SemaRef, ReceiverType,
Method, isClassMessage, isSuperMessage);
1673 if (isClassMessage) {
1682 AttributedType::stripOuterNullability(T);
1683 if (T == Context.getObjCInstanceType()) {
1687 ->getDeclContext());
1689 QualType NewResultType = Context.getObjCObjectPointerType(
1692 NewResultType = Context.getAttributedType(*Nullability, NewResultType,
1694 return NewResultType;
1706 unsigned receiverNullabilityIdx = 0;
1707 if (std::optional<NullabilityKind> nullability =
1711 receiverNullabilityIdx = 1 +
static_cast<unsigned>(*nullability);
1714 unsigned resultNullabilityIdx = 0;
1715 if (std::optional<NullabilityKind> nullability =
1719 resultNullabilityIdx = 1 +
static_cast<unsigned>(*nullability);
1724 static const uint8_t
None = 0;
1725 static const uint8_t
NonNull = 1;
1728 static const uint8_t nullabilityMap[4][4] = {
1736 unsigned newResultNullabilityIdx
1737 = nullabilityMap[receiverNullabilityIdx][resultNullabilityIdx];
1738 if (newResultNullabilityIdx == resultNullabilityIdx)
1744 if (
auto attributed = dyn_cast<AttributedType>(resultType.
getTypePtr())) {
1745 resultType = attributed->getModifiedType();
1752 if (newResultNullabilityIdx > 0) {
1755 return Context.getAttributedType(newNullability, resultType, resultType);
1774 dyn_cast<ObjCCategoryImplDecl>(impl)) {
1775 iface = catImpl->getCategoryDecl();
1777 iface = impl->getClassInterface();
1787 for (
unsigned i = 0, e = overrides.size(); i != e; ++i) {
1802 Context.hasSameUnqualifiedType(destType, MD->
getReturnType()))
1809 SourceRange range = overridden->getReturnTypeSourceRange();
1812 loc = overridden->getLocation();
1813 Diag(loc, diag::note_related_result_type_explicit)
1837 if (!
Method->hasRelatedResultType())
1840 if (Context.hasSameUnqualifiedType(
1841 Method->getReturnType().getNonReferenceType(), MsgSend->
getType()))
1844 if (!Context.hasSameUnqualifiedType(
Method->getReturnType(),
1845 Context.getObjCInstanceType()))
1848 Diag(
Method->getLocation(), diag::note_related_result_type_inferred)
1861 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
1862 SelLoc = SelectorLocs.front();
1868 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
1869 if (Args[i]->isTypeDependent())
1875 result =
SemaRef.checkUnknownAnyArg(SelLoc, Args[i], paramTy);
1877 result =
SemaRef.DefaultArgumentPromotion(Args[i]);
1881 Args[i] = result.
get();
1886 DiagID = diag::err_arc_method_not_found;
1888 DiagID = isClassMessage ? diag::warn_class_method_not_found
1889 : diag::warn_inst_method_not_found;
1894 DiagID = diag::err_method_not_found_with_typo;
1896 DiagID = isClassMessage ? diag::warn_class_method_not_found_with_typo
1897 : diag::warn_instance_method_not_found_with_typo;
1899 SourceRange SelectorRange(SelectorLocs.front(), SelectorLocs.back());
1901 Diag(SelLoc, DiagID)
1902 << Sel<< isClassMessage << MatchedSel
1905 Diag(SelLoc, DiagID) << Sel<< isClassMessage << MatchedSel;
1908 Diag(SelLoc, DiagID)
1909 << Sel << isClassMessage <<
SourceRange(SelectorLocs.front(),
1910 SelectorLocs.back());
1914 Diag(ThisClass->getLocation(), diag::note_receiver_class_declared);
1916 if (ThisClass->lookupClassMethod(Sel))
1917 Diag(RecRange.
getBegin(), diag::note_receiver_expr_here)
1919 ThisClass->getNameAsString());
1927 ReturnType = Context.UnknownAnyTy;
1929 ReturnType = Context.getObjCIdType();
1936 isClassMessage, isSuperMessage);
1943 NumNamedArgs =
Method->param_size();
1945 if (Args.size() < NumNamedArgs) {
1946 Diag(SelLoc, diag::err_typecheck_call_too_few_args)
1947 << 2 << NumNamedArgs << static_cast<unsigned>(Args.size())
1954 std::optional<ArrayRef<QualType>> typeArgs =
1956 bool IsError =
false;
1957 for (
unsigned i = 0; i < NumNamedArgs; i++) {
1959 if (Args[i]->isTypeDependent())
1962 Expr *argExpr = Args[i];
1965 assert(argExpr &&
"CheckMessageArgumentTypes(): missing expression");
1967 if (param->
hasAttr<NoEscapeAttr>() &&
1969 if (
auto *BE = dyn_cast<BlockExpr>(
1971 BE->getBlockDecl()->setDoesNotEscape();
1976 !param->
hasAttr<CFConsumedAttr>())
1981 if (param->
getType() == Context.UnknownAnyTy) {
1987 Args[i] = argE.
get();
2003 if (
SemaRef.RequireCompleteType(
2005 diag::err_call_incomplete_argument, argExpr))
2021 Args[i]->getType()->isBlockPointerType() &&
2024 SemaRef.maybeExtendBlockObject(arg);
2025 Args[i] = arg.get();
2031 if (
Method->isVariadic()) {
2032 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
2033 if (Args[i]->isTypeDependent())
2039 Args[i] = Arg.
get();
2043 if (Args.size() != NumNamedArgs) {
2044 Diag(Args[NumNamedArgs]->getBeginLoc(),
2045 diag::err_typecheck_call_too_many_args)
2046 << 2 << NumNamedArgs << static_cast<unsigned>(Args.size())
2047 <<
Method->getSourceRange() << 0
2049 Args.back()->getEndLoc());
2065 SemaRef.CurContext->getNonClosureAncestor());
2070 if (!method)
return false;
2073 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver))
2085 if (
ObjCMethodDecl *method = iface->lookupMethod(sel, isInstance))
2090 if (
ObjCMethodDecl *method = iface->lookupPrivateMethod(sel, isInstance))
2095 for (
const auto *I : objType->quals())
2107 for (
const auto *PROTO : OPT->
quals()) {
2108 if ((MD = PROTO->lookupMethod(Sel, Instance))) {
2123 assert(IFaceT &&
"Expected an Interface");
2127 Diag(MemberLoc, diag::err_invalid_property_name)
2137 diag::err_property_not_found_forward_class,
2138 MemberName, BaseRange))
2144 if (
SemaRef.DiagnoseUseOfDecl(PD, MemberLoc))
2147 return new (Context)
2151 return new (Context)
2156 for (
const auto *I : OPT->
quals())
2160 if (
SemaRef.DiagnoseUseOfDecl(PD, MemberLoc))
2166 SuperLoc, SuperType);
2168 return new (Context)
2191 if (
SemaRef.DiagnoseUseOfDecl(Getter, MemberLoc))
2210 if (Setter &&
SemaRef.DiagnoseUseOfDecl(Setter, MemberLoc))
2222 if (!(PDecl->getPropertyAttributes() &
2225 diag::warn_property_access_suggest)
2226 << MemberName <<
QualType(OPT, 0) << PDecl->getName()
2231 if (Getter || Setter) {
2233 return new (Context)
2237 return new (Context)
2254 Corrected.isKeyword() ?
nullptr : Corrected.getFoundDecl();
2259 Diag(MemberLoc, diag::err_class_property_found) << MemberName
2266 SemaRef.diagnoseTypo(Corrected,
2267 PDiag(diag::err_property_not_found_suggest)
2268 << MemberName <<
QualType(OPT, 0));
2270 TypoResult, MemberLoc,
2271 SuperLoc, SuperType, Super);
2280 if (
SemaRef.RequireCompleteType(MemberLoc, OBJPT->getPointeeType(),
2281 diag::err_property_not_as_forward_class,
2282 MemberName, BaseExpr))
2286 diag::err_ivar_access_using_property_syntax_suggest)
2287 << MemberName <<
QualType(OPT, 0) << Ivar->getDeclName()
2292 Diag(MemberLoc, diag::err_property_not_found)
2312 if (receiverNamePtr->
isStr(
"super")) {
2314 if (
auto classDecl = CurMethod->getClassInterface()) {
2315 SuperType =
QualType(classDecl->getSuperClassType(), 0);
2316 if (CurMethod->isInstanceMethod()) {
2317 if (SuperType.
isNull()) {
2319 Diag(receiverNameLoc, diag::err_root_class_cannot_use_super)
2320 << CurMethod->getClassInterface()->getIdentifier();
2323 QualType T = Context.getObjCObjectPointerType(SuperType);
2330 receiverNameLoc, T,
true);
2341 Diag(receiverNameLoc, diag::err_expected_either) << tok::identifier
2351 GetterSel = PD->getGetterName();
2352 SetterSel = PD->getSetterName();
2354 GetterSel =
SemaRef.PP.getSelectorTable().getNullarySelector(&propertyName);
2370 if (
SemaRef.DiagnoseUseOfDecl(Getter, propertyNameLoc))
2385 if (Setter &&
SemaRef.DiagnoseUseOfDecl(Setter, propertyNameLoc))
2388 if (Getter || Setter) {
2390 return new (Context)
2397 propertyNameLoc, receiverNameLoc, IFace);
2399 return ExprError(
Diag(propertyNameLoc, diag::err_property_not_found)
2400 << &propertyName << Context.getObjCInterfaceType(IFace));
2410 WantObjCSuper =
Method->getClassInterface()->getSuperClass();
2413 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
2418 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
2419 return std::make_unique<ObjCInterfaceOrSuperCCC>(*
this);
2428 bool HasTrailingDot,
ParsedType &ReceiverType) {
2430 ReceiverType =
nullptr;
2441 switch (
Result.getResultKind()) {
2448 if (!
Method->getClassInterface()) {
2454 if (
Method->getClassInterface()->lookupInstanceVariable(Name,
2466 Result.suppressDiagnostics();
2479 T = Context.getObjCInterfaceType(
Class);
2483 std::nullopt,
Type);
2489 TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
2490 ReceiverType =
SemaRef.CreateParsedType(T, TSInfo);
2495 ObjCInterfaceOrSuperCCC CCC(
SemaRef.getCurMethodDecl());
2497 Result.getLookupNameInfo(),
Result.getLookupKind(), S,
nullptr, CCC,
2499 if (Corrected.isKeyword()) {
2502 SemaRef.diagnoseTypo(Corrected,
PDiag(diag::err_unknown_receiver_suggest)
2509 SemaRef.diagnoseTypo(Corrected,
PDiag(diag::err_unknown_receiver_suggest)
2512 TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
2513 ReceiverType =
SemaRef.CreateParsedType(T, TSInfo);
2531 Diag(SuperLoc, diag::err_invalid_receiver_to_message_super);
2537 Diag(SuperLoc, diag::err_no_super_class_message)
2538 <<
Method->getDeclName();
2545 Diag(SuperLoc, diag::err_root_class_cannot_use_super)
2546 <<
Class->getIdentifier();
2552 if (
Method->getSelector() == Sel)
2553 SemaRef.getCurFunction()->ObjCShouldCallSuper =
false;
2555 if (
Method->isInstanceMethod()) {
2558 SuperTy = Context.getObjCObjectPointerType(SuperTy);
2561 LBracLoc, SelectorLocs, RBracLoc, Args);
2568 SuperLoc, Sel,
nullptr,
2569 LBracLoc, SelectorLocs, RBracLoc, Args);
2573 bool isSuperReceiver,
2579 if (!ReceiverType.
isNull())
2580 receiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType);
2582 assert(((isSuperReceiver && Loc.
isValid()) || receiverTypeInfo) &&
2583 "Either the super receiver location needs to be valid or the receiver "
2584 "needs valid type source information");
2587 Sel,
Method, Loc, Loc, Loc, Args,
2602 auto Builder = S.
Diag(MsgLoc, DiagID)
2610 switch (Edit.
Kind) {
2617 Builder.AddFixItHint(
2638 bool IsClassObjectCall) {
2644 const auto *SE = dyn_cast<ObjCSelectorExpr>(Args[0]->IgnoreParens());
2648 if (!IsClassObjectCall) {
2650 if (!OPT || !OPT->getInterfaceDecl())
2653 OPT->getInterfaceDecl()->lookupInstanceMethod(SE->getSelector());
2656 OPT->getInterfaceDecl()->lookupPrivateMethod(SE->getSelector());
2661 ImpliedMethod = IT->getDecl()->lookupClassMethod(SE->getSelector());
2664 IT->getDecl()->lookupPrivateClassMethod(SE->getSelector());
2669 if (Ret->isRecordType() || Ret->isVectorType() || Ret->isExtVectorType()) {
2670 S.
Diag(Loc, diag::warn_objc_unsafe_perform_selector)
2671 << Method->getSelector()
2672 << (!Ret->isRecordType()
2674 : Ret->isUnionType() ? 1 : 0);
2676 diag::note_objc_unsafe_perform_selector_method_declared_here)
2687 Expr **Args,
unsigned NumArgs) {
2689 bool Format =
false;
2696 for (
const auto *I : Method->specific_attrs<FormatAttr>()) {
2703 if (!Format || NumArgs <= Idx)
2706 Expr *FormatExpr = Args[Idx];
2711 S.
Diag(FormatExpr->
getExprLoc(), diag::warn_objc_cdirective_format_string)
2714 S.
Diag(Method->getLocation(), diag::note_method_declared_at)
2715 << Method->getDeclName();
2757 Diag(Loc, diag::err_missing_open_square_message_send)
2762 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2763 SelectorSlotLocs = SelectorLocs;
2765 SelectorSlotLocs = Loc;
2771 unsigned NumArgs = ArgsIn.size();
2772 Expr **Args = ArgsIn.data();
2773 assert(SuperLoc.
isInvalid() &&
"Message to super with dependent type");
2775 ReceiverTypeInfo, Sel, SelectorLocs,
2777 RBracLoc, isImplicit);
2783 if (!ClassType || !(
Class = ClassType->getInterface())) {
2784 Diag(Loc, diag::err_invalid_receiver_class_message)
2788 assert(
Class &&
"We don't know which class we're messaging?");
2791 (void)
SemaRef.DiagnoseUseOfDecl(
Class, SelectorSlotLocs);
2797 if (
SemaRef.RequireCompleteType(Loc, Context.getObjCInterfaceType(
Class),
2799 ? diag::err_arc_receiver_forward_class
2800 : diag::warn_receiver_forward_class),
2806 Diag(
Method->getLocation(), diag::note_method_sent_forward_class)
2807 <<
Method->getDeclName();
2817 false,
false,
Class))
2825 unsigned NumArgs = ArgsIn.size();
2826 Expr **Args = ArgsIn.data();
2833 if (
Method && !
Method->getReturnType()->isVoidType() &&
2835 LBracLoc,
Method->getReturnType(),
2836 diag::err_illegal_message_expr_incomplete_type))
2840 Diag(SuperLoc, diag::err_messaging_super_with_direct_method)
2844 :
Method->getClassInterface()->getName());
2845 Diag(
Method->getLocation(), diag::note_direct_method_declared_at)
2846 <<
Method->getDeclName();
2853 dyn_cast<ObjCInterfaceDecl>(
Method->getDeclContext());
2855 Diag(Loc, diag::warn_direct_initialize_call);
2856 Diag(
Method->getLocation(), diag::note_method_declared_at)
2857 <<
Method->getDeclName();
2862 Diag(Loc, diag::warn_direct_super_initialize_call);
2863 Diag(
Method->getLocation(), diag::note_method_declared_at)
2864 <<
Method->getDeclName();
2865 Diag(CurMeth->getLocation(), diag::note_method_declared_at)
2866 << CurMeth->getDeclName();
2877 Context, ReturnType,
VK, LBracLoc, SuperLoc,
false,
2878 ReceiverType, Sel, SelectorLocs,
Method,
ArrayRef(Args, NumArgs),
2879 RBracLoc, isImplicit);
2882 Context, ReturnType,
VK, LBracLoc, ReceiverTypeInfo, Sel, SelectorLocs,
2889 ReceiverType,
true);
2904 SemaRef.GetTypeFromParser(Receiver, &ReceiverTypeInfo);
2905 if (ReceiverType.
isNull())
2908 if (!ReceiverTypeInfo)
2909 ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc);
2913 nullptr, LBracLoc, SelectorLocs, RBracLoc,
2922 Sel,
Method, Loc, Loc, Loc, Args,
2929 const auto *Protocol = dyn_cast<ObjCProtocolDecl>(M->
getDeclContext());
2934 if (
const auto *RootClass = dyn_cast_or_null<ObjCInterfaceDecl>(
2938 if (P->getCanonicalDecl() == Protocol->getCanonicalDecl())
2978 assert((Receiver || SuperLoc.
isValid()) &&
"If the Receiver is null, the "
2979 "SuperLoc must be valid so we can "
2988 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2989 SelectorSlotLocs = SelectorLocs;
2991 SelectorSlotLocs = Loc;
2995 Diag(Loc, diag::err_missing_open_square_message_send)
3005 if (Receiver->
getType() == Context.UnknownAnyTy)
3007 SemaRef.forceUnknownAnyToType(Receiver, Context.getObjCIdType());
3017 unsigned NumArgs = ArgsIn.size();
3018 Expr **Args = ArgsIn.data();
3019 assert(SuperLoc.
isInvalid() &&
"Message to super with dependent type");
3021 Context, Context.DependentTy,
VK_PRValue, LBracLoc, Receiver, Sel,
3022 SelectorLocs,
nullptr,
ArrayRef(Args, NumArgs), RBracLoc,
3032 ReceiverType = Receiver->
getType();
3040 !Context.getObjCIdType().isNull() &&
3045 Diag(Loc, diag::warn_bad_receiver_type) << ReceiverType << RecRange;
3048 .ImpCastExprToType(Receiver, Context.getObjCIdType(),
3049 CK_CPointerToObjCPointerCast)
3055 CastKind Kind =
IsNull ? CK_NullToPointer : CK_IntegralToPointer;
3057 SemaRef.ImpCastExprToType(Receiver, Context.getObjCIdType(), Kind)
3060 ReceiverType = Receiver->
getType();
3064 diag::err_incomplete_receiver_type))
3068 SemaRef.PerformContextuallyConvertToObjCPointer(Receiver);
3070 Receiver = result.
get();
3071 ReceiverType = Receiver->
getType();
3087 (Receiver && Context.isObjCNSObjectType(Receiver->
getType()))) {
3092 if (!Methods.empty()) {
3098 Sel, ArgsIn,
Method->isInstanceMethod(), Methods))
3103 receiverIsIdLike, Methods))
3121 Diag(SelLoc, diag::warn_instance_method_on_class_found)
3122 <<
Method->getSelector() << Sel;
3123 Diag(
Method->getLocation(), diag::note_method_declared_at)
3124 <<
Method->getDeclName();
3134 Method = ClassDecl->lookupClassMethod(Sel);
3137 Method = ClassDecl->lookupPrivateClassMethod(Sel);
3152 if (!Methods.empty()) {
3158 if (
Method->isInstanceMethod()) {
3160 dyn_cast<ObjCInterfaceDecl>(
Method->getDeclContext())) {
3161 if (ID->getSuperClass())
3162 Diag(SelLoc, diag::warn_root_inst_method_not_found)
3168 Sel, ArgsIn,
Method->isInstanceMethod(), Methods))
3191 ClassDecl = OCIType->getInterfaceDecl();
3198 if (
SemaRef.RequireCompleteType(
3199 Loc, OCIType->getPointeeType(),
3201 ? diag::err_arc_receiver_forward_instance
3202 : diag::warn_receiver_forward_instance,
3207 forwardClass = OCIType->getInterfaceDecl();
3209 diag::note_receiver_is_id);
3224 Diag(SelLoc, diag::err_arc_may_not_respond)
3225 << OCIType->getPointeeType() << Sel << RecRange
3226 <<
SourceRange(SelectorLocs.front(), SelectorLocs.back());
3234 if (OCIType->qual_empty()) {
3239 if (!Methods.empty()) {
3245 Sel, ArgsIn,
Method->isInstanceMethod(), Methods))
3253 if (
Method && !forwardClass)
3254 Diag(SelLoc, diag::warn_maynot_respond)
3255 << OCIType->getInterfaceDecl()->getIdentifier()
3261 SemaRef.DiagnoseUseOfDecl(
Method, SelectorSlotLocs, forwardClass))
3265 Diag(Loc, diag::err_bad_receiver_type) << ReceiverType << RecRange;
3273 ?
SemaRef.getEnclosingFunction()
3279 diag::err_messaging_unqualified_id_with_direct_method);
3280 Diag(
Method->getLocation(), diag::note_direct_method_declared_at)
3281 <<
Method->getDeclName();
3291 diag::err_messaging_class_with_direct_method);
3294 RecRange,
Method->getClassInterface()->getName()));
3297 Diag(
Method->getLocation(), diag::note_direct_method_declared_at)
3298 <<
Method->getDeclName();
3304 Diag(SuperLoc, diag::err_messaging_super_with_direct_method);
3307 SuperLoc,
Method->getClassInterface()->getName()));
3312 Diag(
Method->getLocation(), diag::note_direct_method_declared_at)
3313 <<
Method->getDeclName();
3315 }
else if (ReceiverType->
isObjCIdType() && !isImplicit) {
3316 Diag(Receiver->
getExprLoc(), diag::warn_messaging_unqualified_id);
3319 if (DIFunctionScopeInfo &&
3322 bool isDesignatedInitChain =
false;
3329 if (!ID->declaresOrInheritsDesignatedInitializers() ||
3330 ID->isDesignatedInitializer(Sel)) {
3331 isDesignatedInitChain =
true;
3337 if (!isDesignatedInitChain) {
3339 auto *CurMD =
SemaRef.getCurMethodDecl();
3340 assert(CurMD &&
"Current method declaration should not be null");
3342 CurMD->isDesignatedInitializerForTheInterface(&InitMethod);
3343 assert(isDesignated && InitMethod);
3346 diag::warn_objc_designated_init_non_designated_init_call :
3347 diag::warn_objc_designated_init_non_super_designated_init_call);
3349 diag::note_objc_designated_init_marked_here);
3353 if (DIFunctionScopeInfo &&
3357 Diag(SelLoc, diag::warn_objc_secondary_init_super_init_call);
3364 unsigned NumArgs = ArgsIn.size();
3365 Expr **Args = ArgsIn.data();
3373 LBracLoc, RBracLoc, RecRange, ReturnType,
VK))
3376 if (
Method && !
Method->getReturnType()->isVoidType() &&
3378 LBracLoc,
Method->getReturnType(),
3379 diag::err_illegal_message_expr_incomplete_type))
3408 Diag(SelLoc, diag::err_arc_illegal_explicit_message)
3413 if (
Method && NumArgs >= 1) {
3414 if (
const auto *SelExp =
3415 dyn_cast<ObjCSelectorExpr>(Args[0]->IgnoreParens())) {
3416 Selector ArgSel = SelExp->getSelector();
3419 SelExp->getSourceRange());
3423 SelExp->getSourceRange());
3426 switch (SelFamily) {
3433 if (!SelMethod->
hasAttr<NSReturnsNotRetainedAttr>()) {
3436 diag::err_arc_perform_selector_retains);
3443 if (SelMethod->
hasAttr<NSReturnsRetainedAttr>()) {
3446 diag::err_arc_perform_selector_retains);
3455 Diag(SelLoc, diag::warn_arc_perform_selector_leaks);
3456 Diag(Args[0]->getExprLoc(), diag::note_used_here);
3469 Context, ReturnType,
VK, LBracLoc, SuperLoc,
true,
3470 ReceiverType, Sel, SelectorLocs,
Method,
ArrayRef(Args, NumArgs),
3471 RBracLoc, isImplicit);
3474 Context, ReturnType,
VK, LBracLoc, Receiver, Sel, SelectorLocs,
Method,
3475 ArrayRef(Args, NumArgs), RBracLoc, isImplicit);
3480 bool IsClassObjectCall = ClassMessage;
3487 if (OPT->getObjectType()->isObjCClass()) {
3488 if (
const auto *CurMeth =
SemaRef.getCurMethodDecl()) {
3489 IsClassObjectCall =
true;
3491 Context.getObjCInterfaceType(CurMeth->getClassInterface());
3497 ReceiverType, IsClassObjectCall);
3510 Result->setDelegateInitCall(
true);
3521 if (!isImplicit &&
Method) {
3527 if (IsWeak && !
SemaRef.isUnevaluatedContext() &&
3566 SemaRef.MaybeConvertParenListExprToParenExpr(S, Receiver);
3572 IdentifierInfo *SelectorId = &Context.Idents.get(
"respondsToSelector");
3580 nullptr, LBracLoc, SelectorLocs,
3614 bool isIndirect =
false;
3618 type = ref->getPointeeType();
3625 type = ptr->getPointeeType();
3632 }
else if (
const ArrayType *array =
type->getAsArrayTypeUnsafe()) {
3633 type =
QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0);
3641 if (
type->isObjCARCBridgableType())
3646 if (
type->isObjCARCBridgableType())
3667 ACCResult
merge(ACCResult left, ACCResult right) {
3668 if (left == right)
return left;
3669 if (left == ACC_bottom)
return right;
3670 if (right == ACC_bottom)
return left;
3676 class ARCCastChecker :
public StmtVisitor<ARCCastChecker, ACCResult> {
3677 typedef StmtVisitor<ARCCastChecker, ACCResult> super;
3679 ASTContext &Context;
3684 static bool isCFType(QualType
type) {
3686 return type->isCARCBridgableType();
3692 : Context(Context), SourceClass(source), TargetClass(target),
3693 Diagnose(diagnose) {}
3696 ACCResult Visit(Expr *e) {
3700 ACCResult VisitStmt(Stmt *
s) {
3705 ACCResult VisitExpr(Expr *e) {
3712 ACCResult VisitObjCObjectLiteral(ObjCObjectLiteral *OL) {
3721 ACCResult VisitObjCStringLiteral(ObjCStringLiteral *SL) {
3722 return VisitObjCObjectLiteral(SL);
3725 ACCResult VisitObjCBoxedExpr(ObjCBoxedExpr *OBE) {
3726 return VisitObjCObjectLiteral(OBE);
3729 ACCResult VisitObjCArrayLiteral(ObjCArrayLiteral *AL) {
3730 return VisitObjCObjectLiteral(AL);
3733 ACCResult VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *DL) {
3734 return VisitObjCObjectLiteral(DL);
3738 ACCResult VisitCastExpr(
CastExpr *e) {
3740 case CK_NullToPointer:
3744 case CK_LValueToRValue:
3746 case CK_CPointerToObjCPointerCast:
3747 case CK_BlockPointerToObjCPointerCast:
3748 case CK_AnyPointerToBlockPointerCast:
3757 ACCResult VisitUnaryExtension(UnaryOperator *e) {
3762 ACCResult VisitBinComma(BinaryOperator *e) {
3763 return Visit(e->
getRHS());
3767 ACCResult VisitConditionalOperator(ConditionalOperator *e) {
3769 if (left == ACC_invalid)
return ACC_invalid;
3774 ACCResult VisitPseudoObjectExpr(PseudoObjectExpr *e) {
3780 ACCResult VisitStmtExpr(StmtExpr *e) {
3785 ACCResult VisitDeclRefExpr(DeclRefExpr *e) {
3786 VarDecl *
var = dyn_cast<VarDecl>(e->
getDecl());
3791 !
var->hasDefinition(Context) &&
3792 var->getType().isConstQualified()) {
3799 return ACC_plusZero;
3807 ACCResult VisitCallExpr(CallExpr *e) {
3809 if (ACCResult result = checkCallToFunction(fn))
3812 return super::VisitCallExpr(e);
3815 ACCResult checkCallToFunction(FunctionDecl *fn) {
3824 if (fn->
hasAttr<CFReturnsNotRetainedAttr>())
3825 return ACC_plusZero;
3830 if (fn->
hasAttr<CFReturnsRetainedAttr>())
3831 return Diagnose ? ACC_plusOne
3836 if (builtinID == Builtin::BI__builtin___CFStringMakeConstantString)
3840 if (!fn->
hasAttr<CFAuditedTransferAttr>())
3845 return Diagnose ? ACC_plusOne
3848 return ACC_plusZero;
3851 ACCResult VisitObjCMessageExpr(ObjCMessageExpr *e) {
3855 ACCResult VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *e) {
3856 ObjCMethodDecl *method;
3861 return checkCallToMethod(method);
3864 ACCResult checkCallToMethod(ObjCMethodDecl *method) {
3865 if (!method)
return ACC_invalid;
3874 if (method->
hasAttr<CFReturnsNotRetainedAttr>())
3875 return ACC_plusZero;
3879 if (method->
hasAttr<CFReturnsRetainedAttr>())
3891 return ACC_plusZero;
3906template <
typename DiagBuilderT>
3910 Expr *realCast,
const char *bridgeKeyword,
const char *CFBridgeName) {
3926 NCE->getAngleBrackets().getEnd());
3930 char PrevChar = *
SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3934 BridgeCall += CFBridgeName;
3941 castedE = CCE->getSubExpr();
3948 char PrevChar = *
SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3952 BridgeCall += CFBridgeName;
3972 std::string castCode =
"(";
3973 castCode += bridgeKeyword;
3977 NCE->getAngleBrackets().getEnd());
3981 std::string castCode =
"(";
3982 castCode += bridgeKeyword;
4001template <
typename T>
4008 for (
auto *Redecl : RT->getDecl()->getMostRecentDecl()->redecls()) {
4009 if (
auto *
attr = Redecl->getAttr<T>())
4019 while (
const auto *TD = T->getAs<
TypedefType>()) {
4020 TDNDecl = TD->getDecl();
4021 if (ObjCBridgeRelatedAttr *ObjCBAttr =
4039 UnavailableAttr::IR_ARCForbiddenConversion))
4052 unsigned srcKind = 0;
4076 S.
Diag(loc, diag::err_arc_cast_requires_bridge)
4085 ACCResult CreateRule =
4087 assert(CreateRule != ACC_bottom &&
"This cast should already be accepted.");
4088 if (CreateRule != ACC_plusOne)
4091 ? S.
Diag(noteLoc, diag::note_arc_bridge)
4092 : S.
Diag(noteLoc, diag::note_arc_cstyle_bridge);
4095 castType,
castExpr, realCast,
"__bridge ",
4098 if (CreateRule != ACC_plusZero)
4101 ? S.
Diag(noteLoc, diag::note_arc_cstyle_bridge_transfer)
4104 diag::note_arc_bridge_transfer)
4105 << castExprType << br;
4108 castType,
castExpr, realCast,
"__bridge_transfer ",
4109 br ?
"CFBridgingRelease" :
nullptr);
4118 S.
Diag(loc, diag::err_arc_cast_requires_bridge)
4126 ACCResult CreateRule =
4128 assert(CreateRule != ACC_bottom &&
"This cast should already be accepted.");
4129 if (CreateRule != ACC_plusOne)
4132 ? S.
Diag(noteLoc, diag::note_arc_bridge)
4133 : S.
Diag(noteLoc, diag::note_arc_cstyle_bridge);
4135 castType,
castExpr, realCast,
"__bridge ",
4138 if (CreateRule != ACC_plusZero)
4141 ? S.
Diag(noteLoc, diag::note_arc_cstyle_bridge_retained)
4144 diag::note_arc_bridge_retained)
4148 castType,
castExpr, realCast,
"__bridge_retained ",
4149 br ?
"CFBridgingRetain" :
nullptr);
4155 S.
Diag(loc, diag::err_arc_mismatched_cast)
4157 << srcKind << castExprType << castType
4158 << castRange <<
castExpr->getSourceRange();
4161template <
typename TB>
4163 bool &HadTheAttribute,
bool warn) {
4165 HadTheAttribute =
false;
4166 while (
const auto *TD = T->getAs<
TypedefType>()) {
4170 HadTheAttribute =
true;
4171 if (Parm->isStr(
"id"))
4184 = InterfacePointerType->getObjectType()->getInterface();
4185 if ((CastClass == ExprClass) ||
4189 S.
Diag(
castExpr->getBeginLoc(), diag::warn_objc_invalid_bridge)
4194 castType, ExprClass)))
4201 S.
Diag(
castExpr->getBeginLoc(), diag::warn_objc_invalid_bridge)
4202 << T <<
Target->getName() << castType;
4204 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4211 diag::err_objc_cf_bridged_not_interface)
4224template <
typename TB>
4226 bool &HadTheAttribute,
bool warn) {
4228 HadTheAttribute =
false;
4229 while (
const auto *TD = T->getAs<
TypedefType>()) {
4233 HadTheAttribute =
true;
4234 if (Parm->isStr(
"id"))
4242 Target = R.getFoundDecl();
4246 castExpr->getType()->getAsObjCInterfacePointerType()) {
4248 = InterfacePointerType->getObjectType()->getInterface();
4249 if ((CastClass == ExprClass) ||
4254 diag::warn_objc_invalid_bridge_to_cf)
4255 <<
castExpr->getType()->getPointeeType() << T;
4259 }
else if (
castExpr->getType()->isObjCIdType() ||
4269 diag::warn_objc_invalid_bridge_to_cf)
4270 <<
castExpr->getType() << castType;
4272 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4279 diag::err_objc_ns_bridged_invalid_cfobject)
4280 <<
castExpr->getType() << castType;
4283 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4300 bool HasObjCBridgeAttr;
4303 if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
4305 bool HasObjCBridgeMutableAttr;
4306 bool ObjCBridgeMutableAttrWillNotWarn =
4309 if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
4312 if (HasObjCBridgeAttr)
4314 HasObjCBridgeAttr,
true);
4315 else if (HasObjCBridgeMutableAttr)
4320 bool HasObjCBridgeAttr;
4323 if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
4325 bool HasObjCBridgeMutableAttr;
4326 bool ObjCBridgeMutableAttrWillNotWarn =
4329 if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
4332 if (HasObjCBridgeAttr)
4334 HasObjCBridgeAttr,
true);
4335 else if (HasObjCBridgeMutableAttr)
4344 if (PRE->isExplicitProperty()) {
4346 SrcType = PDecl->getType();
4348 else if (PRE->isImplicitProperty()) {
4350 SrcType = Getter->getReturnType();
4373 : CK_CPointerToObjCPointerCast;
4385 QualType T = CfToNs ? SrcType : DestType;
4401 Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
4402 << SrcType << DestType;
4407 Target = R.getFoundDecl();
4412 Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
4413 << SrcType << DestType;
4416 Diag(
Target->getBeginLoc(), diag::note_declared_at);
4422 if (CfToNs && CMId) {
4423 Selector Sel = Context.Selectors.getUnarySelector(CMId);
4427 Diag(Loc, diag::err_objc_bridged_related_known_method)
4428 << SrcType << DestType << Sel <<
false;
4436 if (!CfToNs && IMId) {
4437 Selector Sel = Context.Selectors.getNullarySelector(IMId);
4438 InstanceMethod = RelatedClass->
lookupMethod(Sel,
true);
4439 if (!InstanceMethod) {
4441 Diag(Loc, diag::err_objc_bridged_related_known_method)
4442 << SrcType << DestType << Sel <<
true;
4461 if (!CfToNs && !NsToCf)
4469 ClassMethod, InstanceMethod, TDNDecl,
4477 std::string ExpressionString =
"[";
4479 ExpressionString +=
" ";
4480 ExpressionString += ClassMethod->getSelector().getAsString();
4484 Diag(Loc, diag::err_objc_bridged_related_known_method)
4485 << SrcType << DestType << ClassMethod->getSelector() <<
false
4492 QualType receiverType = Context.getObjCInterfaceType(RelatedClass);
4494 Expr *args[] = { SrcExpr };
4496 ClassMethod->getLocation(),
4497 ClassMethod->getSelector(), ClassMethod,
4499 SrcExpr = msg.
get();
4506 if (InstanceMethod) {
4508 std::string ExpressionString;
4511 if (InstanceMethod->isPropertyAccessor())
4513 InstanceMethod->findPropertyDecl()) {
4515 ExpressionString =
".";
4516 ExpressionString += PDecl->getNameAsString();
4517 Diag(Loc, diag::err_objc_bridged_related_known_method)
4518 << SrcType << DestType << InstanceMethod->getSelector() <<
true
4521 if (ExpressionString.empty()) {
4523 ExpressionString =
" ";
4524 ExpressionString += InstanceMethod->getSelector().getAsString();
4525 ExpressionString +=
"]";
4527 Diag(Loc, diag::err_objc_bridged_related_known_method)
4528 << SrcType << DestType << InstanceMethod->getSelector() <<
true
4536 SrcExpr, SrcType, InstanceMethod->getLocation(),
4537 InstanceMethod->getSelector(), InstanceMethod, {});
4538 SrcExpr = msg.
get();
4549 bool Diagnose,
bool DiagnoseCFAudited,
4562 if (exprACTC == castACTC) {
4568 castType != castExprType) {
4574 if (
const ParenType *PT = dyn_cast<ParenType>(DT))
4575 QDT = PT->desugar();
4576 else if (
const TypeOfType *TP = dyn_cast<TypeOfType>(DT))
4577 QDT = TP->desugar();
4578 else if (
const AttributedType *AT = dyn_cast<AttributedType>(DT))
4579 QDT = AT->desugar();
4580 if (QDT != castType &&
4585 Diag(loc, diag::err_arc_nolifetime_behavior);
4623 switch (ARCCastChecker(Context, exprACTC, castACTC,
false).Visit(
castExpr)) {
4636 CK_ARCConsumeObject,
castExpr,
nullptr,
4638 SemaRef.Cleanup.setExprNeedsCleanups(
true);
4663 (Opc == BO_NE || Opc == BO_EQ))) {
4685 castType =
cast->getTypeAsWritten();
4688 castRange =
cast->getTypeInfoAsWritten()->getTypeLoc().getSourceRange();
4689 castType =
cast->getTypeAsWritten();
4692 llvm_unreachable(
"Unexpected ImplicitCastExpr");
4711 if (
ParenExpr *pe = dyn_cast<ParenExpr>(e)) {
4713 return new (Context)
ParenExpr(pe->getLParen(), pe->getRParen(), sub);
4714 }
else if (
UnaryOperator *uo = dyn_cast<UnaryOperator>(e)) {
4715 assert(uo->getOpcode() == UO_Extension);
4719 uo->getOperatorLoc(),
false,
4720 SemaRef.CurFPFeatureOverrides());
4722 assert(!gse->isResultDependent());
4723 assert(!gse->isTypePredicate());
4725 unsigned n = gse->getNumAssocs();
4728 subExprs.reserve(n);
4729 subTypes.reserve(n);
4731 subTypes.push_back(assoc.getTypeSourceInfo());
4732 Expr *sub = assoc.getAssociationExpr();
4733 if (assoc.isSelected())
4735 subExprs.push_back(sub);
4739 Context, gse->getGenericLoc(), gse->getControllingExpr(), subTypes,
4740 subExprs, gse->getDefaultLoc(), gse->getRParenLoc(),
4741 gse->containsUnexpandedParameterPack(), gse->getResultIndex());
4761 return !ObjI->isArcWeakrefUnavailable();
4768 Expr *curExpr = e, *prevExpr =
nullptr;
4773 if (
auto *pe = dyn_cast<ParenExpr>(curExpr)) {
4775 curExpr = pe->getSubExpr();
4779 if (
auto *ce = dyn_cast<CastExpr>(curExpr)) {
4780 if (
auto *ice = dyn_cast<ImplicitCastExpr>(ce))
4781 if (ice->getCastKind() == CK_ARCReclaimReturnedObject) {
4783 return ice->getSubExpr();
4784 if (
auto *pe = dyn_cast<ParenExpr>(prevExpr))
4785 pe->setSubExpr(ice->getSubExpr());
4792 curExpr = ce->getSubExpr();
4811 SubExpr = SubResult.
get();
4818 bool MustConsume =
false;
4824 CK = (T->isBlockPointerType() ? CK_AnyPointerToBlockPointerCast
4825 : CK_CPointerToObjCPointerCast);
4832 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4835 << (T->isBlockPointerType()? 1 : 0)
4839 Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4841 Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer)
4844 br ?
"CFBridgingRelease "
4845 :
"__bridge_transfer ");
4875 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4883 Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4885 Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained)
4888 br ?
"CFBridgingRetain " :
"__bridge_retained");
4895 Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible)
4896 << FromType << T << Kind
4907 SemaRef.Cleanup.setExprNeedsCleanups(
true);
4927 TSInfo = Context.getTrivialTypeSourceInfo(T, LParenLoc);
4954 LookForIvars =
true;
4955 else if (IsClassMethod)
4956 LookForIvars =
false;
4967 if (IsClassMethod) {
4988 Diag(Loc, diag::warn_ivar_use_hidden) << IV->getDeclName();
4996 Diag(Loc, diag::err_ivar_use_in_class_method) << IV->getDeclName();
5007 bool AllowBuiltinCreation) {
5016 if (Lookup.
empty() && II && AllowBuiltinCreation)
5017 SemaRef.LookupBuiltin(Lookup);
5028 "should not reference ivar from this context");
5031 assert(IFace &&
"should not reference ivar from this context");
5039 if (
SemaRef.DiagnoseUseOfDecl(IV, Loc))
5050 SemaRef.ActOnIdExpression(S, SelfScopeSpec, TemplateKWLoc, SelfName,
5056 SelfExpr =
SemaRef.DefaultLvalueConversion(SelfExpr.
get());
5060 SemaRef.MarkAnyDeclReferenced(Loc, IV,
true);
5072 if (!
SemaRef.isUnevaluatedContext() &&
5073 !
getDiagnostics().isIgnored(diag::warn_arc_repeated_use_of_weak, Loc))
5078 SemaRef.ImplicitlyRetainedSelfLocs.push_back({Loc, BD});
5094 (Context.hasSameType(RHSTy, Context.getObjCClassRedefinitionType()))) {
5095 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), LHSTy,
5096 CK_CPointerToObjCPointerCast);
5100 (Context.hasSameType(LHSTy, Context.getObjCClassRedefinitionType()))) {
5101 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), RHSTy,
5102 CK_CPointerToObjCPointerCast);
5107 (Context.hasSameType(RHSTy, Context.getObjCIdRedefinitionType()))) {
5108 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), LHSTy,
5109 CK_CPointerToObjCPointerCast);
5113 (Context.hasSameType(LHSTy, Context.getObjCIdRedefinitionType()))) {
5114 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), RHSTy,
5115 CK_CPointerToObjCPointerCast);
5119 if (Context.isObjCSelType(LHSTy) &&
5120 (Context.hasSameType(RHSTy, Context.getObjCSelRedefinitionType()))) {
5121 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), LHSTy, CK_BitCast);
5124 if (Context.isObjCSelType(RHSTy) &&
5125 (Context.hasSameType(LHSTy, Context.getObjCSelRedefinitionType()))) {
5126 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), RHSTy, CK_BitCast);
5132 if (Context.getCanonicalType(LHSTy) == Context.getCanonicalType(RHSTy)) {
5155 if (!(compositeType = Context.areCommonBaseCompatible(LHSOPT, RHSOPT))
5158 }
else if (Context.canAssignObjCInterfaces(LHSOPT, RHSOPT)) {
5159 compositeType = RHSOPT->isObjCBuiltinType() ? RHSTy : LHSTy;
5160 }
else if (Context.canAssignObjCInterfaces(RHSOPT, LHSOPT)) {
5163 RHSOPT->isObjCQualifiedIdType()) &&
5164 Context.ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT,
5170 compositeType = Context.getObjCIdType();
5172 compositeType = Context.getObjCIdType();
5174 Diag(QuestionLoc, diag::ext_typecheck_cond_incompatible_operands)
5177 QualType incompatTy = Context.getObjCIdType();
5178 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), incompatTy, CK_BitCast);
5179 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), incompatTy, CK_BitCast);
5183 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), compositeType, CK_BitCast);
5184 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), compositeType, CK_BitCast);
5185 return compositeType;
5192 Diag(QuestionLoc, diag::err_cond_voidptr_arc)
5202 QualType destType = Context.getPointerType(destPointee);
5204 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), destType, CK_NoOp);
5206 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), destType, CK_BitCast);
5213 Diag(QuestionLoc, diag::err_cond_voidptr_arc)
5223 QualType destType = Context.getPointerType(destPointee);
5225 RHS =
SemaRef.ImpCastExprToType(RHS.
get(), destType, CK_NoOp);
5227 LHS =
SemaRef.ImpCastExprToType(LHS.
get(), destType, CK_BitCast);
5248 if (OV->getSourceExpr())
5251 if (
auto *SL = dyn_cast<StringLiteral>(SrcExpr)) {
5252 if (!PT->
isObjCIdType() && !(ID && ID->getIdentifier()->isStr(
"NSString")))
5254 if (!SL->isOrdinary())
5258 Diag(SL->getBeginLoc(), diag::err_missing_atsign_prefix)
5270 if (!ID || !ID->getIdentifier()->isStr(
"NSNumber"))
5290 assert((Kind == tok::kw___objc_yes || Kind == tok::kw___objc_no) &&
5291 "Unknown Objective-C Boolean value!");
5293 QualType BoolT = Context.ObjCBuiltinBoolTy;
5294 if (!Context.getBOOLDecl()) {
5298 Result.isSingleResult()) {
5301 Context.setBOOLDecl(TD);
5304 if (Context.getBOOLDecl())
5305 BoolT = Context.getBOOLType();
5306 return new (Context)
5314 auto FindSpecVersion =
5315 [&](StringRef Platform,
5316 const llvm::Triple::OSType &OS) -> std::optional<VersionTuple> {
5322 if (Spec == AvailSpecs.end() && Platform ==
"maccatalyst") {
5329 if (Spec == AvailSpecs.end()) {
5331 const llvm::Triple &Triple = Context.getTargetInfo().getTriple();
5332 if (Triple.isOSDarwin()) {
5338 if (Spec == AvailSpecs.end())
5339 return std::nullopt;
5341 return llvm::Triple::getCanonicalVersionForOS(
5343 llvm::Triple::isValidVersionForOS(OS, Spec->
getVersion()));
5346 VersionTuple Version;
5347 if (
auto MaybeVersion =
5348 FindSpecVersion(Context.getTargetInfo().getPlatformName(),
5349 Context.getTargetInfo().getTriple().getOS()))
5350 Version = *MaybeVersion;
5355 Context->HasPotentialAvailabilityViolations =
true;
5357 return new (Context)
5365 if (
type->isObjCObjectPointerType()) {
5367 }
else if (
type->isBlockPointerType()) {
5368 SemaRef.maybeExtendBlockObject(E);
5369 return CK_BlockPointerToObjCPointerCast;
5371 assert(
type->isPointerType());
5372 return CK_CPointerToObjCPointerCast;
5381 case Stmt::ObjCStringLiteralClass:
5384 case Stmt::ObjCArrayLiteralClass:
5387 case Stmt::ObjCDictionaryLiteralClass:
5390 case Stmt::BlockExprClass:
5392 case Stmt::ObjCBoxedExprClass: {
5395 case Stmt::IntegerLiteralClass:
5396 case Stmt::FloatingLiteralClass:
5397 case Stmt::CharacterLiteralClass:
5398 case Stmt::ObjCBoolLiteralExprClass:
5399 case Stmt::CXXBoolLiteralExprClass:
5402 case Stmt::ImplicitCastExprClass: {
5405 if (CK == CK_IntegralToBoolean || CK == CK_IntegralCast)
Defines the clang::ASTContext interface.
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines enum values for all the target-independent builtin functions.
llvm::MachO::Target Target
Defines the clang::Preprocessor interface.
static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn)
static ObjCMethodDecl * getNSNumberFactoryMethod(SemaObjC &S, SourceLocation Loc, QualType NumberType, bool isLiteral=false, SourceRange R=SourceRange())
Retrieve the NSNumber factory method that should be used to create an Objective-C literal for the giv...
static QualType stripObjCInstanceType(ASTContext &Context, QualType T)
static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, CheckedConversionKind CCK)
static ObjCInterfaceDecl * LookupObjCInterfaceDeclForLiteral(Sema &S, SourceLocation Loc, SemaObjC::ObjCLiteralKind LiteralKind)
Looks up ObjCInterfaceDecl of a given NSClassIdKindKind.
static ObjCMethodDecl * findMethodInCurrentClass(Sema &S, Selector Sel)
static void checkCocoaAPI(Sema &S, const ObjCMessageExpr *Msg)
static bool CheckObjCNumberExpressionIsConstant(Sema &S, Expr *Number)
static ObjCMethodDecl * LookupDirectMethodInGlobalPool(Sema &S, Selector Sel, bool &onlyDirect, bool &anyDirect)
static Expr * maybeUndoReclaimObject(Expr *e)
Look for an ObjCReclaimReturnedObject cast and destroy it.
static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn)
static void CheckObjCDictionaryLiteralDuplicateKeys(Sema &S, ObjCDictionaryLiteral *Literal)
Check for duplicate keys in an ObjC dictionary literal.
static bool ValidateObjCLiteralInterfaceDecl(Sema &S, ObjCInterfaceDecl *Decl, SourceLocation Loc, SemaObjC::ObjCLiteralKind LiteralKind)
Validates ObjCInterfaceDecl availability.
static NSAPI::NSClassIdKindKind ClassKindFromLiteralKind(SemaObjC::ObjCLiteralKind LiteralKind)
Maps ObjCLiteralKind to NSClassIdKindKind.
static bool isAnyCLike(ARCConversionTypeClass ACTC)
static void DiagnoseMismatchedSelectors(Sema &S, SourceLocation AtLoc, ObjCMethodDecl *Method, SourceLocation LParenLoc, SourceLocation RParenLoc, bool WarnMultipleSelectors)
static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, SourceLocation AtLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, ObjCMethodDecl *Method, ObjCMethodList &MethList)
static void applyCocoaAPICheck(Sema &S, const ObjCMessageExpr *Msg, unsigned DiagID, bool(*refactor)(const ObjCMessageExpr *, const NSAPI &, edit::Commit &))
static ObjCMethodDecl * LookupDirectMethodInMethodList(Sema &S, Selector Sel, ObjCMethodList &MethList, bool &onlyDirect, bool &anyDirect)
static ObjCBridgeRelatedAttr * ObjCBridgeRelatedAttrFromType(QualType T, TypedefNameDecl *&TDNDecl)
static T * getObjCBridgeAttr(const TypedefType *TD)
static ARCConversionTypeClass classifyTypeForARCConversion(QualType type)
static bool isAnyRetainable(ARCConversionTypeClass ACTC)
static void RemoveSelectorFromWarningCache(SemaObjC &S, Expr *Arg)
@ ACTC_voidPtr
void* might be a normal C type, or it might a CF type.
@ ACTC_retainable
id, void (^)()
@ ACTC_coreFoundation
struct A*
@ ACTC_indirectRetainable
id*, id***, void (^*)(),
@ ACTC_none
int, void, struct A
static QualType getBaseMessageSendResultType(Sema &S, QualType ReceiverType, ObjCMethodDecl *Method, bool isClassMessage, bool isSuperMessage)
Determine the result type of a message send based on the receiver type, method, and the kind of messa...
static const ObjCMethodDecl * findExplicitInstancetypeDeclarer(const ObjCMethodDecl *MD, QualType instancetype)
Look for an ObjC method whose result type exactly matches the given type.
static void DiagnoseCStringFormatDirectiveInObjCAPI(Sema &S, ObjCMethodDecl *Method, Selector Sel, Expr **Args, unsigned NumArgs)
Diagnose use of s directive in an NSString which is being passed as formatting string to formatting m...
static bool isMethodDeclaredInRootProtocol(Sema &S, const ObjCMethodDecl *M)
static bool validateBoxingMethod(Sema &S, SourceLocation Loc, const ObjCInterfaceDecl *Class, Selector Sel, const ObjCMethodDecl *Method)
Emits an error if the given method does not exist, or if the return type is not an Objective-C object...
static void checkFoundationAPI(Sema &S, SourceLocation Loc, const ObjCMethodDecl *Method, ArrayRef< Expr * > Args, QualType ReceiverType, bool IsClassObjectCall)
static void addFixitForObjCARCConversion(Sema &S, DiagBuilderT &DiagB, CheckedConversionKind CCK, SourceLocation afterLParen, QualType castType, Expr *castExpr, Expr *realCast, const char *bridgeKeyword, const char *CFBridgeName)
static ExprResult CheckObjCCollectionLiteralElement(Sema &S, Expr *Element, QualType T, bool ArrayLiteral=false)
Check that the given expression is a valid element of an Objective-C collection literal.
This file declares semantic analysis for Objective-C.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
One specifier in an @available expression.
StringRef getPlatform() const
VersionTuple getVersion() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Abstract class common to all of the C++ "named"/"keyword" casts.
Represents a C++ nested-name-specifier or a global scope specifier.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression representing the value of the expression if the condition eva...
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression representing the value of the expression if the condition eval...
Represents the canonical version of C arrays with a specified constant size.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isInvalidDecl() const
SourceLocation getLocation() const
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
TranslationUnitDecl * getTranslationUnitDecl()
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isIdentifier() const
Predicate functions for querying what type of name this is.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
ExplicitCastExpr - An explicit cast written in the source code.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenLValueCasts() LLVM_READONLY
Skip past any parentheses and lvalue casts which might surround this expression until reaching a fixe...
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsFloat - Return true if this is a constant which we can fold and convert to a floating point...
bool isObjCSelfExpr() const
Check if this expression is the ObjC 'self' implicit parameter.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
Represents difference between two FPOptions values.
static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc, CharSourceRange FromRange, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code from FromRange at a specific location.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
QualType getReturnType() const
Represents a C11 generic selection.
AssociationTy< false > Association
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Describes the sequence of initializations required to initialize a given object or reference with a s...
Describes an entity that is being initialized.
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
static bool isAsciiIdentifierContinueChar(char c, const LangOptions &LangOpts)
Returns true if the given character could appear in an identifier.
Represents the results of name lookup.
bool empty() const
Return true if no decls were found.
SourceLocation getNameLoc() const
Gets the location of the identifier.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
@ NSDict_dictionaryWithObjectsForKeysCount
@ NSArr_arrayWithObjectsCount
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
static ObjCArrayLiteral * Create(const ASTContext &C, ArrayRef< Expr * > Elements, QualType T, ObjCMethodDecl *Method, bool ExpressibleAsConstantInitializer, SourceRange SR)
A runtime availability query.
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
ObjCBoxedExpr - used for generalized expression boxing.
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
ObjCMethodDecl * getMethod(Selector Sel, bool isInstance, bool AllowHidden=false) const
ObjCPropertyDecl * FindPropertyDeclaration(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyDeclaration - Finds declaration of the property given its name in 'PropertyId' and return...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
static ObjCDictionaryLiteral * Create(const ASTContext &C, ArrayRef< ObjCDictionaryElement > VK, bool HasPackExpansions, QualType T, ObjCMethodDecl *Method, bool ExpressibleAsConstantInitializer, SourceRange SR)
ObjCEncodeExpr, used for @encode in Objective-C.
Represents an ObjC class declaration.
ObjCMethodDecl * lookupClassMethod(Selector Sel) const
Lookup a class method for a given selector.
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
ObjCMethodDecl * lookupInstanceMethod(Selector Sel) const
Lookup an instance method for a given selector.
ObjCMethodDecl * lookupPrivateClassMethod(const Selector &Sel)
ObjCMethodDecl * getCategoryClassMethod(Selector Sel) const
ObjCMethodDecl * lookupPrivateMethod(const Selector &Sel, bool Instance=true) const
Lookup a method in the classes implementation hierarchy.
ObjCMethodDecl * lookupMethod(Selector Sel, bool isInstance, bool shallowCategoryLookup=false, bool followSuper=true, const ObjCCategoryDecl *C=nullptr) const
lookupMethod - This method returns an instance/class method by looking in the class,...
ObjCInterfaceDecl * getSuperClass() const
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getAccessControl() const
QualType getUsageType(QualType objectType) const
Retrieve the type of this instance variable when viewed as a member of a specific object type.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
static ObjCMessageExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, SourceLocation LBracLoc, SourceLocation SuperLoc, bool IsInstanceSuper, QualType SuperType, Selector Sel, ArrayRef< SourceLocation > SelLocs, ObjCMethodDecl *Method, ArrayRef< Expr * > Args, SourceLocation RBracLoc, bool isImplicit)
Create a message send to super.
Selector getSelector() const
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ArrayRef< ParmVarDecl * > parameters() const
bool isPropertyAccessor() const
void getOverriddenMethods(SmallVectorImpl< const ObjCMethodDecl * > &Overridden) const
Return overridden methods for the given Method.
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
const ObjCPropertyDecl * findPropertyDecl(bool CheckOverrides=true) const
Returns the property associated with this method's selector.
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
SourceLocation getBeginLoc() const LLVM_READONLY
bool isDirectMethod() const
True if the method is tagged as objc_direct.
Selector getSelector() const
bool isInstanceMethod() const
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
QualType getReturnType() const
bool isClassMethod() const
ObjCInterfaceDecl * getClassInterface()
bool isGlobalAllocation() const
Represents a pointer to an Objective C object.
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
ObjCPropertyDecl * getExplicitProperty() const
ObjCMethodDecl * getImplicitPropertyGetter() const
bool isExplicitProperty() const
Represents an Objective-C protocol declaration.
bool hasDefinition() const
Determine whether this protocol has a definition.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
bool isNonRuntimeProtocol() const
This is true iff the protocol is tagged with the objc_non_runtime_protocol attribute.
ObjCProtocolExpr used for protocol expression in Objective-C.
bool hasConstantEmptyCollections() const
bool hasConstantCFBooleans() const
ObjCSelectorExpr used for @selector in Objective-C.
ObjCStringLiteral, used for Objective-C string literals i.e.
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
ParenExpr - This represents a parenthesized expression, e.g.
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
Expr * getResultExpr()
Return the result-bearing expression, or null if there is none.
A (possibly-)qualified type.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
QualType withConst() const
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isInObjcMethodScope() const
isInObjcMethodScope - Return true if this scope is, or is contained in, an Objective-C method body.
static Selector constructSetterSelector(IdentifierTable &Idents, SelectorTable &SelTable, const IdentifierInfo *Name)
Return the default setter selector for the given identifier.
Smart pointer class that efficiently represents Objective-C method names.
std::string getAsString() const
Derive the full selector name (e.g.
ObjCMethodFamily getMethodFamily() const
Derive the conventional family of this method.
bool isUnarySelector() const
ObjCStringFormatFamily getStringFormatFamily() const
unsigned getNumArgs() const
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
ObjCMessageKind getObjCMessageKind(Scope *S, IdentifierInfo *Name, SourceLocation NameLoc, bool IsSuper, bool HasTrailingDot, ParsedType &ReceiverType)
ObjCMethodDecl * ValueWithBytesObjCTypeMethod
The declaration of the valueWithBytes:objCType: method.
ExprResult BuildObjCDictionaryLiteral(SourceRange SR, MutableArrayRef< ObjCDictionaryElement > Elements)
ExprResult HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, Expr *BaseExpr, SourceLocation OpLoc, DeclarationName MemberName, SourceLocation MemberLoc, SourceLocation SuperLoc, QualType SuperType, bool Super)
HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an objective C interface.
ExprResult BuildInstanceMessage(Expr *Receiver, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args, bool isImplicit=false)
Build an Objective-C instance message expression.
const ObjCMethodDecl * SelectorsForTypoCorrection(Selector Sel, QualType ObjectType=QualType())
ExprResult ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool WarnMultipleSelectors)
ParseObjCSelectorExpression - Build selector expression for @selector.
ExprResult BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args, bool isImplicit=false)
Build an Objective-C class message expression.
ExprResult BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number)
BuildObjCNumericLiteral - builds an ObjCBoxedExpr AST node for the numeric literal expression.
bool AreMultipleMethodsInGlobalPool(Selector Sel, ObjCMethodDecl *BestMethod, SourceRange R, bool receiverIdOrClass, SmallVectorImpl< ObjCMethodDecl * > &Methods)
ObjCMethodDecl * LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupInstanceMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ExprResult ActOnObjCBridgedCast(Scope *S, SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, ParsedType Type, SourceLocation RParenLoc, Expr *SubExpr)
ObjCLiteralKind CheckLiteralKind(Expr *FromE)
ExprResult BuildObjCEncodeExpression(SourceLocation AtLoc, TypeSourceInfo *EncodedTypeInfo, SourceLocation RParenLoc)
bool CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose=true)
ExprResult BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements)
ObjCInterfaceDecl * NSArrayDecl
The declaration of the Objective-C NSArray class.
ExprResult ActOnClassPropertyRefExpr(const IdentifierInfo &receiverName, const IdentifierInfo &propertyName, SourceLocation receiverNameLoc, SourceLocation propertyNameLoc)
void CheckObjCCircularContainer(ObjCMessageExpr *Message)
Check whether receiver is mutable ObjC container which attempts to add itself into the container.
ObjCInterfaceDecl * getObjCInterfaceDecl(const IdentifierInfo *&Id, SourceLocation IdLoc, bool TypoCorrection=false)
Look for an Objective-C class in the translation unit.
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
bool IvarBacksCurrentMethodAccessor(ObjCInterfaceDecl *IFace, ObjCMethodDecl *Method, ObjCIvarDecl *IV)
IvarBacksCurrentMethodAccessor - This routine returns 'true' if 'IV' is an ivar synthesized for 'Meth...
ExprResult BuildClassMessageImplicit(QualType ReceiverType, bool isSuperReceiver, SourceLocation Loc, Selector Sel, ObjCMethodDecl *Method, MultiExprArg Args)
ObjCInterfaceDecl * NSNumberDecl
The declaration of the Objective-C NSNumber class.
void CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr)
ExprResult BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr)
BuildObjCBoxedExpr - builds an ObjCBoxedExpr AST node for the '@' prefixed parenthesized expression.
ObjCInterfaceDecl * NSValueDecl
The declaration of the Objective-C NSValue class.
Selector RespondsToSelectorSel
will hold 'respondsToSelector:'
bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method, const ObjCMethodDecl *PrevMethod, MethodMatchStrategy strategy=MMS_strict)
MatchTwoMethodDeclarations - Checks if two methods' type match and returns true, or false,...
bool CheckMessageArgumentTypes(const Expr *Receiver, QualType ReceiverType, MultiExprArg Args, Selector Sel, ArrayRef< SourceLocation > SelectorLocs, ObjCMethodDecl *Method, bool isClassMessage, bool isSuperMessage, SourceLocation lbrac, SourceLocation rbrac, SourceRange RecRange, QualType &ReturnType, ExprValueKind &VK)
CheckMessageArgumentTypes - Check types in an Obj-C message send.
ObjCInterfaceDecl * NSStringDecl
The declaration of the Objective-C NSString class.
llvm::MapVector< Selector, SourceLocation > ReferencedSelectors
Method selectors used in a @selector expression.
ObjCMethodDecl * LookupFactoryMethodInGlobalPool(Selector Sel, SourceRange R, bool receiverIdOrClass=false)
LookupFactoryMethodInGlobalPool - Returns the method and warns if there are multiple signatures.
ObjCMethodDecl * StringWithUTF8StringMethod
The declaration of the stringWithUTF8String: method.
bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall)
Check whether the given method, which must be in the 'init' family, is a valid member of that family.
QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
FindCompositeObjCPointerType - Helper method to find composite type of two objective-c pointer types ...
ExprResult BuildObjCStringLiteral(SourceLocation AtLoc, StringLiteral *S)
ObjCInterfaceDecl * NSDictionaryDecl
The declaration of the Objective-C NSDictionary class.
ObjCMethodDecl * ArrayWithObjectsMethod
The declaration of the arrayWithObjects:count: method.
ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc, SourceLocation EncodeLoc, SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc)
QualType QIDNSCopying
id<NSCopying> type.
bool CheckObjCString(Expr *Arg)
CheckObjCString - Checks that the argument to the builtin CFString constructor is correct Note: It mi...
ExprResult ActOnClassMessage(Scope *S, ParsedType Receiver, Selector Sel, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args)
void CheckTollFreeBridgeCast(QualType castType, Expr *castExpr)
bool CheckConversionToObjCLiteral(QualType DstType, Expr *&SrcExpr, bool Diagnose=true)
ObjCMethodDecl * tryCaptureObjCSelf(SourceLocation Loc)
Try to capture an implicit reference to 'self'.
ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs, ArrayRef< Expr * > Strings)
ExprResult ActOnObjCBoolLiteral(SourceLocation AtLoc, SourceLocation ValueLoc, bool Value)
ObjCMethodDecl * DictionaryWithObjectsMethod
The declaration of the dictionaryWithObjects:forKeys:count: method.
QualType NSStringPointer
Pointer to NSString type (NSString *).
ExprResult BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr)
ObjCProtocolDecl * LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Find the protocol with the given name, if any.
QualType NSNumberPointer
Pointer to NSNumber type (NSNumber *).
DeclResult LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S, IdentifierInfo *II)
The parser has read a name in, and Sema has detected that we're currently inside an ObjC method.
ObjCMethodDecl * NSNumberLiteralMethods[NSAPI::NumNSNumberLiteralMethods]
The Objective-C NSNumber methods used to create NSNumber literals.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
QualType getMessageSendResultType(const Expr *Receiver, QualType ReceiverType, ObjCMethodDecl *Method, bool isClassMessage, bool isSuperMessage)
Determine the result of a message send expression based on the type of the receiver,...
ExprResult ParseObjCProtocolExpression(IdentifierInfo *ProtocolName, SourceLocation AtLoc, SourceLocation ProtoLoc, SourceLocation LParenLoc, SourceLocation ProtoIdLoc, SourceLocation RParenLoc)
ParseObjCProtocolExpression - Build protocol expression for @protocol.
ExprResult BuildInstanceMessageImplicit(Expr *Receiver, QualType ReceiverType, SourceLocation Loc, Selector Sel, ObjCMethodDecl *Method, MultiExprArg Args)
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
ObjCMessageKind
Describes the kind of message expression indicated by a message send that starts with an identifier.
@ ObjCClassMessage
The message is a class message, and the identifier is a type name.
@ ObjCInstanceMessage
The message is an instance message.
@ ObjCSuperMessage
The message is sent to 'super'.
ExprResult LookupInObjCMethod(LookupResult &LookUp, Scope *S, IdentifierInfo *II, bool AllowBuiltinCreation=false)
The parser has read a name in, and Sema has detected that we're currently inside an ObjC method.
QualType NSValuePointer
Pointer to NSValue type (NSValue *).
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
ExprResult ActOnInstanceMessage(Scope *S, Expr *Receiver, Selector Sel, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args)
bool GetFormatNSStringIdx(const FormatAttr *Format, unsigned &Idx)
ExprResult BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV)
ExprResult ActOnSuperMessage(Scope *S, SourceLocation SuperLoc, Selector Sel, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args)
CastKind PrepareCastToObjCObjectPointer(ExprResult &E)
Prepare a conversion of the given expression to an ObjC object pointer type.
bool CollectMultipleMethodsInGlobalPool(Selector Sel, SmallVectorImpl< ObjCMethodDecl * > &Methods, bool InstanceFirst, bool CheckTheOther, const ObjCObjectType *TypeBound=nullptr)
We first select the type of the method: Instance or Factory, then collect all methods with that type.
bool checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose=true)
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
void diagnoseARCUnbridgedCast(Expr *e)
Given that we saw an expression with the ARCUnbridgedCastTy placeholder type, complain bitterly.
ObjCMethodDecl * LookupMethodInQualifiedType(Selector Sel, const ObjCObjectPointerType *OPT, bool IsInstance)
LookupMethodInQualifiedType - Lookups up a method in protocol qualifier list of a qualified objective...
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
bool CheckTollFreeBridgeStaticCast(QualType castType, Expr *castExpr, CastKind &Kind)
bool CheckObjCARCUnavailableWeakConversion(QualType castType, QualType ExprType)
bool CheckObjCMethodCall(ObjCMethodDecl *Method, SourceLocation loc, ArrayRef< const Expr * > Args)
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr, Expr *IndexExpr, ObjCMethodDecl *getterMethod, ObjCMethodDecl *setterMethod)
Build an ObjC subscript pseudo-object expression, given that that's supported by the runtime.
bool isSelfExpr(Expr *RExpr)
Private Helper predicate to check for 'self'.
ExprResult ActOnObjCAvailabilityCheckExpr(llvm::ArrayRef< AvailabilitySpec > AvailSpecs, SourceLocation AtLoc, SourceLocation RParen)
bool isKnownName(StringRef name)
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
Sema - This implements semantic analysis and AST building for C.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
bool FormatStringHasSArg(const StringLiteral *FExpr)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
ASTContext & getASTContext() const
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const LangOptions & LangOpts
ExprResult DefaultLvalueConversion(Expr *E)
static bool isCast(CheckedConversionKind CCK)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
SourceManager & getSourceManager() const
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
SourceManager & SourceMgr
DiagnosticsEngine & Diags
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
CompoundStmt * getSubStmt()
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
tokloc_iterator tokloc_begin() const
tokloc_iterator tokloc_end() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
StringRef getString() const
The top declaration context.
Represents a declaration of a type.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isBlockPointerType() const
const ObjCObjectPointerType * getAsObjCQualifiedClassType() const
bool isBooleanType() const
const ObjCObjectPointerType * getAsObjCQualifiedIdType() const
bool isObjCBuiltinType() const
bool isVoidPointerType() const
bool isObjCARCBridgableType() const
Determine whether the given type T is a "bridgable" Objective-C type, which is either an Objective-C ...
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool canHaveNullability(bool ResultIfUnknown=true) const
Determine whether the given type can have a nullability specifier applied to it, i....
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isCARCBridgableType() const
Determine whether the given type T is a "bridgeable" C type.
bool isObjCIdType() const
bool isObjCClassOrClassKindOfType() const
Whether the type is Objective-C 'Class' or a __kindof type of an Class type, e.g.,...
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCObjectPointerType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
std::optional< ArrayRef< QualType > > getObjCSubstitutions(const DeclContext *dc) const
Retrieve the set of substitutions required when accessing a member of the Objective-C receiver type t...
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
const ObjCObjectType * getAsObjCInterfaceType() const
bool isAnyPointerType() const
bool isObjCIdOrObjectKindOfType(const ASTContext &ctx, const ObjCObjectType *&bound) const
Whether the type is Objective-C 'id' or a __kindof type of an object type, e.g., __kindof NSView * or...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
TypedefNameDecl * getDecl() const
Simple class containing the result of Sema::CorrectTypo.
DeclClass * getCorrectionDeclAs() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Expr * getSubExpr() const
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a C++ unqualified-id that has been parsed.
void setImplicitSelfParam(const IdentifierInfo *Id)
Specify that this unqualified-id is an implicit 'self' parameter.
void setType(QualType newType)
bool isCommitable() const
edit_iterator edit_begin() const
SmallVectorImpl< Edit >::const_iterator edit_iterator
edit_iterator edit_end() const
Retains information about a function, method, or block that is currently being parsed.
bool ObjCIsDesignatedInit
True when this is a method marked as a designated initializer.
bool ObjCWarnForNoInitDelegation
This starts true for a secondary initializer method and will be set to false if there is an invocatio...
bool ObjCIsSecondaryInit
True when this is an initializer method not marked as a designated initializer within a class that ha...
bool ObjCWarnForNoDesignatedInitChain
This starts true for a method marked as designated initializer and will be set to false if there is a...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
constexpr Variable var(Literal L)
Returns the variable of L.
bool rewriteObjCRedundantCallWithLiteral(const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
bool followsCreateRule(const FunctionDecl *FD)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ NonNull
Values of this type can never be null.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_ObjCSubscript
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
ObjCMethodFamily
A family of Objective-C methods.
@ OMF_None
No particular method family.
MutableArrayRef< Expr * > MultiExprArg
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ObjCBridgeCastKind
The kind of bridging performed by the Objective-C bridge cast.
@ OBC_Bridge
Bridging via __bridge, which does nothing but reinterpret the bits.
@ OBC_BridgeTransfer
Bridging via __bridge_transfer, which transfers ownership of an Objective-C pointer into ARC.
@ OBC_BridgeRetained
Bridging via __bridge_retain, which makes an ARC object available as a +1 C pointer.
CastKind
CastKind - The kind of operation required for a conversion.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
CheckedConversionKind
The kind of conversion being performed.
@ Implicit
An implicit conversion.
@ CStyleCast
A C-style cast.
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
@ OtherCast
A cast other than a C-style cast.
@ FunctionalCast
A functional-style cast.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
EvalResult is a struct with detailed info about an evaluated expression.
An element in an Objective-C dictionary literal.
a linked list of methods with the same selector name but different signatures.
ObjCMethodDecl * getMethod() const
ObjCMethodList * getNext() const
CharSourceRange getFileRange(SourceManager &SM) const
CharSourceRange getInsertFromRange(SourceManager &SM) const