summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorSaar Raz <saar@raz.email>2020-01-23 23:24:56 +0200
committerSaar Raz <saar@raz.email>2020-01-24 02:28:31 +0200
commita9b2cf6c625ab15e3cef00350c855e7cd319cf83 (patch)
tree4597d04f819bad6cc3f5b6497f87ead5189c8579 /clang
parent6a8cd9fc81e86916c1d8d55f52e3c7d5ccdb598a (diff)
downloadbcm5719-llvm-a9b2cf6c625ab15e3cef00350c855e7cd319cf83.tar.gz
bcm5719-llvm-a9b2cf6c625ab15e3cef00350c855e7cd319cf83.zip
[Concepts] Add ExpressionEvaluationContexts to instantiation of constraints
Proper ExpressionEvaluationContext were not being entered when instantiating constraint expressions, which caused assertion failures in certain cases, including bug #44614. (cherry picked from commit 4d33a8dfcf67e970ea4d150d514b27de02e79aee)
Diffstat (limited to 'clang')
-rwxr-xr-xclang/lib/Sema/SemaTemplateInstantiateDecl.cpp8
-rw-r--r--clang/test/SemaTemplate/instantiate-requires-clause.cpp12
2 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 8fd7491c45e..92f6e0dc1c9 100755
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -1848,6 +1848,8 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(
// FIXME: Concepts: Do not substitute into constraint expressions
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
if (TrailingRequiresClause) {
+ EnterExpressionEvaluationContext ConstantEvaluated(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
TemplateArgs);
if (SubstRC.isInvalid())
@@ -2186,6 +2188,8 @@ Decl *TemplateDeclInstantiator::VisitCXXMethodDecl(
// FIXME: Concepts: Do not substitute into constraint expressions
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
if (TrailingRequiresClause) {
+ EnterExpressionEvaluationContext ConstantEvaluated(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
TemplateArgs);
if (SubstRC.isInvalid())
@@ -2525,6 +2529,8 @@ Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
TemplateArgumentListInfo InstArgs;
if (TemplArgInfo) {
+ EnterExpressionEvaluationContext ConstantEvaluated(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
@@ -3729,6 +3735,8 @@ TemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) {
// checking satisfaction.
Expr *InstRequiresClause = nullptr;
if (Expr *E = L->getRequiresClause()) {
+ EnterExpressionEvaluationContext ConstantEvaluated(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
ExprResult Res = SemaRef.SubstExpr(E, TemplateArgs);
if (Res.isInvalid() || !Res.isUsable()) {
return nullptr;
diff --git a/clang/test/SemaTemplate/instantiate-requires-clause.cpp b/clang/test/SemaTemplate/instantiate-requires-clause.cpp
index 04b595717e6..3b7dc3ddd74 100644
--- a/clang/test/SemaTemplate/instantiate-requires-clause.cpp
+++ b/clang/test/SemaTemplate/instantiate-requires-clause.cpp
@@ -39,3 +39,15 @@ struct S {
};
static_assert(S<void>::f(1));
+
+constexpr auto value = 0;
+
+template<typename T>
+struct S2 {
+ template<typename = void> requires(value, true)
+ static constexpr auto f() requires(value, true) {
+ }
+};
+
+static_assert((S2<int>::f(), true));
+
OpenPOWER on IntegriCloud