Author: rsmith Date: Sat Jan 7 13:42:26 2017 New Revision: 291358 URL: http://llvm.org/viewvc/llvm-project?rev=291358&view=rev Log: Consistently use a ConstantEvaluated context for expressions in attributes, except for those with the "attributes are unevaluated contexts" flag.
Modified: cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp cfe/trunk/test/SemaCXX/enable_if.cpp Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=291358&r1=291357&r2=291358&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Sat Jan 7 13:42:26 2017 @@ -306,10 +306,11 @@ unsigned Parser::ParseAttributeArgsCommo // 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())); Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=291358&r1=291357&r2=291358&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Sat Jan 7 13:42:26 2017 @@ -173,7 +173,8 @@ static void instantiateDependentEnableIf const EnableIfAttr *A, const Decl *Tmpl, Decl *New) { Expr *Cond = nullptr; { - EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated); + ContextRAII SwitchContext(*this, cast<FunctionDecl>(New)); + EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated); ExprResult Result = S.SubstExpr(A->getCond(), TemplateArgs); if (Result.isInvalid()) return; Modified: cfe/trunk/test/SemaCXX/enable_if.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/enable_if.cpp?rev=291358&r1=291357&r2=291358&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/enable_if.cpp (original) +++ cfe/trunk/test/SemaCXX/enable_if.cpp Sat Jan 7 13:42:26 2017 @@ -464,3 +464,11 @@ void runFoo() { Foo<double>().bar(1); } } + +namespace instantiate_constexpr_in_enable_if { + template<typename T> struct X { + static constexpr bool ok() { return true; } + void f() __attribute__((enable_if(ok(), ""))); + }; + void g() { X<int>().f(); } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits