Author: rsmith Date: Mon Jun 5 20:34:24 2017 New Revision: 304760 URL: http://llvm.org/viewvc/llvm-project?rev=304760&view=rev Log: PR33318: Add missing full-expression checking to static_assert expression.
This fixes missing lambda-captures for variables referenced only inside a static_assert (!), among other things. Modified: cfe/trunk/include/clang/Parse/Parser.h cfe/trunk/lib/Parse/ParseDeclCXX.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp cfe/trunk/test/SemaTemplate/deduction.cpp Modified: cfe/trunk/include/clang/Parse/Parser.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=304760&r1=304759&r2=304760&view=diff ============================================================================== --- cfe/trunk/include/clang/Parse/Parser.h (original) +++ cfe/trunk/include/clang/Parse/Parser.h Mon Jun 5 20:34:24 2017 @@ -1461,7 +1461,8 @@ public: }; ExprResult ParseExpression(TypeCastState isTypeCast = NotTypeCast); - ExprResult ParseConstantExpressionInExprEvalContext(TypeCastState isTypeCast); + ExprResult ParseConstantExpressionInExprEvalContext( + TypeCastState isTypeCast = NotTypeCast); ExprResult ParseConstantExpression(TypeCastState isTypeCast = NotTypeCast); ExprResult ParseConstraintExpression(); // Expr that doesn't include commas. Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=304760&r1=304759&r2=304760&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Mon Jun 5 20:34:24 2017 @@ -840,7 +840,9 @@ Decl *Parser::ParseStaticAssertDeclarati return nullptr; } - ExprResult AssertExpr(ParseConstantExpression()); + EnterExpressionEvaluationContext ConstantEvaluated( + Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated); + ExprResult AssertExpr(ParseConstantExpressionInExprEvalContext()); if (AssertExpr.isInvalid()) { SkipMalformedDecl(); return nullptr; Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=304760&r1=304759&r2=304760&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Jun 5 20:34:24 2017 @@ -13232,6 +13232,14 @@ Decl *Sema::BuildStaticAssertDeclaration } } + ExprResult FullAssertExpr = ActOnFinishFullExpr(AssertExpr, StaticAssertLoc, + /*DiscardedValue*/false, + /*IsConstexpr*/true); + if (FullAssertExpr.isInvalid()) + Failed = true; + else + AssertExpr = FullAssertExpr.get(); + Decl *Decl = StaticAssertDecl::Create(Context, CurContext, StaticAssertLoc, AssertExpr, AssertMessage, RParenLoc, Failed); Modified: cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp?rev=304760&r1=304759&r2=304760&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp Mon Jun 5 20:34:24 2017 @@ -1376,3 +1376,7 @@ XT<int> xt{}; } + +void PR33318(int i) { + [&](auto) { static_assert(&i != nullptr, ""); }(0); // expected-warning 2{{always true}} expected-note {{instantiation}} +} Modified: cfe/trunk/test/SemaTemplate/deduction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/deduction.cpp?rev=304760&r1=304759&r2=304760&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/deduction.cpp (original) +++ cfe/trunk/test/SemaTemplate/deduction.cpp Mon Jun 5 20:34:24 2017 @@ -305,11 +305,11 @@ namespace nullptr_deduction { template<typename T, T v> struct X {}; template<typename T, T v> void f(X<T, v>) { - static_assert(!v, ""); + static_assert(!v, ""); // expected-warning 2{{implicit conversion of nullptr constant to 'bool'}} } void g() { - f(X<int*, nullptr>()); - f(X<nullptr_t, nullptr>()); + f(X<int*, nullptr>()); // expected-note {{instantiation of}} + f(X<nullptr_t, nullptr>()); // expected-note {{instantiation of}} } template<template<typename T, T> class X, typename T, typename U, int *P> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits