diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 8c312c9d2c5a1..dff336f2ff2dd 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -18,7 +18,6 @@ #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/PrettyDeclStackTrace.h" -#include "clang/AST/TypeVisitor.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/Stack.h" #include "clang/Sema/DeclSpec.h" @@ -2146,94 +2145,6 @@ void Sema::SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, UpdateExceptionSpec(New, ESI); } -namespace { - - struct GetContainedInventedTypeParmVisitor : - public TypeVisitor { - using TypeVisitor::Visit; - - TemplateTypeParmDecl *Visit(QualType T) { - if (T.isNull()) - return nullptr; - return Visit(T.getTypePtr()); - } - // The deduced type itself. - TemplateTypeParmDecl *VisitTemplateTypeParmType( - const TemplateTypeParmType *T) { - if (!T->getDecl()->isImplicit()) - return nullptr; - return T->getDecl(); - } - - // Only these types can contain 'auto' types, and subsequently be replaced - // by references to invented parameters. - - TemplateTypeParmDecl *VisitElaboratedType(const ElaboratedType *T) { - return Visit(T->getNamedType()); - } - - TemplateTypeParmDecl *VisitPointerType(const PointerType *T) { - return Visit(T->getPointeeType()); - } - - TemplateTypeParmDecl *VisitBlockPointerType(const BlockPointerType *T) { - return Visit(T->getPointeeType()); - } - - TemplateTypeParmDecl *VisitReferenceType(const ReferenceType *T) { - return Visit(T->getPointeeTypeAsWritten()); - } - - TemplateTypeParmDecl *VisitMemberPointerType(const MemberPointerType *T) { - return Visit(T->getPointeeType()); - } - - TemplateTypeParmDecl *VisitArrayType(const ArrayType *T) { - return Visit(T->getElementType()); - } - - TemplateTypeParmDecl *VisitDependentSizedExtVectorType( - const DependentSizedExtVectorType *T) { - return Visit(T->getElementType()); - } - - TemplateTypeParmDecl *VisitVectorType(const VectorType *T) { - return Visit(T->getElementType()); - } - - TemplateTypeParmDecl *VisitFunctionProtoType(const FunctionProtoType *T) { - return VisitFunctionType(T); - } - - TemplateTypeParmDecl *VisitFunctionType(const FunctionType *T) { - return Visit(T->getReturnType()); - } - - TemplateTypeParmDecl *VisitParenType(const ParenType *T) { - return Visit(T->getInnerType()); - } - - TemplateTypeParmDecl *VisitAttributedType(const AttributedType *T) { - return Visit(T->getModifiedType()); - } - - TemplateTypeParmDecl *VisitMacroQualifiedType(const MacroQualifiedType *T) { - return Visit(T->getUnderlyingType()); - } - - TemplateTypeParmDecl *VisitAdjustedType(const AdjustedType *T) { - return Visit(T->getOriginalType()); - } - - TemplateTypeParmDecl *VisitPackExpansionType(const PackExpansionType *T) { - return Visit(T->getPattern()); - } - }; - -} // namespace - ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, @@ -2281,41 +2192,6 @@ ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm, return nullptr; } - // In abbreviated templates, TemplateTypeParmDecls with possible - // TypeConstraints are created when the parameter list is originally parsed. - // The TypeConstraints can therefore reference other functions parameters in - // the abbreviated function template, which is why we must instantiate them - // here, when the instantiated versions of those referenced parameters are in - // scope. - if (TemplateTypeParmDecl *TTP = - GetContainedInventedTypeParmVisitor().Visit(OldDI->getType())) { - if (const TypeConstraint *TC = TTP->getTypeConstraint()) { - // TODO: Concepts: do not instantiate the constraint (delayed constraint - // substitution) - const ASTTemplateArgumentListInfo *TemplArgInfo - = TC->getTemplateArgsAsWritten(); - TemplateArgumentListInfo InstArgs; - - if (TemplArgInfo) { - InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc); - InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc); - if (Subst(TemplArgInfo->getTemplateArgs(), - TemplArgInfo->NumTemplateArgs, InstArgs, TemplateArgs)) - return nullptr; - } - auto *Inst = cast( - FindInstantiatedDecl(TTP->getLocation(), TTP, TemplateArgs)); - if (AttachTypeConstraint( - TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(), - TC->getNamedConcept(), &InstArgs, Inst, - TTP->isParameterPack() - ? cast(TC->getImmediatelyDeclaredConstraint()) - ->getEllipsisLoc() - : SourceLocation())) - return nullptr; - } - } - ParmVarDecl *NewParm = CheckParameter(Context.getTranslationUnitDecl(), OldParm->getInnerLocStart(), OldParm->getLocation(), diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 0e1d5fa77c693..2637b4cb6dcab 100755 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2525,34 +2525,28 @@ Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl( Inst->setAccess(AS_public); Inst->setImplicit(D->isImplicit()); if (auto *TC = D->getTypeConstraint()) { - if (!D->isImplicit()) { - // Invented template parameter type constraints will be instantiated with - // the corresponding auto-typed parameter as it might reference other - // parameters. - - // TODO: Concepts: do not instantiate the constraint (delayed constraint - // substitution) - const ASTTemplateArgumentListInfo *TemplArgInfo - = TC->getTemplateArgsAsWritten(); - TemplateArgumentListInfo InstArgs; - - if (TemplArgInfo) { - InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc); - InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc); - if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(), - TemplArgInfo->NumTemplateArgs, - InstArgs, TemplateArgs)) - return nullptr; - } - if (SemaRef.AttachTypeConstraint( - TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(), - TC->getNamedConcept(), &InstArgs, Inst, - D->isParameterPack() - ? cast(TC->getImmediatelyDeclaredConstraint()) - ->getEllipsisLoc() - : SourceLocation())) + // TODO: Concepts: do not instantiate the constraint (delayed constraint + // substitution) + const ASTTemplateArgumentListInfo *TemplArgInfo + = TC->getTemplateArgsAsWritten(); + TemplateArgumentListInfo InstArgs; + + if (TemplArgInfo) { + InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc); + InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc); + if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(), + TemplArgInfo->NumTemplateArgs, + InstArgs, TemplateArgs)) return nullptr; } + if (SemaRef.AttachTypeConstraint( + TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(), + TC->getNamedConcept(), &InstArgs, Inst, + D->isParameterPack() + ? cast(TC->getImmediatelyDeclaredConstraint()) + ->getEllipsisLoc() + : SourceLocation())) + return nullptr; } if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) { TypeSourceInfo *InstantiatedDefaultArg = diff --git a/clang/test/SemaTemplate/instantiate-abbreviated-template.cpp b/clang/test/SemaTemplate/instantiate-abbreviated-template.cpp deleted file mode 100644 index a73b6ce3610fa..0000000000000 --- a/clang/test/SemaTemplate/instantiate-abbreviated-template.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify -// expected-no-diagnostics - -template -concept C = true; - -template -struct S { - template - static void foo1(U a, auto b); - static void foo2(T a, C auto b); - static void foo3(T a, C auto b); - static void foo4(T a, C auto b, const C auto &&c); -}; - -using sf1 = decltype(S::foo1(1, 2)); -using sf2 = decltype(S::foo2(1, 2)); -using sf3 = decltype(S::foo3(1, 2)); -using sf4 = decltype(S::foo4(1, 2, 3)); - - -template -struct G { - static void foo1(auto a, const C auto &&... b); - static void foo2(auto a, const C auto &&... b); -}; - -using gf1 = decltype(G::foo1('a', 1, 2, 3, 4)); -using gf2 = decltype(G::foo2('a', 1, 2));