23#include "llvm/ADT/STLExtras.h"
32 const TagType *TagTy = dyn_cast<TagType>(T->getCanonicalTypeInternal());
33 if (!isa_and_present<RecordType, InjectedClassNameType>(TagTy))
37 RD->isCurrentInstantiation(CurContext))
43 if (!T->isDependentType())
44 if (
auto *D = T->getAsTagDecl())
46 return ::getCurrentInstantiationOf(T,
CurContext);
50 bool EnteringContext) {
61 if (EnteringContext) {
67 NNSType =
Context.getCanonicalType(NNSType);
68 if (
const auto *SpecType =
69 dyn_cast<TemplateSpecializationType>(NNSType)) {
74 dyn_cast_or_null<ClassTemplateDecl>(
75 SpecType->getTemplateName().getAsTemplateDecl())) {
84 if (!TemplateParamLists.empty()) {
85 unsigned Depth =
ClassTemplate->getTemplateParameters()->getDepth();
86 auto L = find_if(TemplateParamLists,
90 if (L != TemplateParamLists.end()) {
93 SpecType->template_arguments(), *L, Pos);
105 "specifier in SFINAE context?");
122 }
else if (
const auto *RecordT = dyn_cast<RecordType>(NNSType)) {
124 return RecordT->getDecl()->getDefinitionOrSelf();
140 return Context.getTranslationUnitDecl();
146 llvm_unreachable(
"unexpected null nested name specifier");
149 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
161 assert(NNS.
isDependent() &&
"Only dependent nested-name-specifier allowed");
167 return ::getCurrentInstantiationOf(T,
CurContext);
181 assert(DC &&
"given null context");
183 TagDecl *tag = dyn_cast<TagDecl>(DC);
204 diag::err_incomplete_nested_name_spec,
210 if (
auto *EnumD = dyn_cast<EnumDecl>(tag))
234 return !TreatAsComplete;
256 Diag(L, diag::err_incomplete_nested_name_spec)
260 Diag(L, diag::err_incomplete_enum) <<
Context.getCanonicalTagType(EnumD);
277 Diag(SuperLoc, diag::err_super_in_lambda_unsupported);
283 if (S->isFunctionScope()) {
284 if (
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(S->getEntity()))
288 if (S->isClassScope()) {
295 Diag(SuperLoc, diag::err_invalid_super_scope);
298 Diag(SuperLoc, diag::err_no_base_classes) << RD->
getName();
323 if (TD->getUnderlyingType()->isRecordType())
325 if (TD->getUnderlyingType()->isEnumeralType()) {
326 if (
Context.getLangOpts().CPlusPlus11)
334 if (
Context.getLangOpts().CPlusPlus11)
339 if (
auto *TD = dyn_cast<TagDecl>(SD)) {
340 if (TD->isDependentType())
343 ->isDependentType()) {
356 if ((NNS = T->getPrefix()))
359 const auto *DNT = dyn_cast<DependentNameType>(T);
366 assert(!
Found.isAmbiguous() &&
"Cannot handle ambiguities here yet");
368 if (!
Found.isSingleResult())
382class NestedNameSpecifierValidatorCCC final
385 explicit NestedNameSpecifierValidatorCCC(
Sema &SRef,
bool HasQualifier)
388 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
392 if (!SRef.isAcceptableNestedNameSpecifier(ND))
397 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
398 return std::make_unique<NestedNameSpecifierValidatorCCC>(*
this);
412 if (
const auto *USD = dyn_cast<UsingShadowDecl>(ND)) {
417 }
else if (
const auto *TD = dyn_cast<TypeDecl>(ND)) {
420 switch (T->getTypeClass()) {
422 case Type::InjectedClassName:
427 TTL.setNameLoc(NameLoc);
435 case Type::UnresolvedUsing:
457 bool ErrorRecoveryLookup,
458 bool *IsCorrectedToColon,
459 bool OnlyNamespace) {
469 bool isDependent =
false;
470 if (IsCorrectedToColon)
471 *IsCorrectedToColon =
false;
472 if (!ObjectType.
isNull()) {
475 assert(!SS.
isSet() &&
"ObjectType and scope specifier cannot coexist");
478 }
else if (SS.
isSet()) {
486 bool ObjectTypeSearchedInScope =
false;
523 else if (ScopeLookupResult)
524 Found.addDecl(ScopeLookupResult);
526 ObjectTypeSearchedInScope =
true;
528 }
else if (!isDependent) {
533 if (
Found.isAmbiguous())
538 if (
Found.empty() && isDependent &&
539 !(LookupCtx && LookupCtx->
isRecord() &&
543 if (ErrorRecoveryLookup)
565 if (
Found.empty() && !ErrorRecoveryLookup) {
571 else if (S && !isDependent)
575 R.suppressDiagnostics();
578 if (IsCorrectedToColon) {
579 *IsCorrectedToColon =
true;
580 Diag(IdInfo.
CCLoc, diag::err_nested_name_spec_is_not_class)
584 Diag(ND->getLocation(), diag::note_declared_at);
588 Diag(R.getNameLoc(), OnlyNamespace
589 ?
unsigned(diag::err_expected_namespace_name)
590 :
unsigned(diag::err_expected_class_or_namespace))
593 Diag(ND->getLocation(), diag::note_entity_declared_at)
604 NestedNameSpecifierValidatorCCC CCC(*
this, !SS.
isEmpty());
606 Found.getLookupNameInfo(),
Found.getLookupKind(), S, &SS, CCC,
609 bool DroppedSpecifier =
610 Corrected.WillReplaceSpecifier() &&
612 if (DroppedSpecifier)
615 << Name << LookupCtx << DroppedSpecifier
621 if (Corrected.getCorrectionSpecifier())
625 if (
NamedDecl *ND = Corrected.getFoundDecl())
627 Found.setLookupName(Corrected.getCorrection());
634 Found.isSingleResult() ?
Found.getRepresentativeDecl() :
nullptr;
635 bool IsExtension =
false;
637 if (!AcceptSpec && IsExtension) {
642 if (!ObjectType.
isNull() && !ObjectTypeSearchedInScope &&
661 OuterDecl = ScopeLookupResult;
669 if (ErrorRecoveryLookup)
673 diag::err_nested_name_member_ref_lookup_ambiguous)
684 if (
auto *TD = dyn_cast_or_null<TypedefNameDecl>(SD))
689 if (ErrorRecoveryLookup)
695 if (
NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(SD)) {
711 assert(IsType &&
"unhandled declaration kind");
717 if (ErrorRecoveryLookup)
751 diag::ext_undeclared_unqual_id_with_dependent_base)
762 ContainingClass,
false);
786 if (!
Found.empty()) {
800 return !T->getAsCanonical<TagType>();
810 Diag(ND->getLocation(), diag::note_entity_declared_at)
813 }
else if (SS.
isSet())
825 bool *IsCorrectedToColon,
826 bool OnlyNamespace) {
832 IsCorrectedToColon, OnlyNamespace);
847 if (!T->isDependentType() && !
isa<TagType>(T.getCanonicalType())) {
889 bool EnteringContext) {
906 bool EnteringContext) {
918 TemplateArgs, S,
true);
924 if (!T->isDependentType() && !
isa<TagType>(T.getCanonicalType())) {
925 Diag(TemplateNameLoc, diag::err_nested_name_spec_non_tag) << T;
945 struct NestedNameSpecifierAnnotation {
955 (
sizeof(NestedNameSpecifierAnnotation) + SS.
location_size()),
956 alignof(NestedNameSpecifierAnnotation));
957 NestedNameSpecifierAnnotation *Annotation
958 =
new (Mem) NestedNameSpecifierAnnotation;
967 if (!AnnotationPtr) {
972 NestedNameSpecifierAnnotation *Annotation
973 =
static_cast<NestedNameSpecifierAnnotation *
>(AnnotationPtr);
978 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1004 return CurContext->getRedeclContext()->isFileContext();
1012 llvm_unreachable(
"unexpected null nested name specifier");
1015 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
1019 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1024 if (!DC)
return true;
1041 assert(SS.
isSet() &&
"Parser passed invalid CXXScopeSpec.");
1045 "exiting declarator scope we never really entered");
Defines the clang::ASTContext interface.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Record Record
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.
static bool ExtendNestedNameSpecifier(Sema &S, CXXScopeSpec &SS, const NamedDecl *ND, SourceLocation NameLoc, SourceLocation CCLoc)
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) 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.
void Make(ASTContext &Context, TypeLoc TL, SourceLocation ColonColonLoc)
Make a nested-name-specifier of the form 'type::'.
char * location_data() const
Retrieve the data associated with the source-location information.
SourceLocation getLastQualifierNameLoc() const
Retrieve the location of the name in the last qualifier in this nested name specifier.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
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
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
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 Extend(ASTContext &Context, NamespaceBaseDecl *Namespace, SourceLocation NamespaceLoc, SourceLocation ColonColonLoc)
Extend the current nested-name-specifier by another nested-name-specifier component of the form 'name...
bool isInvalid() const
An error occurred during parsing of the scope specifier.
void MakeMicrosoftSuper(ASTContext &Context, CXXRecordDecl *RD, SourceLocation SuperLoc, SourceLocation ColonColonLoc)
Turns this (empty) nested-name-specifier into '__super' nested-name-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.
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 isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool isFunctionOrMethod() const
Captures information about "declaration specifiers".
TST getTypeSpecType() const
SourceLocation getBeginLoc() const LLVM_READONLY
static const TST TST_typename_pack_indexing
SourceLocation getEllipsisLoc() 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.
std::string getAsString() const
Retrieve the human-readable string for this name.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(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...
EnumDecl * getDefinition() const
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.
Represents the results of name lookup.
DeclClass * getAsSingle() const
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.
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 * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
void setEllipsisLoc(SourceLocation Loc)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Callback class to reject typo corrections that look like template parameters when doing a qualified l...
bool ValidateCandidate(const TypoCorrection &Candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
Scope - A scope is a transient data structure that is used while parsing the program.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
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.
@ 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,...
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)
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
ASTContext & getASTContext() const
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...
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
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.
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
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)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
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 ...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
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 isSFINAEContext() const
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
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.
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 InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
OpaquePtr< TemplateName > TemplateTy
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.
SourceLocation getEnd() const
SourceLocation getBegin() const
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 * getDefinitionOrSelf() const
void setElaboratedKeywordLoc(SourceLocation Loc)
A convenient class for passing around template argument information.
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.
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.
void clear()
Resets this builder to the newly-initialized state.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
void pushTrivial(ASTContext &Context, QualType T, SourceLocation Loc)
Pushes 'T' with all locations pointing to 'Loc'.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
TagDecl * castAsTagDecl() const
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.
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.
Wrapper for source info for types used via transparent aliases.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
@ Result
The result type of a method or function.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
@ 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.
U cast(CodeGen::Address addr)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ 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.