diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-27 07:56:27 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-27 07:56:27 +0000 |
commit | 977e39c989b2f0d9cb175a100d2663a8323367db (patch) | |
tree | a08e09cca6e503c356370ae8b3505f4e1995c735 /lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 2f25e95e52816cc143f17decb41eaef86fd08cc4 (diff) |
DR1495: A partial specialization is ill-formed if it is not (strictly) more
specialized than the primary template. (Put another way, if we imagine there
were a partial specialization matching the primary template, we should never
select it if some other partial specialization also matches.)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290593 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 14d239b548..160c9f0907 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -279,6 +279,17 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( Sema::InstantiatingTemplate::InstantiatingTemplate( Sema &SemaRef, SourceLocation PointOfInstantiation, + TemplateDecl *Template, + ArrayRef<TemplateArgument> TemplateArgs, + sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) + : InstantiatingTemplate( + SemaRef, + ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution, + PointOfInstantiation, InstantiationRange, Template, nullptr, + TemplateArgs, &DeductionInfo) {} + +Sema::InstantiatingTemplate::InstantiatingTemplate( + Sema &SemaRef, SourceLocation PointOfInstantiation, ClassTemplatePartialSpecializationDecl *PartialSpec, ArrayRef<TemplateArgument> TemplateArgs, sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) @@ -497,8 +508,12 @@ void Sema::PrintInstantiationStack() { } else { bool IsVar = isa<VarTemplateDecl>(Active->Entity) || isa<VarTemplateSpecializationDecl>(Active->Entity); + bool IsTemplate = false; TemplateParameterList *Params; - if (auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>( + if (auto *D = dyn_cast<TemplateDecl>(Active->Entity)) { + IsTemplate = true; + Params = D->getTemplateParameters(); + } else if (auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>( Active->Entity)) { Params = D->getTemplateParameters(); } else if (auto *D = dyn_cast<VarTemplatePartialSpecializationDecl>( @@ -510,7 +525,7 @@ void Sema::PrintInstantiationStack() { Diags.Report(Active->PointOfInstantiation, diag::note_deduced_template_arg_substitution_here) - << IsVar << cast<NamedDecl>(Active->Entity) + << IsVar << IsTemplate << cast<NamedDecl>(Active->Entity) << getTemplateArgumentBindingsText(Params, Active->TemplateArgs, Active->NumTemplateArgs) << Active->InstantiationRange; |