[Bug c++/123889] [13/14/15 Regression] C++11 diagnostic about non-constexpr functions is useless
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Mar 8 05:20:31 GMT 2026
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123889
--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-15 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:
https://gcc.gnu.org/g:627283aa16cd2825763d4f9919343cf823d2feac
commit r15-10900-g627283aa16cd2825763d4f9919343cf823d2feac
Author: Jakub Jelinek <jakub@redhat.com>
Date: Mon Feb 9 09:06:47 2026 +0100
c++: Fix up diagnostics of wrong constexpr bodies in C++11 in templates
[PR123889]
We emit weird diagnostics on the following testcase in C++11.
If it is not a template, maybe_save_constexpr_fundef calls first
if (!is_valid_constexpr_fn (fun, complain))
return;
(which doesn't fail) and then
tree massaged = massage_constexpr_body (fun, DECL_SAVED_TREE (fun));
if (massaged == NULL_TREE || massaged == error_mark_node)
{
if (!DECL_CONSTRUCTOR_P (fun) && complain)
error ("body of %<constexpr%> function %qD not a return-statement",
fun);
return;
}
which diagnoses it and if even that would succeed, go on with
bool potential = potential_rvalue_constant_expression (massaged);
if (!potential && complain)
require_potential_rvalue_constant_expression_fncheck (massaged);
In templates, maybe_save_constexpr_fundef returns early:
if (processing_template_decl
|| cp_function_chain->invalid_constexpr
|| (DECL_CLONED_FUNCTION_P (fun) && !DECL_DELETING_DESTRUCTOR_P
(fun)))
return;
and then it is called again during instantiation.
But in that case DECL_GENERATED_P (fun) is true and so we silently return
on errors without diagnosing them:
bool complain = !DECL_GENERATED_P (fun) && !implicit;
Now, when we actually try to constexpr evaluate those (if at all), we
emit an error and then
'constexpr ...' is not usable as a 'constexpr' function because:
message and then explain_invalid_constexpr_fn tries to diagnose
the errors by calling is_valid_constexpr_fn (fun, true) and
require_potential_rvalue_constant_expression (massaged). So it diagnoses
those 2 cases, but misses the one where massaged was NULL or
error_mark_node
for a non-constructor, so after the because: there is no reason emitted.
The following patch diagnoses even that.
2026-02-09 Jakub Jelinek <jakub@redhat.com>
PR c++/123889
* constexpr.cc (explain_invalid_constexpr_fn): Diagnose
NULL or error_mark_node massaged on non-constructor.
* g++.dg/cpp0x/constexpr-123889.C: New test.
(cherry picked from commit 4e13b78bf0e28120d4b1595313c42a1de83fc3ed)
More information about the Gcc-bugs
mailing list