23#include "llvm/ADT/STLExtras.h"
33 if (
const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
34 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
35 if (!Record->isDependentContext() ||
36 Record->isCurrentInstantiation(CurContext))
40 }
else if (isa<InjectedClassNameType>(Ty))
41 return cast<InjectedClassNameType>(Ty)->getDecl();
56 return Tag->getDecl();
58 return ::getCurrentInstantiationOf(T,
CurContext);
75 bool EnteringContext) {
86 if (EnteringContext) {
100 = dyn_cast_or_null<ClassTemplateDecl>(
101 SpecType->getTemplateName().getAsTemplateDecl())) {
113 if (!TemplateParamLists.empty()) {
114 unsigned Depth =
ClassTemplate->getTemplateParameters()->getDepth();
115 auto L = find_if(TemplateParamLists,
119 if (L != TemplateParamLists.end()) {
122 SpecType->template_arguments(), *L, Pos);
133 "specifier in SFINAE context?");
152 return RecordT->getDecl();
161 llvm_unreachable(
"Dependent nested-name-specifier has no DeclContext");
172 assert(Tag &&
"Non-tag type in nested-name-specifier");
183 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
200 assert(NNS->
isDependent() &&
"Only dependent nested-name-specifier allowed");
206 return ::getCurrentInstantiationOf(T,
CurContext);
220 assert(DC &&
"given null context");
222 TagDecl *tag = dyn_cast<TagDecl>(DC);
232 tag =
type->getAsTagDecl();
249 if (
auto *EnumD = dyn_cast<EnumDecl>(tag))
272 return !TreatAsComplete;
294 Diag(L, diag::err_incomplete_nested_name_spec)
315 Diag(SuperLoc, diag::err_super_in_lambda_unsupported);
321 if (S->isFunctionScope()) {
322 if (
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(S->getEntity()))
326 if (S->isClassScope()) {
327 RD = cast<CXXRecordDecl>(S->getEntity());
333 Diag(SuperLoc, diag::err_invalid_super_scope);
336 Diag(SuperLoc, diag::err_no_base_classes) << RD->
getName();
357 if (isa<NamespaceDecl>(SD))
360 if (!isa<TypeDecl>(SD))
369 if (TD->getUnderlyingType()->isRecordType())
371 if (TD->getUnderlyingType()->isEnumeralType()) {
377 }
else if (isa<RecordDecl>(SD)) {
379 }
else if (isa<EnumDecl>(SD)) {
406 assert(!Found.
isAmbiguous() &&
"Cannot handle ambiguities here yet");
422class NestedNameSpecifierValidatorCCC final
425 explicit NestedNameSpecifierValidatorCCC(
Sema &SRef)
428 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
432 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
433 return std::make_unique<NestedNameSpecifierValidatorCCC>(*
this);
476 bool ErrorRecoveryLookup,
477 bool *IsCorrectedToColon,
478 bool OnlyNamespace) {
488 bool isDependent =
false;
489 if (IsCorrectedToColon)
490 *IsCorrectedToColon =
false;
491 if (!ObjectType.
isNull()) {
494 assert(!SS.
isSet() &&
"ObjectType and scope specifier cannot coexist");
497 }
else if (SS.
isSet()) {
505 bool ObjectTypeSearchedInScope =
false;
542 else if (ScopeLookupResult)
543 Found.
addDecl(ScopeLookupResult);
545 ObjectTypeSearchedInScope =
true;
547 }
else if (!isDependent) {
557 if (Found.
empty() && isDependent &&
558 !(LookupCtx && LookupCtx->
isRecord() &&
559 (!cast<CXXRecordDecl>(LookupCtx)->hasDefinition() ||
560 !cast<CXXRecordDecl>(LookupCtx)->hasAnyDependentBases()))) {
562 if (ErrorRecoveryLookup)
573 if (Found.
empty() && !ErrorRecoveryLookup) {
579 else if (S && !isDependent)
586 if (IsCorrectedToColon) {
587 *IsCorrectedToColon =
true;
588 Diag(IdInfo.
CCLoc, diag::err_nested_name_spec_is_not_class)
592 Diag(ND->getLocation(), diag::note_declared_at);
597 ?
unsigned(diag::err_expected_namespace_name)
598 :
unsigned(diag::err_expected_class_or_namespace))
601 Diag(ND->getLocation(), diag::note_entity_declared_at)
612 NestedNameSpecifierValidatorCCC CCC(*
this);
617 bool DroppedSpecifier =
618 Corrected.WillReplaceSpecifier() &&
619 Name.getAsString() == Corrected.getAsString(
getLangOpts());
620 if (DroppedSpecifier)
623 << Name << LookupCtx << DroppedSpecifier
629 if (Corrected.getCorrectionSpecifier())
633 if (
NamedDecl *ND = Corrected.getFoundDecl())
643 bool IsExtension =
false;
645 if (!AcceptSpec && IsExtension) {
650 if (!ObjectType.
isNull() && !ObjectTypeSearchedInScope &&
669 OuterDecl = ScopeLookupResult;
673 (!isa<TypeDecl>(OuterDecl) || !isa<TypeDecl>(SD) ||
677 if (ErrorRecoveryLookup)
681 diag::err_nested_name_member_ref_lookup_ambiguous)
692 if (
auto *TD = dyn_cast_or_null<TypedefNameDecl>(SD))
697 if (ErrorRecoveryLookup)
703 if (
NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(SD)) {
720 if (
const auto *USD = dyn_cast<UsingShadowDecl>(SD)) {
723 }
else if (isa<InjectedClassNameType>(T)) {
727 }
else if (isa<RecordType>(T)) {
730 }
else if (isa<TypedefType>(T)) {
733 }
else if (isa<EnumType>(T)) {
736 }
else if (isa<TemplateTypeParmType>(T)) {
740 }
else if (isa<UnresolvedUsingType>(T)) {
744 }
else if (isa<SubstTemplateTypeParmType>(T)) {
748 }
else if (isa<SubstTemplateTypeParmPackType>(T)) {
753 llvm_unreachable(
"Unhandled TypeDecl node in nested-name-specifier");
763 if (ErrorRecoveryLookup)
797 diag::ext_undeclared_unqual_id_with_dependent_base)
806 if (!Found.
empty()) {
818 Diag(ND->getLocation(), diag::note_entity_declared_at)
821 }
else if (SS.
isSet())
833 bool *IsCorrectedToColon,
834 bool OnlyNamespace) {
840 IsCorrectedToColon, OnlyNamespace);
878 bool EnteringContext) {
895 bool EnteringContext) {
924 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
940 isa<FunctionTemplateDecl>(TD) || isa<VarTemplateDecl>(TD)) {
945 Diag(CCLoc, diag::err_non_type_template_in_nested_name_specifier)
946 << (TD && isa<VarTemplateDecl>(TD)) << Template << R;
960 Diag(TemplateNameLoc, diag::err_nested_name_spec_non_tag) << T;
973 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
985 struct NestedNameSpecifierAnnotation {
995 (
sizeof(NestedNameSpecifierAnnotation) + SS.
location_size()),
996 alignof(NestedNameSpecifierAnnotation));
997 NestedNameSpecifierAnnotation *Annotation
998 =
new (Mem) NestedNameSpecifierAnnotation;
1007 if (!AnnotationPtr) {
1012 NestedNameSpecifierAnnotation *Annotation
1013 =
static_cast<NestedNameSpecifierAnnotation *
>(AnnotationPtr);
1018 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1041 switch (Qualifier->getKind()) {
1057 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
1067 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1072 if (!DC)
return true;
1094 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1098 "exiting declarator scope we never really entered");
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static CXXRecordDecl * getCurrentInstantiationOf(QualType T, DeclContext *CurContext)
Find the current instantiation that associated with the given type.
enum clang::format::@1210::AnnotatingParser::Context::@329 ContextType
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
const LangOptions & getLangOpts() const
void * Allocate(size_t Size, unsigned Align=8) const
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasDefinition() const
Represents a C++ nested-name-specifier or a global scope specifier.
char * location_data() const
Retrieve the data associated with the source-location information.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceLocation getLastQualifierNameLoc() const
Retrieve the location of the name in the last qualifier in this nested name specifier.
SourceRange getRange() const
void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc)
Turn this (empty) nested-name-specifier into the global nested-name-specifier '::'.
bool isSet() const
Deprecated.
ArrayRef< TemplateParameterList * > getTemplateParamLists() const
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.
void SetInvalid(SourceRange R)
Indicate that this nested-name-specifier is invalid.
unsigned location_size() const
Retrieve the size of the data associated with source-location information.
void MakeSuper(ASTContext &Context, CXXRecordDecl *RD, SourceLocation SuperLoc, SourceLocation ColonColonLoc)
Turns this (empty) nested-name-specifier into '__super' nested-name-specifier.
void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, SourceLocation ColonColonLoc)
Extend the current nested-name-specifier by another nested-name-specifier component of the form 'type...
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Declaration of a class template.
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...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
bool isFunctionOrMethod() const
Captures information about "declaration specifiers".
TST getTypeSpecType() const
Expr * getRepAsExpr() const
static const TST TST_decltype
SourceLocation getTypeSpecTypeLoc() const
static const TST TST_error
SourceRange getTypeofParensRange() const
SourceLocation getLocation() const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
Represents a dependent template name that cannot be resolved prior to template instantiation.
bool isIdentifier() const
Determine whether this template name refers to an identifier.
NestedNameSpecifier * getQualifier() const
Return the nested name specifier that qualifies this name.
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setTemplateKeywordLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void setLAngleLoc(SourceLocation Loc)
void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)
void setTemplateNameLoc(SourceLocation Loc)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Wrapper for source info for enum types.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
Wrapper for source info for injected class names of class templates.
Represents the results of name lookup.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
DeclClass * getAsSingle() const
void setContextRange(SourceRange SR)
Sets a 'context' source range.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
void setLookupName(DeclarationName Name)
Sets the name to look up.
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.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
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.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
Provides information a specialization of a member of a class template, which may be a member function...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represents a C++ namespace alias.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
A (possibly-)qualified type.
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.
Wrapper for source info for record types.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Scope - A scope is a transient data structure that is used while parsing the program.
Sema - This implements semantic analysis and AST building for C.
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
Scope * getCurScope() const
Retrieve the parser's current scope.
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier *NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, bool Final=false, const TemplateArgumentList *Innermost=nullptr, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
void NoteAllFoundTemplates(TemplateName Name)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void * SaveNestedNameSpecifierAnnotation(CXXScopeSpec &SS)
Given a C++ nested-name-specifier, produce an annotation value that the parser can use later to recon...
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
bool ActOnCXXGlobalScopeSpecifier(SourceLocation CCLoc, CXXScopeSpec &SS)
The parser has parsed a global nested-name-specifier '::'.
bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
The parser has parsed a nested-name-specifier 'identifier::'.
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...
void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
ActOnCXXExitDeclaratorScope - Called when a declarator that previously invoked ActOnCXXEnterDeclarato...
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
bool ActOnSuperScopeSpecifier(SourceLocation SuperLoc, SourceLocation ColonColonLoc, CXXScopeSpec &SS)
The parser has parsed a '__super' nested-name-specifier.
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
void ExitDeclaratorContext(Scope *S)
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier *NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
Build a new nested-name-specifier for "identifier::", as described by ActOnCXXNestedNameSpecifier.
void RestoreNestedNameSpecifierAnnotation(void *Annotation, SourceRange AnnotationRange, CXXScopeSpec &SS)
Given an annotation pointer for a nested-name-specifier, restore the nested-name-specifier structure.
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
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.
bool isAcceptableNestedNameSpecifier(const NamedDecl *SD, bool *CanCorrect=nullptr)
Determines whether the given declaration is an valid acceptable result for name lookup of a nested-na...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
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.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
bool ActOnCXXEnterDeclaratorScope(Scope *S, CXXScopeSpec &SS)
ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global scope or nested-name-specifi...
bool resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name, SourceLocation NameLoc, bool Diagnose=true)
bool InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
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)
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, NestedNameSpecInfo &IdInfo, bool EnteringContext)
IsInvalidUnlessNestedName - This method is used for error recovery purposes to determine whether the ...
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
Encodes a location in the source.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getEnd() const
SourceLocation getBegin() const
Wrapper for substituted template type parameters.
Wrapper for substituted template type parameters.
Represents the declaration of a struct/union/class/enum.
bool isBeingDefined() const
Return true if this decl is currently being defined.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getDecl() const
A convenient class for passing around template argument information.
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl() const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
Stores a list of template parameters for a TemplateDecl and its derived classes.
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)
void setTemplateKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
Represents a type template specialization; the template must be a class template, a type alias templa...
Wrapper for template type parameters.
Represents a declaration of a type.
const Type * getTypeForDecl() const
TypeLoc getTypeLocInContext(ASTContext &Context, QualType T)
Copies the type-location information to the given AST context and returns a TypeLoc referring into th...
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isEnumeralType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
QualType getCanonicalTypeInternal() const
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
Wrapper for source info for unresolved typename using decls.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ Result
The result type of a method or function.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ ETK_None
No keyword precedes the qualified type name.
Keeps information about an identifier in a nested-name-spec.
IdentifierInfo * Identifier
The identifier preceding the '::'.
SourceLocation IdentifierLoc
The location of the identifier.
SourceLocation CCLoc
The location of the '::'.
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.