38 if (!PrevMemberDecl) {
48 diag::err_class_redeclared_with_different_access)
49 << MemberDecl << LexicalAS;
50 Diag(PrevMemberDecl->
getLocation(), diag::note_previous_access_declaration)
51 << PrevMemberDecl << PrevMemberDecl->
getAccess();
66 if (isa<EnumDecl>(DC))
67 DC = cast<EnumDecl>(DC)->getDeclContext();
71 DeclaringClass = cast<CXXRecordDecl>(DeclaringClass->
getDeclContext());
72 return DeclaringClass;
76struct EffectiveContext {
86 if (
auto *DGD = dyn_cast<CXXDeductionGuideDecl>(DC)) {
87 if (DGD->isImplicit()) {
88 DC = DGD->getCorrespondingConstructor();
92 DC = cast<DeclContext>(DGD->getDeducedTemplate()->getTemplatedDecl());
116 if (isa<CXXRecordDecl>(DC)) {
119 DC =
Record->getDeclContext();
120 }
else if (isa<FunctionDecl>(DC)) {
122 Functions.push_back(
Function->getCanonicalDecl());
123 if (
Function->getFriendObjectKind())
124 DC =
Function->getLexicalDeclContext();
135 bool isDependent()
const {
return Dependent; }
139 return llvm::is_contained(
Records, R);
170 FoundDecl, BaseObjectType) {
184 bool isInstanceMember()
const {
185 return (isMemberAccess() && getTargetDecl()->isCXXInstanceMember());
188 bool hasInstanceContext()
const {
189 return HasInstanceContext;
192 class SavedInstanceContext {
194 SavedInstanceContext(SavedInstanceContext &&S)
201 SavedInstanceContext &operator=(SavedInstanceContext &&) =
delete;
205 SavedInstanceContext(
const SavedInstanceContext &) =
delete;
206 SavedInstanceContext &operator=(
const SavedInstanceContext &) =
delete;
208 ~SavedInstanceContext() {
210 Target->HasInstanceContext = Has;
214 friend struct AccessTarget;
215 explicit SavedInstanceContext(AccessTarget &
Target)
221 SavedInstanceContext saveInstanceContext() {
222 return SavedInstanceContext(*
this);
225 void suppressInstanceContext() {
226 HasInstanceContext =
false;
230 assert(HasInstanceContext);
231 if (CalculatedInstanceContext)
232 return InstanceContext;
234 CalculatedInstanceContext =
true;
236 InstanceContext = (IC ? cast<CXXRecordDecl>(IC)->getCanonicalDecl()
238 return InstanceContext;
242 return DeclaringClass;
250 namingClass = cast<CXXRecordDecl>(namingClass->
getParent());
256 HasInstanceContext = (isMemberAccess() &&
257 !getBaseObjectType().isNull() &&
258 getTargetDecl()->isCXXInstanceMember());
259 CalculatedInstanceContext =
false;
260 InstanceContext =
nullptr;
262 if (isMemberAccess())
265 DeclaringClass = getBaseClass();
266 DeclaringClass = DeclaringClass->getCanonicalDecl();
269 bool HasInstanceContext : 1;
270 mutable bool CalculatedInstanceContext : 1;
286 if (FromDC == ToDC)
return true;
317 for (
const auto &I : Derived->
bases()) {
337 if (Queue.empty())
break;
339 Derived = Queue.pop_back_val();
351 assert(!
Friend->isDependentContext() &&
352 "can't handle friends with dependent contexts here");
354 if (!Context->isDependentContext())
357 if (
Friend->isFileContext())
370 if (!
Friend->isDependentType() && !Context->isDependentType())
380 if (Context->getDeclName() !=
Friend->getDeclName())
384 Context->getDeclContext(),
385 Friend->getDeclContext()))
393 ->getAs<FunctionProtoType>();
400 if (FriendTy->getNumParams() != ContextTy->getNumParams())
404 FriendTy->getReturnType()))
407 for (
unsigned I = 0,
E = FriendTy->getNumParams(); I !=
E; ++I)
409 FriendTy->getParamType(I)))
419 Context->getTemplatedDecl(),
420 Friend->getTemplatedDecl());
424 const EffectiveContext &EC,
426 if (EC.includesClass(
Friend))
429 if (EC.isDependent()) {
440 const EffectiveContext &EC,
442 if (
const auto *RD =
Friend->getAsCXXRecordDecl())
446 if (
Friend->isDependentType())
455 const EffectiveContext &EC,
462 I = EC.Records.begin(),
E = EC.Records.end(); I !=
E; ++I) {
469 if (isa<ClassTemplateSpecializationDecl>(
Record)) {
470 CTD = cast<ClassTemplateSpecializationDecl>(
Record)
471 ->getSpecializedTemplate();
475 CTD =
Record->getDescribedClassTemplate();
484 if (!EC.isDependent())
495 Friend->getDeclContext()))
508 const EffectiveContext &EC,
513 I = EC.Functions.begin(),
E = EC.Functions.end(); I !=
E; ++I) {
527 const EffectiveContext &EC,
534 I = EC.Functions.begin(),
E = EC.Functions.end(); I !=
E; ++I) {
538 FTD = (*I)->getDescribedFunctionTemplate();
557 const EffectiveContext &EC,
572 if (isa<ClassTemplateDecl>(
Friend))
575 if (isa<FunctionTemplateDecl>(
Friend))
578 if (isa<CXXRecordDecl>(
Friend))
581 assert(isa<FunctionDecl>(
Friend) &&
"unknown friend decl kind");
586 const EffectiveContext &EC,
613struct ProtectedFriendContext {
615 const EffectiveContext &EC;
623 ProtectedFriendContext(
Sema &S,
const EffectiveContext &EC,
626 : S(S), EC(EC), NamingClass(NamingClass),
627 CheckDependent(InstanceContext->isDependentContext() ||
628 NamingClass->isDependentContext()),
629 EverDependent(
false) {}
633 bool checkFriendshipAlongPath(
unsigned I) {
634 assert(I < CurPath.size());
635 for (
unsigned E = CurPath.size(); I !=
E; ++I) {
650 bool findFriendship(
const CXXRecordDecl *Cur,
unsigned PrivateDepth) {
654 if (Cur == NamingClass)
655 return checkFriendshipAlongPath(PrivateDepth);
658 EverDependent =
true;
661 for (
const auto &I : Cur->
bases()) {
664 unsigned BasePrivateDepth = PrivateDepth;
666 BasePrivateDepth = CurPath.size() - 1;
675 EverDependent =
true;
680 CurPath.push_back(RD);
690 assert(CurPath.empty());
691 CurPath.push_back(Cur);
692 return findFriendship(Cur, 0);
726 assert(InstanceContext ==
nullptr ||
733 if (!InstanceContext)
return GetFriendKind(S, EC, NamingClass);
735 ProtectedFriendContext PRC(S, EC, InstanceContext, NamingClass);
736 if (PRC.findFriendship(InstanceContext))
return AR_accessible;
742 const EffectiveContext &EC,
745 const AccessTarget &
Target) {
747 "declaration should be canonicalized before being passed here");
754 for (EffectiveContext::record_iterator
755 I = EC.Records.begin(),
E = EC.Records.end(); I !=
E; ++I) {
762 if (ECRecord == NamingClass)
794 if (!
Target.hasInstanceContext()) {
805 if (S.
getLangOpts().MSVCCompat && !EC.Functions.empty())
806 if (
CXXMethodDecl* MD = dyn_cast<CXXMethodDecl>(EC.Functions.front()))
831 assert(
Target.isInstanceMember());
834 if (!InstanceContext) {
860 if (
Target.hasInstanceContext()) {
861 InstanceContext =
Target.resolveInstanceContext(S);
870 llvm_unreachable(
"impossible friendship kind");
880 llvm_unreachable(
"impossible friendship kind");
940 const EffectiveContext &EC,
951 assert(isDerived &&
"derived class not actually derived from base");
956 assert(FinalAccess !=
AS_none &&
"forbidden access after declaring class");
958 bool AnyDependent =
false;
963 AccessTarget::SavedInstanceContext _ =
Target.saveInstanceContext();
967 CXXBasePath::iterator I = PI->end(),
E = PI->begin();
984 PathAccess = std::max(PathAccess, BaseAccess);
993 Target.suppressInstanceContext();
1003 if (BestPath ==
nullptr || PathAccess < BestPath->Access) {
1005 BestPath->
Access = PathAccess;
1016 "fell out of loop with public path");
1034 if (!
Target.isInstanceMember())
1037 assert(
Target.isMemberAccess());
1041 for (EffectiveContext::record_iterator
1042 I = EC.Records.begin(),
E = EC.Records.end(); I !=
E; ++I) {
1062 if (!
Target.hasInstanceContext()) {
1064 if (NamingClass == ECRecord)
continue;
1074 assert(InstanceContext &&
"diagnosing dependent access");
1086 if (isa<CXXConstructorDecl>(
D) || isa<CXXDestructorDecl>(
D) ||
1087 (isa<FunctionTemplateDecl>(
D) &&
1088 isa<CXXConstructorDecl>(
1089 cast<FunctionTemplateDecl>(
D)->getTemplatedDecl()))) {
1091 diag::note_access_protected_restricted_ctordtor)
1097 diag::note_access_protected_restricted_object)
1107 const EffectiveContext &EC,
1108 AccessTarget &entity) {
1109 assert(entity.isMemberAccess());
1119 if (
VarDecl *VD = dyn_cast<VarDecl>(
D))
1125 else if (
TagDecl *TD = dyn_cast<TagDecl>(
D)) {
1126 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
1131 if (!PrevDecl)
break;
1136 Decl *ImmediateChild;
1141 while (DC->
getParent() != DeclaringClass)
1143 ImmediateChild = cast<Decl>(DC);
1148 bool isImplicit =
true;
1149 for (
const auto *I : DeclaringClass->
decls()) {
1150 if (I == ImmediateChild)
break;
1151 if (isa<AccessSpecDecl>(I)) {
1165 const EffectiveContext &EC,
1166 AccessTarget &entity) {
1168 AccessTarget::SavedInstanceContext _ = entity.saveInstanceContext();
1177 if (entity.isMemberAccess()) {
1180 const CXXRecordDecl *declaringClass = entity.getDeclaringClass();
1182 switch (
HasAccess(S, EC, declaringClass, accessSoFar, entity)) {
1187 entity.suppressInstanceContext();
1192 declaringClass == entity.getEffectiveNamingClass())
1197 llvm_unreachable(
"cannot diagnose dependent access");
1205 CXXBasePath::iterator i = path.end(), e = path.begin();
1206 CXXBasePath::iterator constrainingBase = i;
1220 if (baseAccess > accessSoFar) {
1221 constrainingBase = i;
1222 accessSoFar = baseAccess;
1225 switch (
HasAccess(S, EC, derivingClass, accessSoFar, entity)) {
1229 entity.suppressInstanceContext();
1230 constrainingBase =
nullptr;
1233 llvm_unreachable(
"cannot diagnose dependent access");
1240 assert(constrainingBase == i);
1247 if (constrainingBase == path.end())
1253 unsigned diagnostic;
1254 if (entity.isMemberAccess() ||
1255 constrainingBase + 1 != path.end()) {
1256 diagnostic = diag::note_access_constrained_by_path;
1258 diagnostic = diag::note_access_natural;
1268 if (entity.isMemberAccess())
1269 S.
Diag(entity.getTargetDecl()->getLocation(),
1270 diag::note_member_declared_at);
1274 const EffectiveContext &EC,
1275 AccessTarget &Entity) {
1277 const CXXRecordDecl *DeclaringClass = Entity.getDeclaringClass();
1278 NamedDecl *
D = (Entity.isMemberAccess() ? Entity.getTargetDecl() :
nullptr);
1310 AccessTarget &Entity) {
1312 dyn_cast<UsingShadowDecl>(Entity.getTargetDecl()))
1313 if (
UsingDecl *UD = dyn_cast<UsingDecl>(Shadow->getIntroducer())) {
1315 if (Entity.getTargetDecl()->getAccess() ==
AS_private &&
1318 S.
Diag(AccessLoc, diag::ext_ms_using_declaration_inaccessible)
1319 << UD->getQualifiedNameAsString()
1330 const EffectiveContext &EC,
1331 AccessTarget &Entity) {
1333 const CXXRecordDecl *NamingClass = Entity.getEffectiveNamingClass();
1336 assert(UnprivilegedAccess !=
AS_public &&
"public access not weeded out");
1342 if (UnprivilegedAccess !=
AS_none) {
1343 switch (
HasAccess(S, EC, NamingClass, UnprivilegedAccess, Entity)) {
1359 AccessTarget::SavedInstanceContext _ = Entity.saveInstanceContext();
1365 if (Entity.isMemberAccess()) {
1369 const CXXRecordDecl *DeclaringClass = Entity.getDeclaringClass();
1372 switch (
HasAccess(S, EC, DeclaringClass, FinalAccess, Entity)) {
1380 Entity.suppressInstanceContext();
1386 if (DeclaringClass == NamingClass)
1392 assert(Entity.getDeclaringClass() != NamingClass);
1400 assert(
Path->Access <= UnprivilegedAccess &&
1401 "access along best path worse than direct?");
1408 const EffectiveContext &EC,
1410 const AccessTarget &Entity) {
1411 assert(EC.isDependent() &&
"delaying non-dependent access");
1416 Entity.isMemberAccess(),
1418 Entity.getTargetDecl(),
1419 Entity.getNamingClass(),
1420 Entity.getBaseObjectType(),
1426 const EffectiveContext &EC,
1428 AccessTarget &Entity) {
1429 assert(Entity.getAccess() !=
AS_public &&
"called for public access!");
1440 if (!Entity.isQuiet())
1449 llvm_unreachable(
"invalid access result");
1453 AccessTarget &Entity) {
1483 bool IsFriendDeclaration =
false;
1484 while (TS && !IsFriendDeclaration) {
1488 if (!IsFriendDeclaration) {
1500 llvm_unreachable(
"invalid access result");
1515 if (
auto *
D = dyn_cast_if_present<DeclContext>(TD->getTemplatedDecl()))
1517 }
else if (
auto *RD = dyn_cast<RequiresExprBodyDecl>(
D)) {
1521 EffectiveContext EC(DC);
1536 if (!NamingD)
return;
1539 if (!TargetD)
return;
1543 NamedDecl *TargetDecl = cast<NamedDecl>(TargetD);
1545 if (!BaseObjectType.
isNull()) {
1546 BaseObjectType =
SubstType(BaseObjectType, TemplateArgs,
Loc,
1548 if (BaseObjectType.
isNull())
return;
1552 AccessTarget::Member,
1561 cast<CXXRecordDecl>(TargetD),
1562 cast<CXXRecordDecl>(NamingD),
1572 !
E->getNamingClass() ||
1576 AccessTarget Entity(
Context, AccessTarget::Member,
E->getNamingClass(),
1593 AccessTarget Entity(
Context, AccessTarget::Member,
E->getNamingClass(),
1609 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
Found,
1613 Entity.setDiag(
Diag);
1618 case AR_dependent: llvm_unreachable(
"dependent for =delete computation");
1619 case AR_delayed: llvm_unreachable(
"cannot delay =delete computation");
1621 llvm_unreachable(
"bad access result");
1640 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
1643 Entity.setDiag(
PDiag);
1652 bool IsCopyBindingRefToTemp) {
1659 PD =
PDiag(IsCopyBindingRefToTemp
1660 ? diag::ext_rvalue_to_reference_access_ctor
1661 : diag::err_access_ctor);
1666 PD =
PDiag(diag::err_access_base_ctor);
1674 PD =
PDiag(diag::err_access_field_ctor);
1681 PD =
PDiag(diag::err_access_lambda_capture);
1714 }
else if (
auto *Shadow =
1715 dyn_cast<ConstructorUsingShadowDecl>(
Found.getDecl())) {
1720 ObjectClass = NamingClass;
1723 AccessTarget AccessEntity(
1724 Context, AccessTarget::Member, NamingClass,
1727 AccessEntity.setDiag(PD);
1742 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
Found,
1745 Entity.setDiag(diag::err_access)
1759 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
1773 AccessTarget Entity(
Context, AccessTarget::Member, DecomposedClass, Field,
1775 Entity.setDiag(diag::err_decomp_decl_inaccessible_field);
1788 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
Found,
1809 if (!ArgExprs.empty()) {
1811 ArgExprs.back()->getEndLoc());
1829 AccessTarget entity(
Context, AccessTarget::Member,
1833 entity.setDiag(diag::err_access_friend_function)
1845 llvm_unreachable(
"invalid access result");
1858 AccessTarget Entity(
Context, AccessTarget::Member, NamingClass,
Found,
1860 Entity.setDiag(diag::err_access)
1870 bool ForceUnprivileged) {
1877 AccessTarget Entity(
Context, AccessTarget::Base,
Base, Derived,
Path.Access);
1879 SetupPDiag(Entity.setDiag(DiagID));
1881 if (ForceUnprivileged) {
1884 case ::AR_accessible:
1886 case ::AR_inaccessible:
1888 case ::AR_dependent:
1891 llvm_unreachable(
"unexpected result from CheckEffectiveAccess");
1899 unsigned DiagID,
bool ForceCheck,
1900 bool ForceUnprivileged) {
1904 ForceCheck, ForceUnprivileged);
1909 &&
"performing access check without access control");
1910 assert(R.
getNamingClass() &&
"performing access check without naming class");
1917 Entity.setDiag(diag::err_access);
1926 if (
Target->isCXXClassMember() && NamingClass) {
1949 ClassOfMethodDecl = MD->getClassInterface();
1952 = dyn_cast<ObjCImplDecl>(FD->getLexicalDeclContext())) {
1954 = dyn_cast<ObjCImplementationDecl>(Impl))
1955 ClassOfMethodDecl = IMPD->getClassInterface();
1957 = dyn_cast<ObjCCategoryImplDecl>(Impl))
1958 ClassOfMethodDecl = CatImplClass->getClassInterface();
1963 if (!ClassOfMethodDecl)
1974 return Ivar->getContainingInterface()->
isSuperClassOf(ClassOfMethodDecl);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::Expr interface and subclasses for C++ expressions.
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
llvm::MachO::Records Records
llvm::MachO::Record Record
static void DiagnoseBadAccess(Sema &S, SourceLocation Loc, const EffectiveContext &EC, AccessTarget &Entity)
AccessResult
A copy of Sema's enum without AR_delayed.
static bool TryDiagnoseProtectedAccess(Sema &S, const EffectiveContext &EC, AccessTarget &Target)
Given that an entity has protected natural access, check whether access might be denied because of th...
static AccessResult IsDerivedFromInclusive(const CXXRecordDecl *Derived, const CXXRecordDecl *Target)
Checks whether one class is derived from another, inclusively.
static void diagnoseBadDirectAccess(Sema &S, const EffectiveContext &EC, AccessTarget &entity)
We are unable to access a given declaration due to its direct access control; diagnose that.
static Sema::AccessResult CheckAccess(Sema &S, SourceLocation Loc, AccessTarget &Entity)
static AccessResult GetFriendKind(Sema &S, const EffectiveContext &EC, const CXXRecordDecl *Class)
static AccessResult MatchesFriend(Sema &S, const EffectiveContext &EC, const CXXRecordDecl *Friend)
static AccessResult GetProtectedFriendKind(Sema &S, const EffectiveContext &EC, const CXXRecordDecl *InstanceContext, const CXXRecordDecl *NamingClass)
Search for a class P that EC is a friend of, under the constraint InstanceContext <= P if InstanceCon...
static bool IsMicrosoftUsingDeclarationAccessBug(Sema &S, SourceLocation AccessLoc, AccessTarget &Entity)
MSVC has a bug where if during an using declaration name lookup, the declaration found is unaccessibl...
static CXXBasePath * FindBestPath(Sema &S, const EffectiveContext &EC, AccessTarget &Target, AccessSpecifier FinalAccess, CXXBasePaths &Paths)
Finds the best path from the naming class to the declaring class, taking friend declarations into acc...
static AccessResult IsAccessible(Sema &S, const EffectiveContext &EC, AccessTarget &Entity)
Determines whether the accessed entity is accessible.
static AccessResult HasAccess(Sema &S, const EffectiveContext &EC, const CXXRecordDecl *NamingClass, AccessSpecifier Access, const AccessTarget &Target)
static bool MightInstantiateTo(const CXXRecordDecl *From, const CXXRecordDecl *To)
Checks whether one class might instantiate to the other.
static void DiagnoseAccessPath(Sema &S, const EffectiveContext &EC, AccessTarget &entity)
Diagnose the path which caused the given declaration or base class to become inaccessible.
static CXXRecordDecl * FindDeclaringClass(NamedDecl *D)
static AccessResult CheckEffectiveAccess(Sema &S, const EffectiveContext &EC, SourceLocation Loc, AccessTarget &Entity)
Checks access to an entity from the given effective context.
static void DelayDependentAccess(Sema &S, const EffectiveContext &EC, SourceLocation Loc, const AccessTarget &Entity)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
AccessSpecifier Access
The access along this inheritance path.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
std::list< CXXBasePath >::iterator paths_iterator
Represents a base class of a C++ class.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
QualType getType() const
Retrieves the type of the base class.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
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 isLambda() const
Determine whether this class describes a lambda function object.
bool hasDefinition() const
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
Declaration of a class template.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
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 isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
A dependently-generated diagnostic.
NamedDecl * getAccessNamingClass() const
QualType getAccessBaseObjectType() const
bool isAccessToMember() const
NamedDecl * getAccessTarget() const
SourceLocation getAccessLoc() const
const PartialDiagnostic & getDiagnostic() const
static DependentDiagnostic * Create(ASTContext &Context, DeclContext *Parent, AccessNonce _, SourceLocation Loc, bool IsMemberAccess, AccessSpecifier AS, NamedDecl *TargetDecl, CXXRecordDecl *NamingClass, QualType BaseObjectType, const PartialDiagnostic &PDiag)
AccessSpecifier getAccess() const
This represents one expression.
Represents a member of a struct/union/class.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
bool isUnsupportedFriend() const
Determines if this friend kind is unsupported.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Represents a function declaration or definition.
DeclarationNameInfo getNameInfo() const
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
Describes an entity that is being initialized.
EntityKind getKind() const
Determine the kind of initialization.
QualType getType() const
Retrieve type being initialized.
ValueDecl * getDecl() const
Retrieve the variable, parameter, or field being initialized.
const InitializedEntity * getParent() const
Retrieve the parent of the entity being initialized, when the initialization itself is occurring with...
bool isInheritedVirtualBase() const
Return whether the base is an inherited virtual base.
@ EK_Member
The entity being initialized is a non-static data member subobject.
@ EK_Base
The entity being initialized is a base member subobject.
@ EK_ParenAggInitMember
The entity being initialized is a non-static data member subobject of an object initialized via paren...
@ EK_Delegating
The initialization is being done by a delegating constructor.
@ EK_LambdaCapture
The entity being initialized is the field that captures a variable in a lambda.
StringRef getCapturedVarName() const
For a lambda capture, return the capture's name.
const CXXBaseSpecifier * getBaseSpecifier() const
Retrieve the base specifier.
Represents the results of name lookup.
SourceLocation getNameLoc() const
Gets the location of the identifier.
CXXRecordDecl * getNamingClass() const
Returns the 'naming class' for this lookup, i.e.
QualType getBaseObjectType() const
Returns the base object type associated with this lookup; important for [class.protected].
Data structure that captures multiple levels of template argument lists for use in template instantia...
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.
std::string getQualifiedNameAsString() const
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCMethodDecl - Represents an instance or class method declaration.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
SourceLocation getNameLoc() const
Gets the location of the name.
CXXRecordDecl * getNamingClass()
Gets the naming class of this lookup, if any.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isFriendScope() const
Determine whether this scope is a friend scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
Sema - This implements semantic analysis and AST building for C.
Scope * getCurScope() const
Retrieve the parser's current scope.
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
AccessResult CheckAllocationAccess(SourceLocation OperatorLoc, SourceRange PlacementRange, CXXRecordDecl *NamingClass, DeclAccessPair FoundDecl, bool Diagnose=true)
Checks access to an overloaded operator new or delete.
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
const LangOptions & getLangOpts() const
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E, DeclAccessPair FoundDecl)
Perform access-control checking on a previously-unresolved member access which has now been resolved ...
bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass, QualType BaseType)
Checks access to Target from the given class.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
void CheckLookupAccess(const LookupResult &R)
Checks access to all the declarations in the given result set.
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
AccessResult CheckMemberAccess(SourceLocation UseLoc, CXXRecordDecl *NamingClass, DeclAccessPair Found)
Checks access to a member.
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Represents the declaration of a struct/union/class/enum.
The base class of all kinds of template declarations (e.g., class, function, etc.).
A container of type source information.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
CanQualType getCanonicalTypeUnqualified() const
const T * castAs() const
Member-template castAs<specific type>.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Base class for declarations which introduce a typedef-name.
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.
The iterator over UnresolvedSets.
Represents a C++ using-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represents a variable declaration or definition.
A declaration being accessed, together with information about how it was accessed.
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
AccessedEntity & getAccessData()
static DelayedDiagnostic makeAccess(SourceLocation Loc, const AccessedEntity &Entity)
The JSON file list parser is used to communicate input to InstallAPI.
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
OverloadExpr * Expression