aboutsummaryrefslogtreecommitdiff
path: root/libjava/testsuite/libjava.compile/static_2.java
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2026-02-09 09:06:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2026-02-09 09:06:47 +0100
commit4e13b78bf0e28120d4b1595313c42a1de83fc3ed (patch)
treeb0d6e6ca4b6b061dc81ae5d7e0b41542383623e5 /libjava/testsuite/libjava.compile/static_2.java
parent2f84ad4ddc2a2dc93584d87da347c444a77f429c (diff)
downloadgcc-4e13b78bf0e28120d4b1595313c42a1de83fc3ed.zip
gcc-4e13b78bf0e28120d4b1595313c42a1de83fc3ed.tar.gz
gcc-4e13b78bf0e28120d4b1595313c42a1de83fc3ed.tar.bz2
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.
Diffstat (limited to 'libjava/testsuite/libjava.compile/static_2.java')
0 files changed, 0 insertions, 0 deletions