On Fri, Mar 25, 2022 at 12:07:31PM -0400, Patrick Palka via Gcc-patches wrote: > When an if-stmt is deemed non-constant because both of its branches are > non-constant, we issue a rather generic error which, given that it points > to the 'if' token, misleadingly suggests the condition is at fault: > > constexpr-105050.C:8:3: error: expression ‘<statement>’ is not a constant > expression > 8 | if (p != q && *p < 0) > | ^~ > > This patch clarifies the error message to read: > > constexpr-105050.C:8:3: error: neither branch of ‘if’ is a constant > expression > 8 | if (p != q && *p < 0) > | ^~ > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk?
LGTM. > PR c++/105050 > > gcc/cp/ChangeLog: > > * constexpr.cc (potential_constant_expression_1) <case IF_STMT>: > Clarify error message when a if-stmt is non-constant because its > branches are non-constant. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp1y/constexpr-105050.C: New test. > --- > gcc/cp/constexpr.cc | 7 ++++++- > gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C | 12 ++++++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C > > diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc > index 778680b8270..9c40b051574 100644 > --- a/gcc/cp/constexpr.cc > +++ b/gcc/cp/constexpr.cc > @@ -9439,7 +9439,12 @@ potential_constant_expression_1 (tree t, bool > want_rval, bool strict, bool now, > } > } > if (flags & tf_error) > - error_at (loc, "expression %qE is not a constant expression", t); > + { > + if (TREE_CODE (t) == IF_STMT) > + error_at (loc, "neither branch of %<if%> is a constant expression"); > + else > + error_at (loc, "expression %qE is not a constant expression", t); > + } > return false; > > case VEC_INIT_EXPR: > diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C > b/gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C > new file mode 100644 > index 00000000000..99d5c9960ac > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C > @@ -0,0 +1,12 @@ > +// PR c++/105050 > +// { dg-do compile { target c++14 } } > + > +void g(); > +void h(); > + > +constexpr void f(int* p, int *q) { > + if (p != q && *p < 0) // { dg-error "neither branch of 'if' is a constant > expression" } > + g(); > + else > + h(); > +} > -- > 2.35.1.655.ga68dfadae5 > Marek