From: Richard Smith Date: Sat, 7 Jan 2017 19:42:26 +0000 (+0000) Subject: Consistently use a ConstantEvaluated context for expressions in attributes, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c96c95c2afc525df54faf75eb3fcbe5a2f6c3e4;p=clang Consistently use a ConstantEvaluated context for expressions in attributes, except for those with the "attributes are unevaluated contexts" flag. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291358 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index ba24adefe6..833d93e454 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -306,10 +306,11 @@ unsigned Parser::ParseAttributeArgsCommon( // Parse the non-empty comma-separated list of expressions. do { - bool ShouldEnter = attributeParsedArgsUnevaluated(*AttrName); + bool Uneval = attributeParsedArgsUnevaluated(*AttrName); EnterExpressionEvaluationContext Unevaluated( - Actions, Sema::Unevaluated, /*LambdaContextDecl=*/nullptr, - /*IsDecltype=*/false, ShouldEnter); + Actions, Uneval ? Sema::Unevaluated : Sema::ConstantEvaluated, + /*LambdaContextDecl=*/nullptr, + /*IsDecltype=*/false); ExprResult ArgExpr( Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression())); diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index f4013b8206..e7679fc11e 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -173,7 +173,8 @@ static void instantiateDependentEnableIfAttr( const EnableIfAttr *A, const Decl *Tmpl, Decl *New) { Expr *Cond = nullptr; { - EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated); + ContextRAII SwitchContext(*this, cast(New)); + EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated); ExprResult Result = S.SubstExpr(A->getCond(), TemplateArgs); if (Result.isInvalid()) return; diff --git a/test/SemaCXX/enable_if.cpp b/test/SemaCXX/enable_if.cpp index 0f8fc9b265..eababc34d3 100644 --- a/test/SemaCXX/enable_if.cpp +++ b/test/SemaCXX/enable_if.cpp @@ -464,3 +464,11 @@ void runFoo() { Foo().bar(1); } } + +namespace instantiate_constexpr_in_enable_if { + template struct X { + static constexpr bool ok() { return true; } + void f() __attribute__((enable_if(ok(), ""))); + }; + void g() { X().f(); } +}