31#include "llvm/ADT/SmallString.h"
32#include "llvm/Support/ConvertUTF.h"
49 if (Strings.size() != 1) {
54 for (
Expr *
E : Strings) {
55 S = cast<StringLiteral>(
E);
58 if (!S->isOrdinary()) {
59 Diag(S->getBeginLoc(), diag::err_cfstring_literal_not_string_constant)
60 << S->getSourceRange();
65 StrBuf += S->getString();
68 StrLocs.append(S->tokloc_begin(), S->tokloc_end());
74 assert(CAT &&
"String literal not of constant array type!");
76 CAT->
getElementType(), llvm::APInt(32, StrBuf.size() + 1),
nullptr,
79 false, StrTy, &StrLocs[0],
102 std::string StringClass(
getLangOpts().ObjCConstantStringClass);
104 if (StringClass.empty())
105 NSIdent = &Context.
Idents.
get(
"NSConstantString");
107 NSIdent = &Context.
Idents.
get(StringClass);
118 Diag(S->getBeginLoc(), diag::err_no_nsconstant_string_class)
119 << NSIdent << S->getSourceRange();
159 S.
Diag(
Loc, diag::err_undeclared_boxing_method) << Sel <<
Class->getName();
166 S.
Diag(
Loc, diag::err_objc_literal_method_sig)
179 switch (LiteralKind) {
197 llvm_unreachable(
"LiteralKind can't be converted into a ClassKind");
210 S.
Diag(
Loc, diag::err_undeclared_objc_literal_class)
211 << II->
getName() << LiteralKind;
213 }
else if (!
Decl->hasDefinition() && !S.
getLangOpts().DebuggerObjCLiteral) {
214 S.
Diag(
Loc, diag::err_undeclared_objc_literal_class)
215 <<
Decl->getName() << LiteralKind;
252 bool isLiteral =
false,
254 std::optional<NSAPI::NSNumberLiteralMethodKind> Kind =
255 S.NSAPIObj->getNSNumberFactoryMethodKind(NumberType);
259 S.
Diag(
Loc, diag::err_invalid_nsnumber_type)
266 if (S.NSNumberLiteralMethods[*Kind])
267 return S.NSNumberLiteralMethods[*Kind];
269 Selector Sel = S.NSAPIObj->getNSNumberLiteralSelector(*Kind,
276 if (!S.NSNumberDecl) {
279 if (!S.NSNumberDecl) {
284 if (S.NSNumberPointer.isNull()) {
292 if (!Method && S.
getLangOpts().DebuggerObjCLiteral) {
297 ReturnTInfo, S.NSNumberDecl,
307 NumberType,
nullptr,
SC_None,
nullptr);
317 S.NSNumberLiteralMethods[*Kind] = Method;
331 switch (Char->getKind()) {
334 NumberType = Context.
CharTy;
367 Number = ConvertedNumber.
get();
380 Value ? tok::kw_true : tok::kw_false);
386 CK_IntegralToBoolean);
396 bool ArrayLiteral =
false) {
398 if (Element->isTypeDependent())
408 if (S.
getLangOpts().CPlusPlus && Element->getType()->isRecordType()) {
416 return Seq.Perform(S, Entity, Kind, Element);
419 Expr *OrigElement = Element;
428 if (!Element->getType()->isObjCObjectPointerType() &&
429 !Element->getType()->isBlockPointerType()) {
430 bool Recovered =
false;
433 if (isa<IntegerLiteral>(OrigElement) ||
434 isa<CharacterLiteral>(OrigElement) ||
435 isa<FloatingLiteral>(OrigElement) ||
436 isa<ObjCBoolLiteralExpr>(OrigElement) ||
437 isa<CXXBoolLiteralExpr>(OrigElement)) {
440 int Which = isa<CharacterLiteral>(OrigElement) ? 1
441 : (isa<CXXBoolLiteralExpr>(OrigElement) ||
442 isa<ObjCBoolLiteralExpr>(OrigElement)) ? 2
459 else if (
StringLiteral *String = dyn_cast<StringLiteral>(OrigElement)) {
460 if (String->isOrdinary()) {
476 S.
Diag(Element->getBeginLoc(), diag::err_invalid_collection_element)
477 << Element->getType();
483 dyn_cast<ObjCStringLiteral>(OrigElement)) {
485 unsigned numConcat = SL->getNumConcatenated();
488 bool hasMacro =
false;
489 for (
unsigned i = 0; i < numConcat ; ++i)
490 if (SL->getStrTokenLoc(i).isMacroID()) {
495 S.
Diag(Element->getBeginLoc(),
496 diag::warn_concatenated_nsarray_literal)
497 << Element->getType();
507 Element->getBeginLoc(), Element);
525 ValueExpr = RValue.
get();
543 if (
auto *CE = dyn_cast<ImplicitCastExpr>(ValueExpr))
544 if (CE->getCastKind() == CK_ArrayToPointerDecay)
546 dyn_cast<StringLiteral>(CE->getSubExpr()->IgnoreParens())) {
547 assert((SL->isOrdinary() || SL->isUTF8()) &&
548 "unexpected character encoding");
549 StringRef Str = SL->getString();
550 const llvm::UTF8 *StrBegin = Str.bytes_begin();
551 const llvm::UTF8 *StrEnd = Str.bytes_end();
553 if (llvm::isLegalUTF8String(&StrBegin, StrEnd)) {
558 return new (Context)
ObjCBoxedExpr(CE, BoxedType,
nullptr, SR);
561 Diag(SL->getBeginLoc(), diag::warn_objc_boxing_invalid_utf8_string)
571 if (!BoxingMethod &&
getLangOpts().DebuggerObjCLiteral) {
596 stringWithUTF8String, BoxingMethod))
605 std::optional<NullabilityKind> Nullability =
620 dyn_cast<CharacterLiteral>(ValueExpr->
IgnoreParens())) {
623 switch (Char->getKind()) {
626 ValueType = Context.
CharTy;
648 if (!ET->getDecl()->isComplete()) {
649 Diag(
Loc, diag::err_objc_incomplete_boxed_expression_type)
655 ET->getDecl()->getIntegerType());
681 if (!BoxingMethod &&
getLangOpts().DebuggerObjCLiteral) {
704 Params.push_back(
bytes);
714 Params.push_back(
type);
721 ValueWithBytesObjCType, BoxingMethod))
728 Diag(
Loc, diag::err_objc_non_trivially_copyable_boxed_expression_type)
738 Diag(
Loc, diag::err_objc_illegal_boxed_expression_type)
761 ValueExpr = ConvertedValueExpr.
get();
774 assert(!
getLangOpts().isSubscriptPointerArithmetic());
780 "base or index cannot have dependent type here");
798 getterMethod, setterMethod, RB);
820 if (!Method &&
getLangOpts().DebuggerObjCLiteral) {
837 Params.push_back(objects);
845 Params.push_back(cnt);
860 diag::note_objc_literal_method_param)
867 if (!Method->
parameters()[1]->getType()->isIntegerType()) {
871 diag::note_objc_literal_method_param)
887 Expr **ElementsBuffer = Elements.data();
888 for (
unsigned I = 0, N = Elements.size(); I != N; ++I) {
890 SemaRef, ElementsBuffer[I], RequiredType,
true);
894 ElementsBuffer[I] = Converted.
get();
910 if (Literal->isValueDependent() || Literal->isTypeDependent())
916 struct APSIntCompare {
917 bool operator()(
const llvm::APSInt &LHS,
const llvm::APSInt &RHS)
const {
918 return llvm::APSInt::compareValues(LHS, RHS) < 0;
922 llvm::DenseMap<StringRef, SourceLocation> StringKeys;
923 std::map<llvm::APSInt, SourceLocation, APSIntCompare> IntegralKeys;
926 auto Pair = Map.insert({Key,
Loc});
928 S.
Diag(
Loc, diag::warn_nsdictionary_duplicate_key);
929 S.
Diag(Pair.first->second, diag::note_nsdictionary_duplicate_key_here);
933 for (
unsigned Idx = 0, End = Literal->getNumElements(); Idx != End; ++Idx) {
934 Expr *Key = Literal->getKeyValueElement(Idx).Key->IgnoreParenImpCasts();
936 if (
auto *StrLit = dyn_cast<ObjCStringLiteral>(Key)) {
937 StringRef Bytes = StrLit->getString()->getBytes();
939 checkOneKey(StringKeys, Bytes,
Loc);
942 if (
auto *BE = dyn_cast<ObjCBoxedExpr>(Key)) {
943 Expr *Boxed = BE->getSubExpr();
948 checkOneKey(StringKeys, Str->getBytes(),
Loc);
955 checkOneKey(IntegralKeys,
Result.Val.getInt(),
Loc);
981 if (!Method &&
getLangOpts().DebuggerObjCLiteral) {
998 Params.push_back(objects);
1006 Params.push_back(keys);
1014 Params.push_back(cnt);
1030 diag::note_objc_literal_method_param)
1064 diag::note_objc_literal_method_param)
1072 QualType CountType = Method->parameters()[2]->getType();
1076 Diag(Method->parameters()[2]->getLocation(),
1077 diag::note_objc_literal_method_param)
1087 QualType ValuesT = DictionaryWithObjectsMethod->parameters()[0]->getType();
1089 QualType KeysT = DictionaryWithObjectsMethod->parameters()[1]->getType();
1094 bool HasPackExpansions =
false;
1105 if (
Value.isInvalid())
1108 Element.Key = Key.
get();
1109 Element.Value =
Value.get();
1111 if (Element.EllipsisLoc.isInvalid())
1114 if (!Element.Key->containsUnexpandedParameterPack() &&
1115 !Element.Value->containsUnexpandedParameterPack()) {
1116 Diag(Element.EllipsisLoc,
1117 diag::err_pack_expansion_without_parameter_packs)
1119 Element.Value->getEndLoc());
1123 HasPackExpansions =
true;
1131 DictionaryWithObjectsMethod, SR);
1133 return SemaRef.MaybeBindToTemporary(Literal);
1148 diag::err_incomplete_type_objc_at_encode,
1155 if (!NotEncodedT.
isNull())
1156 Diag(AtLoc, diag::warn_incomplete_encoded_type)
1157 << EncodedType << NotEncodedT;
1164 return new (Context)
ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc);
1190 bool Warned =
false;
1193 if (MatchingMethodDecl == Method ||
1201 S.
Diag(AtLoc, diag::warn_multiple_selectors)
1207 S.
Diag(MatchingMethodDecl->
getLocation(), diag::note_method_declared_at)
1218 bool WarnMultipleSelectors) {
1219 if (!WarnMultipleSelectors ||
1222 bool Warned =
false;
1229 Method, InstMethList))
1235 Method, ClsMethList) || Warned)
1251 assert(Method->
getSelector() == Sel &&
"Method with wrong selector in method list");
1254 DirectMethod = Method;
1259 return DirectMethod;
1274 S, Sel,
Iter->second.first, onlyDirect, anyDirect);
1276 S, Sel,
Iter->second.second, onlyDirect, anyDirect);
1278 return DirectInstance ? DirectInstance : DirectClass;
1307 bool WarnMultipleSelectors) {
1316 Selector MatchedSel = OM->getSelector();
1319 Diag(SelLoc, diag::warn_undeclared_selector_with_typo)
1320 << Sel << MatchedSel
1324 Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
1327 WarnMultipleSelectors);
1329 bool onlyDirect =
true;
1330 bool anyDirect =
false;
1335 Diag(AtLoc, diag::err_direct_selector_expression)
1339 }
else if (anyDirect) {
1345 if (LikelyTargetMethod && LikelyTargetMethod->
isDirectMethod()) {
1346 Diag(AtLoc, diag::warn_potentially_direct_selector_expression) << Sel;
1348 diag::note_direct_method_declared_at)
1350 }
else if (!LikelyTargetMethod) {
1353 Diag(AtLoc, diag::warn_strict_potentially_direct_selector_expression)
1356 diag::note_direct_method_declared_at)
1377 Diag(AtLoc, diag::err_arc_illegal_selector) <<
1407 Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
1411 Diag(ProtoLoc, diag::err_objc_non_runtime_protocol_in_protocol_expr)
1414 Diag(ProtoLoc, diag::err_atprotocol_protocol) << PDecl;
1424 return new (Context)
ObjCProtocolExpr(Ty, PDecl, AtLoc, ProtoIdLoc, RParenLoc);
1470 bool isClassMessage,
1471 bool isSuperMessage) {
1472 assert(Method &&
"Must have a method");
1482 if (
auto nullability =
1507 if (isSuperMessage) {
1510 return transferNullability(
1529 return transferNullability(ReceiverType);
1535 bool isClassMessage,
1536 bool isSuperMessage) {
1540 SemaRef, ReceiverType, Method, isClassMessage, isSuperMessage);
1543 if (isClassMessage) {
1555 cast<ImplicitParamDecl>(
1557 ->getDeclContext());
1564 NewResultType, NewResultType);
1565 return NewResultType;
1577 unsigned receiverNullabilityIdx = 0;
1578 if (std::optional<NullabilityKind> nullability =
1582 receiverNullabilityIdx = 1 +
static_cast<unsigned>(*nullability);
1585 unsigned resultNullabilityIdx = 0;
1586 if (std::optional<NullabilityKind> nullability =
1590 resultNullabilityIdx = 1 +
static_cast<unsigned>(*nullability);
1595 static const uint8_t
None = 0;
1596 static const uint8_t
NonNull = 1;
1599 static const uint8_t nullabilityMap[4][4] = {
1607 unsigned newResultNullabilityIdx
1608 = nullabilityMap[receiverNullabilityIdx][resultNullabilityIdx];
1609 if (newResultNullabilityIdx == resultNullabilityIdx)
1615 if (
auto attributed = dyn_cast<AttributedType>(resultType.
getTypePtr())) {
1616 resultType = attributed->getModifiedType();
1623 if (newResultNullabilityIdx > 0) {
1628 resultType, resultType);
1647 dyn_cast<ObjCCategoryImplDecl>(impl)) {
1648 iface = catImpl->getCategoryDecl();
1650 iface = impl->getClassInterface();
1660 for (
unsigned i = 0, e = overrides.size(); i != e; ++i) {
1682 SourceRange range = overridden->getReturnTypeSourceRange();
1685 loc = overridden->getLocation();
1686 Diag(loc, diag::note_related_result_type_explicit)
1734 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
1735 SelLoc = SelectorLocs.front();
1741 for (
unsigned i = 0, e = Args.size(); i != e; i++) {
1742 if (Args[i]->isTypeDependent())
1754 Args[i] = result.
get();
1759 DiagID = diag::err_arc_method_not_found;
1761 DiagID = isClassMessage ? diag::warn_class_method_not_found
1762 : diag::warn_inst_method_not_found;
1767 DiagID = diag::err_method_not_found_with_typo;
1769 DiagID = isClassMessage ? diag::warn_class_method_not_found_with_typo
1770 : diag::warn_instance_method_not_found_with_typo;
1772 SourceRange SelectorRange(SelectorLocs.front(), SelectorLocs.back());
1774 Diag(SelLoc, DiagID)
1775 << Sel<< isClassMessage << MatchedSel
1778 Diag(SelLoc, DiagID) << Sel<< isClassMessage << MatchedSel;
1781 Diag(SelLoc, DiagID)
1782 << Sel << isClassMessage <<
SourceRange(SelectorLocs.front(),
1783 SelectorLocs.back());
1787 Diag(ThisClass->getLocation(), diag::note_receiver_class_declared);
1789 if (ThisClass->lookupClassMethod(Sel))
1790 Diag(RecRange.
getBegin(), diag::note_receiver_expr_here)
1792 ThisClass->getNameAsString());
1809 isClassMessage, isSuperMessage);
1818 if (Args.size() < NumNamedArgs) {
1819 Diag(SelLoc, diag::err_typecheck_call_too_few_args)
1820 << 2 << NumNamedArgs << static_cast<unsigned>(Args.size())
1827 std::optional<ArrayRef<QualType>> typeArgs =
1829 bool IsError =
false;
1830 for (
unsigned i = 0; i < NumNamedArgs; i++) {
1832 if (Args[i]->isTypeDependent())
1835 Expr *argExpr = Args[i];
1838 assert(argExpr &&
"CheckMessageArgumentTypes(): missing expression");
1840 if (param->
hasAttr<NoEscapeAttr>() &&
1842 if (
auto *BE = dyn_cast<BlockExpr>(
1844 BE->getBlockDecl()->setDoesNotEscape();
1849 !param->
hasAttr<CFConsumedAttr>())
1860 Args[i] = argE.
get();
1878 diag::err_call_incomplete_argument, argExpr))
1894 Args[i]->getType()->isBlockPointerType() &&
1898 Args[i] = arg.get();
1905 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
1906 if (Args[i]->isTypeDependent())
1912 Args[i] = Arg.
get();
1916 if (Args.size() != NumNamedArgs) {
1917 Diag(Args[NumNamedArgs]->getBeginLoc(),
1918 diag::err_typecheck_call_too_many_args)
1919 << 2 << NumNamedArgs << static_cast<unsigned>(Args.size())
1922 Args.back()->getEndLoc());
1943 if (!method)
return false;
1946 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver))
1958 if (
ObjCMethodDecl *method = iface->lookupMethod(sel, isInstance))
1963 if (
ObjCMethodDecl *method = iface->lookupPrivateMethod(sel, isInstance))
1968 for (
const auto *I : objType->
quals())
1980 for (
const auto *PROTO : OPT->
quals()) {
1981 if ((MD = PROTO->lookupMethod(Sel, Instance))) {
1999 Diag(MemberLoc, diag::err_invalid_property_name)
2009 diag::err_property_not_found_forward_class,
2010 MemberName, BaseRange))
2019 return new (Context)
2023 return new (Context)
2028 for (
const auto *I : OPT->
quals())
2038 SuperLoc, SuperType);
2040 return new (Context)
2094 if (!(PDecl->getPropertyAttributes() &
2097 diag::warn_property_access_suggest)
2098 << MemberName <<
QualType(OPT, 0) << PDecl->getName()
2103 if (Getter || Setter) {
2105 return new (Context)
2109 return new (Context)
2125 Corrected.isKeyword() ? nullptr : Corrected.getFoundDecl();
2126 if (ChosenDecl && isa<ObjCPropertyDecl>(ChosenDecl))
2127 if (cast<ObjCPropertyDecl>(ChosenDecl)->isClassProperty()) {
2130 Diag(MemberLoc, diag::err_class_property_found) << MemberName
2138 PDiag(diag::err_property_not_found_suggest)
2139 << MemberName <<
QualType(OPT, 0));
2141 TypoResult, MemberLoc,
2142 SuperLoc, SuperType, Super);
2152 diag::err_property_not_as_forward_class,
2153 MemberName, BaseExpr))
2157 diag::err_ivar_access_using_property_syntax_suggest)
2158 << MemberName <<
QualType(OPT, 0) << Ivar->getDeclName()
2163 Diag(MemberLoc, diag::err_property_not_found)
2183 if (receiverNamePtr->
isStr(
"super")) {
2185 if (
auto classDecl = CurMethod->getClassInterface()) {
2186 SuperType =
QualType(classDecl->getSuperClassType(), 0);
2187 if (CurMethod->isInstanceMethod()) {
2188 if (SuperType.
isNull()) {
2190 Diag(receiverNameLoc, diag::err_root_class_cannot_use_super)
2191 << CurMethod->getClassInterface()->getIdentifier();
2201 receiverNameLoc,
T,
true);
2212 Diag(receiverNameLoc, diag::err_expected_either) << tok::identifier
2222 GetterSel = PD->getGetterName();
2223 SetterSel = PD->getSetterName();
2259 if (Getter || Setter) {
2261 return new (Context)
2268 propertyNameLoc, receiverNameLoc, IFace);
2270 return ExprError(
Diag(propertyNameLoc, diag::err_property_not_found)
2284 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
2289 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
2290 return std::make_unique<ObjCInterfaceOrSuperCCC>(*
this);
2299 bool HasTrailingDot,
ParsedType &ReceiverType) {
2301 ReceiverType =
nullptr;
2306 if (IsSuper && S->isInObjcMethodScope())
2312 switch (
Result.getResultKind()) {
2337 Result.suppressDiagnostics();
2368 Result.getLookupNameInfo(),
Result.getLookupKind(), S,
nullptr, CCC,
2370 if (Corrected.isKeyword()) {
2402 Diag(SuperLoc, diag::err_invalid_receiver_to_message_super);
2408 Diag(SuperLoc, diag::err_no_super_class_message)
2416 Diag(SuperLoc, diag::err_root_class_cannot_use_super)
2417 <<
Class->getIdentifier();
2432 LBracLoc, SelectorLocs, RBracLoc, Args);
2439 SuperLoc, Sel,
nullptr,
2440 LBracLoc, SelectorLocs, RBracLoc, Args);
2444 bool isSuperReceiver,
2450 if (!ReceiverType.
isNull())
2453 assert(((isSuperReceiver &&
Loc.
isValid()) || receiverTypeInfo) &&
2454 "Either the super receiver location needs to be valid or the receiver "
2455 "needs valid type source information");
2473 auto Builder = S.
Diag(MsgLoc, DiagID)
2481 switch (Edit.
Kind) {
2488 Builder.AddFixItHint(
2509 bool IsClassObjectCall) {
2515 const auto *SE = dyn_cast<ObjCSelectorExpr>(Args[0]->IgnoreParens());
2519 if (!IsClassObjectCall) {
2521 if (!OPT || !OPT->getInterfaceDecl())
2524 OPT->getInterfaceDecl()->lookupInstanceMethod(SE->getSelector());
2527 OPT->getInterfaceDecl()->lookupPrivateMethod(SE->getSelector());
2532 ImpliedMethod = IT->getDecl()->lookupClassMethod(SE->getSelector());
2535 IT->getDecl()->lookupPrivateClassMethod(SE->getSelector());
2540 if (Ret->isRecordType() || Ret->isVectorType() || Ret->isExtVectorType()) {
2541 S.
Diag(
Loc, diag::warn_objc_unsafe_perform_selector)
2543 << (!Ret->isRecordType()
2545 : Ret->isUnionType() ? 1 : 0);
2547 diag::note_objc_unsafe_perform_selector_method_declared_here)
2558 Expr **Args,
unsigned NumArgs) {
2560 bool Format =
false;
2574 if (!Format || NumArgs <= Idx)
2577 Expr *FormatExpr = Args[Idx];
2582 S.
Diag(FormatExpr->
getExprLoc(), diag::warn_objc_cdirective_format_string)
2628 Diag(
Loc, diag::err_missing_open_square_message_send)
2633 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2634 SelectorSlotLocs = SelectorLocs;
2636 SelectorSlotLocs =
Loc;
2642 unsigned NumArgs = ArgsIn.size();
2643 Expr **Args = ArgsIn.data();
2644 assert(SuperLoc.
isInvalid() &&
"Message to super with dependent type");
2646 ReceiverTypeInfo, Sel, SelectorLocs,
2648 RBracLoc, isImplicit);
2655 Diag(
Loc, diag::err_invalid_receiver_class_message)
2659 assert(
Class &&
"We don't know which class we're messaging?");
2670 ? diag::err_arc_receiver_forward_class
2671 : diag::warn_receiver_forward_class),
2681 Method =
Class->lookupClassMethod(Sel);
2685 Method =
Class->lookupPrivateClassMethod(Sel);
2688 false,
false,
Class))
2696 unsigned NumArgs = ArgsIn.size();
2697 Expr **Args = ArgsIn.data();
2700 Method,
true, SuperLoc.
isValid(), LBracLoc,
2707 diag::err_illegal_message_expr_incomplete_type))
2711 Diag(SuperLoc, diag::err_messaging_super_with_direct_method)
2726 Diag(
Loc, diag::warn_direct_initialize_call);
2733 Diag(
Loc, diag::warn_direct_super_initialize_call);
2736 Diag(CurMeth->getLocation(), diag::note_method_declared_at)
2737 << CurMeth->getDeclName();
2748 Context, ReturnType, VK, LBracLoc, SuperLoc,
false,
2749 ReceiverType, Sel, SelectorLocs, Method,
ArrayRef(Args, NumArgs),
2750 RBracLoc, isImplicit);
2753 Context, ReturnType, VK, LBracLoc, ReceiverTypeInfo, Sel, SelectorLocs,
2754 Method,
ArrayRef(Args, NumArgs), RBracLoc, isImplicit);
2760 ReceiverType,
true);
2776 if (ReceiverType.
isNull())
2779 if (!ReceiverTypeInfo)
2784 nullptr, LBracLoc, SelectorLocs, RBracLoc,
2800 const auto *Protocol = dyn_cast<ObjCProtocolDecl>(M->
getDeclContext());
2805 if (
const auto *RootClass = dyn_cast_or_null<ObjCInterfaceDecl>(
2809 if (
P->getCanonicalDecl() == Protocol->getCanonicalDecl())
2849 assert((Receiver || SuperLoc.
isValid()) &&
"If the Receiver is null, the "
2850 "SuperLoc must be valid so we can "
2859 if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2860 SelectorSlotLocs = SelectorLocs;
2862 SelectorSlotLocs =
Loc;
2866 Diag(
Loc, diag::err_missing_open_square_message_send)
2888 unsigned NumArgs = ArgsIn.size();
2889 Expr **Args = ArgsIn.data();
2890 assert(SuperLoc.
isInvalid() &&
"Message to super with dependent type");
2893 SelectorLocs,
nullptr,
ArrayRef(Args, NumArgs), RBracLoc,
2903 ReceiverType = Receiver->
getType();
2916 Diag(
Loc, diag::warn_bad_receiver_type) << ReceiverType << RecRange;
2920 CK_CPointerToObjCPointerCast)
2926 CastKind Kind =
IsNull ? CK_NullToPointer : CK_IntegralToPointer;
2931 ReceiverType = Receiver->
getType();
2935 diag::err_incomplete_receiver_type))
2941 Receiver = result.
get();
2942 ReceiverType = Receiver->
getType();
2963 if (!Methods.empty()) {
2966 Method = Methods[0];
2970 Method = BestMethod;
2974 receiverIsIdLike, Methods))
2992 Diag(SelLoc, diag::warn_instance_method_on_class_found)
3005 Method = ClassDecl->lookupClassMethod(Sel);
3008 Method = ClassDecl->lookupPrivateClassMethod(Sel);
3023 if (!Methods.empty()) {
3026 Method = Methods[0];
3032 if (ID->getSuperClass())
3033 Diag(SelLoc, diag::warn_root_inst_method_not_found)
3040 Method = BestMethod;
3062 ClassDecl = OCIType->getInterfaceDecl();
3070 Loc, OCIType->getPointeeType(),
3072 ? diag::err_arc_receiver_forward_instance
3073 : diag::warn_receiver_forward_instance,
3078 forwardClass = OCIType->getInterfaceDecl();
3080 diag::note_receiver_is_id);
3095 Diag(SelLoc, diag::err_arc_may_not_respond)
3096 << OCIType->getPointeeType() << Sel << RecRange
3097 <<
SourceRange(SelectorLocs.front(), SelectorLocs.back());
3101 if (!Method && (!Receiver || !
isSelfExpr(Receiver))) {
3105 if (OCIType->qual_empty()) {
3110 if (!Methods.empty()) {
3113 Method = Methods[0];
3117 Method = BestMethod;
3124 if (Method && !forwardClass)
3125 Diag(SelLoc, diag::warn_maynot_respond)
3126 << OCIType->getInterfaceDecl()->getIdentifier()
3136 Diag(
Loc, diag::err_bad_receiver_type) << ReceiverType << RecRange;
3150 diag::err_messaging_unqualified_id_with_direct_method);
3162 diag::err_messaging_class_with_direct_method);
3175 Diag(SuperLoc, diag::err_messaging_super_with_direct_method);
3186 }
else if (ReceiverType->
isObjCIdType() && !isImplicit) {
3187 Diag(Receiver->
getExprLoc(), diag::warn_messaging_unqualified_id);
3190 if (DIFunctionScopeInfo &&
3193 bool isDesignatedInitChain =
false;
3200 if (!ID->declaresOrInheritsDesignatedInitializers() ||
3201 ID->isDesignatedInitializer(Sel)) {
3202 isDesignatedInitChain =
true;
3208 if (!isDesignatedInitChain) {
3211 assert(CurMD &&
"Current method declaration should not be null");
3213 CurMD->isDesignatedInitializerForTheInterface(&InitMethod);
3214 assert(isDesignated && InitMethod);
3217 diag::warn_objc_designated_init_non_designated_init_call :
3218 diag::warn_objc_designated_init_non_super_designated_init_call);
3220 diag::note_objc_designated_init_marked_here);
3224 if (DIFunctionScopeInfo &&
3228 Diag(SelLoc, diag::warn_objc_secondary_init_super_init_call);
3235 unsigned NumArgs = ArgsIn.size();
3236 Expr **Args = ArgsIn.data();
3243 Method, ClassMessage, SuperLoc.
isValid(),
3244 LBracLoc, RBracLoc, RecRange, ReturnType, VK))
3250 diag::err_illegal_message_expr_incomplete_type))
3279 Diag(SelLoc, diag::err_arc_illegal_explicit_message)
3284 if (Method && NumArgs >= 1) {
3285 if (
const auto *SelExp =
3286 dyn_cast<ObjCSelectorExpr>(Args[0]->IgnoreParens())) {
3287 Selector ArgSel = SelExp->getSelector();
3290 SelExp->getSourceRange());
3294 SelExp->getSourceRange());
3297 switch (SelFamily) {
3304 if (!SelMethod->
hasAttr<NSReturnsNotRetainedAttr>()) {
3307 diag::err_arc_perform_selector_retains);
3314 if (SelMethod->
hasAttr<NSReturnsRetainedAttr>()) {
3317 diag::err_arc_perform_selector_retains);
3326 Diag(SelLoc, diag::warn_arc_perform_selector_leaks);
3327 Diag(Args[0]->getExprLoc(), diag::note_used_here);
3340 Context, ReturnType, VK, LBracLoc, SuperLoc,
true,
3341 ReceiverType, Sel, SelectorLocs, Method,
ArrayRef(Args, NumArgs),
3342 RBracLoc, isImplicit);
3345 Context, ReturnType, VK, LBracLoc, Receiver, Sel, SelectorLocs, Method,
3346 ArrayRef(Args, NumArgs), RBracLoc, isImplicit);
3351 bool IsClassObjectCall = ClassMessage;
3358 if (OPT->getObjectType()->isObjCClass()) {
3360 IsClassObjectCall =
true;
3368 ReceiverType, IsClassObjectCall);
3381 Result->setDelegateInitCall(
true);
3392 if (!isImplicit && Method) {
3416 auto Pos = S.ReferencedSelectors.find(Sel);
3417 if (Pos != S.ReferencedSelectors.end() && Pos->second ==
Loc)
3418 S.ReferencedSelectors.erase(Pos);
3435 if (isa<ParenListExpr>(Receiver)) {
3451 nullptr, LBracLoc, SelectorLocs,
3485 bool isIndirect =
false;
3489 type = ref->getPointeeType();
3496 type = ptr->getPointeeType();
3503 }
else if (
const ArrayType *array =
type->getAsArrayTypeUnsafe()) {
3504 type =
QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0);
3512 if (
type->isObjCARCBridgableType())
3517 if (
type->isObjCARCBridgableType())
3538 ACCResult merge(ACCResult left, ACCResult right) {
3539 if (left == right)
return left;
3540 if (left == ACC_bottom)
return right;
3541 if (right == ACC_bottom)
return left;
3547 class ARCCastChecker :
public StmtVisitor<ARCCastChecker, ACCResult> {
3557 return type->isCARCBridgableType();
3563 : Context(Context), SourceClass(source), TargetClass(target),
3564 Diagnose(diagnose) {}
3567 ACCResult Visit(
Expr *e) {
3571 ACCResult VisitStmt(
Stmt *
s) {
3576 ACCResult VisitExpr(
Expr *e) {
3592 ACCResult VisitCastExpr(
CastExpr *e) {
3594 case CK_NullToPointer:
3598 case CK_LValueToRValue:
3600 case CK_CPointerToObjCPointerCast:
3601 case CK_BlockPointerToObjCPointerCast:
3602 case CK_AnyPointerToBlockPointerCast:
3617 return Visit(e->
getRHS());
3623 if (left == ACC_invalid)
return ACC_invalid;
3634 ACCResult VisitStmtExpr(
StmtExpr *e) {
3645 !
var->hasDefinition(Context) &&
3646 var->getType().isConstQualified()) {
3653 return ACC_plusZero;
3661 ACCResult VisitCallExpr(
CallExpr *e) {
3663 if (ACCResult result = checkCallToFunction(fn))
3666 return super::VisitCallExpr(e);
3678 if (fn->
hasAttr<CFReturnsNotRetainedAttr>())
3679 return ACC_plusZero;
3684 if (fn->
hasAttr<CFReturnsRetainedAttr>())
3685 return Diagnose ? ACC_plusOne
3690 if (builtinID == Builtin::BI__builtin___CFStringMakeConstantString)
3694 if (!fn->
hasAttr<CFAuditedTransferAttr>())
3699 return Diagnose ? ACC_plusOne
3702 return ACC_plusZero;
3715 return checkCallToMethod(method);
3719 if (!method)
return ACC_invalid;
3728 if (method->
hasAttr<CFReturnsNotRetainedAttr>())
3729 return ACC_plusZero;
3733 if (method->
hasAttr<CFReturnsRetainedAttr>())
3745 return ACC_plusZero;
3760template <
typename DiagBuilderT>
3764 Expr *realCast,
const char *bridgeKeyword,
const char *CFBridgeName) {
3780 NCE->getAngleBrackets().getEnd());
3784 char PrevChar = *
SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3788 BridgeCall += CFBridgeName;
3795 castedE = CCE->getSubExpr();
3802 char PrevChar = *
SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3806 BridgeCall += CFBridgeName;
3808 if (isa<ParenExpr>(castedE)) {
3826 std::string castCode =
"(";
3827 castCode += bridgeKeyword;
3831 NCE->getAngleBrackets().getEnd());
3835 std::string castCode =
"(";
3836 castCode += bridgeKeyword;
3841 if (isa<ParenExpr>(castedE)) {
3855template <
typename T>
3862 for (
auto *Redecl : RT->getDecl()->getMostRecentDecl()->redecls()) {
3863 if (
auto *
attr = Redecl->getAttr<
T>())
3874 TDNDecl = TD->getDecl();
3875 if (ObjCBridgeRelatedAttr *ObjCBAttr =
3876 getObjCBridgeAttr<ObjCBridgeRelatedAttr>(TD))
3893 UnavailableAttr::IR_ARCForbiddenConversion))
3906 unsigned srcKind = 0;
3930 S.
Diag(loc, diag::err_arc_cast_requires_bridge)
3939 ACCResult CreateRule =
3941 assert(CreateRule != ACC_bottom &&
"This cast should already be accepted.");
3942 if (CreateRule != ACC_plusOne)
3945 ? S.
Diag(noteLoc, diag::note_arc_bridge)
3946 : S.
Diag(noteLoc, diag::note_arc_cstyle_bridge);
3949 castType,
castExpr, realCast,
"__bridge ",
3952 if (CreateRule != ACC_plusZero)
3955 ? S.
Diag(noteLoc, diag::note_arc_cstyle_bridge_transfer)
3958 diag::note_arc_bridge_transfer)
3959 << castExprType << br;
3962 castType,
castExpr, realCast,
"__bridge_transfer ",
3963 br ?
"CFBridgingRelease" :
nullptr);
3972 S.
Diag(loc, diag::err_arc_cast_requires_bridge)
3980 ACCResult CreateRule =
3982 assert(CreateRule != ACC_bottom &&
"This cast should already be accepted.");
3983 if (CreateRule != ACC_plusOne)
3986 ? S.
Diag(noteLoc, diag::note_arc_bridge)
3987 : S.
Diag(noteLoc, diag::note_arc_cstyle_bridge);
3989 castType,
castExpr, realCast,
"__bridge ",
3992 if (CreateRule != ACC_plusZero)
3995 ? S.
Diag(noteLoc, diag::note_arc_cstyle_bridge_retained)
3998 diag::note_arc_bridge_retained)
4002 castType,
castExpr, realCast,
"__bridge_retained ",
4003 br ?
"CFBridgingRetain" :
nullptr);
4009 S.
Diag(loc, diag::err_arc_mismatched_cast)
4011 << srcKind << castExprType << castType
4012 << castRange <<
castExpr->getSourceRange();
4015template <
typename TB>
4017 bool &HadTheAttribute,
bool warn) {
4019 HadTheAttribute =
false;
4022 if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {
4024 HadTheAttribute =
true;
4025 if (Parm->isStr(
"id"))
4038 = InterfacePointerType->getObjectType()->getInterface();
4039 if ((CastClass == ExprClass) ||
4043 S.
Diag(
castExpr->getBeginLoc(), diag::warn_objc_invalid_bridge)
4048 castType, ExprClass)))
4055 S.
Diag(
castExpr->getBeginLoc(), diag::warn_objc_invalid_bridge)
4056 <<
T <<
Target->getName() << castType;
4058 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4065 diag::err_objc_cf_bridged_not_interface)
4078template <
typename TB>
4080 bool &HadTheAttribute,
bool warn) {
4082 HadTheAttribute =
false;
4085 if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {
4087 HadTheAttribute =
true;
4088 if (Parm->isStr(
"id"))
4100 castExpr->getType()->getAsObjCInterfacePointerType()) {
4102 = InterfacePointerType->getObjectType()->getInterface();
4103 if ((CastClass == ExprClass) ||
4108 diag::warn_objc_invalid_bridge_to_cf)
4109 <<
castExpr->getType()->getPointeeType() <<
T;
4113 }
else if (
castExpr->getType()->isObjCIdType() ||
4123 diag::warn_objc_invalid_bridge_to_cf)
4124 <<
castExpr->getType() << castType;
4126 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4133 diag::err_objc_ns_bridged_invalid_cfobject)
4134 <<
castExpr->getType() << castType;
4137 S.
Diag(
Target->getBeginLoc(), diag::note_declared_at);
4154 bool HasObjCBridgeAttr;
4155 bool ObjCBridgeAttrWillNotWarn = CheckObjCBridgeNSCast<ObjCBridgeAttr>(
4157 if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
4159 bool HasObjCBridgeMutableAttr;
4160 bool ObjCBridgeMutableAttrWillNotWarn =
4161 CheckObjCBridgeNSCast<ObjCBridgeMutableAttr>(
4163 if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
4166 if (HasObjCBridgeAttr)
4168 HasObjCBridgeAttr,
true);
4169 else if (HasObjCBridgeMutableAttr)
4170 CheckObjCBridgeNSCast<ObjCBridgeMutableAttr>(
4174 bool HasObjCBridgeAttr;
4175 bool ObjCBridgeAttrWillNotWarn = CheckObjCBridgeCFCast<ObjCBridgeAttr>(
4177 if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
4179 bool HasObjCBridgeMutableAttr;
4180 bool ObjCBridgeMutableAttrWillNotWarn =
4181 CheckObjCBridgeCFCast<ObjCBridgeMutableAttr>(
4183 if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
4186 if (HasObjCBridgeAttr)
4188 HasObjCBridgeAttr,
true);
4189 else if (HasObjCBridgeMutableAttr)
4190 CheckObjCBridgeCFCast<ObjCBridgeMutableAttr>(
4198 if (PRE->isExplicitProperty()) {
4200 SrcType = PDecl->getType();
4202 else if (PRE->isImplicitProperty()) {
4204 SrcType = Getter->getReturnType();
4227 : CK_CPointerToObjCPointerCast;
4239 QualType T = CfToNs ? SrcType : DestType;
4255 Diag(
Loc, diag::err_objc_bridged_related_invalid_class) << RCId
4256 << SrcType << DestType;
4263 RelatedClass = cast<ObjCInterfaceDecl>(
Target);
4266 Diag(
Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
4267 << SrcType << DestType;
4270 Diag(
Target->getBeginLoc(), diag::note_declared_at);
4276 if (CfToNs && CMId) {
4281 Diag(
Loc, diag::err_objc_bridged_related_known_method)
4282 << SrcType << DestType << Sel <<
false;
4290 if (!CfToNs && IMId) {
4292 InstanceMethod = RelatedClass->
lookupMethod(Sel,
true);
4293 if (!InstanceMethod) {
4295 Diag(
Loc, diag::err_objc_bridged_related_known_method)
4296 << SrcType << DestType << Sel <<
true;
4315 if (!CfToNs && !NsToCf)
4323 ClassMethod, InstanceMethod, TDNDecl,
4331 std::string ExpressionString =
"[";
4333 ExpressionString +=
" ";
4334 ExpressionString += ClassMethod->getSelector().getAsString();
4338 Diag(
Loc, diag::err_objc_bridged_related_known_method)
4339 << SrcType << DestType << ClassMethod->getSelector() <<
false
4348 Expr *args[] = { SrcExpr };
4350 ClassMethod->getLocation(),
4351 ClassMethod->getSelector(), ClassMethod,
4353 SrcExpr = msg.
get();
4360 if (InstanceMethod) {
4362 std::string ExpressionString;
4365 if (InstanceMethod->isPropertyAccessor())
4367 InstanceMethod->findPropertyDecl()) {
4369 ExpressionString =
".";
4370 ExpressionString += PDecl->getNameAsString();
4371 Diag(
Loc, diag::err_objc_bridged_related_known_method)
4372 << SrcType << DestType << InstanceMethod->getSelector() <<
true
4375 if (ExpressionString.empty()) {
4377 ExpressionString =
" ";
4378 ExpressionString += InstanceMethod->getSelector().getAsString();
4379 ExpressionString +=
"]";
4381 Diag(
Loc, diag::err_objc_bridged_related_known_method)
4382 << SrcType << DestType << InstanceMethod->getSelector() <<
true
4390 SrcExpr, SrcType, InstanceMethod->getLocation(),
4391 InstanceMethod->getSelector(), InstanceMethod, std::nullopt);
4392 SrcExpr = msg.
get();
4403 bool Diagnose,
bool DiagnoseCFAudited,
4416 if (exprACTC == castACTC) {
4422 castType != castExprType) {
4428 if (
const ParenType *PT = dyn_cast<ParenType>(DT))
4429 QDT = PT->desugar();
4430 else if (
const TypeOfType *TP = dyn_cast<TypeOfType>(DT))
4431 QDT = TP->desugar();
4432 else if (
const AttributedType *AT = dyn_cast<AttributedType>(DT))
4433 QDT = AT->desugar();
4434 if (QDT != castType &&
4439 Diag(loc, diag::err_arc_nolifetime_behavior);
4473 switch (ARCCastChecker(Context, exprACTC, castACTC,
false).Visit(
castExpr)) {
4486 CK_ARCConsumeObject,
castExpr,
nullptr,
4513 (Opc == BO_NE || Opc == BO_EQ))) {
4535 castType =
cast->getTypeAsWritten();
4538 castRange =
cast->getTypeInfoAsWritten()->getTypeLoc().getSourceRange();
4539 castType =
cast->getTypeAsWritten();
4542 llvm_unreachable(
"Unexpected ImplicitCastExpr");
4561 if (
ParenExpr *pe = dyn_cast<ParenExpr>(e)) {
4563 return new (Context)
ParenExpr(pe->getLParen(), pe->getRParen(), sub);
4564 }
else if (
UnaryOperator *uo = dyn_cast<UnaryOperator>(e)) {
4565 assert(uo->getOpcode() == UO_Extension);
4569 uo->getOperatorLoc(),
false,
4572 assert(!gse->isResultDependent());
4573 assert(!gse->isTypePredicate());
4575 unsigned n = gse->getNumAssocs();
4578 subExprs.reserve(n);
4579 subTypes.reserve(n);
4581 subTypes.push_back(assoc.getTypeSourceInfo());
4582 Expr *sub = assoc.getAssociationExpr();
4583 if (assoc.isSelected())
4585 subExprs.push_back(sub);
4589 Context, gse->getGenericLoc(), gse->getControllingExpr(), subTypes,
4590 subExprs, gse->getDefaultLoc(), gse->getRParenLoc(),
4591 gse->containsUnexpandedParameterPack(), gse->getResultIndex());
4593 assert(isa<ImplicitCastExpr>(e) &&
"bad form of unbridged cast!");
4594 return cast<ImplicitCastExpr>(e)->getSubExpr();
4605 if (isa<ObjCObjectPointerType>(canCastType) &&
4611 return !ObjI->isArcWeakrefUnavailable();
4618 Expr *curExpr = e, *prevExpr =
nullptr;
4623 if (
auto *pe = dyn_cast<ParenExpr>(curExpr)) {
4625 curExpr = pe->getSubExpr();
4629 if (
auto *ce = dyn_cast<CastExpr>(curExpr)) {
4630 if (
auto *ice = dyn_cast<ImplicitCastExpr>(ce))
4631 if (ice->getCastKind() == CK_ARCReclaimReturnedObject) {
4633 return ice->getSubExpr();
4634 if (
auto *pe = dyn_cast<ParenExpr>(prevExpr))
4635 pe->setSubExpr(ice->getSubExpr());
4637 cast<CastExpr>(prevExpr)->setSubExpr(ice->getSubExpr());
4642 curExpr = ce->getSubExpr();
4661 SubExpr = SubResult.
get();
4668 bool MustConsume =
false;
4675 : CK_CPointerToObjCPointerCast);
4682 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4689 Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4691 Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer)
4694 br ?
"CFBridgingRelease "
4695 :
"__bridge_transfer ");
4725 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4733 Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4735 Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained)
4738 br ?
"CFBridgingRetain " :
"__bridge_retained");
4745 Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible)
4746 << FromType <<
T << Kind
4804 LookForIvars =
true;
4805 else if (IsClassMethod)
4806 LookForIvars =
false;
4817 if (IsClassMethod) {
4838 Diag(
Loc, diag::warn_ivar_use_hidden) << IV->getDeclName();
4846 Diag(
Loc, diag::err_ivar_use_in_class_method) << IV->getDeclName();
4857 bool AllowBuiltinCreation) {
4864 cast<ObjCIvarDecl>(Ivar.
get()));
4866 if (Lookup.
empty() && II && AllowBuiltinCreation)
4878 "should not reference ivar from this context");
4881 assert(IFace &&
"should not reference ivar from this context");
4946 CK_CPointerToObjCPointerCast);
4952 CK_CPointerToObjCPointerCast);
4959 CK_CPointerToObjCPointerCast);
4965 CK_CPointerToObjCPointerCast);
5013 RHSOPT->isObjCQualifiedIdType()) &&
5024 Diag(QuestionLoc, diag::ext_typecheck_cond_incompatible_operands)
5035 return compositeType;
5042 Diag(QuestionLoc, diag::err_cond_voidptr_arc)
5063 Diag(QuestionLoc, diag::err_cond_voidptr_arc)
5098 if (OV->getSourceExpr())
5101 if (
auto *SL = dyn_cast<StringLiteral>(SrcExpr)) {
5102 if (!PT->
isObjCIdType() && !(ID && ID->getIdentifier()->isStr(
"NSString")))
5104 if (!SL->isOrdinary())
5108 Diag(SL->getBeginLoc(), diag::err_missing_atsign_prefix)
5115 if ((isa<IntegerLiteral>(SrcExpr) || isa<CharacterLiteral>(SrcExpr) ||
5116 isa<FloatingLiteral>(SrcExpr) || isa<ObjCBoolLiteralExpr>(SrcExpr) ||
5117 isa<CXXBoolLiteralExpr>(SrcExpr)) &&
5120 if (!ID || !ID->getIdentifier()->isStr(
"NSNumber"))
5140 assert((Kind == tok::kw___objc_yes || Kind == tok::kw___objc_no) &&
5141 "Unknown Objective-C Boolean value!");
5148 Result.isSingleResult()) {
5156 return new (Context)
5164 auto FindSpecVersion =
5165 [&](StringRef Platform) -> std::optional<VersionTuple> {
5171 if (Spec == AvailSpecs.end() && Platform ==
"maccatalyst") {
5176 if (Spec == AvailSpecs.end())
5177 return std::nullopt;
5181 VersionTuple Version;
5182 if (
auto MaybeVersion =
5184 Version = *MaybeVersion;
5189 Context->HasPotentialAvailabilityViolations =
true;
5191 return new (Context)
5199 if (
type->isObjCObjectPointerType()) {
5201 }
else if (
type->isBlockPointerType()) {
5203 return CK_BlockPointerToObjCPointerCast;
5205 assert(
type->isPointerType());
5206 return CK_CPointerToObjCPointerCast;
5215 case Stmt::ObjCStringLiteralClass:
5218 case Stmt::ObjCArrayLiteralClass:
5221 case Stmt::ObjCDictionaryLiteralClass:
5224 case Stmt::BlockExprClass:
5226 case Stmt::ObjCBoxedExprClass: {
5227 Expr *Inner = cast<ObjCBoxedExpr>(FromE)->getSubExpr()->IgnoreParens();
5228 switch (Inner->getStmtClass()) {
5229 case Stmt::IntegerLiteralClass:
5230 case Stmt::FloatingLiteralClass:
5231 case Stmt::CharacterLiteralClass:
5232 case Stmt::ObjCBoolLiteralExprClass:
5233 case Stmt::CXXBoolLiteralExprClass:
5236 case Stmt::ImplicitCastExprClass: {
5237 CastKind CK = cast<CastExpr>(Inner)->getCastKind();
5239 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.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
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 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()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
void setObjCNSStringType(QualType T)
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getObjCSelRedefinitionType() const
Retrieve the type that 'SEL' has been defined to, which may be different from the built-in 'SEL' if '...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
bool isObjCSelType(QualType T) const
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
SelectorTable & Selectors
TypedefDecl * getBOOLDecl() const
Retrieve declaration of 'BOOL' typedef.
QualType getObjCInstanceType()
Retrieve the Objective-C "instancetype" type, if already known; otherwise, returns a NULL type;.
QualType getObjCProtoType() const
Retrieve the type of the Objective-C Protocol class.
CanQualType ObjCBuiltinIdTy
void setBOOLDecl(TypedefDecl *TD)
Save declaration of 'BOOL' typedef.
QualType getObjCSelType() const
Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.
CanQualType UnsignedLongTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getBOOLType() const
type of 'BOOL' type.
CanQualType PseudoObjectTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
CanQualType ObjCBuiltinBoolTy
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getObjCClassRedefinitionType() const
Retrieve the type that Class has been defined to, which may be different from the built-in Class if C...
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
QualType getObjCConstantStringInterface() const
QualType getObjCIdRedefinitionType() const
Retrieve the type that id has been defined to, which may be different from the built-in id if id has ...
const TargetInfo & getTargetInfo() const
QualType getObjCNSStringType() const
QualType getWideCharType() const
Return the type of wide characters.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
An attributed type is a type to which a type attribute has been applied.
static Kind getNullabilityAttrKind(NullabilityKind kind)
Retrieve the attribute kind corresponding to the given nullability kind.
static std::optional< NullabilityKind > stripOuterNullability(QualType &T)
Strip off the top-level nullability annotation on the given type, if it's there.
One specifier in an @available expression.
StringRef getPlatform() const
VersionTuple getVersion() const
A builtin binary operation expression such as "x + y" or "x <= y".
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.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
void setExprNeedsCleanups(bool SideEffects)
ConditionalOperator - The ?: ternary operator.
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...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
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
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() 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
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.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
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...
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 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.
@ 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.
Represents a function declaration or definition.
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.
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.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ 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.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
@ Found
Name lookup found a single declaration that met the criteria.
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, 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, 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...
Interfaces are the core concept in Objective-C for object oriented design.
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
unsigned param_size() 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.
QualType getSendResultType() const
Determine the type of an expression that sends a message to this function.
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
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs=std::nullopt)
Sets the method's parameters and selector source locations.
bool isDirectMethod() const
True if the method is tagged as objc_direct.
Selector getSelector() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isInstanceMethod() const
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
QualType getReturnType() const
ObjCImplementationControl getImplementationControl() const
bool isClassMethod() const
ObjCInterfaceDecl * getClassInterface()
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 a class type in Objective C.
ObjCInterfaceDecl * getInterface() const
Gets the interface declaration for this object type, if the base type really is an 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.
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
IdentifierTable & getIdentifierTable()
SelectorTable & getSelectorTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Expr * getResultExpr()
Return the result-bearing expression, or null if there is none.
A (possibly-)qualified type.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
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 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.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
static Selector constructSetterSelector(IdentifierTable &Idents, SelectorTable &SelTable, const IdentifierInfo *Name)
Return the default setter selector for the given identifier.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
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
bool isNull() const
Determine whether this is the empty selector.
ObjCStringFormatFamily getStringFormatFamily() const
unsigned getNumArgs() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
iterator find(Selector Sel)
llvm::DenseMap< Selector, Lists >::iterator iterator
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.
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
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)
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.
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...
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.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult ActOnIntegerConstant(SourceLocation Loc, uint64_t Val)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
bool FormatStringHasSArg(const StringLiteral *FExpr)
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
FPOptionsOverride CurFPFeatureOverrides()
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
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
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
const LangOptions & LangOpts
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
sema::FunctionScopeInfo * getCurFunction() const
ExprResult DefaultLvalueConversion(Expr *E)
void maybeExtendBlockObject(ExprResult &E)
Do an explicit extend of the given block pointer if we're in ARC.
static bool isCast(CheckedConversionKind CCK)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
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.
sema::FunctionScopeInfo * getCurFunctionAvailabilityContext()
Retrieve the current function, if any, that should be analyzed for potential availability violations.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
SourceManager & SourceMgr
DiagnosticsEngine & Diags
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
sema::FunctionScopeInfo * getEnclosingFunction() const
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType ¶mType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
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
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
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.
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, const SourceLocation *Loc, unsigned NumConcatenated)
This is the "fully general" constructor that allows representation of strings formed from multiple co...
StringRef getString() const
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
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.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
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
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 isBuiltinType() const
Helper methods to distinguish type categories.
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 isObjCBoxableRecordType() const
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 ObjCObjectType * getAsObjCInterfaceType() 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 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)
Represents a variable declaration or definition.
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.
void recordUseOfWeak(const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
bool ObjCIsDesignatedInit
True when this is a method marked as a designated initializer.
bool ObjCShouldCallSuper
A flag that is set when parsing a method that must call super's implementation, such as -dealloc,...
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< Attr > attr
Matches attributes.
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.
uint32_t Literal
Literals are represented as positive integers.
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.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
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...
ObjCMethodFamily
A family of Objective-C methods.
@ OMF_None
No particular method family.
@ 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.
ActionResult< Expr * > ExprResult
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.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
ActionResult< Decl * > DeclResult
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
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.
MutableArrayRef< Expr * > MultiExprArg
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