[Bug c++/57941] [c++11] confusing error message with invalid constexpr constructor in template struct
manu at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Jul 20 20:54:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57941
Manuel López-Ibáñez <manu at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-07-20
CC| |manu at gcc dot gnu.org
Ever confirmed|0 |1
Known to fail| |4.8.0, 4.9.0
--- Comment #1 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
Confirmed. It also fails on trunk.
Clang++:
test.cc:10:16: error: static_assert expression is not an integral constant
expression
static_assert (a <int> (), "foo");
^~~~~~~~~~
test.cc:5:31: note: non-constexpr function 'c' cannot be used in a constant
expression
constexpr int b () { return c (); }
^
test.cc:4:22: note: in call to ')'
constexpr a (): i (b ()) { }
^
test.cc:10:16: note: in call to 'a()'
static_assert (a <int> (), "foo");
^
test.cc:6:7: note: declared here
int c () const { throw 42; }
^
1 error generated.
which is not perfect but it is clearly better.
The code that handles this is at explain_invalid_constexpr_fn at
/home/manuel/test1/src/gcc/cp/semantics.c:6461
save_loc = input_location;
input_location = DECL_SOURCE_LOCATION (fun);
inform (0, "%q+D is not usable as a constexpr function because:", fun);
/* First check the declaration. */
if (is_valid_constexpr_fn (fun, true))
{
/* Then if it's OK, the body. */
if (DECL_DEFAULTED_FN (fun))
explain_implicit_non_constexpr (fun);
else
{
body = massage_constexpr_body (fun, DECL_SAVED_TREE (fun));
require_potential_rvalue_constant_expression (body);
if (DECL_CONSTRUCTOR_P (fun))
cx_check_missing_mem_inits (fun, body, true);
}
}
input_location = save_loc;
I don't understand the point of the first "if", since if it is ever not taken
it would be a bug.
However, in this case, interestingly, the "if" is taken, but then nothing else
prints any explanation. I didn't investigate in detail why.
Also, playing tricks with input_location is not so nice.
More information about the Gcc-bugs
mailing list