35 return !Bases.count(
Base->getCanonicalDecl());
37 return BaseIsNotInSet(Record) && Record->forallBases(BaseIsNotInSet);
90 assert(!R.
empty() && (*R.
begin())->isCXXClassMember());
95 (!isa<CXXMethodDecl>(DC) || cast<CXXMethodDecl>(DC)->isStatic());
101 bool hasNonInstance =
false;
102 bool isField =
false;
106 D = D->getUnderlyingDecl();
108 if (D->isCXXInstanceMember()) {
109 isField |= isa<FieldDecl>(D) || isa<MSPropertyDecl>(D) ||
110 isa<IndirectFieldDecl>(D);
115 hasNonInstance =
true;
133 assert(!AbstractInstanceResult);
135 case Sema::ExpressionEvaluationContext::Unevaluated:
136 case Sema::ExpressionEvaluationContext::UnevaluatedList:
141 case Sema::ExpressionEvaluationContext::UnevaluatedAbstract:
145 case Sema::ExpressionEvaluationContext::DiscardedStatement:
146 case Sema::ExpressionEvaluationContext::ConstantEvaluated:
147 case Sema::ExpressionEvaluationContext::ImmediateFunctionContext:
148 case Sema::ExpressionEvaluationContext::PotentiallyEvaluated:
149 case Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed:
155 if (isStaticContext) {
159 return AbstractInstanceResult ? AbstractInstanceResult
164 if (
auto *MD = dyn_cast<CXXMethodDecl>(DC))
165 contextClass = MD->
getParent()->getCanonicalDecl();
166 else if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
169 return AbstractInstanceResult ? AbstractInstanceResult
193 AbstractInstanceResult ? AbstractInstanceResult :
212 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FunctionLevelDC);
216 bool InStaticMethod = Method && Method->
isStatic();
217 bool IsField = isa<FieldDecl>(Rep) || isa<IndirectFieldDecl>(Rep);
219 if (IsField && InStaticMethod)
221 SemaRef.
Diag(Loc, diag::err_invalid_member_use_in_static_method)
222 << Range << nameInfo.
getName();
223 else if (ContextClass && RepClass && SS.
isEmpty() && !InStaticMethod &&
224 !RepClass->
Equals(ContextClass) && RepClass->
Encloses(ContextClass))
227 SemaRef.
Diag(Loc, diag::err_nested_non_static_member_use)
228 << IsField << RepClass << nameInfo.
getName() << ContextClass << Range;
230 SemaRef.
Diag(Loc, diag::err_invalid_non_static_member_use)
231 << nameInfo.
getName() << Range;
233 SemaRef.
Diag(Loc, diag::err_member_call_without_object)
253 Diag(R.
getNameLoc(), diag::warn_cxx98_compat_non_static_member_use)
260 if (TemplateArgs || TemplateKWLoc.
isValid())
271 llvm_unreachable(
"unexpected instance member access kind");
293 return (len >= 1 && len <= 4) || len == 8 || len == 16;
317 bool HalvingSwizzle =
false;
321 bool HexSwizzle = (*compStr ==
's' || *compStr ==
'S') && compStr[1];
323 bool HasRepeated =
false;
324 bool HasIndex[16] = {};
330 if (!strcmp(compStr,
"hi") || !strcmp(compStr,
"lo") ||
331 !strcmp(compStr,
"even") || !strcmp(compStr,
"odd")) {
332 HalvingSwizzle =
true;
333 }
else if (!HexSwizzle &&
335 bool HasRGBA =
IsRGBA(*compStr);
338 if (HasRGBA !=
IsRGBA(*compStr))
340 if (HasIndex[Idx]) HasRepeated =
true;
341 HasIndex[Idx] =
true;
346 if (HasRGBA || (*compStr &&
IsRGBA(*compStr))) {
349 const char *DiagBegin = HasRGBA ? CompName->
getNameStart() : compStr;
350 S.
Diag(OpLoc, diag::ext_opencl_ext_vector_type_rgba_selector)
351 << StringRef(DiagBegin, 1) <<
SourceRange(CompLoc);
355 if (HexSwizzle) compStr++;
357 if (HasIndex[Idx]) HasRepeated =
true;
358 HasIndex[Idx] =
true;
363 if (!HalvingSwizzle && *compStr) {
366 S.
Diag(OpLoc, diag::err_ext_vector_component_name_illegal)
373 if (!HalvingSwizzle) {
381 S.
Diag(OpLoc, diag::err_ext_vector_component_exceeds_length)
391 unsigned SwizzleLength = CompName->
getLength();
397 S.
Diag(OpLoc, diag::err_opencl_ext_vector_component_invalid_length)
408 unsigned CompSize = HalvingSwizzle ? (vecType->
getNumElements() + 1) / 2
422 for (Sema::ExtVectorDeclsType::iterator
426 if ((*I)->getUnderlyingType() == VT)
444 for (
const auto *I : PDecl->
protocols()) {
457 Decl *GDecl =
nullptr;
458 for (
const auto *I : QIdTy->
quals()) {
472 for (
const auto *I : QIdTy->
quals()) {
503 assert(BaseExpr &&
"cannot happen with implicit member accesses");
504 Diag(OpLoc, diag::err_typecheck_member_reference_struct_union)
512 (TemplateArgs && llvm::any_of(TemplateArgs->
arguments(),
514 return Arg.getArgument().isDependent();
520 Context, BaseExpr, BaseType, IsArrow, OpLoc,
522 NameInfo, TemplateArgs);
539 SemaRef.
Diag(nameInfo.
getLoc(), diag::err_qualified_member_of_unrelated)
540 << SS.
getRange() << rep << BaseType;
571 if (!BaseExpr && !(*I)->isCXXInstanceMember())
598 explicit RecordMemberExprValidatorCCC(
const RecordType *RTy)
599 : Record(RTy->getDecl()) {
602 WantTypeSpecifiers =
false;
603 WantExpressionKeywords =
false;
604 WantCXXNamedCasts =
false;
605 WantFunctionLikeCasts =
false;
606 WantRemainingKeywords =
false;
609 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
613 if (!ND || !(isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND)))
617 if (Record->containsDecl(ND))
620 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Record)) {
622 for (
const auto &BS : RD->bases()) {
623 if (
const auto *BSTy = BS.getType()->getAs<
RecordType>()) {
624 if (BSTy->getDecl()->containsDecl(ND))
633 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
634 return std::make_unique<RecordMemberExprValidatorCCC>(*
this);
654 diag::err_typecheck_incomplete_tag,
658 if (HasTemplateArgs || TemplateKWLoc.
isValid()) {
679 assert(DC &&
"Cannot handle non-computable dependent contexts in lookup");
681 if (!isa<TypeDecl>(DC)) {
705 RecordMemberExprValidatorCCC CCC(RTy);
710 assert(!TC.isKeyword() &&
711 "Got a keyword as a correction for a member!");
712 bool DroppedSpecifier =
713 TC.WillReplaceSpecifier() &&
714 Typo.getAsString() == TC.getAsString(SemaRef.getLangOpts());
715 SemaRef.diagnoseTypo(TC, SemaRef.PDiag(diag::err_no_member_suggest)
716 << Typo << DC << DroppedSpecifier
719 SemaRef.Diag(TypoLoc, diag::err_no_member) << Typo << DC << BaseRange;
723 LookupResult R(Q.SemaRef, Q.NameInfo, Q.LookupKind, Q.Redecl);
725 R.suppressDiagnostics();
726 R.setLookupName(TC.getCorrection());
731 BaseExpr, BaseExpr->getType(), OpLoc, IsArrow, SS,
SourceLocation(),
732 nullptr, R,
nullptr,
nullptr);
742 Decl *ObjCImpDecl,
bool HasTemplateArgs,
759 SS, TemplateKWLoc, FirstQualifierInScope,
760 NameInfo, TemplateArgs);
771 SS, TemplateArgs !=
nullptr, TemplateKWLoc, TE))
782 TemplateArgs !=
nullptr, TemplateKWLoc);
795 BaseType =
Base->getType();
799 OpLoc, IsArrow, SS, TemplateKWLoc,
800 FirstQualifierInScope, R, TemplateArgs, S,
809 Expr *baseObjectExpr,
824 assert(!baseObjectExpr &&
"anonymous struct/union is static data member?");
832 baseObjectExpr = result.
get();
835 assert((baseVariable || baseObjectExpr) &&
836 "referencing anonymous struct/union without a base variable or "
841 Expr *result = baseObjectExpr;
858 SS, field, foundDecl, memberNameInfo)
868 FieldDecl *field = cast<FieldDecl>(*FI++);
877 (FI == FEnd ? SS : EmptySS), field,
878 fakeFoundDecl, memberNameInfo)
907 FoundDecl, HadMultipleCandidates, MemberNameInfo, Ty,
908 VK, OK, TemplateArgs);
917 assert((!IsArrow ||
Base->isPRValue()) &&
918 "-> base must be a pointer prvalue");
921 Member, FoundDecl, MemberNameInfo, TemplateArgs, Ty,
945 for (; S != S->getFnParent(); S = S->getParent()) {
946 if (S->isFnTryCatchScope())
961 bool SuppressQualifierCheck,
972 if (!IsArrow && BaseExpr && BaseExpr->
isPRValue()) {
976 BaseExpr = Converted.
get();
990 if (S && BaseExpr && FD &&
991 (isa<CXXDestructorDecl>(FD) || isa<CXXConstructorDecl>(FD)) &&
994 Diag(MemberLoc, diag::warn_cdtor_function_try_handler_mem_expr)
995 << isa<CXXDestructorDecl>(FD);
1005 if (!IsArrow && BaseExpr) {
1008 bool MayBePseudoDestructor =
false;
1010 OpLoc, tok::arrow, ObjectType,
1011 MayBePseudoDestructor);
1015 ExtraArgs->
S, RetryExpr.
get(), OpLoc, tok::arrow, TempSS,
1022 Diag(OpLoc, diag::err_no_member_overloaded_arrow)
1041 if ((SS.
isSet() || !BaseExpr ||
1042 (isa<CXXThisExpr>(BaseExpr) &&
1043 cast<CXXThisExpr>(BaseExpr)->isImplicit())) &&
1044 !SuppressQualifierCheck &&
1057 BaseExpr, BaseExprType,
1060 TemplateKWLoc, MemberNameInfo,
1084 if (TemplateArgs || TemplateKWLoc.
isValid())
1088 FoundDecl, TemplateArgs);
1100 if (
FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))
1112 FoundDecl, BaseExpr,
1115 if (
VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) {
1116 return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var,
1118 MemberNameInfo, Var->getType().getNonReferenceType(),
1122 if (
CXXMethodDecl *MemberFn = dyn_cast<CXXMethodDecl>(MemberDecl)) {
1125 if (MemberFn->isInstance()) {
1130 type = MemberFn->getType();
1134 MemberFn, FoundDecl,
false,
1137 assert(!isa<FunctionDecl>(MemberDecl) &&
"member function not C++ method?");
1146 if (
VarTemplateDecl *VarTempl = dyn_cast<VarTemplateDecl>(MemberDecl)) {
1147 if (!TemplateArgs) {
1153 MemberNameInfo.
getLoc(), *TemplateArgs);
1160 BaseExpr, BaseExpr->
getType(), IsArrow, OpLoc, SS, TemplateKWLoc,
1161 FirstQualifierInScope, MemberNameInfo, TemplateArgs);
1167 return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var,
1174 if (isa<TypeDecl>(MemberDecl))
1175 Diag(MemberLoc, diag::err_typecheck_member_reference_type)
1176 << MemberName << BaseType <<
int(IsArrow);
1178 Diag(MemberLoc, diag::err_typecheck_member_reference_unknown)
1179 << MemberName << BaseType <<
int(IsArrow);
1196 if (!opty)
return false;
1224 return PT->getPointeeType()->isRecordType();
1231 if (IsArrow && !
Base->getType()->isFunctionType())
1250 Decl *ObjCImpDecl,
bool HasTemplateArgs,
1252 assert(BaseExpr.
get() &&
"no base expression");
1284 S.
Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
1292 S.
Diag(MemberLoc, diag::err_typecheck_member_reference_arrow)
1305 S.
PDiag(diag::warn_atomic_member_access));
1306 BaseType = ATy->getValueType().getUnqualifiedType();
1309 CK_AtomicToNonAtomic, BaseExpr.
get(),
nullptr,
1317 HasTemplateArgs, TemplateKWLoc, TE))
1345 (OTy->isObjCId() || OTy->isObjCClass()))
1350 if (OTy->isObjCId() &&
Member->isStr(
"isa"))
1355 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1360 diag::err_typecheck_incomplete_tag,
1377 S.
PDiag(diag::err_typecheck_member_reference_ivar_suggest)
1381 assert(!ClassDeclared);
1384 if (
auto *
Category = dyn_cast<ObjCCategoryDecl>(D))
1387 if (
auto *Implementation = dyn_cast<ObjCImplementationDecl>(D))
1388 ClassDeclared = Implementation->getClassInterface();
1389 else if (
auto *Interface = dyn_cast<ObjCInterfaceDecl>(D))
1390 ClassDeclared = Interface;
1392 assert(ClassDeclared &&
"cannot query interface");
1397 S.
Diag(MemberLoc, diag::err_property_found_suggest)
1403 S.
Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
1410 assert(ClassDeclared);
1425 ClassOfMethodDecl = MD->getClassInterface();
1434 dyn_cast<ObjCImplementationDecl>(ObjCImpDecl))
1435 ClassOfMethodDecl = IMPD->getClassInterface();
1437 dyn_cast<ObjCCategoryImplDecl>(ObjCImpDecl))
1438 ClassOfMethodDecl = CatImplClass->getClassInterface();
1444 S.
Diag(MemberLoc, diag::err_private_ivar_access)
1448 S.
Diag(MemberLoc, diag::err_protected_ivar_access)
1456 if (UO->getOpcode() == UO_Deref)
1459 if (
DeclRefExpr *DE = dyn_cast<DeclRefExpr>(BaseExp))
1461 S.
Diag(DE->getLocation(), diag::err_arc_weak_ivar_access);
1473 S.
Diag(MemberLoc, diag::warn_direct_ivar_access) << IV->
getDeclName();
1482 !S.
Diags.
isIgnored(diag::warn_arc_repeated_use_of_weak, MemberLoc))
1535 SMD = dyn_cast<ObjCMethodDecl>(SDecl);
1546 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1548 return ExprError(S.
Diag(MemberLoc, diag::err_property_not_found)
1549 << MemberName << BaseType);
1559 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1593 if (Getter || Setter) {
1601 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1603 return ExprError(S.
Diag(MemberLoc, diag::err_property_not_found)
1604 << MemberName << BaseType);
1617 S.
Diag(R.
getNameLoc(), diag::err_ext_vector_component_name_illegal)
1647 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1661 if (!IsArrow && Ptr->getPointeeType()->isRecordType() &&
1663 S.
Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
1673 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1680 BaseExpr, S.
PDiag(diag::err_member_reference_needs_call),
1687 ObjCImpDecl, HasTemplateArgs, TemplateKWLoc);
1690 S.
Diag(OpLoc, diag::err_typecheck_member_reference_struct_union)
1712 Decl *ObjCImpDecl) {
1719 Diag(
Id.getSourceRange().getBegin(),
1720 diag::ext_ms_explicit_constructor_call);
1728 NameInfo, TemplateArgs);
1731 bool IsArrow = (OpKind == tok::arrow);
1734 return ExprError(
Diag(OpLoc, diag::err_hlsl_operator_unsupported) << 2);
1744 if (
Base->getType()->isDependentType() || Name.isDependentName() ||
1747 TemplateKWLoc, FirstQualifierInScope,
1748 NameInfo, TemplateArgs);
1753 Base,
Base->getType(), OpLoc, IsArrow, SS, TemplateKWLoc,
1754 FirstQualifierInScope, NameInfo, TemplateArgs, S, &ExtraArgs);
1757 CheckMemberAccessOfNoDeref(cast<MemberExpr>(Res.
get()));
1762void Sema::CheckMemberAccessOfNoDeref(
const MemberExpr *E) {
1782 CheckAddressOfNoDeref(E->
getBase());
1785 if (
const auto *Ptr = dyn_cast<PointerType>(
1787 if (Ptr->getPointeeType()->hasAttr(attr::NoDeref))
1814 QualType MemberType = Field->getType();
1836 Qualifiers Combined = BaseQuals + MemberQuals;
1837 if (Combined != MemberQuals)
1844 if (BaseType->
hasAttr(attr::NoDeref))
1849 auto *CurMethod = dyn_cast<CXXMethodDecl>(
CurContext);
1850 if (!(CurMethod && CurMethod->isDefaulted()))
1855 if (
Base.isInvalid())
1862 isa<CXXThisExpr>(
Base.get()->IgnoreParenImpCasts())) {
1865 MemberNameInfo.
getLoc());
1871 false, MemberNameInfo,
1872 MemberType, VK, OK);
1884 bool IsKnownInstance,
const Scope *S) {
1892 assert(!ThisTy.
isNull() &&
"didn't correctly pre-flight capture of 'this'");
1894 Expr *baseExpr =
nullptr;
1895 if (IsKnownInstance) {
1906 nullptr, R, TemplateArgs, S);
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::Preprocessor interface.
static bool ShouldTryAgainWithRedefinitionType(Sema &S, ExprResult &base)
Given that normal member access failed on the given expression, and given that the expression's type ...
static bool isPointerToRecordType(QualType T)
static Decl * FindGetterSetterNameDeclFromProtocolList(const ObjCProtocolDecl *PDecl, IdentifierInfo *Member, const Selector &Sel, ASTContext &Context)
@ IMA_Mixed_Unrelated
The reference may be to an instance member, but it is invalid if so, because the context is from an u...
@ IMA_Mixed
The reference may be an implicit instance member access.
@ IMA_Error_Unrelated
All possible referrents are instance members of an unrelated class.
@ IMA_Unresolved_StaticContext
The reference may be to an unresolved using declaration and the context is not an instance method.
@ IMA_Unresolved
The reference may be to an unresolved using declaration.
@ IMA_Error_StaticContext
All possible referrents are instance members and the current context is not an instance method.
@ IMA_Mixed_StaticContext
The reference may be to an instance member, but it might be invalid if so, because the context is not...
@ IMA_Abstract
The reference is a contextually-permitted abstract member reference.
@ IMA_Instance
The reference is definitely an implicit instance member access.
@ IMA_Field_Uneval_Context
@ IMA_Static
The reference is definitely not an instance member access.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes.
static void diagnoseInstanceReference(Sema &SemaRef, const CXXScopeSpec &SS, NamedDecl *Rep, const DeclarationNameInfo &nameInfo)
Diagnose a reference to a field with no object available.
static bool isRecordType(QualType T)
static bool LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, Expr *BaseExpr, const RecordType *RTy, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, bool HasTemplateArgs, SourceLocation TemplateKWLoc, TypoExpr *&TE)
static QualType CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK, SourceLocation OpLoc, const IdentifierInfo *CompName, SourceLocation CompLoc)
Check an ext-vector component access expression.
llvm::SmallPtrSet< const CXXRecordDecl *, 4 > BaseSet
static Decl * FindGetterSetterNameDecl(const ObjCObjectPointerType *QIdTy, IdentifierInfo *Member, const Selector &Sel, ASTContext &Context)
static void DiagnoseQualifiedMemberReference(Sema &SemaRef, Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, NamedDecl *rep, const DeclarationNameInfo &nameInfo)
We know that the given qualified member reference points only to declarations which do not belong to ...
static bool IsValidOpenCLComponentSwizzleLength(unsigned len)
static ExprResult BuildMSPropertyRefExpr(Sema &S, Expr *BaseExpr, bool IsArrow, const CXXScopeSpec &SS, MSPropertyDecl *PD, const DeclarationNameInfo &NameInfo)
static bool IsRGBA(char c)
Determine whether input char is from rgba component set.
static IMAKind ClassifyImplicitMemberAccess(Sema &SemaRef, const LookupResult &R)
The given lookup names class member(s) and is not being used for an address-of-member expression.
static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc)
Look up the given member of the given non-type-dependent expression.
static bool IsInFnTryBlockHandler(const Scope *S)
Determine if the given scope is within a function-try-block handler.
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
QualType getObjCClassType() const
Represents the Objective-C Class type.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
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.
CanQualType BoundMemberTy
CanQualType PseudoObjectTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
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...
QualType getObjCIdRedefinitionType() const
Retrieve the type that id has been defined to, which may be different from the built-in id if id has ...
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getTypedefType(const TypedefNameDecl *Decl, QualType Underlying=QualType()) const
Return the unique reference to the type for the specified typedef-name decl.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is provably not derived from the type Base.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
SourceRange getRange() const
bool isSet() const
Deprecated.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context encloses the declaration context DC.
DeclContext * getNonTransparentContext()
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 isInvalidDecl() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
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 isDependentName() const
Determines whether the name itself is dependent, e.g., because it involves a C++ type that is itself ...
NameKind getNameKind() const
Determine what kind of name this is.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
This represents one expression.
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.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
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.
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
ExtVectorType - Extended vector type.
bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const
static int getNumericAccessorIdx(char c)
static int getPointAccessorIdx(char c)
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
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.
Represents a prototype with parameter type info, e.g.
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
const char * getNameStart() const
Return the beginning of the actual null-terminated string for this identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a field injected from an anonymous union/struct into the parent scope.
chain_iterator chain_end() const
chain_iterator chain_begin() const
VarDecl * getVarDecl() const
ArrayRef< NamedDecl * >::const_iterator chain_iterator
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
iterator begin(Source *source, bool LocalOnly=false)
Represents the results of name lookup.
bool isUnresolvableResult() const
void setBaseObjectType(QualType T)
Sets the base object type for this lookup.
bool empty() const
Return true if no decls were found.
bool isOverloadedResult() const
Determines if the results are overloaded.
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.
CXXRecordDecl * getNamingClass() const
Returns the 'naming class' for this lookup, i.e.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
Sema & getSema() const
Get the Sema object that this lookup result is searching with.
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
Sema::RedeclarationKind redeclarationKind() const
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
An instance of this class represents the declaration of a property member.
A member reference to an MSPropertyDecl.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a method that was resolved from an overloaded...
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
A C++ nested-name-specifier augmented with source location information.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCPropertyDecl * FindPropertyDeclaration(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyDeclaration - Finds declaration of the property given its name in 'PropertyId' and return...
ObjCMethodDecl * getInstanceMethod(Selector Sel, bool AllowHidden=false) const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCMethodDecl * lookupClassMethod(Selector Sel) const
Lookup a class method for a given selector.
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
ObjCMethodDecl * lookupPrivateMethod(const Selector &Sel, bool Instance=true) const
Lookup a method in the classes implementation hierarchy.
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
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.
ObjCMethodDecl - Represents an instance or class method declaration.
ObjCInterfaceDecl * getClassInterface()
Represents a pointer to an Objective C object.
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
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.
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Represents an Objective-C protocol declaration.
protocol_range protocols() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
IdentifierTable & getIdentifierTable()
SelectorTable & getSelectorTable()
A (possibly-)qualified type.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
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...
The collection of all-type qualifiers we support.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
bool hasAddressSpace() const
Represents a struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
@ TryScope
This is the scope of a C++ try statement.
static Selector constructSetterSelector(IdentifierTable &Idents, SelectorTable &SelTable, const IdentifierInfo *Name)
Return the default setter selector for the given identifier.
Selector getNullarySelector(IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier *NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
void DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *&TemplateArgs)
Decomposes the given name into a DeclarationNameInfo, its location, and possibly a list of template a...
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
ExprResult ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor)
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
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 tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
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...
TypoExpr * CorrectTypoDelayed(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, TypoDiagnosticGenerator TDG, TypoRecoveryCallback TRC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CCK_ImplicitConversion)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
sema::FunctionScopeInfo * getCurFunction() const
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
ExprResult ActOnMemberAccessExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Member, Decl *ObjCImpDecl)
The main callback when the parser finds something like expression .
ExprResult BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, bool IsDefiniteInstance, const Scope *S)
Builds an implicit member access expression.
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool IvarBacksCurrentMethodAccessor(ObjCInterfaceDecl *IFace, ObjCMethodDecl *Method, ObjCIvarDecl *IV)
IvarBacksCurrentMethodAccessor - This routine returns 'true' if 'IV' is an ivar synthesized for 'Meth...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
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.
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
ExprResult ActOnDependentMemberExpr(Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs)
Get the specialization of the given variable template corresponding to the specified argument list,...
bool isThisOutsideMemberFunctionBody(QualType BaseType)
Determine whether the given type is the type of *this that is used outside of the body of a member fu...
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS, SourceLocation nameLoc, IndirectFieldDecl *indirectField, DeclAccessPair FoundDecl=DeclAccessPair::make(nullptr, AS_none), Expr *baseObjectExpr=nullptr, SourceLocation opLoc=SourceLocation())
ExternalSemaSource * getExternalSource() const
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.
VarDecl * isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo=false, unsigned StopAt=0)
Check if the specified variable is used in one of the private clauses (private, firstprivate,...
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.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, bool &MemberOfUnknownSpecialization, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec *SS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
DiagnosticsEngine & Diags
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
ExprResult getOpenMPCapturedExpr(VarDecl *Capture, ExprValueKind VK, ExprObjectKind OK, SourceLocation Loc)
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
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 PerformObjectMemberConversion(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, UnresolvedLookupExpr *AsULE=nullptr)
Builds an expression which might be an implicit member expression.
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
A convenient class for passing around template argument information.
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
Represents a C++ template name within the type system.
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
bool isPointerType() const
bool isObjCSelType() const
const T * castAs() const
Member-template castAs<specific type>.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorType() const
bool isExtVectorBoolType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isFunctionType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
TypoExpr - Internal placeholder for expressions where typo correction still needs to be performed and...
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a C++ unqualified-id that has been parsed.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
static UnresolvedMemberExpr * Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End)
The iterator over UnresolvedSets.
const DeclAccessPair & getPair() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Declaration of a variable template.
unsigned getNumElements() const
QualType getElementType() const
void recordUseOfWeak(const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
@ IK_ConstructorName
A constructor name.
ObjCMethodFamily
A family of Objective-C methods.
@ Result
The result type of a method or function.
ActionResult< Expr * > ExprResult
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.