diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp index 90539eaabbe03..24d346bdfaa53 100644 --- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp @@ -350,6 +350,8 @@ class RenamerClangTidyVisitor const TemplateDecl *Decl = Loc.getTypePtr()->getTemplateName().getAsTemplateDecl( /*IgnoreDeduced=*/true); + if (!Decl) + return true; if (const auto *ClassDecl = dyn_cast(Decl)) if (const NamedDecl *TemplDecl = ClassDecl->getTemplatedDecl()) diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp index 32018d1bf3a84..8aae41420b83e 100644 --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -406,15 +406,6 @@ struct TargetFinder { } } } - void VisitDependentTemplateSpecializationType( - const DependentTemplateSpecializationType *DTST) { - if (Outer.Resolver) { - for (const NamedDecl *ND : - Outer.Resolver->resolveTemplateSpecializationType(DTST)) { - Outer.add(ND, Flags); - } - } - } void VisitTypedefType(const TypedefType *TT) { if (shouldSkipTypedef(TT->getDecl())) return; @@ -455,11 +446,13 @@ struct TargetFinder { // class template specializations have a (specialized) CXXRecordDecl. else if (const CXXRecordDecl *RD = TST->getAsCXXRecordDecl()) Outer.add(RD, Flags); // add(Decl) will despecialize if needed. - else { + else if (auto *TD = TST->getTemplateName().getAsTemplateDecl()) // fallback: the (un-specialized) declaration from primary template. - if (auto *TD = TST->getTemplateName().getAsTemplateDecl()) - Outer.add(TD->getTemplatedDecl(), Flags | Rel::TemplatePattern); - } + Outer.add(TD->getTemplatedDecl(), Flags | Rel::TemplatePattern); + else if (Outer.Resolver) + for (const NamedDecl *ND : + Outer.Resolver->resolveTemplateSpecializationType(TST)) + Outer.add(ND, Flags); } void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *STTPT) { @@ -900,15 +893,6 @@ refInTypeLoc(TypeLoc L, const HeuristicResolver *Resolver) { DeclRelation::Alias, Resolver)}); } - void VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc L) { - Refs.push_back( - ReferenceLoc{L.getQualifierLoc(), L.getTemplateNameLoc(), - /*IsDecl=*/false, - explicitReferenceTargets( - DynTypedNode::create(L.getType()), {}, Resolver)}); - } - void VisitDependentNameTypeLoc(DependentNameTypeLoc L) { Refs.push_back( ReferenceLoc{L.getQualifierLoc(), L.getNameLoc(), diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 2b151b1274428..ab720ebe6b47f 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -728,11 +728,6 @@ class CollectExtraHighlightings return true; } - bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc L) { - H.addAngleBracketTokens(L.getLAngleLoc(), L.getRAngleLoc()); - return true; - } - bool VisitFunctionDecl(FunctionDecl *D) { if (D->isOverloadedOperator()) { const auto AddOpDeclToken = [&](SourceLocation Loc) { @@ -1087,11 +1082,12 @@ class CollectExtraHighlightings return true; } - bool VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc L) { - H.addToken(L.getTemplateNameLoc(), HighlightingKind::Type) - .addModifier(HighlightingModifier::DependentName) - .addModifier(HighlightingModifier::ClassScope); + bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc L) { + if (!L.getTypePtr()->getTemplateName().getAsTemplateDecl( + /*IgnoreDeduced=*/true)) + H.addToken(L.getTemplateNameLoc(), HighlightingKind::Type) + .addModifier(HighlightingModifier::DependentName) + .addModifier(HighlightingModifier::ClassScope); H.addAngleBracketTokens(L.getLAngleLoc(), L.getRAngleLoc()); return true; } diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp index f369e1b0341e8..dd26182630ae1 100644 --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -1029,8 +1029,7 @@ TEST_F(TargetDeclTest, DependentTypes) { template void foo(typename A::template [[B]]); )cpp"; - EXPECT_DECLS("DependentTemplateSpecializationTypeLoc", - "template struct B"); + EXPECT_DECLS("TemplateSpecializationTypeLoc", "template struct B"); // Dependent name with recursive definition. We don't expect a // result, but we shouldn't get into a stack overflow either. diff --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp index 0cbf9a080a3ce..7bbdc8ba00dca 100644 --- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp +++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp @@ -321,6 +321,8 @@ class ASTWalker : public RecursiveASTVisitor { // TypeLoc visitors. void reportType(SourceLocation RefLoc, NamedDecl *ND) { + if (!ND) + return; // Reporting explicit references to types nested inside classes can cause // issues, e.g. a type accessed through a derived class shouldn't require // inclusion of the base. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 4868714d898ec..51e5973098c14 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -458,7 +458,9 @@ AST Matchers following the corresponding changes in the clang AST. - Ensure ``hasBitWidth`` doesn't crash on bit widths that are dependent on template parameters. - +- Remove the ``dependentTemplateSpecializationType`` matcher, as the + corresponding AST node was removed. This matcher was never very useful, since + there was no way to match on its template name. - Add a boolean member ``IgnoreSystemHeaders`` to ``MatchFinderOptions``. This allows it to ignore nodes in system headers when traversing the AST. diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 1c17333b722f8..b8f6de69bbb98 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -241,9 +241,6 @@ class ASTContext : public RefCountedBase { mutable llvm::FoldingSet UsingTypes; mutable llvm::FoldingSet> TypedefTypes; mutable llvm::FoldingSet DependentNameTypes; - mutable llvm::DenseMap - DependentTemplateSpecializationTypes; mutable llvm::FoldingSet PackExpansionTypes; mutable llvm::FoldingSet ObjCObjectTypes; mutable llvm::FoldingSet ObjCObjectPointerTypes; @@ -1904,7 +1901,8 @@ class ASTContext : public RefCountedBase { TemplateTypeParmDecl *ParmDecl = nullptr) const; QualType getCanonicalTemplateSpecializationType( - TemplateName T, ArrayRef CanonicalArgs) const; + ElaboratedTypeKeyword Keyword, TemplateName T, + ArrayRef CanonicalArgs) const; QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, @@ -1935,13 +1933,6 @@ class ASTContext : public RefCountedBase { NestedNameSpecifier NNS, const IdentifierInfo *Name) const; - QualType getDependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args) const; - QualType getDependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args, bool IsCanonical = false) const; - TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const; /// Form a pack expansion type with the given pattern. diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h index fe08d637a1e1d..ea68cc70f9131 100644 --- a/clang/include/clang/AST/ASTNodeTraverser.h +++ b/clang/include/clang/AST/ASTNodeTraverser.h @@ -533,11 +533,6 @@ class ASTNodeTraverser for (unsigned I=0, N=TL.getNumArgs(); I < N; ++I) dumpTemplateArgumentLoc(TL.getArgLoc(I)); } - void VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc TL) { - for (unsigned I=0, N=TL.getNumArgs(); I < N; ++I) - dumpTemplateArgumentLoc(TL.getArgLoc(I)); - } void VisitTypedefDecl(const TypedefDecl *D) { Visit(D->getUnderlyingType()); } diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 02581c8e73299..c1944487716de 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1192,13 +1192,6 @@ DEF_TRAVERSE_TYPE(DependentNameType, { TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); }) -DEF_TRAVERSE_TYPE(DependentTemplateSpecializationType, { - const DependentTemplateStorage &S = T->getDependentTemplateName(); - if (TraverseQualifier) - TRY_TO(TraverseNestedNameSpecifier(S.getQualifier())); - TRY_TO(TraverseTemplateArguments(T->template_arguments())); -}) - DEF_TRAVERSE_TYPE(TemplateSpecializationType, { if (TraverseQualifier) { TRY_TO(TraverseTemplateName(T->getTemplateName())); @@ -1546,15 +1539,6 @@ DEF_TRAVERSE_TYPELOC(DependentNameType, { TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); }) -DEF_TRAVERSE_TYPELOC(DependentTemplateSpecializationType, { - if (TraverseQualifier) - TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); - - for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) { - TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I))); - } -}) - DEF_TRAVERSE_TYPELOC(TemplateSpecializationType, { if (TraverseQualifier) TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); diff --git a/clang/include/clang/AST/TemplateName.h b/clang/include/clang/AST/TemplateName.h index abb0669bff378..b6999a1b4e9b9 100644 --- a/clang/include/clang/AST/TemplateName.h +++ b/clang/include/clang/AST/TemplateName.h @@ -297,10 +297,10 @@ class TemplateName { /// set of function templates, returns NULL. TemplateDecl *getAsTemplateDecl(bool IgnoreDeduced = false) const; - /// Retrieves the underlying template declaration that + /// Retrieves the underlying template name that /// this template name refers to, along with the /// deduced default arguments, if any. - std::pair + std::pair getTemplateDeclAndDefaultArgs() const; /// Retrieve the underlying, overloaded function template diff --git a/clang/include/clang/AST/TypeBase.h b/clang/include/clang/AST/TypeBase.h index db2ab04e4471c..9074992a3de8c 100644 --- a/clang/include/clang/AST/TypeBase.h +++ b/clang/include/clang/AST/TypeBase.h @@ -2250,22 +2250,6 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase { unsigned NumArgs; }; - class DependentTemplateSpecializationTypeBitfields { - friend class DependentTemplateSpecializationType; - - LLVM_PREFERRED_TYPE(KeywordWrapperBitfields) - unsigned : NumTypeWithKeywordBits; - - /// The number of template arguments named in this class template - /// specialization, which is expected to be able to hold at least 1024 - /// according to [implimits]. However, as this limit is somewhat easy to - /// hit with template metaprogramming we'd prefer to keep it as large - /// as possible. At the moment it has been left as a non-bitfield since - /// this type safely fits in 64 bits as an unsigned, so there is no reason - /// to introduce the performance impact of a bitfield. - unsigned NumArgs; - }; - class PackExpansionTypeBitfields { friend class PackExpansionType; @@ -2346,8 +2330,6 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase { SubstTemplateTypeParmTypeBitfields SubstTemplateTypeParmTypeBits; SubstPackTypeBitfields SubstPackTypeBits; TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits; - DependentTemplateSpecializationTypeBitfields - DependentTemplateSpecializationTypeBits; PackExpansionTypeBitfields PackExpansionTypeBits; CountAttributedTypeBitfields CountAttributedTypeBits; PresefinedSugarTypeBitfields PredefinedSugarTypeBits; @@ -7366,9 +7348,9 @@ class TemplateSpecializationType : public TypeWithKeyword, } void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx); - static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, - ArrayRef Args, QualType Underlying, - const ASTContext &Context); + static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, + TemplateName T, ArrayRef Args, + QualType Underlying, const ASTContext &Context); static bool classof(const Type *T) { return T->getTypeClass() == TemplateSpecialization; @@ -7459,46 +7441,6 @@ class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode { } }; -/// Represents a template specialization type whose template cannot be -/// resolved, e.g. -/// A::template B -class DependentTemplateSpecializationType : public TypeWithKeyword { - friend class ASTContext; // ASTContext creates these - - DependentTemplateStorage Name; - - DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, - const DependentTemplateStorage &Name, - ArrayRef Args, - QualType Canon); - -public: - const DependentTemplateStorage &getDependentTemplateName() const { - return Name; - } - - ArrayRef template_arguments() const { - return {reinterpret_cast(this + 1), - DependentTemplateSpecializationTypeBits.NumArgs}; - } - - bool isSugared() const { return false; } - QualType desugar() const { return QualType(this, 0); } - - void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { - Profile(ID, Context, getKeyword(), Name, template_arguments()); - } - - static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, - ElaboratedTypeKeyword Keyword, - const DependentTemplateStorage &Name, - ArrayRef Args); - - static bool classof(const Type *T) { - return T->getTypeClass() == DependentTemplateSpecialization; - } -}; - /// Represents a pack expansion of types. /// /// Pack expansions are part of C++11 variadic templates. A pack diff --git a/clang/include/clang/AST/TypeLoc.h b/clang/include/clang/AST/TypeLoc.h index d52e10419e97a..38e8fba569396 100644 --- a/clang/include/clang/AST/TypeLoc.h +++ b/clang/include/clang/AST/TypeLoc.h @@ -2598,134 +2598,6 @@ class DependentNameTypeLoc : public ConcreteTypeLoc { -public: - SourceLocation getElaboratedKeywordLoc() const { - return this->getLocalData()->ElaboratedKWLoc; - } - - void setElaboratedKeywordLoc(SourceLocation Loc) { - this->getLocalData()->ElaboratedKWLoc = Loc; - } - - NestedNameSpecifierLoc getQualifierLoc() const { - if (!getLocalData()->QualifierData) - return NestedNameSpecifierLoc(); - - return NestedNameSpecifierLoc( - getTypePtr()->getDependentTemplateName().getQualifier(), - getLocalData()->QualifierData); - } - - void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc) { - if (!QualifierLoc) { - // Even if we have a nested-name-specifier in the dependent - // template specialization type, we won't record the nested-name-specifier - // location information when this type-source location information is - // part of a nested-name-specifier. - getLocalData()->QualifierData = nullptr; - return; - } - - assert(QualifierLoc.getNestedNameSpecifier() == - getTypePtr()->getDependentTemplateName().getQualifier() && - "Inconsistent nested-name-specifier pointer"); - getLocalData()->QualifierData = QualifierLoc.getOpaqueData(); - } - - SourceLocation getTemplateKeywordLoc() const { - return getLocalData()->TemplateKWLoc; - } - - void setTemplateKeywordLoc(SourceLocation Loc) { - getLocalData()->TemplateKWLoc = Loc; - } - - SourceLocation getTemplateNameLoc() const { - return this->getLocalData()->NameLoc; - } - - void setTemplateNameLoc(SourceLocation Loc) { - this->getLocalData()->NameLoc = Loc; - } - - SourceLocation getLAngleLoc() const { - return this->getLocalData()->LAngleLoc; - } - - void setLAngleLoc(SourceLocation Loc) { - this->getLocalData()->LAngleLoc = Loc; - } - - SourceLocation getRAngleLoc() const { - return this->getLocalData()->RAngleLoc; - } - - void setRAngleLoc(SourceLocation Loc) { - this->getLocalData()->RAngleLoc = Loc; - } - - unsigned getNumArgs() const { - return getTypePtr()->template_arguments().size(); - } - - void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI) { - getArgInfos()[i] = AI; - } - - TemplateArgumentLocInfo getArgLocInfo(unsigned i) const { - return getArgInfos()[i]; - } - - TemplateArgumentLoc getArgLoc(unsigned i) const { - return TemplateArgumentLoc(getTypePtr()->template_arguments()[i], - getArgLocInfo(i)); - } - - SourceRange getLocalSourceRange() const { - if (getElaboratedKeywordLoc().isValid()) - return SourceRange(getElaboratedKeywordLoc(), getRAngleLoc()); - else if (getQualifierLoc()) - return SourceRange(getQualifierLoc().getBeginLoc(), getRAngleLoc()); - else if (getTemplateKeywordLoc().isValid()) - return SourceRange(getTemplateKeywordLoc(), getRAngleLoc()); - else - return SourceRange(getTemplateNameLoc(), getRAngleLoc()); - } - - void copy(DependentTemplateSpecializationTypeLoc Loc) { - unsigned size = getFullDataSize(); - assert(size == Loc.getFullDataSize()); - memcpy(Data, Loc.Data, size); - } - - void initializeLocal(ASTContext &Context, SourceLocation Loc); - - unsigned getExtraLocalDataSize() const { - return getNumArgs() * sizeof(TemplateArgumentLocInfo); - } - - unsigned getExtraLocalDataAlignment() const { - return alignof(TemplateArgumentLocInfo); - } - -private: - TemplateArgumentLocInfo *getArgInfos() const { - return static_cast(getExtraLocalData()); - } -}; - struct PackExpansionTypeLocInfo { SourceLocation EllipsisLoc; }; diff --git a/clang/include/clang/AST/TypeProperties.td b/clang/include/clang/AST/TypeProperties.td index 185a968217f97..b3932a67db69d 100644 --- a/clang/include/clang/AST/TypeProperties.td +++ b/clang/include/clang/AST/TypeProperties.td @@ -729,41 +729,6 @@ let Class = TemplateSpecializationType in { }]>; } -let Class = DependentTemplateSpecializationType in { - def : ReadHelper<[{ - const auto &dtn = node->getDependentTemplateName(); - auto name = dtn.getName(); - }]>; - - def : Property<"qualifier", NestedNameSpecifier> { - let Read = [{ dtn.getQualifier() }]; - } - def : Property<"identifier", Optional> { - let Read = [{ makeOptionalFromPointer(name.getIdentifier()) }]; - } - def : Property<"operatorKind", OverloadedOperatorKind> { - let Conditional = [{ !identifier }]; - let Read = [{ name.getOperator() }]; - } - def : Property<"HasTemplateKeyword", Bool> { - let Read = [{ dtn.hasTemplateKeyword() }]; - } - - def : Property<"keyword", ElaboratedTypeKeyword> { - let Read = [{ node->getKeyword() }]; - } - def : Property<"templateArguments", Array> { - let Read = [{ node->template_arguments() }]; - } - - def : Creator<[{ - DependentTemplateStorage S(qualifier, identifier ? IdentifierOrOverloadedOperator(*identifier) : - IdentifierOrOverloadedOperator(*operatorKind), - HasTemplateKeyword); - return ctx.getDependentTemplateSpecializationType(keyword, S, templateArguments); - }]>; -} - let Class = TemplateTypeParmType in { def : Property<"depth", UInt32> { let Read = [{ node->getDepth() }]; diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index f1d88a9523838..492863ddfc4a1 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -7712,18 +7712,6 @@ AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher, /// \endcode extern const AstTypeMatcher dependentNameType; -/// Matches a dependent template specialization type -/// -/// Example matches A::template B -/// \code -/// template struct A; -/// template struct declToImport { -/// typename A::template B a; -/// }; -/// \endcode -extern const AstTypeMatcher - dependentTemplateSpecializationType; - /// Matches declarations whose declaration context, interpreted as a /// Decl, matches \c InnerMatcher. /// diff --git a/clang/include/clang/Basic/TypeNodes.td b/clang/include/clang/Basic/TypeNodes.td index fb6862b90987f..db43a8529f02b 100644 --- a/clang/include/clang/Basic/TypeNodes.td +++ b/clang/include/clang/Basic/TypeNodes.td @@ -5,10 +5,11 @@ class TypeNode : ASTNode { bit Abstract = abstract; } -/// A type node that is only used to represent dependent types in C++. For -/// example, DependentTemplateSpecializationType is used to represent types -/// where the base template-id is dependent (such as `T::foo`). Code -/// that only works with non-dependent types can ignore these type nodes. +/// A type node that is only used to represent dependent types in C++. +/// For example, DependentSizedArrayType is used to represent types where the +/// size expression is dependent (such as `T[V]`, where V is a constant template +/// parameter). Code that only works with non-dependent types can ignore these +/// type nodes. class AlwaysDependent {} /// A type node that is never used to represent a canonical type, which is to @@ -96,7 +97,6 @@ def DeducedType : TypeNode; def AutoType : TypeNode; def DeducedTemplateSpecializationType : TypeNode; def DependentNameType : TypeNode, AlwaysDependent; -def DependentTemplateSpecializationType : TypeNode, AlwaysDependent; def PackExpansionType : TypeNode, AlwaysDependent; def PackIndexingType : TypeNode, NeverCanonicalUnlessDependent; def ObjCTypeParamType : TypeNode, NeverCanonical; diff --git a/clang/include/clang/Sema/HeuristicResolver.h b/clang/include/clang/Sema/HeuristicResolver.h index 71588bee92d16..9a220ba147ecb 100644 --- a/clang/include/clang/Sema/HeuristicResolver.h +++ b/clang/include/clang/Sema/HeuristicResolver.h @@ -62,7 +62,7 @@ class HeuristicResolver { std::vector resolveDependentNameType(const DependentNameType *DNT) const; std::vector resolveTemplateSpecializationType( - const DependentTemplateSpecializationType *DTST) const; + const TemplateSpecializationType *TST) const; // Try to heuristically resolve a dependent nested name specifier // to the type it likely denotes. Note that *dependent* name specifiers always diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index a7600ab88febe..7e00085685b21 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11399,10 +11399,6 @@ class Sema final : public SemaBase { SourceLocation NameLoc, IdentifierInfo *&II); - bool resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name, - SourceLocation NameLoc, - bool Diagnose = true); - /// Determine whether a particular identifier might be the name in a C++1z /// deduction-guide declaration. bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, @@ -11643,7 +11639,8 @@ class Sema final : public SemaBase { QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, - TemplateArgumentListInfo &TemplateArgs); + TemplateArgumentListInfo &TemplateArgs, + Scope *Scope, bool ForNestedNameSpecifier); TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, diff --git a/clang/include/clang/Serialization/TypeBitCodes.def b/clang/include/clang/Serialization/TypeBitCodes.def index bea15254922c1..d6c484563409c 100644 --- a/clang/include/clang/Serialization/TypeBitCodes.def +++ b/clang/include/clang/Serialization/TypeBitCodes.def @@ -39,7 +39,6 @@ TYPE_BIT_CODE(ObjCObject, OBJC_OBJECT, 28) TYPE_BIT_CODE(TemplateTypeParm, TEMPLATE_TYPE_PARM, 29) TYPE_BIT_CODE(TemplateSpecialization, TEMPLATE_SPECIALIZATION, 30) TYPE_BIT_CODE(DependentName, DEPENDENT_NAME, 31) -TYPE_BIT_CODE(DependentTemplateSpecialization, DEPENDENT_TEMPLATE_SPECIALIZATION, 32) TYPE_BIT_CODE(DependentSizedArray, DEPENDENT_SIZED_ARRAY, 33) TYPE_BIT_CODE(Paren, PAREN, 34) TYPE_BIT_CODE(PackExpansion, PACK_EXPANSION, 35) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index ed4c6b0e38be3..5240054c2f36b 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4286,7 +4286,6 @@ QualType ASTContext::getVariableArrayDecayedType(QualType type) const { case Type::DependentName: case Type::InjectedClassName: case Type::TemplateSpecialization: - case Type::DependentTemplateSpecialization: case Type::TemplateTypeParm: case Type::SubstTemplateTypeParmPack: case Type::SubstBuiltinTemplatePack: @@ -5932,6 +5931,30 @@ QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, return QualType(TypeParm, 0); } +static ElaboratedTypeKeyword +getCanonicalElaboratedTypeKeyword(ElaboratedTypeKeyword Keyword) { + switch (Keyword) { + // These are just themselves. + case ElaboratedTypeKeyword::None: + case ElaboratedTypeKeyword::Struct: + case ElaboratedTypeKeyword::Union: + case ElaboratedTypeKeyword::Enum: + case ElaboratedTypeKeyword::Interface: + return Keyword; + + // These are equivalent. + case ElaboratedTypeKeyword::Typename: + return ElaboratedTypeKeyword::None; + + // These are functionally equivalent, so relying on their equivalence is + // IFNDR. By making them equivalent, we disallow overloading, which at least + // can produce a diagnostic. + case ElaboratedTypeKeyword::Class: + return ElaboratedTypeKeyword::Struct; + } + llvm_unreachable("unexpected keyword kind"); +} + TypeSourceInfo *ASTContext::getTemplateSpecializationTypeInfo( ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, @@ -5970,17 +5993,20 @@ hasAnyPackExpansions(ArrayRef Args) { } QualType ASTContext::getCanonicalTemplateSpecializationType( - TemplateName Template, ArrayRef Args) const { + ElaboratedTypeKeyword Keyword, TemplateName Template, + ArrayRef Args) const { assert(Template == getCanonicalTemplateName(Template, /*IgnoreDeduced=*/true)); - assert(!Args.empty()); + assert((Keyword == ElaboratedTypeKeyword::None || + Template.getAsDependentTemplateName())); #ifndef NDEBUG for (const auto &Arg : Args) assert(Arg.structurallyEquals(getCanonicalTemplateArgument(Arg))); #endif llvm::FoldingSetNodeID ID; - TemplateSpecializationType::Profile(ID, Template, Args, QualType(), *this); + TemplateSpecializationType::Profile(ID, Keyword, Template, Args, QualType(), + *this); void *InsertPos = nullptr; if (auto *T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos)) return QualType(T, 0); @@ -5988,9 +6014,9 @@ QualType ASTContext::getCanonicalTemplateSpecializationType( void *Mem = Allocate(sizeof(TemplateSpecializationType) + sizeof(TemplateArgument) * Args.size(), alignof(TemplateSpecializationType)); - auto *Spec = new (Mem) - TemplateSpecializationType(ElaboratedTypeKeyword::None, Template, - /*IsAlias=*/false, Args, QualType()); + auto *Spec = + new (Mem) TemplateSpecializationType(Keyword, Template, + /*IsAlias=*/false, Args, QualType()); assert(Spec->isDependentType() && "canonical template specialization must be dependent"); Types.push_back(Spec); @@ -6002,16 +6028,16 @@ QualType ASTContext::getTemplateSpecializationType( ElaboratedTypeKeyword Keyword, TemplateName Template, ArrayRef SpecifiedArgs, ArrayRef CanonicalArgs, QualType Underlying) const { - assert(!Template.getUnderlying().getAsDependentTemplateName() && - "No dependent template names here!"); - const auto *TD = Template.getAsTemplateDecl(/*IgnoreDeduced=*/true); bool IsTypeAlias = TD && TD->isTypeAlias(); if (Underlying.isNull()) { TemplateName CanonTemplate = getCanonicalTemplateName(Template, /*IgnoreDeduced=*/true); - bool NonCanonical = - Template != CanonTemplate || Keyword != ElaboratedTypeKeyword::None; + ElaboratedTypeKeyword CanonKeyword = + CanonTemplate.getAsDependentTemplateName() + ? getCanonicalElaboratedTypeKeyword(Keyword) + : ElaboratedTypeKeyword::None; + bool NonCanonical = Template != CanonTemplate || Keyword != CanonKeyword; SmallVector CanonArgsVec; if (CanonicalArgs.empty()) { CanonArgsVec = SmallVector(SpecifiedArgs); @@ -6033,8 +6059,8 @@ QualType ASTContext::getTemplateSpecializationType( "Caller must compute aliased type"); IsTypeAlias = false; - Underlying = - getCanonicalTemplateSpecializationType(CanonTemplate, CanonicalArgs); + Underlying = getCanonicalTemplateSpecializationType( + CanonKeyword, CanonTemplate, CanonicalArgs); if (!NonCanonical) return Underlying; } @@ -6085,30 +6111,6 @@ ASTContext::getMacroQualifiedType(QualType UnderlyingTy, return QualType(newType, 0); } -static ElaboratedTypeKeyword -getCanonicalElaboratedTypeKeyword(ElaboratedTypeKeyword Keyword) { - switch (Keyword) { - // These are just themselves. - case ElaboratedTypeKeyword::None: - case ElaboratedTypeKeyword::Struct: - case ElaboratedTypeKeyword::Union: - case ElaboratedTypeKeyword::Enum: - case ElaboratedTypeKeyword::Interface: - return Keyword; - - // These are equivalent. - case ElaboratedTypeKeyword::Typename: - return ElaboratedTypeKeyword::None; - - // These are functionally equivalent, so relying on their equivalence is - // IFNDR. By making them equivalent, we disallow overloading, which at least - // can produce a diagnostic. - case ElaboratedTypeKeyword::Class: - return ElaboratedTypeKeyword::Struct; - } - llvm_unreachable("unexpected keyword kind"); -} - QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const { @@ -6140,68 +6142,6 @@ QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, return QualType(T, 0); } -QualType ASTContext::getDependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args) const { - // TODO: avoid this copy - SmallVector ArgCopy; - for (unsigned I = 0, E = Args.size(); I != E; ++I) - ArgCopy.push_back(Args[I].getArgument()); - return getDependentTemplateSpecializationType(Keyword, Name, ArgCopy); -} - -QualType ASTContext::getDependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args, bool IsCanonical) const { - llvm::FoldingSetNodeID ID; - DependentTemplateSpecializationType::Profile(ID, *this, Keyword, Name, Args); - - if (auto const T_iter = DependentTemplateSpecializationTypes.find(ID); - T_iter != DependentTemplateSpecializationTypes.end()) - return QualType(T_iter->getSecond(), 0); - - NestedNameSpecifier NNS = Name.getQualifier(); - - QualType Canon; - if (!IsCanonical) { - ElaboratedTypeKeyword CanonKeyword = - getCanonicalElaboratedTypeKeyword(Keyword); - NestedNameSpecifier CanonNNS = NNS.getCanonical(); - bool AnyNonCanonArgs = false; - auto CanonArgs = - ::getCanonicalTemplateArguments(*this, Args, AnyNonCanonArgs); - - if (CanonKeyword != Keyword || AnyNonCanonArgs || CanonNNS != NNS || - !Name.hasTemplateKeyword()) { - Canon = getDependentTemplateSpecializationType( - CanonKeyword, {CanonNNS, Name.getName(), /*HasTemplateKeyword=*/true}, - CanonArgs, - /*IsCanonical=*/true); - } - } else { - assert(Keyword == getCanonicalElaboratedTypeKeyword(Keyword)); - assert(Name.hasTemplateKeyword()); - assert(NNS.isCanonical()); -#ifndef NDEBUG - for (const auto &Arg : Args) - assert(Arg.structurallyEquals(getCanonicalTemplateArgument(Arg))); -#endif - } - void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + - sizeof(TemplateArgument) * Args.size()), - alignof(DependentTemplateSpecializationType)); - auto *T = - new (Mem) DependentTemplateSpecializationType(Keyword, Name, Args, Canon); -#ifndef NDEBUG - llvm::FoldingSetNodeID InsertedID; - T->Profile(InsertedID, *this); - assert(InsertedID == ID && "ID does not match"); -#endif - Types.push_back(T); - DependentTemplateSpecializationTypes.try_emplace(ID, T); - return QualType(T, 0); -} - TemplateArgument ASTContext::getInjectedTemplateArg(NamedDecl *Param) const { TemplateArgument Arg; if (const auto *TTP = dyn_cast(Param)) { @@ -14327,21 +14267,6 @@ static QualType getCommonNonSugarTypeNode(const ASTContext &Ctx, const Type *X, getCommonTypeKeyword(NX, NY, /*IsSame=*/true), getCommonQualifier(Ctx, NX, NY, /*IsSame=*/true), NX->getIdentifier()); } - case Type::DependentTemplateSpecialization: { - const auto *TX = cast(X), - *TY = cast(Y); - auto As = getCommonTemplateArguments(Ctx, TX->template_arguments(), - TY->template_arguments()); - const DependentTemplateStorage &SX = TX->getDependentTemplateName(), - &SY = TY->getDependentTemplateName(); - assert(SX.getName() == SY.getName()); - DependentTemplateStorage Name( - getCommonNNS(Ctx, SX.getQualifier(), SY.getQualifier(), - /*IsSame=*/true), - SX.getName(), SX.hasTemplateKeyword() || SY.hasTemplateKeyword()); - return Ctx.getDependentTemplateSpecializationType( - getCommonTypeKeyword(TX, TY, /*IsSame=*/true), Name, As); - } case Type::UnaryTransform: { const auto *TX = cast(X), *TY = cast(Y); diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index db14272ae5db8..1c8fd83feb7f8 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1890,25 +1890,6 @@ ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) { /*ExpactPack=*/false); } -ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType( - const DependentTemplateSpecializationType *T) { - const DependentTemplateStorage &DTN = T->getDependentTemplateName(); - auto QualifierOrErr = import(DTN.getQualifier()); - if (!QualifierOrErr) - return QualifierOrErr.takeError(); - - SmallVector ToPack; - ToPack.reserve(T->template_arguments().size()); - if (Error Err = ImportTemplateArguments(T->template_arguments(), ToPack)) - return std::move(Err); - - return Importer.getToContext().getDependentTemplateSpecializationType( - T->getKeyword(), - {*QualifierOrErr, Importer.Import(DTN.getName()), - DTN.hasTemplateKeyword()}, - ToPack); -} - ExpectedType ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) { auto ToQualifierOrErr = import(T->getQualifier()); diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp index 1292c30d47589..155734679b2da 100644 --- a/clang/lib/AST/ASTStructuralEquivalence.cpp +++ b/clang/lib/AST/ASTStructuralEquivalence.cpp @@ -1384,20 +1384,6 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, break; } - case Type::DependentTemplateSpecialization: { - const auto *Spec1 = cast(T1); - const auto *Spec2 = cast(T2); - if (Spec1->getKeyword() != Spec2->getKeyword()) - return false; - if (!IsStructurallyEquivalent(Context, Spec1->getDependentTemplateName(), - Spec2->getDependentTemplateName())) - return false; - if (!IsStructurallyEquivalent(Context, Spec1->template_arguments(), - Spec2->template_arguments())) - return false; - break; - } - case Type::PackExpansion: if (!IsStructurallyEquivalent(Context, cast(T1)->getPattern(), diff --git a/clang/lib/AST/ASTTypeTraits.cpp b/clang/lib/AST/ASTTypeTraits.cpp index d2f7fdbbad04d..84eb77730b1cb 100644 --- a/clang/lib/AST/ASTTypeTraits.cpp +++ b/clang/lib/AST/ASTTypeTraits.cpp @@ -249,10 +249,6 @@ SourceRange DynTypedNode::getSourceRange(bool IncludeQualifier) const { auto T = TL->castAs(); return SourceRange(T.getTemplateNameLoc(), T.getEndLoc()); } - case TypeLoc::DependentTemplateSpecialization: { - auto T = TL->castAs(); - return SourceRange(T.getTemplateNameLoc(), T.getEndLoc()); - } case TypeLoc::Enum: case TypeLoc::Record: case TypeLoc::InjectedClassName: diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 3162857aac5d0..b6bb6117d42af 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -663,6 +663,7 @@ CanQualType ClassTemplateDecl::getCanonicalInjectedSpecializationType( Ctx.canonicalizeTemplateArguments(CanonicalArgs); CommonPtr->CanonInjectedTST = CanQualType::CreateUnsafe(Ctx.getCanonicalTemplateSpecializationType( + ElaboratedTypeKeyword::None, TemplateName(const_cast(getCanonicalDecl())), CanonicalArgs)); } @@ -1209,6 +1210,7 @@ ClassTemplatePartialSpecializationDecl::getCanonicalInjectedSpecializationType( if (CanonInjectedTST.isNull()) { CanonInjectedTST = CanQualType::CreateUnsafe(Ctx.getCanonicalTemplateSpecializationType( + ElaboratedTypeKeyword::None, TemplateName(getSpecializedTemplate()->getCanonicalDecl()), getTemplateArgs().asArray())); } diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 163cd43abd45a..2173aed5b45af 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -1311,19 +1311,6 @@ void CXXNameMangler::manglePrefix(QualType type) { mangleTemplateArgs(TST->getTemplateName(), TST->template_arguments()); addSubstitution(QualType(TST, 0)); } - } else if (const auto *DTST = - type->getAs()) { - if (!mangleSubstitution(QualType(DTST, 0))) { - TemplateName Template = getASTContext().getDependentTemplateName( - DTST->getDependentTemplateName()); - mangleTemplatePrefix(Template); - - // FIXME: GCC does not appear to mangle the template arguments when - // the template in question is a dependent template name. Should we - // emulate that badness? - mangleTemplateArgs(Template, DTST->template_arguments()); - addSubstitution(QualType(DTST, 0)); - } } else if (const auto *DNT = type->getAs()) { // Clang 14 and before did not consider this substitutable. bool Clang14Compat = isCompatibleWith(LangOptions::ClangABI::Ver14); @@ -2525,10 +2512,14 @@ bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty, mangleSourceNameWithAbiTags(TD); break; } + case TemplateName::DependentTemplate: { + const DependentTemplateStorage *S = TN.getAsDependentTemplateName(); + mangleSourceName(S->getName().getIdentifier()); + break; + } case TemplateName::OverloadedTemplate: case TemplateName::AssumedTemplate: - case TemplateName::DependentTemplate: case TemplateName::DeducedTemplate: llvm_unreachable("invalid base for a template specialization type"); @@ -2574,17 +2565,6 @@ bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty, mangleSourceName(cast(Ty)->getIdentifier()); break; - case Type::DependentTemplateSpecialization: { - const DependentTemplateSpecializationType *DTST = - cast(Ty); - TemplateName Template = getASTContext().getDependentTemplateName( - DTST->getDependentTemplateName()); - const DependentTemplateStorage &S = DTST->getDependentTemplateName(); - mangleSourceName(S.getName().getIdentifier()); - mangleTemplateArgs(Template, DTST->template_arguments()); - break; - } - case Type::Using: return mangleUnresolvedTypeOrSimpleId(cast(Ty)->desugar(), Prefix); @@ -4458,16 +4438,14 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) { mangleTemplateName(TD, T->template_arguments()); } else { - if (mangleSubstitution(QualType(T, 0))) - return; - + Out << 'N'; mangleTemplatePrefix(T->getTemplateName()); // FIXME: GCC does not appear to mangle the template arguments when // the template in question is a dependent template name. Should we // emulate that badness? mangleTemplateArgs(T->getTemplateName(), T->template_arguments()); - addSubstitution(QualType(T, 0)); + Out << 'E'; } } @@ -4505,21 +4483,6 @@ void CXXNameMangler::mangleType(const DependentNameType *T) { Out << 'E'; } -void CXXNameMangler::mangleType(const DependentTemplateSpecializationType *T) { - // Dependently-scoped template types are nested if they have a prefix. - Out << 'N'; - - TemplateName Prefix = - getASTContext().getDependentTemplateName(T->getDependentTemplateName()); - mangleTemplatePrefix(Prefix); - - // FIXME: GCC does not appear to mangle the template arguments when - // the template in question is a dependent template name. Should we - // emulate that badness? - mangleTemplateArgs(Prefix, T->template_arguments()); - Out << 'E'; -} - void CXXNameMangler::mangleType(const TypeOfType *T) { // FIXME: this is pretty unsatisfactory, but there isn't an obvious // "extension with parameters" mangling. diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index d96472e393f68..8cbc72b1db735 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -3655,12 +3655,6 @@ void MicrosoftCXXNameMangler::mangleType(const DependentNameType *T, Qualifiers, Error(Range.getBegin(), "dependent name type") << Range; } -void MicrosoftCXXNameMangler::mangleType( - const DependentTemplateSpecializationType *T, Qualifiers, - SourceRange Range) { - Error(Range.getBegin(), "dependent template specialization type") << Range; -} - void MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T, Qualifiers, SourceRange Range) { Error(Range.getBegin(), "pack expansion") << Range; diff --git a/clang/lib/AST/ODRHash.cpp b/clang/lib/AST/ODRHash.cpp index fb95f58092c49..6842038b7eb57 100644 --- a/clang/lib/AST/ODRHash.cpp +++ b/clang/lib/AST/ODRHash.cpp @@ -1213,16 +1213,6 @@ class ODRTypeVisitor : public TypeVisitor { VisitTypeWithKeyword(T); } - void VisitDependentTemplateSpecializationType( - const DependentTemplateSpecializationType *T) { - Hash.AddDependentTemplateName(T->getDependentTemplateName()); - ID.AddInteger(T->template_arguments().size()); - for (const auto &TA : T->template_arguments()) { - Hash.AddTemplateArgument(TA); - } - VisitTypeWithKeyword(T); - } - void VisitUnaryTransformType(const UnaryTransformType *T) { AddQualType(T->getUnderlyingType()); AddQualType(T->getBaseType()); diff --git a/clang/lib/AST/TemplateName.cpp b/clang/lib/AST/TemplateName.cpp index f2cb15dbc43dd..2b8044e4188cd 100644 --- a/clang/lib/AST/TemplateName.cpp +++ b/clang/lib/AST/TemplateName.cpp @@ -213,25 +213,25 @@ TemplateDecl *TemplateName::getAsTemplateDecl(bool IgnoreDeduced) const { dyn_cast_if_present(Name.Storage)); } -std::pair +std::pair TemplateName::getTemplateDeclAndDefaultArgs() const { + DefaultArguments DefArgs; for (TemplateName Name = *this; /**/; /**/) { - if (Name.getKind() == TemplateName::DeducedTemplate) { - DeducedTemplateStorage *DTS = Name.getAsDeducedTemplateName(); - TemplateDecl *TD = - DTS->getUnderlying().getAsTemplateDecl(/*IgnoreDeduced=*/true); - DefaultArguments DefArgs = DTS->getDefaultArguments(); - if (TD && DefArgs) + if (DeducedTemplateStorage *DTS = Name.getAsDeducedTemplateName()) { + assert(!DefArgs && "multiple default args?"); + DefArgs = DTS->getDefaultArguments(); + if (TemplateDecl *TD = DTS->getUnderlying().getAsTemplateDecl(); + TD && DefArgs) assert(DefArgs.StartPos + DefArgs.Args.size() <= TD->getTemplateParameters()->size()); - return {TD, DTS->getDefaultArguments()}; + Name = DTS->getUnderlying(); } if (std::optional UnderlyingOrNone = Name.desugar(/*IgnoreDeduced=*/false)) { Name = *UnderlyingOrNone; continue; } - return {cast_if_present(Name.Storage.dyn_cast()), {}}; + return {Name, DefArgs}; } } diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 86621795d81e6..9794314a98f81 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -1933,10 +1933,6 @@ NestedNameSpecifier Type::getPrefix() const { return cast(this) ->getTemplateName() .getQualifier(); - case Type::DependentTemplateSpecialization: - return cast(this) - ->getDependentTemplateName() - .getQualifier(); case Type::Enum: case Type::Record: case Type::InjectedClassName: @@ -3215,7 +3211,6 @@ bool Type::isSpecifierType() const { case SubstTemplateTypeParm: case TemplateSpecialization: case DependentName: - case DependentTemplateSpecialization: case ObjCInterface: case ObjCObject: return true; @@ -3333,42 +3328,12 @@ StringRef KeywordHelpers::getKeywordName(ElaboratedTypeKeyword Keyword) { llvm_unreachable("Unknown elaborated type keyword."); } -DependentTemplateSpecializationType::DependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args, QualType Canon) - : TypeWithKeyword(Keyword, DependentTemplateSpecialization, Canon, - - toTypeDependence(Name.getDependence())), - Name(Name) { - DependentTemplateSpecializationTypeBits.NumArgs = Args.size(); - auto *ArgBuffer = const_cast(template_arguments().data()); - for (const TemplateArgument &Arg : Args) { - addDependence(toTypeDependence(Arg.getDependence() & - TemplateArgumentDependence::UnexpandedPack)); - - new (ArgBuffer++) TemplateArgument(Arg); - } -} - -void DependentTemplateSpecializationType::Profile( - llvm::FoldingSetNodeID &ID, const ASTContext &Context, - ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, - ArrayRef Args) { - ID.AddInteger(llvm::to_underlying(Keyword)); - Name.Profile(ID); - for (const TemplateArgument &Arg : Args) - Arg.Profile(ID, Context); -} - bool Type::isElaboratedTypeSpecifier() const { ElaboratedTypeKeyword Keyword; if (const auto *TST = dyn_cast(this)) Keyword = TST->getKeyword(); else if (const auto *DepName = dyn_cast(this)) Keyword = DepName->getKeyword(); - else if (const auto *DepTST = - dyn_cast(this)) - Keyword = DepTST->getKeyword(); else if (const auto *T = dyn_cast(this)) Keyword = T->getKeyword(); else if (const auto *T = dyn_cast(this)) @@ -4641,17 +4606,6 @@ TemplateSpecializationType::TemplateSpecializationType( TemplateSpecializationTypeBits.NumArgs = Args.size(); TemplateSpecializationTypeBits.TypeAlias = IsAlias; - assert(!T.getAsDependentTemplateName() && - "Use DependentTemplateSpecializationType for dependent template-name"); - assert((T.getKind() == TemplateName::Template || - T.getKind() == TemplateName::SubstTemplateTemplateParm || - T.getKind() == TemplateName::SubstTemplateTemplateParmPack || - T.getKind() == TemplateName::UsingTemplate || - T.getKind() == TemplateName::QualifiedTemplate || - T.getKind() == TemplateName::DeducedTemplate || - T.getKind() == TemplateName::AssumedTemplate) && - "Unexpected template name for TemplateSpecializationType"); - auto *TemplateArgs = const_cast(template_arguments().data()); for (const TemplateArgument &Arg : Args) { @@ -4690,15 +4644,17 @@ bool clang::TemplateSpecializationType::isSugared() const { void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { - Profile(ID, Template, template_arguments(), + Profile(ID, getKeyword(), Template, template_arguments(), isSugared() ? desugar() : QualType(), Ctx); } void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, + ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef Args, QualType Underlying, const ASTContext &Context) { + ID.AddInteger(llvm::to_underlying(Keyword)); T.Profile(ID); Underlying.Profile(ID); @@ -5105,7 +5061,6 @@ bool Type::canHaveNullability(bool ResultIfUnknown) const { case Type::SubstTemplateTypeParmPack: case Type::SubstBuiltinTemplatePack: case Type::DependentName: - case Type::DependentTemplateSpecialization: case Type::Auto: return ResultIfUnknown; diff --git a/clang/lib/AST/TypeLoc.cpp b/clang/lib/AST/TypeLoc.cpp index 3e9597fc4d471..55476e2175a1f 100644 --- a/clang/lib/AST/TypeLoc.cpp +++ b/clang/lib/AST/TypeLoc.cpp @@ -477,8 +477,6 @@ NestedNameSpecifierLoc TypeLoc::getPrefix() const { return castAs().getQualifierLoc(); case TypeLoc::TemplateSpecialization: return castAs().getQualifierLoc(); - case TypeLoc::DependentTemplateSpecialization: - return castAs().getQualifierLoc(); case TypeLoc::DeducedTemplateSpecialization: return castAs().getQualifierLoc(); case TypeLoc::Enum: @@ -505,13 +503,6 @@ SourceLocation TypeLoc::getNonPrefixBeginLoc() const { Loc = TL.getTemplateNameLoc(); return Loc; } - case TypeLoc::DependentTemplateSpecialization: { - auto TL = castAs(); - SourceLocation Loc = TL.getTemplateKeywordLoc(); - if (!Loc.isValid()) - Loc = TL.getTemplateNameLoc(); - return Loc; - } case TypeLoc::DeducedTemplateSpecialization: { auto TL = castAs(); SourceLocation Loc = TL.getTemplateKeywordLoc(); @@ -550,12 +541,6 @@ SourceLocation TypeLoc::getNonElaboratedBeginLoc() const { return QualifierLoc.getBeginLoc(); return T.getTemplateNameLoc(); } - case TypeLoc::DependentTemplateSpecialization: { - auto T = castAs(); - if (NestedNameSpecifierLoc QualifierLoc = T.getQualifierLoc()) - return QualifierLoc.getBeginLoc(); - return T.getTemplateNameLoc(); - } case TypeLoc::DeducedTemplateSpecialization: { auto T = castAs(); if (NestedNameSpecifierLoc QualifierLoc = T.getQualifierLoc()) @@ -690,20 +675,6 @@ void DependentNameTypeLoc::initializeLocal(ASTContext &Context, setNameLoc(Loc); } -void -DependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context, - SourceLocation Loc) { - initializeElaboratedKeyword(*this, Loc); - setQualifierLoc(initializeQualifier( - Context, getTypePtr()->getDependentTemplateName().getQualifier(), Loc)); - setTemplateKeywordLoc(Loc); - setTemplateNameLoc(Loc); - setLAngleLoc(Loc); - setRAngleLoc(Loc); - TemplateSpecializationTypeLoc::initializeArgLocs( - Context, getTypePtr()->template_arguments(), getArgInfos(), Loc); -} - void TemplateSpecializationTypeLoc::set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, @@ -949,8 +920,5 @@ AutoTypeLoc TypeLoc::getContainedAutoTypeLoc() const { SourceLocation TypeLoc::getTemplateKeywordLoc() const { if (const auto TSTL = getAsAdjusted()) return TSTL.getTemplateKeywordLoc(); - if (const auto DTSTL = - getAsAdjusted()) - return DTSTL.getTemplateKeywordLoc(); return SourceLocation(); } diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 54ca42d2035ad..cd59678d67f2f 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -237,7 +237,6 @@ bool TypePrinter::canPrefixQualifiers(const Type *T, case Type::TemplateSpecialization: case Type::InjectedClassName: case Type::DependentName: - case Type::DependentTemplateSpecialization: case Type::ObjCObject: case Type::ObjCTypeParam: case Type::ObjCInterface: @@ -1836,22 +1835,6 @@ void TypePrinter::printDependentNameBefore(const DependentNameType *T, void TypePrinter::printDependentNameAfter(const DependentNameType *T, raw_ostream &OS) {} -void TypePrinter::printDependentTemplateSpecializationBefore( - const DependentTemplateSpecializationType *T, raw_ostream &OS) { - IncludeStrongLifetimeRAII Strong(Policy); - - OS << TypeWithKeyword::getKeywordName(T->getKeyword()); - if (T->getKeyword() != ElaboratedTypeKeyword::None) - OS << " "; - - T->getDependentTemplateName().print(OS, Policy); - printTemplateArgumentList(OS, T->template_arguments(), Policy); - spaceBeforePlaceHolder(OS); -} - -void TypePrinter::printDependentTemplateSpecializationAfter( - const DependentTemplateSpecializationType *T, raw_ostream &OS) {} - void TypePrinter::printPackExpansionBefore(const PackExpansionType *T, raw_ostream &OS) { printBefore(T->getPattern(), OS); diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index 653b3810cb68b..1f0e007dafc65 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -1109,8 +1109,6 @@ const AstTypeMatcher templateTypeParmType; const AstTypeMatcher injectedClassNameType; const AstTypeMatcher decayedType; const AstTypeMatcher dependentNameType; -const AstTypeMatcher - dependentTemplateSpecializationType; AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType, AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType, ComplexType)); diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 48a7b91969aef..01c03f309a77b 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -222,7 +222,6 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(declRefExpr); REGISTER_MATCHER(dependentNameType); REGISTER_MATCHER(dependentScopeDeclRefExpr); - REGISTER_MATCHER(dependentTemplateSpecializationType); REGISTER_MATCHER(declStmt); REGISTER_MATCHER(declaratorDecl); REGISTER_MATCHER(decltypeType); diff --git a/clang/lib/Sema/HeuristicResolver.cpp b/clang/lib/Sema/HeuristicResolver.cpp index 29840a430292e..a5d1f5dd389cb 100644 --- a/clang/lib/Sema/HeuristicResolver.cpp +++ b/clang/lib/Sema/HeuristicResolver.cpp @@ -41,8 +41,8 @@ class HeuristicResolverImpl { resolveUsingValueDecl(const UnresolvedUsingValueDecl *UUVD); std::vector resolveDependentNameType(const DependentNameType *DNT); - std::vector resolveTemplateSpecializationType( - const DependentTemplateSpecializationType *DTST); + std::vector + resolveTemplateSpecializationType(const TemplateSpecializationType *TST); QualType resolveNestedNameSpecifierToType(NestedNameSpecifier NNS); QualType getPointeeType(QualType T); std::vector @@ -373,8 +373,9 @@ HeuristicResolverImpl::resolveDependentNameType(const DependentNameType *DNT) { std::vector HeuristicResolverImpl::resolveTemplateSpecializationType( - const DependentTemplateSpecializationType *DTST) { - const DependentTemplateStorage &DTN = DTST->getDependentTemplateName(); + const TemplateSpecializationType *TST) { + const DependentTemplateStorage &DTN = + *TST->getTemplateName().getAsDependentTemplateName(); return resolveDependentMember( resolveNestedNameSpecifierToType(DTN.getQualifier()), DTN.getName().getIdentifier(), TemplateFilter); @@ -596,8 +597,8 @@ std::vector HeuristicResolver::resolveDependentNameType( } std::vector HeuristicResolver::resolveTemplateSpecializationType( - const DependentTemplateSpecializationType *DTST) const { - return HeuristicResolverImpl(Ctx).resolveTemplateSpecializationType(DTST); + const TemplateSpecializationType *TST) const { + return HeuristicResolverImpl(Ctx).resolveTemplateSpecializationType(TST); } QualType HeuristicResolver::resolveNestedNameSpecifierToType( NestedNameSpecifier NNS) const { diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index 3eed6ad7fe6b3..8411a3da8322d 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/lib/Sema/SemaAttr.cpp @@ -157,8 +157,8 @@ void Sema::inferGslPointerAttribute(TypedefNameDecl *TD) { if (auto *TST = dyn_cast(Canonical.getTypePtr())) { - RD = dyn_cast_or_null( - TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl()); + if (const auto *TD = TST->getTemplateName().getAsTemplateDecl()) + RD = dyn_cast_or_null(TD->getTemplatedDecl()); } } diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp index 437c69aa1587d..e89243b9d767a 100644 --- a/clang/lib/Sema/SemaCXXScopeSpec.cpp +++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -896,64 +896,15 @@ bool Sema::ActOnCXXNestedNameSpecifier(Scope *S, if (SS.isInvalid()) return true; - TemplateName Template = OpaqueTemplate.get(); - // Translate the parser's template argument list in our AST format. TemplateArgumentListInfo TemplateArgs(LAngleLoc, RAngleLoc); translateTemplateArguments(TemplateArgsIn, TemplateArgs); - DependentTemplateName *DTN = Template.getAsDependentTemplateName(); - if (DTN && DTN->getName().getIdentifier()) { - // Handle a dependent template specialization for which we cannot resolve - // the template name. - assert(DTN->getQualifier() == SS.getScopeRep()); - QualType T = Context.getDependentTemplateSpecializationType( - ElaboratedTypeKeyword::None, - {SS.getScopeRep(), DTN->getName().getIdentifier(), - TemplateKWLoc.isValid()}, - TemplateArgs.arguments()); - - // Create source-location information for this type. - TypeLocBuilder Builder; - DependentTemplateSpecializationTypeLoc SpecTL - = Builder.push(T); - SpecTL.setElaboratedKeywordLoc(SourceLocation()); - SpecTL.setQualifierLoc(SS.getWithLocInContext(Context)); - SpecTL.setTemplateKeywordLoc(TemplateKWLoc); - SpecTL.setTemplateNameLoc(TemplateNameLoc); - SpecTL.setLAngleLoc(LAngleLoc); - SpecTL.setRAngleLoc(RAngleLoc); - for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I) - SpecTL.setArgLocInfo(I, TemplateArgs[I].getLocInfo()); - - SS.clear(); - SS.Make(Context, Builder.getTypeLocInContext(Context, T), CCLoc); - return false; - } - - // If we assumed an undeclared identifier was a template name, try to - // typo-correct it now. - if (Template.getAsAssumedTemplateName() && - resolveAssumedTemplateNameAsType(S, Template, TemplateNameLoc)) - return true; - - TemplateDecl *TD = Template.getAsTemplateDecl(); - if (Template.getAsOverloadedTemplate() || DTN || - isa(TD) || isa(TD)) { - SourceRange R(TemplateNameLoc, RAngleLoc); - if (SS.getRange().isValid()) - R.setBegin(SS.getRange().getBegin()); - - Diag(CCLoc, diag::err_non_type_template_in_nested_name_specifier) - << isa_and_nonnull(TD) << Template << R; - NoteAllFoundTemplates(Template); - return true; - } - // We were able to resolve the template name to an actual template. // Build an appropriate nested-name-specifier. - QualType T = CheckTemplateIdType(ElaboratedTypeKeyword::None, Template, - TemplateNameLoc, TemplateArgs); + QualType T = CheckTemplateIdType( + ElaboratedTypeKeyword::None, OpaqueTemplate.get(), TemplateNameLoc, + TemplateArgs, /*Scope=*/S, /*ForNestedNameSpecifier=*/true); if (T.isNull()) return true; @@ -961,7 +912,7 @@ bool Sema::ActOnCXXNestedNameSpecifier(Scope *S, // nested name specifiers. if (!T->isDependentType() && !isa(T.getCanonicalType())) { Diag(TemplateNameLoc, diag::err_nested_name_spec_non_tag) << T; - NoteAllFoundTemplates(Template); + NoteAllFoundTemplates(OpaqueTemplate.get()); return true; } diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp index cc03616e0dfe1..229e91ed04caa 100644 --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -90,7 +90,8 @@ static QualType lookupPromiseType(Sema &S, const FunctionDecl *FD, // Build the template-id. QualType CoroTrait = S.CheckTemplateIdType( - ElaboratedTypeKeyword::None, TemplateName(CoroTraits), KwLoc, Args); + ElaboratedTypeKeyword::None, TemplateName(CoroTraits), KwLoc, Args, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); if (CoroTrait.isNull()) return QualType(); if (S.RequireCompleteType(KwLoc, CoroTrait, @@ -163,7 +164,8 @@ static QualType lookupCoroutineHandleType(Sema &S, QualType PromiseType, // Build the template-id. QualType CoroHandleType = S.CheckTemplateIdType( - ElaboratedTypeKeyword::None, TemplateName(CoroHandle), Loc, Args); + ElaboratedTypeKeyword::None, TemplateName(CoroHandle), Loc, Args, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); if (CoroHandleType.isNull()) return QualType(); if (S.RequireCompleteType(Loc, CoroHandleType, diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7c1459e320167..2b0ddb584c37e 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -6392,12 +6392,6 @@ bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, NextTL = TL.castAs().getQualifierLoc().getAsTypeLoc(); break; - case TypeLoc::DependentTemplateSpecialization: { - auto TST = TL.castAs(); - TemplateKeywordLoc = TST.getTemplateKeywordLoc(); - NextTL = TST.getQualifierLoc().getAsTypeLoc(); - break; - } default: break; } diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 63ce87b9b0607..8008c7b160bed 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1138,8 +1138,9 @@ static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait, } // Build the template-id. - QualType TraitTy = S.CheckTemplateIdType(ElaboratedTypeKeyword::None, - TemplateName(TraitTD), Loc, Args); + QualType TraitTy = S.CheckTemplateIdType( + ElaboratedTypeKeyword::None, TemplateName(TraitTD), Loc, Args, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); if (TraitTy.isNull()) return QualType(); @@ -12315,7 +12316,8 @@ static QualType BuildStdClassTemplate(Sema &S, ClassTemplateDecl *CTD, Args.addArgument(TemplateArgumentLoc(TemplateArgument(TypeParam), TSI)); return S.CheckTemplateIdType(ElaboratedTypeKeyword::None, TemplateName(CTD), - Loc, Args); + Loc, Args, /*Scope=*/nullptr, + /*ForNestedNameSpecifier=*/false); } QualType Sema::BuildStdInitializerList(QualType Element, SourceLocation Loc) { diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index bd62ac6234180..439444281c2d5 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -21360,8 +21360,9 @@ ExprResult Sema::CheckPlaceholderExpr(Expr *E) { QualType TST; { SFINAETrap Trap(*this); - TST = CheckTemplateIdType(ElaboratedTypeKeyword::None, TN, - NameInfo.getBeginLoc(), TAL); + TST = CheckTemplateIdType( + ElaboratedTypeKeyword::None, TN, NameInfo.getBeginLoc(), TAL, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); } if (TST.isNull()) TST = Context.getTemplateSpecializationType( diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 54918c560b655..25728de1779ad 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -4575,6 +4575,13 @@ static void getNestedNameSpecifierIdentifiers( case Type::TemplateSpecialization: { TemplateName Name = cast(T)->getTemplateName(); + if (const DependentTemplateName *DTN = + Name.getAsDependentTemplateName()) { + getNestedNameSpecifierIdentifiers(DTN->getQualifier(), Identifiers); + if (const auto *II = DTN->getName().getIdentifier()) + Identifiers.push_back(II); + return; + } if (const QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { getNestedNameSpecifierIdentifiers(QTN->getQualifier(), Identifiers); @@ -4584,15 +4591,6 @@ static void getNestedNameSpecifierIdentifiers( Identifiers.push_back(TD->getIdentifier()); return; } - case Type::DependentTemplateSpecialization: { - const DependentTemplateStorage &S = - cast(T) - ->getDependentTemplateName(); - getNestedNameSpecifierIdentifiers(S.getQualifier(), Identifiers); - // FIXME: Should this dig into the Name as well? - // Identifiers.push_back(S.getName().getIdentifier()); - return; - } case Type::SubstTemplateTypeParm: T = cast(T) ->getReplacementType() diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 58dae32569bcc..d6b25c2d83613 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2845,6 +2845,16 @@ TemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier( if (const TemplateSpecializationType *TST = T->getAs()) { + TemplateName Name = TST->getTemplateName(); + if (const auto *DTS = Name.getAsDependentTemplateName()) { + // Look one step prior in a dependent template specialization type. + if (NestedNameSpecifier NNS = DTS->getQualifier(); + NNS.getKind() == NestedNameSpecifier::Kind::Type) + T = QualType(NNS.getAsType(), 0); + else + T = QualType(); + continue; + } if (TemplateDecl *Template = TST->getTemplateName().getAsTemplateDecl()) { if (TypeDecl *Parent = dyn_cast(Template->getDeclContext())) T = Context.getTypeDeclType(Parent); @@ -2854,18 +2864,6 @@ TemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier( } } - // Look one step prior in a dependent template specialization type. - if (const DependentTemplateSpecializationType *DependentTST - = T->getAs()) { - if (NestedNameSpecifier NNS = - DependentTST->getDependentTemplateName().getQualifier(); - NNS.getKind() == NestedNameSpecifier::Kind::Type) - T = QualType(NNS.getAsType(), 0); - else - T = QualType(); - continue; - } - // Look one step prior in a dependent name type. if (const DependentNameType *DependentName = T->getAs()){ if (NestedNameSpecifier NNS = DependentName->getQualifier(); @@ -2985,16 +2983,16 @@ TemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier( continue; } - } else if (const TemplateSpecializationType *TST - = T->getAs()) { - if (TemplateDecl *Template = TST->getTemplateName().getAsTemplateDecl()) { + } else if (const auto *TST = T->getAs()) { + TemplateName Name = TST->getTemplateName(); + if (TemplateDecl *Template = Name.getAsTemplateDecl()) { ExpectedTemplateParams = Template->getTemplateParameters(); NeedNonemptyTemplateHeader = true; + } else if (Name.getAsDeducedTemplateName()) { + // FIXME: We actually could/should check the template arguments here + // against the corresponding template parameter list. + NeedNonemptyTemplateHeader = false; } - } else if (T->getAs()) { - // FIXME: We actually could/should check the template arguments here - // against the corresponding template parameter list. - NeedNonemptyTemplateHeader = false; } // C++ [temp.expl.spec]p16: @@ -3203,8 +3201,9 @@ static QualType builtinCommonTypeImpl(Sema &S, ElaboratedTypeKeyword Keyword, Sema::SFINAETrap SFINAE(S, /*ForValidityCheck=*/true); Sema::ContextRAII TUContext(S, S.Context.getTranslationUnitDecl()); - QualType BaseTemplateInst = - S.CheckTemplateIdType(Keyword, BaseTemplate, TemplateLoc, Args); + QualType BaseTemplateInst = S.CheckTemplateIdType( + Keyword, BaseTemplate, TemplateLoc, Args, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); if (SFINAE.hasErrorOccurred()) return QualType(); @@ -3422,7 +3421,9 @@ static QualType checkBuiltinTemplateIdType( // The first template argument will be reused as the template decl that // our synthetic template arguments will be applied to. return SemaRef.CheckTemplateIdType(Keyword, Converted[0].getAsTemplate(), - TemplateLoc, SyntheticTemplateArgs); + TemplateLoc, SyntheticTemplateArgs, + /*Scope=*/nullptr, + /*ForNestedNameSpecifier=*/false); } case BTK__type_pack_element: { @@ -3467,7 +3468,8 @@ static QualType checkBuiltinTemplateIdType( CT, TemplateArgs[1].getLocation()))); TemplateName HasTypeMember = Converted[1].getAsTemplate(); return SemaRef.CheckTemplateIdType(Keyword, HasTypeMember, TemplateLoc, - TAs); + TAs, /*Scope=*/nullptr, + /*ForNestedNameSpecifier=*/false); } QualType HasNoTypeMember = Converted[2].getAsType(); return HasNoTypeMember; @@ -3666,40 +3668,81 @@ Sema::findFailedBooleanCondition(Expr *Cond) { return { FailedCond, Description }; } +static TemplateName +resolveAssumedTemplateNameAsType(Sema &S, Scope *Scope, + const AssumedTemplateStorage *ATN, + SourceLocation NameLoc) { + // We assumed this undeclared identifier to be an (ADL-only) function + // template name, but it was used in a context where a type was required. + // Try to typo-correct it now. + LookupResult R(S, ATN->getDeclName(), NameLoc, S.LookupOrdinaryName); + struct CandidateCallback : CorrectionCandidateCallback { + bool ValidateCandidate(const TypoCorrection &TC) override { + return TC.getCorrectionDecl() && + getAsTypeTemplateDecl(TC.getCorrectionDecl()); + } + std::unique_ptr clone() override { + return std::make_unique(*this); + } + } FilterCCC; + + TypoCorrection Corrected = + S.CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Scope, + /*SS=*/nullptr, FilterCCC, CorrectTypoKind::ErrorRecovery); + if (Corrected && Corrected.getFoundDecl()) { + S.diagnoseTypo(Corrected, S.PDiag(diag::err_no_template_suggest) + << ATN->getDeclName()); + return S.Context.getQualifiedTemplateName( + /*Qualifier=*/std::nullopt, /*TemplateKeyword=*/false, + TemplateName(Corrected.getCorrectionDeclAs())); + } + + return TemplateName(); +} + QualType Sema::CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Name, SourceLocation TemplateLoc, - TemplateArgumentListInfo &TemplateArgs) { - // FIXME: 'getUnderlying' loses SubstTemplateTemplateParm nodes from alias - // template substitutions. - if (DependentTemplateName *DTN = - Name.getUnderlying().getAsDependentTemplateName(); - DTN && DTN->getName().getIdentifier()) - // When building a template-id where the template-name is dependent, - // assume the template is a type template. Either our assumption is - // correct, or the code is ill-formed and will be diagnosed when the - // dependent name is substituted. - return Context.getDependentTemplateSpecializationType( - ElaboratedTypeKeyword::None, *DTN, TemplateArgs.arguments()); - - if (Name.getAsAssumedTemplateName() && - resolveAssumedTemplateNameAsType(/*Scope=*/nullptr, Name, TemplateLoc)) - return QualType(); + TemplateArgumentListInfo &TemplateArgs, + Scope *Scope, bool ForNestedNameSpecifier) { + auto [UnderlyingName, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs(); - TemplateDecl *Template; - DefaultArguments DefaultArgs; - if (const SubstTemplateTemplateParmPackStorage *S = - Name.getAsSubstTemplateTemplateParmPack()) { - Template = S->getParameterPack(); - } else { - std::tie(Template, DefaultArgs) = Name.getTemplateDeclAndDefaultArgs(); - if (!Template || isa(Template) || - isa(Template) || isa(Template)) { - Diag(TemplateLoc, diag::err_template_id_not_a_type) << Name; - NoteAllFoundTemplates(Name); - return QualType(); + TemplateDecl *Template = UnderlyingName.getAsTemplateDecl(); + if (!Template) { + if (const auto *S = UnderlyingName.getAsSubstTemplateTemplateParmPack()) { + Template = S->getParameterPack(); + } else if (const auto *DTN = UnderlyingName.getAsDependentTemplateName()) { + if (DTN->getName().getIdentifier()) + // When building a template-id where the template-name is dependent, + // assume the template is a type template. Either our assumption is + // correct, or the code is ill-formed and will be diagnosed when the + // dependent name is substituted. + return Context.getTemplateSpecializationType(Keyword, Name, + TemplateArgs.arguments(), + /*CanonicalArgs=*/{}); + } else if (const auto *ATN = UnderlyingName.getAsAssumedTemplateName()) { + if (TemplateName CorrectedName = ::resolveAssumedTemplateNameAsType( + *this, Scope, ATN, TemplateLoc); + CorrectedName.isNull()) { + Diag(TemplateLoc, diag::err_no_template) << ATN->getDeclName(); + return QualType(); + } else { + Name = CorrectedName; + Template = Name.getAsTemplateDecl(); + } } } + if (!Template || + isa(Template)) { + SourceRange R(TemplateLoc, TemplateArgs.getRAngleLoc()); + if (ForNestedNameSpecifier) + Diag(TemplateLoc, diag::err_non_type_template_in_nested_name_specifier) + << isa_and_nonnull(Template) << Name << R; + else + Diag(TemplateLoc, diag::err_template_id_not_a_type) << Name << R; + NoteAllFoundTemplates(Name); + return QualType(); + } // Check that the template argument list is well-formed for this // template. @@ -3810,6 +3853,7 @@ QualType Sema::CheckTemplateIdType(ElaboratedTypeKeyword Keyword, // // template struct A; CanonType = Context.getCanonicalTemplateSpecializationType( + ElaboratedTypeKeyword::None, Context.getCanonicalTemplateName(Name, /*IgnoreDeduced=*/true), CTAI.CanonicalConverted); assert(CanonType->isCanonicalUnqualified()); @@ -3908,55 +3952,19 @@ void Sema::ActOnUndeclaredTypeTemplateName(Scope *S, TemplateTy &ParsedName, IdentifierInfo *&II) { assert(TNK == TNK_Undeclared_template && "not an undeclared template name"); - TemplateName Name = ParsedName.get(); - auto *ATN = Name.getAsAssumedTemplateName(); + auto *ATN = ParsedName.get().getAsAssumedTemplateName(); assert(ATN && "not an assumed template name"); II = ATN->getDeclName().getAsIdentifierInfo(); - if (!resolveAssumedTemplateNameAsType(S, Name, NameLoc, /*Diagnose*/false)) { + if (TemplateName Name = + ::resolveAssumedTemplateNameAsType(*this, S, ATN, NameLoc); + !Name.isNull()) { // Resolved to a type template name. ParsedName = TemplateTy::make(Name); TNK = TNK_Type_template; } } -bool Sema::resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name, - SourceLocation NameLoc, - bool Diagnose) { - // We assumed this undeclared identifier to be an (ADL-only) function - // template name, but it was used in a context where a type was required. - // Try to typo-correct it now. - AssumedTemplateStorage *ATN = Name.getAsAssumedTemplateName(); - assert(ATN && "not an assumed template name"); - - LookupResult R(*this, ATN->getDeclName(), NameLoc, LookupOrdinaryName); - struct CandidateCallback : CorrectionCandidateCallback { - bool ValidateCandidate(const TypoCorrection &TC) override { - return TC.getCorrectionDecl() && - getAsTypeTemplateDecl(TC.getCorrectionDecl()); - } - std::unique_ptr clone() override { - return std::make_unique(*this); - } - } FilterCCC; - - TypoCorrection Corrected = - CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, nullptr, - FilterCCC, CorrectTypoKind::ErrorRecovery); - if (Corrected && Corrected.getFoundDecl()) { - diagnoseTypo(Corrected, PDiag(diag::err_no_template_suggest) - << ATN->getDeclName()); - Name = Context.getQualifiedTemplateName( - /*Qualifier=*/std::nullopt, /*TemplateKeyword=*/false, - TemplateName(Corrected.getCorrectionDeclAs())); - return false; - } - - if (Diagnose) - Diag(R.getNameLoc(), diag::err_no_template) << R.getLookupName(); - return true; -} - TypeResult Sema::ActOnTemplateIdType( Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, @@ -4013,36 +4021,13 @@ TypeResult Sema::ActOnTemplateIdType( } } - TemplateName Template = TemplateD.get(); - if (Template.getAsAssumedTemplateName() && - resolveAssumedTemplateNameAsType(S, Template, TemplateIILoc)) - return true; - // Translate the parser's template argument list in our AST format. TemplateArgumentListInfo TemplateArgs(LAngleLoc, RAngleLoc); translateTemplateArguments(TemplateArgsIn, TemplateArgs); - if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { - assert(SS.getScopeRep() == DTN->getQualifier()); - QualType T = Context.getDependentTemplateSpecializationType( - ElaboratedKeyword, *DTN, TemplateArgs.arguments()); - // Build type-source information. - TypeLocBuilder TLB; - DependentTemplateSpecializationTypeLoc SpecTL - = TLB.push(T); - SpecTL.setElaboratedKeywordLoc(ElaboratedKeywordLoc); - SpecTL.setQualifierLoc(SS.getWithLocInContext(Context)); - SpecTL.setTemplateKeywordLoc(TemplateKWLoc); - SpecTL.setTemplateNameLoc(TemplateIILoc); - SpecTL.setLAngleLoc(LAngleLoc); - SpecTL.setRAngleLoc(RAngleLoc); - for (unsigned I = 0, N = SpecTL.getNumArgs(); I != N; ++I) - SpecTL.setArgLocInfo(I, TemplateArgs[I].getLocInfo()); - return CreateParsedType(T, TLB.getTypeSourceInfo(Context, T)); - } - - QualType SpecTy = CheckTemplateIdType(ElaboratedKeyword, Template, - TemplateIILoc, TemplateArgs); + QualType SpecTy = CheckTemplateIdType( + ElaboratedKeyword, TemplateD.get(), TemplateIILoc, TemplateArgs, + /*Scope=*/S, /*ForNestedNameSpecifier=*/false); if (SpecTy.isNull()) return true; @@ -4067,8 +4052,6 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK, if (SS.isInvalid()) return TypeResult(true); - TemplateName Template = TemplateD.get(); - // Translate the parser's template argument list in our AST format. TemplateArgumentListInfo TemplateArgs(LAngleLoc, RAngleLoc); translateTemplateArguments(TemplateArgsIn, TemplateArgs); @@ -4078,28 +4061,9 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK, ElaboratedTypeKeyword Keyword = TypeWithKeyword::getKeywordForTagTypeKind(TagKind); - if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { - assert(SS.getScopeRep() == DTN->getQualifier()); - QualType T = Context.getDependentTemplateSpecializationType( - Keyword, *DTN, TemplateArgs.arguments()); - - // Build type-source information. - TypeLocBuilder TLB; - DependentTemplateSpecializationTypeLoc SpecTL - = TLB.push(T); - SpecTL.setElaboratedKeywordLoc(TagLoc); - SpecTL.setQualifierLoc(SS.getWithLocInContext(Context)); - SpecTL.setTemplateKeywordLoc(TemplateKWLoc); - SpecTL.setTemplateNameLoc(TemplateLoc); - SpecTL.setLAngleLoc(LAngleLoc); - SpecTL.setRAngleLoc(RAngleLoc); - for (unsigned I = 0, N = SpecTL.getNumArgs(); I != N; ++I) - SpecTL.setArgLocInfo(I, TemplateArgs[I].getLocInfo()); - return CreateParsedType(T, TLB.getTypeSourceInfo(Context, T)); - } - QualType Result = - CheckTemplateIdType(Keyword, Template, TemplateLoc, TemplateArgs); + CheckTemplateIdType(Keyword, TemplateD.get(), TemplateLoc, TemplateArgs, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); if (Result.isNull()) return TypeResult(true); @@ -6389,11 +6353,6 @@ bool UnnamedLocalNoLinkageFinder::VisitDependentNameType( return VisitNestedNameSpecifier(T->getQualifier()); } -bool UnnamedLocalNoLinkageFinder::VisitDependentTemplateSpecializationType( - const DependentTemplateSpecializationType* T) { - return VisitNestedNameSpecifier(T->getDependentTemplateName().getQualifier()); -} - bool UnnamedLocalNoLinkageFinder::VisitPackExpansionType( const PackExpansionType* T) { return Visit(T->getPattern()); @@ -7832,8 +7791,10 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, bool PartialOrdering, bool *StrictPackMatch) { TemplateName Name = Arg.getArgument().getAsTemplateOrTemplatePattern(); - auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs(); + auto [UnderlyingName, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs(); + TemplateDecl *Template = UnderlyingName.getAsTemplateDecl(); if (!Template) { + // FIXME: Handle AssumedTemplateNames // Any dependent template name is fine. assert(Name.isDependent() && "Non-dependent template isn't a declaration?"); return false; @@ -8949,6 +8910,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization( } else { CanQualType CanonType = CanQualType::CreateUnsafe( Context.getCanonicalTemplateSpecializationType( + ElaboratedTypeKeyword::None, TemplateName(ClassTemplate->getCanonicalDecl()), CTAI.CanonicalConverted)); if (Context.hasSameType( @@ -11128,43 +11090,11 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, TemplateArgumentListInfo TemplateArgs(LAngleLoc, RAngleLoc); translateTemplateArguments(TemplateArgsIn, TemplateArgs); - auto Keyword = TypenameLoc.isValid() ? ElaboratedTypeKeyword::Typename - : ElaboratedTypeKeyword::None; - - TemplateName Template = TemplateIn.get(); - if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { - // Construct a dependent template specialization type. - assert(DTN && "dependent template has non-dependent name?"); - assert(DTN->getQualifier() == SS.getScopeRep()); - - if (!DTN->getName().getIdentifier()) { - Diag(TemplateIILoc, diag::err_template_id_not_a_type) << Template; - NoteAllFoundTemplates(Template); - return true; - } - - QualType T = Context.getDependentTemplateSpecializationType( - Keyword, *DTN, TemplateArgs.arguments()); - - // Create source-location information for this type. - TypeLocBuilder Builder; - DependentTemplateSpecializationTypeLoc SpecTL - = Builder.push(T); - SpecTL.setElaboratedKeywordLoc(TypenameLoc); - SpecTL.setQualifierLoc(SS.getWithLocInContext(Context)); - SpecTL.setTemplateKeywordLoc(TemplateKWLoc); - SpecTL.setTemplateNameLoc(TemplateIILoc); - SpecTL.setLAngleLoc(LAngleLoc); - SpecTL.setRAngleLoc(RAngleLoc); - for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I) - SpecTL.setArgLocInfo(I, TemplateArgs[I].getLocInfo()); - return CreateParsedType(T, Builder.getTypeSourceInfo(Context, T)); - } - - QualType T = CheckTemplateIdType(TypenameLoc.isValid() - ? ElaboratedTypeKeyword::Typename - : ElaboratedTypeKeyword::None, - Template, TemplateIILoc, TemplateArgs); + QualType T = CheckTemplateIdType( + TypenameLoc.isValid() ? ElaboratedTypeKeyword::Typename + : ElaboratedTypeKeyword::None, + TemplateIn.get(), TemplateIILoc, TemplateArgs, + /*Scope=*/S, /*ForNestedNameSpecifier=*/false); if (T.isNull()) return true; diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index cce40c0c91f95..64be2aab259f5 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -696,6 +696,11 @@ DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams, if (isa(P.getCanonicalType())) { const TemplateSpecializationType *TP = ::getLastTemplateSpecType(P); TNP = TP->getTemplateName(); + + // No deduction for specializations of dependent template names. + if (TNP.getAsDependentTemplateName()) + return TemplateDeductionResult::Success; + // FIXME: To preserve sugar, the TST needs to carry sugared resolved // arguments. PResolved = @@ -2540,7 +2545,6 @@ static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch( case Type::Decltype: case Type::UnaryTransform: case Type::DeducedTemplateSpecialization: - case Type::DependentTemplateSpecialization: case Type::PackExpansion: case Type::Pipe: case Type::ArrayParameter: @@ -6495,9 +6499,9 @@ Sema::getMoreSpecializedPartialSpecialization( " the same template."); TemplateName Name(PS1->getSpecializedTemplate()->getCanonicalDecl()); QualType PT1 = Context.getCanonicalTemplateSpecializationType( - Name, PS1->getTemplateArgs().asArray()); + ElaboratedTypeKeyword::None, Name, PS1->getTemplateArgs().asArray()); QualType PT2 = Context.getCanonicalTemplateSpecializationType( - Name, PS2->getTemplateArgs().asArray()); + ElaboratedTypeKeyword::None, Name, PS2->getTemplateArgs().asArray()); TemplateDeductionInfo Info(Loc); return getMoreSpecialized(*this, PT1, PT2, PS1, PS2, Info); @@ -6512,10 +6516,10 @@ bool Sema::isMoreSpecializedThanPrimary( Primary->getInjectedTemplateArgs(Context)); Context.canonicalizeTemplateArguments(PrimaryCanonArgs); - QualType PrimaryT = - Context.getCanonicalTemplateSpecializationType(Name, PrimaryCanonArgs); + QualType PrimaryT = Context.getCanonicalTemplateSpecializationType( + ElaboratedTypeKeyword::None, Name, PrimaryCanonArgs); QualType PartialT = Context.getCanonicalTemplateSpecializationType( - Name, Spec->getTemplateArgs().asArray()); + ElaboratedTypeKeyword::None, Name, Spec->getTemplateArgs().asArray()); VarTemplatePartialSpecializationDecl *MaybeSpec = getMoreSpecialized(*this, PartialT, PrimaryT, Spec, Primary, Info); @@ -6993,8 +6997,12 @@ MarkUsedTemplateParameters(ASTContext &Ctx, QualType T, case Type::TemplateSpecialization: { const TemplateSpecializationType *Spec = cast(T); - MarkUsedTemplateParameters(Ctx, Spec->getTemplateName(), OnlyDeduced, - Depth, Used); + + TemplateName Name = Spec->getTemplateName(); + if (OnlyDeduced && Name.getAsDependentTemplateName()) + break; + + MarkUsedTemplateParameters(Ctx, Name, OnlyDeduced, Depth, Used); // C++0x [temp.deduct.type]p9: // If the template argument list of P contains a pack expansion that is @@ -7030,31 +7038,6 @@ MarkUsedTemplateParameters(ASTContext &Ctx, QualType T, OnlyDeduced, Depth, Used); break; - case Type::DependentTemplateSpecialization: { - // C++14 [temp.deduct.type]p5: - // The non-deduced contexts are: - // -- The nested-name-specifier of a type that was specified using a - // qualified-id - // - // C++14 [temp.deduct.type]p6: - // When a type name is specified in a way that includes a non-deduced - // context, all of the types that comprise that type name are also - // non-deduced. - if (OnlyDeduced) - break; - - const DependentTemplateSpecializationType *Spec - = cast(T); - - MarkUsedTemplateParameters(Ctx, - Spec->getDependentTemplateName().getQualifier(), - OnlyDeduced, Depth, Used); - - for (const auto &Arg : Spec->template_arguments()) - MarkUsedTemplateParameters(Ctx, Arg, OnlyDeduced, Depth, Used); - break; - } - case Type::TypeOf: if (!OnlyDeduced) MarkUsedTemplateParameters(Ctx, cast(T)->getUnmodifiedType(), diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index b3cbd7f8c1efe..df1a100cab22c 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -6951,8 +6951,9 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, Args.addArgument( getTrivialTemplateArgumentLoc(UnpackedArg, QualType(), Loc)); } - QualType T = CheckTemplateIdType(ElaboratedTypeKeyword::None, - TemplateName(TD), Loc, Args); + QualType T = CheckTemplateIdType( + ElaboratedTypeKeyword::None, TemplateName(TD), Loc, Args, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); // We may get a non-null type with errors, in which case // `getAsCXXRecordDecl` will return `nullptr`. For instance, this // happens when one of the template arguments is an invalid diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 0f655d7f684a5..d723fb80f437e 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6036,15 +6036,6 @@ namespace { assert(TInfo); TL.copy(TInfo->getTypeLoc().castAs()); } - void VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc TL) { - assert(DS.getTypeSpecType() == TST_typename); - TypeSourceInfo *TInfo = nullptr; - Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo); - assert(TInfo); - TL.copy( - TInfo->getTypeLoc().castAs()); - } void VisitAutoTypeLoc(AutoTypeLoc TL) { assert(DS.getTypeSpecType() == TST_auto || DS.getTypeSpecType() == TST_decltype_auto || diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 0587a7decbd8d..6136937210978 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -744,10 +744,11 @@ class TreeTransform { StmtResult TransformSEHHandler(Stmt *Handler); - QualType TransformDependentTemplateSpecializationType( - TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, - QualType ObjectType, NamedDecl *UnqualLookup, - bool AllowInjectedClassName); + QualType TransformTemplateSpecializationType(TypeLocBuilder &TLB, + TemplateSpecializationTypeLoc TL, + QualType ObjectType, + NamedDecl *FirstQualifierInScope, + bool AllowInjectedClassName); QualType TransformTagType(TypeLocBuilder &TLB, TagTypeLoc TL); @@ -1163,24 +1164,6 @@ class TreeTransform { return SemaRef.BuildParenType(InnerType); } - /// Build a new typename type that refers to a template-id. - /// - /// By default, builds a new DependentNameType type from the - /// nested-name-specifier and the given type. Subclasses may override - /// this routine to provide different behavior. - QualType RebuildDependentTemplateSpecializationType( - ElaboratedTypeKeyword Keyword, SourceLocation TemplateKWLoc, - TemplateName Name, SourceLocation NameLoc, TemplateArgumentListInfo &Args, - bool AllowInjectedClassName) { - // If it's still dependent, make a dependent specialization. - if (const DependentTemplateStorage *S = Name.getAsDependentTemplateName()) - return SemaRef.Context.getDependentTemplateSpecializationType( - Keyword, *S, Args.arguments()); - - return getDerived().RebuildTemplateSpecializationType(Keyword, Name, - NameLoc, Args); - } - /// Build a new typename type that refers to an identifier. /// /// By default, performs semantic analysis when building the typename type @@ -5526,19 +5509,18 @@ QualType TreeTransform::RebuildQualifiedType(QualType T, template QualType TreeTransform::TransformTypeInObjectScope( TypeLocBuilder &TLB, TypeLoc TL, QualType ObjectType, - NamedDecl *UnqualLookup) { + NamedDecl *FirstQualifierInScope) { assert(!getDerived().AlreadyTransformed(TL.getType())); switch (TL.getTypeLocClass()) { - case TypeLoc::DependentTemplateSpecialization: - return getDerived().TransformDependentTemplateSpecializationType( - TLB, TL.castAs(), ObjectType, - UnqualLookup, /*AllowInjectedClassName=*/true); - case TypeLoc::DependentName: { + case TypeLoc::TemplateSpecialization: + return getDerived().TransformTemplateSpecializationType( + TLB, TL.castAs(), ObjectType, + FirstQualifierInScope, /*AllowInjectedClassName=*/true); + case TypeLoc::DependentName: return getDerived().TransformDependentNameType( TLB, TL.castAs(), /*DeducedTSTContext=*/false, - ObjectType, UnqualLookup); - } + ObjectType, FirstQualifierInScope); default: // Any dependent canonical type can appear here, through type alias // templates. @@ -7504,12 +7486,22 @@ QualType TreeTransform::TransformAutoType(TypeLocBuilder &TLB, template QualType TreeTransform::TransformTemplateSpecializationType( TypeLocBuilder &TLB, TemplateSpecializationTypeLoc TL) { + return getDerived().TransformTemplateSpecializationType( + TLB, TL, /*ObjectType=*/QualType(), /*FirstQualifierInScope=*/nullptr, + /*AllowInjectedClassName=*/false); +} + +template +QualType TreeTransform::TransformTemplateSpecializationType( + TypeLocBuilder &TLB, TemplateSpecializationTypeLoc TL, QualType ObjectType, + NamedDecl *FirstQualifierInScope, bool AllowInjectedClassName) { const TemplateSpecializationType *T = TL.getTypePtr(); NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc(); TemplateName Template = getDerived().TransformTemplateName( QualifierLoc, TL.getTemplateKeywordLoc(), T->getTemplateName(), - TL.getTemplateNameLoc()); + TL.getTemplateNameLoc(), ObjectType, FirstQualifierInScope, + AllowInjectedClassName); if (Template.isNull()) return QualType(); @@ -7532,23 +7524,6 @@ QualType TreeTransform::TransformTemplateSpecializationType( NewTemplateArgs); if (!Result.isNull()) { - // Specializations of template template parameters are represented as - // TemplateSpecializationTypes, and substitution of type alias templates - // within a dependent context can transform them into - // DependentTemplateSpecializationTypes. - if (isa(Result)) { - DependentTemplateSpecializationTypeLoc NewTL - = TLB.push(Result); - NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); - NewTL.setQualifierLoc(QualifierLoc); - NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); - NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); - NewTL.setLAngleLoc(TL.getLAngleLoc()); - NewTL.setRAngleLoc(TL.getRAngleLoc()); - for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) - NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); - return Result; - } TLB.push(Result).set( TL.getElaboratedKeywordLoc(), QualifierLoc, TL.getTemplateKeywordLoc(), TL.getTemplateNameLoc(), NewTemplateArgs); @@ -7799,83 +7774,6 @@ QualType TreeTransform::TransformDependentNameType( return Result; } -template -QualType TreeTransform::TransformDependentTemplateSpecializationType( - TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL) { - return getDerived().TransformDependentTemplateSpecializationType( - TLB, TL, QualType(), nullptr, false); -} - -template -QualType TreeTransform::TransformDependentTemplateSpecializationType( - TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, - QualType ObjectType, NamedDecl *UnqualLookup, bool AllowInjectedClassName) { - const DependentTemplateSpecializationType *T = TL.getTypePtr(); - - NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc(); - if (QualifierLoc) { - QualifierLoc = getDerived().TransformNestedNameSpecifierLoc( - QualifierLoc, ObjectType, UnqualLookup); - if (!QualifierLoc) - return QualType(); - // These only apply to the leftmost prefix. - ObjectType = QualType(); - UnqualLookup = nullptr; - } - CXXScopeSpec SS; - SS.Adopt(QualifierLoc); - - TemplateArgumentListInfo NewTemplateArgs(TL.getLAngleLoc(), - TL.getRAngleLoc()); - auto ArgsRange = llvm::make_range>({TL, 0}, {TL, TL.getNumArgs()}); - - if (getDerived().TransformTemplateArguments(ArgsRange.begin(), - ArgsRange.end(), NewTemplateArgs)) - return QualType(); - bool TemplateArgumentsChanged = !llvm::equal( - ArgsRange, NewTemplateArgs.arguments(), - [](const TemplateArgumentLoc &A, const TemplateArgumentLoc &B) { - return A.getArgument().structurallyEquals(B.getArgument()); - }); - - const DependentTemplateStorage &DTN = T->getDependentTemplateName(); - - QualType Result = TL.getType(); - if (getDerived().AlwaysRebuild() || SS.getScopeRep() != DTN.getQualifier() || - TemplateArgumentsChanged || !ObjectType.isNull()) { - TemplateName Name = getDerived().RebuildTemplateName( - SS, TL.getTemplateKeywordLoc(), DTN.getName(), TL.getTemplateNameLoc(), - ObjectType, AllowInjectedClassName); - if (Name.isNull()) - return QualType(); - Result = getDerived().RebuildDependentTemplateSpecializationType( - T->getKeyword(), TL.getTemplateKeywordLoc(), Name, - TL.getTemplateNameLoc(), NewTemplateArgs, - /*AllowInjectedClassName=*/false); - if (Result.isNull()) - return QualType(); - } - - QualifierLoc = SS.getWithLocInContext(SemaRef.Context); - if (isa(Result)) { - TLB.push(Result).set( - TL.getElaboratedKeywordLoc(), QualifierLoc, TL.getTemplateKeywordLoc(), - TL.getTemplateNameLoc(), NewTemplateArgs); - } else { - auto SpecTL = TLB.push(Result); - SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); - SpecTL.setQualifierLoc(QualifierLoc); - SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); - SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); - SpecTL.setLAngleLoc(TL.getLAngleLoc()); - SpecTL.setRAngleLoc(TL.getRAngleLoc()); - for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) - SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); - } - return Result; -} - template QualType TreeTransform::TransformPackExpansionType(TypeLocBuilder &TLB, PackExpansionTypeLoc TL) { @@ -17468,8 +17366,9 @@ template QualType TreeTransform::RebuildTemplateSpecializationType( ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateNameLoc, TemplateArgumentListInfo &TemplateArgs) { - return SemaRef.CheckTemplateIdType(Keyword, Template, TemplateNameLoc, - TemplateArgs); + return SemaRef.CheckTemplateIdType( + Keyword, Template, TemplateNameLoc, TemplateArgs, + /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false); } template diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 1b3a8b13f1fb1..5f40e94074702 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -7532,20 +7532,6 @@ void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { TL.setNameLoc(readSourceLocation()); } -void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc TL) { - TL.setElaboratedKeywordLoc(readSourceLocation()); - TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); - TL.setTemplateKeywordLoc(readSourceLocation()); - TL.setTemplateNameLoc(readSourceLocation()); - TL.setLAngleLoc(readSourceLocation()); - TL.setRAngleLoc(readSourceLocation()); - for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) - TL.setArgLocInfo(I, - Reader.readTemplateArgumentLocInfo( - TL.getTypePtr()->template_arguments()[I].getKind())); -} - void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { TL.setEllipsisLoc(readSourceLocation()); } diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index a3a25e48f9065..15a3ed4c427f8 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -659,18 +659,6 @@ void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { addSourceLocation(TL.getNameLoc()); } -void TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc TL) { - addSourceLocation(TL.getElaboratedKeywordLoc()); - Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc()); - addSourceLocation(TL.getTemplateKeywordLoc()); - addSourceLocation(TL.getTemplateNameLoc()); - addSourceLocation(TL.getLAngleLoc()); - addSourceLocation(TL.getRAngleLoc()); - for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) - Record.AddTemplateArgumentLocInfo(TL.getArgLoc(I)); -} - void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { addSourceLocation(TL.getEllipsisLoc()); } @@ -1058,7 +1046,6 @@ void ASTWriter::WriteBlockInfoBlock() { RECORD(TYPE_TEMPLATE_TYPE_PARM); RECORD(TYPE_TEMPLATE_SPECIALIZATION); RECORD(TYPE_DEPENDENT_NAME); - RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION); RECORD(TYPE_DEPENDENT_SIZED_ARRAY); RECORD(TYPE_PAREN); RECORD(TYPE_MACRO_QUALIFIED); diff --git a/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp b/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp index d9444110d421c..c9108fc299cc1 100644 --- a/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp +++ b/clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp @@ -157,12 +157,6 @@ SourceLocation StartLocationForType(TypeLoc TL) { return QualifierLoc.getBeginLoc(); return TTL.getNameLoc(); } - case TypeLoc::DependentTemplateSpecialization: { - auto TTL = TL.castAs(); - if (NestedNameSpecifierLoc QualifierLoc = TTL.getQualifierLoc()) - return QualifierLoc.getBeginLoc(); - return TTL.getTemplateNameLoc(); - } default: llvm_unreachable("unhandled TypeLoc class"); } diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp index b75f8ff6defee..90fd1f91b9ef2 100644 --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -974,13 +974,6 @@ class BuildTreeVisitor : public RecursiveASTVisitor { BeginLoc = TST.getTemplateNameLoc(); return buildSimpleTemplateName({BeginLoc, TST.getEndLoc()}); } - case TypeLoc::DependentTemplateSpecialization: { - auto DT = TL.castAs(); - SourceLocation BeginLoc = DT.getTemplateKeywordLoc(); - if (BeginLoc.isInvalid()) - BeginLoc = DT.getTemplateNameLoc(); - return buildSimpleTemplateName({BeginLoc, DT.getEndLoc()}); - } case TypeLoc::Decltype: { const auto DTL = TL.castAs(); if (!RecursiveASTVisitor::TraverseDecltypeTypeLoc( diff --git a/clang/test/AST/ast-dump-templates.cpp b/clang/test/AST/ast-dump-templates.cpp index e43fe6b1dda25..18f62e4acdc78 100644 --- a/clang/test/AST/ast-dump-templates.cpp +++ b/clang/test/AST/ast-dump-templates.cpp @@ -175,7 +175,10 @@ namespace TestDependentMemberPointer { // DUMP-NEXT: | `-BuiltinType {{.+}} 'int' // DUMP-NEXT: `-TypeAliasDecl {{.+}} Z 'int U::template V::*'{{$}} // DUMP-NEXT: `-MemberPointerType {{.+}} 'int U::template V::*' dependent -// DUMP-NEXT: |-DependentTemplateSpecializationType {{.+}} 'U::template V' dependent +// DUMP-NEXT: |-TemplateSpecializationType {{.+}} 'U::template V' dependent +// DUMP-NEXT: | |-name: 'U::template V':'type-parameter-0-0::template V' dependent +// DUMP-NEXT: | | `-NestedNameSpecifier TypeSpec 'U' +// DUMP-NEXT: | `-TemplateArgument type 'int' // DUMP-NEXT: `-BuiltinType {{.+}} 'int' } // namespace TestDependentMemberPointer @@ -237,6 +240,28 @@ namespace GH153540 { // DUMP-NEXT: CXXConstructExpr {{.*}} 'N::S':'GH153540::N::S' 'void (int)' } // namespace GH153540 +namespace AliasDependentTemplateSpecializationType { + // DUMP-LABEL: NamespaceDecl {{.*}} AliasDependentTemplateSpecializationType{{$}} + + template class TT> using T1 = TT; + template using T2 = T1; + +// DUMP: TypeAliasDecl {{.*}} T2 'T1':'T::template X' +// DUMP-NEXT: `-TemplateSpecializationType {{.*}} 'T1' sugar dependent alias +// DUMP-NEXT: |-name: 'T1':'AliasDependentTemplateSpecializationType::T1' qualified +// DUMP-NEXT: | `-TypeAliasTemplateDecl {{.*}} T1 +// DUMP-NEXT: |-TemplateArgument template 'T::template X':'type-parameter-0-0::template X' dependent +// DUMP-NEXT: | `-NestedNameSpecifier TypeSpec 'T' +// DUMP-NEXT: `-TemplateSpecializationType {{.*}} 'T::template X' dependent +// DUMP-NEXT: |-name: 'T::template X':'type-parameter-0-0::template X' subst index 0 final +// DUMP-NEXT: | |-parameter: TemplateTemplateParmDecl {{.*}} depth 0 index 0 TT +// DUMP-NEXT: | |-associated TypeAliasTemplate {{.*}} 'T1' +// DUMP-NEXT: | `-replacement: 'T::template X':'type-parameter-0-0::template X' dependent +// DUMP-NEXT: | `-NestedNameSpecifier TypeSpec 'T' +// DUMP-NEXT: `-TemplateArgument type 'int' +// DUMP-NEXT: `-BuiltinType {{.*}} 'int' +} // namespace + // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py @@ -6646,8 +6671,8 @@ namespace GH153540 { // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6425, -// JSON-NEXT: "line": 180, +// JSON-NEXT: "offset": 6613, +// JSON-NEXT: "line": 183, // JSON-NEXT: "col": 1, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -6961,12 +6986,30 @@ namespace GH153540 { // JSON-NEXT: "inner": [ // JSON-NEXT: { // JSON-NEXT: "id": "0x{{.*}}", -// JSON-NEXT: "kind": "DependentTemplateSpecializationType", +// JSON-NEXT: "kind": "TemplateSpecializationType", // JSON-NEXT: "type": { // JSON-NEXT: "qualType": "U::template V" // JSON-NEXT: }, // JSON-NEXT: "isDependent": true, -// JSON-NEXT: "isInstantiationDependent": true +// JSON-NEXT: "isInstantiationDependent": true, +// JSON-NEXT: "templateName": "U::template V", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "kind": "TemplateArgument", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: }, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "BuiltinType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: } +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "id": "0x{{.*}}", @@ -6989,20 +7032,20 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NamespaceDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6478, -// JSON-NEXT: "line": 182, +// JSON-NEXT: "offset": 6666, +// JSON-NEXT: "line": 185, // JSON-NEXT: "col": 11, // JSON-NEXT: "tokLen": 19 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6468, +// JSON-NEXT: "offset": 6656, // JSON-NEXT: "col": 1, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9336, -// JSON-NEXT: "line": 222, +// JSON-NEXT: "offset": 9524, +// JSON-NEXT: "line": 225, // JSON-NEXT: "col": 1, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7013,19 +7056,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplateDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6601, -// JSON-NEXT: "line": 184, +// JSON-NEXT: "offset": 6789, +// JSON-NEXT: "line": 187, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6563, +// JSON-NEXT: "offset": 6751, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6612, +// JSON-NEXT: "offset": 6800, // JSON-NEXT: "col": 52, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7036,18 +7079,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6579, +// JSON-NEXT: "offset": 6767, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6573, +// JSON-NEXT: "offset": 6761, // JSON-NEXT: "col": 13, // JSON-NEXT: "tokLen": 5 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6579, +// JSON-NEXT: "offset": 6767, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: } @@ -7061,18 +7104,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6589, +// JSON-NEXT: "offset": 6777, // JSON-NEXT: "col": 29, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6584, +// JSON-NEXT: "offset": 6772, // JSON-NEXT: "col": 24, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6589, +// JSON-NEXT: "offset": 6777, // JSON-NEXT: "col": 29, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: } @@ -7088,18 +7131,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6601, +// JSON-NEXT: "offset": 6789, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6594, +// JSON-NEXT: "offset": 6782, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6612, +// JSON-NEXT: "offset": 6800, // JSON-NEXT: "col": 52, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7162,18 +7205,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6601, +// JSON-NEXT: "offset": 6789, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6594, +// JSON-NEXT: "offset": 6782, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6601, +// JSON-NEXT: "offset": 6789, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: } @@ -7190,19 +7233,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplateDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6655, -// JSON-NEXT: "line": 185, +// JSON-NEXT: "offset": 6843, +// JSON-NEXT: "line": 188, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6617, +// JSON-NEXT: "offset": 6805, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6666, +// JSON-NEXT: "offset": 6854, // JSON-NEXT: "col": 52, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7213,18 +7256,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6633, +// JSON-NEXT: "offset": 6821, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6627, +// JSON-NEXT: "offset": 6815, // JSON-NEXT: "col": 13, // JSON-NEXT: "tokLen": 5 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6633, +// JSON-NEXT: "offset": 6821, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: } @@ -7238,18 +7281,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6643, +// JSON-NEXT: "offset": 6831, // JSON-NEXT: "col": 29, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6638, +// JSON-NEXT: "offset": 6826, // JSON-NEXT: "col": 24, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6643, +// JSON-NEXT: "offset": 6831, // JSON-NEXT: "col": 29, // JSON-NEXT: "tokLen": 3 // JSON-NEXT: } @@ -7265,18 +7308,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6655, +// JSON-NEXT: "offset": 6843, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6648, +// JSON-NEXT: "offset": 6836, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6666, +// JSON-NEXT: "offset": 6854, // JSON-NEXT: "col": 52, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7339,18 +7382,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6655, +// JSON-NEXT: "offset": 6843, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6648, +// JSON-NEXT: "offset": 6836, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6655, +// JSON-NEXT: "offset": 6843, // JSON-NEXT: "col": 41, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: } @@ -7367,21 +7410,21 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplatePartialSpecializationDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6719, -// JSON-NEXT: "line": 188, +// JSON-NEXT: "offset": 6907, +// JSON-NEXT: "line": 191, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6672, -// JSON-NEXT: "line": 187, +// JSON-NEXT: "offset": 6860, +// JSON-NEXT: "line": 190, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6753, -// JSON-NEXT: "line": 188, +// JSON-NEXT: "offset": 6941, +// JSON-NEXT: "line": 191, // JSON-NEXT: "col": 44, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7488,12 +7531,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "DeclRefExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6743, +// JSON-NEXT: "offset": 6931, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6743, +// JSON-NEXT: "offset": 6931, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7527,12 +7570,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "DeclRefExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6748, +// JSON-NEXT: "offset": 6936, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6748, +// JSON-NEXT: "offset": 6936, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7556,19 +7599,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6688, -// JSON-NEXT: "line": 187, +// JSON-NEXT: "offset": 6876, +// JSON-NEXT: "line": 190, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6682, +// JSON-NEXT: "offset": 6870, // JSON-NEXT: "col": 13, // JSON-NEXT: "tokLen": 5 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6688, +// JSON-NEXT: "offset": 6876, // JSON-NEXT: "col": 19, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7583,18 +7626,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6697, +// JSON-NEXT: "offset": 6885, // JSON-NEXT: "col": 28, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6692, +// JSON-NEXT: "offset": 6880, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6697, +// JSON-NEXT: "offset": 6885, // JSON-NEXT: "col": 28, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7611,18 +7654,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6706, +// JSON-NEXT: "offset": 6894, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6701, +// JSON-NEXT: "offset": 6889, // JSON-NEXT: "col": 32, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6706, +// JSON-NEXT: "offset": 6894, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7639,19 +7682,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 6719, -// JSON-NEXT: "line": 188, +// JSON-NEXT: "offset": 6907, +// JSON-NEXT: "line": 191, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 6712, +// JSON-NEXT: "offset": 6900, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 6719, +// JSON-NEXT: "offset": 6907, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: } @@ -7666,21 +7709,21 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplatePartialSpecializationDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 8035, -// JSON-NEXT: "line": 206, +// JSON-NEXT: "offset": 8223, +// JSON-NEXT: "line": 209, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 7985, -// JSON-NEXT: "line": 205, +// JSON-NEXT: "offset": 8173, +// JSON-NEXT: "line": 208, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8069, -// JSON-NEXT: "line": 206, +// JSON-NEXT: "offset": 8257, +// JSON-NEXT: "line": 209, // JSON-NEXT: "col": 44, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7787,12 +7830,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "DeclRefExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 8059, +// JSON-NEXT: "offset": 8247, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8059, +// JSON-NEXT: "offset": 8247, // JSON-NEXT: "col": 34, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7826,12 +7869,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "DeclRefExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 8064, +// JSON-NEXT: "offset": 8252, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8064, +// JSON-NEXT: "offset": 8252, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7855,19 +7898,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 8004, -// JSON-NEXT: "line": 205, +// JSON-NEXT: "offset": 8192, +// JSON-NEXT: "line": 208, // JSON-NEXT: "col": 22, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 7995, +// JSON-NEXT: "offset": 8183, // JSON-NEXT: "col": 13, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8004, +// JSON-NEXT: "offset": 8192, // JSON-NEXT: "col": 22, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7882,18 +7925,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 8013, +// JSON-NEXT: "offset": 8201, // JSON-NEXT: "col": 31, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 8008, +// JSON-NEXT: "offset": 8196, // JSON-NEXT: "col": 26, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8013, +// JSON-NEXT: "offset": 8201, // JSON-NEXT: "col": 31, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7910,18 +7953,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NonTypeTemplateParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 8022, +// JSON-NEXT: "offset": 8210, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 8017, +// JSON-NEXT: "offset": 8205, // JSON-NEXT: "col": 35, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8022, +// JSON-NEXT: "offset": 8210, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 2 // JSON-NEXT: } @@ -7938,19 +7981,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 8035, -// JSON-NEXT: "line": 206, +// JSON-NEXT: "offset": 8223, +// JSON-NEXT: "line": 209, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 8028, +// JSON-NEXT: "offset": 8216, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 8035, +// JSON-NEXT: "offset": 8223, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: } @@ -7967,20 +8010,20 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NamespaceDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9382, -// JSON-NEXT: "line": 224, +// JSON-NEXT: "offset": 9570, +// JSON-NEXT: "line": 227, // JSON-NEXT: "col": 11, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9372, +// JSON-NEXT: "offset": 9560, // JSON-NEXT: "col": 1, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9791, -// JSON-NEXT: "line": 238, +// JSON-NEXT: "offset": 9979, +// JSON-NEXT: "line": 241, // JSON-NEXT: "col": 1, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -7991,20 +8034,20 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "NamespaceDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9456, -// JSON-NEXT: "line": 227, +// JSON-NEXT: "offset": 9644, +// JSON-NEXT: "line": 230, // JSON-NEXT: "col": 13, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9446, +// JSON-NEXT: "offset": 9634, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 9 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9507, -// JSON-NEXT: "line": 229, +// JSON-NEXT: "offset": 9695, +// JSON-NEXT: "line": 232, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8015,19 +8058,19 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplateDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, -// JSON-NEXT: "line": 228, +// JSON-NEXT: "offset": 9680, +// JSON-NEXT: "line": 231, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9464, +// JSON-NEXT: "offset": 9652, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9502, +// JSON-NEXT: "offset": 9690, // JSON-NEXT: "col": 43, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8038,18 +8081,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9473, +// JSON-NEXT: "offset": 9661, // JSON-NEXT: "col": 14, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8064,18 +8107,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9485, +// JSON-NEXT: "offset": 9673, // JSON-NEXT: "col": 26, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9502, +// JSON-NEXT: "offset": 9690, // JSON-NEXT: "col": 43, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8130,18 +8173,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9485, +// JSON-NEXT: "offset": 9673, // JSON-NEXT: "col": 26, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8154,18 +8197,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXConstructorDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8179,18 +8222,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8207,18 +8250,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ClassTemplateSpecializationDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9464, +// JSON-NEXT: "offset": 9652, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9502, +// JSON-NEXT: "offset": 9690, // JSON-NEXT: "col": 43, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8286,18 +8329,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXRecordDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9485, +// JSON-NEXT: "offset": 9673, // JSON-NEXT: "col": 26, // JSON-NEXT: "tokLen": 6 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8310,18 +8353,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXConstructorDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8337,18 +8380,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8363,18 +8406,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXConstructorDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8393,18 +8436,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8419,18 +8462,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXConstructorDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8449,18 +8492,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8475,18 +8518,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXDestructorDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8510,18 +8553,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "FunctionTemplateDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9464, +// JSON-NEXT: "offset": 9652, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8533,18 +8576,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9473, +// JSON-NEXT: "offset": 9661, // JSON-NEXT: "col": 14, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8559,18 +8602,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXDeductionGuideDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8585,18 +8628,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8611,18 +8654,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXDeductionGuideDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9496, +// JSON-NEXT: "offset": 9684, // JSON-NEXT: "col": 37, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8653,18 +8696,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9499, +// JSON-NEXT: "offset": 9687, // JSON-NEXT: "col": 40, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9498, +// JSON-NEXT: "offset": 9686, // JSON-NEXT: "col": 39, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8681,18 +8724,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "FunctionTemplateDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9464, +// JSON-NEXT: "offset": 9652, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8704,18 +8747,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "TemplateTypeParmDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9473, +// JSON-NEXT: "offset": 9661, // JSON-NEXT: "col": 14, // JSON-NEXT: "tokLen": 8 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9482, +// JSON-NEXT: "offset": 9670, // JSON-NEXT: "col": 23, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8730,18 +8773,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "CXXDeductionGuideDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8756,18 +8799,18 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "ParmVarDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9492, +// JSON-NEXT: "offset": 9680, // JSON-NEXT: "col": 33, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8786,20 +8829,20 @@ namespace GH153540 { // JSON-NEXT: "id": "0x{{.*}}", // JSON-NEXT: "kind": "FunctionDecl", // JSON-NEXT: "loc": { -// JSON-NEXT: "offset": 9516, -// JSON-NEXT: "line": 230, +// JSON-NEXT: "offset": 9704, +// JSON-NEXT: "line": 233, // JSON-NEXT: "col": 8, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9511, +// JSON-NEXT: "offset": 9699, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 4 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9537, -// JSON-NEXT: "line": 232, +// JSON-NEXT: "offset": 9725, +// JSON-NEXT: "line": 235, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8815,14 +8858,14 @@ namespace GH153540 { // JSON-NEXT: "kind": "CompoundStmt", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9520, -// JSON-NEXT: "line": 230, +// JSON-NEXT: "offset": 9708, +// JSON-NEXT: "line": 233, // JSON-NEXT: "col": 12, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9537, -// JSON-NEXT: "line": 232, +// JSON-NEXT: "offset": 9725, +// JSON-NEXT: "line": 235, // JSON-NEXT: "col": 3, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8833,13 +8876,13 @@ namespace GH153540 { // JSON-NEXT: "kind": "CXXFunctionalCastExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9526, -// JSON-NEXT: "line": 231, +// JSON-NEXT: "offset": 9714, +// JSON-NEXT: "line": 234, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9532, +// JSON-NEXT: "offset": 9720, // JSON-NEXT: "col": 11, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8864,12 +8907,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "CXXConstructExpr", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9526, +// JSON-NEXT: "offset": 9714, // JSON-NEXT: "col": 5, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9532, +// JSON-NEXT: "offset": 9720, // JSON-NEXT: "col": 11, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8890,12 +8933,12 @@ namespace GH153540 { // JSON-NEXT: "kind": "IntegerLiteral", // JSON-NEXT: "range": { // JSON-NEXT: "begin": { -// JSON-NEXT: "offset": 9531, +// JSON-NEXT: "offset": 9719, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: }, // JSON-NEXT: "end": { -// JSON-NEXT: "offset": 9531, +// JSON-NEXT: "offset": 9719, // JSON-NEXT: "col": 10, // JSON-NEXT: "tokLen": 1 // JSON-NEXT: } @@ -8915,6 +8958,282 @@ namespace GH153540 { // JSON-NEXT: ] // JSON-NEXT: } // JSON-NEXT: ] +// JSON-NEXT: }, +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "NamespaceDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10014, +// JSON-NEXT: "line": 243, +// JSON-NEXT: "col": 11, +// JSON-NEXT: "tokLen": 40 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10004, +// JSON-NEXT: "col": 1, +// JSON-NEXT: "tokLen": 9 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 11286, +// JSON-NEXT: "line": 263, +// JSON-NEXT: "col": 1, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "AliasDependentTemplateSpecializationType", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TypeAliasTemplateDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10179, +// JSON-NEXT: "line": 246, +// JSON-NEXT: "col": 38, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10144, +// JSON-NEXT: "col": 3, +// JSON-NEXT: "tokLen": 8 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10196, +// JSON-NEXT: "col": 55, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "T1", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateTemplateParmDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10175, +// JSON-NEXT: "col": 34, +// JSON-NEXT: "tokLen": 2 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10153, +// JSON-NEXT: "col": 12, +// JSON-NEXT: "tokLen": 8 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10175, +// JSON-NEXT: "col": 34, +// JSON-NEXT: "tokLen": 2 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "TT", +// JSON-NEXT: "depth": 0, +// JSON-NEXT: "index": 0, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateTypeParmDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10167, +// JSON-NEXT: "col": 26, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10162, +// JSON-NEXT: "col": 21, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10162, +// JSON-NEXT: "col": 21, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "tagUsed": "class", +// JSON-NEXT: "depth": 1, +// JSON-NEXT: "index": 0 +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: }, +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TypeAliasDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10185, +// JSON-NEXT: "col": 44, +// JSON-NEXT: "tokLen": 2 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10179, +// JSON-NEXT: "col": 38, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10196, +// JSON-NEXT: "col": 55, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "T1", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "TT" +// JSON-NEXT: }, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateSpecializationType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "TT" +// JSON-NEXT: }, +// JSON-NEXT: "isDependent": true, +// JSON-NEXT: "isInstantiationDependent": true, +// JSON-NEXT: "templateName": "TT", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "kind": "TemplateArgument", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: }, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "BuiltinType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: } +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: }, +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TypeAliasTemplateDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10219, +// JSON-NEXT: "line": 247, +// JSON-NEXT: "col": 21, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10201, +// JSON-NEXT: "col": 3, +// JSON-NEXT: "tokLen": 8 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10246, +// JSON-NEXT: "col": 48, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "T2", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateTypeParmDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10216, +// JSON-NEXT: "col": 18, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10210, +// JSON-NEXT: "col": 12, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10216, +// JSON-NEXT: "col": 18, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "T", +// JSON-NEXT: "tagUsed": "class", +// JSON-NEXT: "depth": 0, +// JSON-NEXT: "index": 0 +// JSON-NEXT: }, +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TypeAliasDecl", +// JSON-NEXT: "loc": { +// JSON-NEXT: "offset": 10225, +// JSON-NEXT: "col": 27, +// JSON-NEXT: "tokLen": 2 +// JSON-NEXT: }, +// JSON-NEXT: "range": { +// JSON-NEXT: "begin": { +// JSON-NEXT: "offset": 10219, +// JSON-NEXT: "col": 21, +// JSON-NEXT: "tokLen": 5 +// JSON-NEXT: }, +// JSON-NEXT: "end": { +// JSON-NEXT: "offset": 10246, +// JSON-NEXT: "col": 48, +// JSON-NEXT: "tokLen": 1 +// JSON-NEXT: } +// JSON-NEXT: }, +// JSON-NEXT: "name": "T2", +// JSON-NEXT: "type": { +// JSON-NEXT: "desugaredQualType": "T::template X", +// JSON-NEXT: "qualType": "T1" +// JSON-NEXT: }, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateSpecializationType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "T1" +// JSON-NEXT: }, +// JSON-NEXT: "isDependent": true, +// JSON-NEXT: "isInstantiationDependent": true, +// JSON-NEXT: "isAlias": true, +// JSON-NEXT: "templateName": "T1", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "kind": "TemplateArgument" +// JSON-NEXT: }, +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "TemplateSpecializationType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "T::template X" +// JSON-NEXT: }, +// JSON-NEXT: "isDependent": true, +// JSON-NEXT: "isInstantiationDependent": true, +// JSON-NEXT: "templateName": "T::template X", +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "kind": "TemplateArgument", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: }, +// JSON-NEXT: "inner": [ +// JSON-NEXT: { +// JSON-NEXT: "id": "0x{{.*}}", +// JSON-NEXT: "kind": "BuiltinType", +// JSON-NEXT: "type": { +// JSON-NEXT: "qualType": "int" +// JSON-NEXT: } +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] +// JSON-NEXT: } +// JSON-NEXT: ] // JSON-NEXT: } // JSON-NEXT: ] // JSON-NEXT: } diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 0ed029c39885f..9526f629bda42 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -1834,19 +1834,6 @@ bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { return VisitNestedNameSpecifierLoc(TL.getQualifierLoc()); } -bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( - DependentTemplateSpecializationTypeLoc TL) { - if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) - return true; - - // Visit the template arguments. - for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) - if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) - return true; - - return false; -} - bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { return Visit(TL.getPatternLoc()); } diff --git a/clang/tools/libclang/CXIndexDataConsumer.cpp b/clang/tools/libclang/CXIndexDataConsumer.cpp index 423dd1b25adad..932201a94cdae 100644 --- a/clang/tools/libclang/CXIndexDataConsumer.cpp +++ b/clang/tools/libclang/CXIndexDataConsumer.cpp @@ -393,8 +393,6 @@ SourceLocation CXIndexDataConsumer::CXXBasesListInfo::getBaseLoc( // TypeLoc::getNameLoc() if (auto TTL = TL.getAs()) return TTL.getNameLoc(); - if (auto TTL = TL.getAs()) - return TTL.getTemplateNameLoc(); if (auto TTL = TL.getAs()) return TTL.getTemplateNameLoc(); if (auto TTL = TL.getAs()) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index ac40a871c0252..e7160bcf2e0c2 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -774,8 +774,8 @@ TEST_P(ImportType, ImportDependentTemplateSpecialization) { " typename A::template B a;" "};", Lang_CXX03, "", Lang_CXX03, Verifier, - classTemplateDecl(has(cxxRecordDecl(has( - fieldDecl(hasType(dependentTemplateSpecializationType()))))))); + classTemplateDecl(has(cxxRecordDecl( + has(fieldDecl(hasType(templateSpecializationType()))))))); } TEST_P(ImportType, ImportDeducedTemplateSpecialization) { diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index d7df9cae01f33..9692d6e6fae97 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -2031,7 +2031,7 @@ TEST_P(ASTMatchersTest, DependentTemplateSpecializationType) { typename A::template B a; }; )", - dependentTemplateSpecializationType())); + templateSpecializationType())); } TEST_P(ASTMatchersTest, RecordType) { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 39aacdb58e694..e4544cd66f49b 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3962,8 +3962,6 @@ TypeSystemClang::GetTypeInfo(lldb::opaque_compiler_type_t type, return 0; case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; - case clang::Type::DependentTemplateSpecialization: - return eTypeIsTemplate; case clang::Type::Enum: if (pointee_or_element_clang_type) @@ -4237,8 +4235,6 @@ TypeSystemClang::GetTypeClass(lldb::opaque_compiler_type_t type) { break; case clang::Type::DependentName: break; - case clang::Type::DependentTemplateSpecialization: - break; case clang::Type::PackExpansion: break; @@ -5108,7 +5104,6 @@ lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type, case clang::Type::SubstTemplateTypeParmPack: case clang::Type::InjectedClassName: case clang::Type::DependentName: - case clang::Type::DependentTemplateSpecialization: case clang::Type::PackExpansion: case clang::Type::ObjCObject: @@ -5277,7 +5272,6 @@ lldb::Format TypeSystemClang::GetFormat(lldb::opaque_compiler_type_t type) { case clang::Type::SubstTemplateTypeParmPack: case clang::Type::InjectedClassName: case clang::Type::DependentName: - case clang::Type::DependentTemplateSpecialization: case clang::Type::PackExpansion: case clang::Type::ObjCObject: @@ -6171,8 +6165,6 @@ uint32_t TypeSystemClang::GetNumPointeeChildren(clang::QualType type) { return 0; case clang::Type::DependentName: return 1; - case clang::Type::DependentTemplateSpecialization: - return 1; case clang::Type::ObjCObject: return 0; case clang::Type::ObjCInterface: