c++: -fimplicit-constexpr diagnostic improvement [PR116696]
PR116696 expressed surprise that explicit 'constexpr' was needed on one function; this was because the function isn't 'inline', and -fimplicit-constexpr doesn't try to promote non-inline functions. Let's be more helpful in that situation, and also help trace through functions that were promoted. PR c++/116696 gcc/cp/ChangeLog: * constexpr.cc (explain_invalid_constexpr_fn): When -fimplicit-constexpr, also explain inline functions, and point out non-inline functions. gcc/testsuite/ChangeLog: * g++.dg/DRs/dr2478.C: Prune extra diagnostic. * g++.dg/ext/fimplicit-constexpr1.C: New test.
This commit is contained in:
parent
99988464fc
commit
4ee692337c
3 changed files with 16 additions and 1 deletions
|
@ -1057,9 +1057,16 @@ explain_invalid_constexpr_fn (tree fun)
|
|||
/* Only diagnose defaulted functions, lambdas, or instantiations. */
|
||||
else if (!DECL_DEFAULTED_FN (fun)
|
||||
&& !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun))
|
||||
&& !(flag_implicit_constexpr
|
||||
&& !DECL_DECLARED_CONSTEXPR_P (fun)
|
||||
&& DECL_DECLARED_INLINE_P (fun))
|
||||
&& !is_instantiation_of_constexpr (fun))
|
||||
{
|
||||
inform (DECL_SOURCE_LOCATION (fun), "%qD declared here", fun);
|
||||
if (flag_implicit_constexpr && !maybe_constexpr_fn (fun)
|
||||
&& decl_defined_p (fun))
|
||||
inform (DECL_SOURCE_LOCATION (fun),
|
||||
"%<-fimplicit-constexpr%> only affects %<inline%> functions");
|
||||
return;
|
||||
}
|
||||
if (diagnosed == NULL)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
// { dg-do compile { target c++20 } }
|
||||
|
||||
// Defeat -fimplicit-constexpr
|
||||
int ii;
|
||||
int ii; // { dg-prune-output "value of 'ii' is not usable in a constant expr" }
|
||||
|
||||
template <typename T>
|
||||
struct S {
|
||||
|
|
8
gcc/testsuite/g++.dg/ext/fimplicit-constexpr1.C
Normal file
8
gcc/testsuite/g++.dg/ext/fimplicit-constexpr1.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// { dg-additional-options -fimplicit-constexpr }
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
void f() { } // { dg-message "'-fimplicit-constexpr' only affects 'inline' functions" }
|
||||
|
||||
inline int g() { f(); return 42; } // { dg-error {non-'constexpr' function 'void f\(\)'} }
|
||||
|
||||
constexpr int i = g(); // { dg-error {'int g\(\)' called in a constant expression} }
|
Loading…
Add table
Reference in a new issue