Author: rsmith Date: Fri Aug 28 17:33:53 2015 New Revision: 246347 URL: http://llvm.org/viewvc/llvm-project?rev=246347&view=rev Log: PR24612: Don't bail out of checking a constexpr function before checking whether it can ever produce a constant expression in the case where it has a void return type and no return statements.
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=246347&r1=246346&r2=246347&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Aug 28 17:33:53 2015 @@ -1230,9 +1230,9 @@ bool Sema::CheckConstexprFunctionBody(co Diag(Dcl->getLocation(), OK ? diag::warn_cxx11_compat_constexpr_body_no_return : diag::err_constexpr_body_no_return); - return OK; - } - if (ReturnStmts.size() > 1) { + if (!OK) + return false; + } else if (ReturnStmts.size() > 1) { Diag(ReturnStmts.back(), getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_constexpr_body_multiple_return Modified: cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp?rev=246347&r1=246346&r2=246347&view=diff ============================================================================== --- cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp (original) +++ cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp Fri Aug 28 17:33:53 2015 @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown -verify -std=c++11 -fcxx-exceptions %s +// RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown -verify -std=c++14 -fcxx-exceptions %s // RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown -std=c++11 -fcxx-exceptions -Wno-invalid-constexpr %s -DNO_INVALID_CONSTEXPR namespace StdExample { @@ -102,7 +103,10 @@ X x = cmin(X(), X()); // ok, not constex template<typename T> struct Y { constexpr Y() {} - constexpr int get() { return T(); } // expected-warning {{C++14}} + constexpr int get() { return T(); } +#if __cplusplus < 201402L + // expected-warning@-2 {{C++14}} +#endif }; struct Z { operator int(); }; @@ -118,7 +122,7 @@ namespace PR14550 { // marks some functions as constexpr which use builtins which we don't // support constant folding). Ensure that we don't mark those functions // as invalid after suppressing the diagnostic. -# 122 "p5.cpp" 1 3 +# 126 "p5.cpp" 1 3 int n; struct A { static constexpr int f() { return n; } @@ -126,7 +130,11 @@ namespace PR14550 { template<typename T> struct B { B() { g(T::f()); } // expected-error {{undeclared identifier 'g'}} }; -# 130 "p5.cpp" 2 +# 134 "p5.cpp" 2 template class B<A>; // expected-note {{here}} } #endif + +#if __cplusplus >= 201402L +constexpr void f() { throw; } // expected-error {{never produces}} expected-note {{subexpression}} +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits