diff options
author | Saar Raz <saar@raz.email> | 2019-12-22 09:35:53 +0200 |
---|---|---|
committer | Saar Raz <saar@raz.email> | 2019-12-22 13:15:38 +0200 |
commit | d3f5769d5e93b30d4a8b4696381d5e4a304992fa (patch) | |
tree | 93d2a0af1aae2c9c11a8cb9efb3ae5c8aed7800a /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 9a3fab97468f9555a770707e23a4c424bfd696c2 (diff) | |
download | bcm5719-llvm-d3f5769d5e93b30d4a8b4696381d5e4a304992fa.tar.gz bcm5719-llvm-d3f5769d5e93b30d4a8b4696381d5e4a304992fa.zip |
[Concepts] Constrained partial specializations and function overloads.
Added support for constraint satisfaction checking and partial ordering of constraints in constrained partial specialization and function template overloads.
Re-commit after fixing some crashes and warnings.
Differential Revision: https://reviews.llvm.org/D41910
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 6db8eb3e5ed..770c07d41b1 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -207,6 +207,8 @@ bool Sema::CodeSynthesisContext::isInstantiationRecord() const { case DefiningSynthesizedFunction: case ExceptionSpecEvaluation: case ConstraintSubstitution: + case ParameterMappingSubstitution: + case ConstraintNormalization: case RewritingOperatorAsSpaceship: return false; @@ -380,6 +382,22 @@ Sema::InstantiatingTemplate::InstantiatingTemplate( PointOfInstantiation, InstantiationRange, Template, nullptr, {}, &DeductionInfo) {} +Sema::InstantiatingTemplate::InstantiatingTemplate( + Sema &SemaRef, SourceLocation PointOfInstantiation, + ConstraintNormalization, NamedDecl *Template, + SourceRange InstantiationRange) + : InstantiatingTemplate( + SemaRef, CodeSynthesisContext::ConstraintNormalization, + PointOfInstantiation, InstantiationRange, Template) {} + +Sema::InstantiatingTemplate::InstantiatingTemplate( + Sema &SemaRef, SourceLocation PointOfInstantiation, + ParameterMappingSubstitution, NamedDecl *Template, + SourceRange InstantiationRange) + : InstantiatingTemplate( + SemaRef, CodeSynthesisContext::ParameterMappingSubstitution, + PointOfInstantiation, InstantiationRange, Template) {} + void Sema::pushCodeSynthesisContext(CodeSynthesisContext Ctx) { Ctx.SavedInNonInstantiationSFINAEContext = InNonInstantiationSFINAEContext; InNonInstantiationSFINAEContext = false; @@ -733,6 +751,17 @@ void Sema::PrintInstantiationStack() { diag::note_constraint_substitution_here) << Active->InstantiationRange; break; + case CodeSynthesisContext::ConstraintNormalization: + Diags.Report(Active->PointOfInstantiation, + diag::note_constraint_normalization_here) + << cast<NamedDecl>(Active->Entity)->getName() + << Active->InstantiationRange; + break; + case CodeSynthesisContext::ParameterMappingSubstitution: + Diags.Report(Active->PointOfInstantiation, + diag::note_parameter_mapping_substitution_here) + << Active->InstantiationRange; + break; } } } @@ -757,6 +786,8 @@ Optional<TemplateDeductionInfo *> Sema::isSFINAEContext() const { case CodeSynthesisContext::DefaultFunctionArgumentInstantiation: case CodeSynthesisContext::ExceptionSpecInstantiation: case CodeSynthesisContext::ConstraintsCheck: + case CodeSynthesisContext::ParameterMappingSubstitution: + case CodeSynthesisContext::ConstraintNormalization: // This is a template instantiation, so there is no SFINAE. return None; @@ -2926,6 +2957,17 @@ Sema::SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs) { return Instantiator.TransformStmt(S); } +bool Sema::SubstTemplateArguments( + ArrayRef<TemplateArgumentLoc> Args, + const MultiLevelTemplateArgumentList &TemplateArgs, + TemplateArgumentListInfo &Out) { + TemplateInstantiator Instantiator(*this, TemplateArgs, + SourceLocation(), + DeclarationName()); + return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), + Out); +} + ExprResult Sema::SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs) { if (!E) |