On 11/16/22 09:08, Jakub Jelinek wrote:
On Wed, Nov 16, 2022 at 08:20:34AM -0500, Jason Merrill wrote:
Ok. But there is another issue, the
https://eel.is/c++draft/expr.const#5.2
spot that P2647R1 is changing didn't exist in C++20, it was only added with
P2242R3. So, if one would treat P2647R1 as a DR for C++20, one has to come up
with
a different standard modification.
Probably change the last bullet of:
[dcl.constexpr]/3
its function-body shall not enclose
a goto statement,
an identifier label,
a definition of a variable of non-literal type or of static or thread
storage duration.
to
a definition of a variable of non-literal type or of a non-constexpr
variable of static or thread storage duration.
or so.
Indeed, though the hypothetical C++20 change could still use the "usable in
constant expressions" phrase.
Yes.
Though, with -std=c++20 we are rejected already in start_decl's
if (current_function_decl && VAR_P (decl)
&& DECL_DECLARED_CONSTEXPR_P (current_function_decl)
&& cxx_dialect < cxx23)
{
bool ok = false;
if (CP_DECL_THREAD_LOCAL_P (decl) && !DECL_REALLY_EXTERN (decl))
error_at (DECL_SOURCE_LOCATION (decl),
"%qD defined %<thread_local%> in %qs function only "
"available with %<-std=c++2b%> or %<-std=gnu++2b%>", decl,
DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
? "consteval" : "constexpr");
else if (TREE_STATIC (decl))
error_at (DECL_SOURCE_LOCATION (decl),
"%qD defined %<static%> in %qs function only available "
"with %<-std=c++2b%> or %<-std=gnu++2b%>", decl,
DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
? "consteval" : "constexpr");
else
ok = true;
if (!ok)
cp_function_chain->invalid_constexpr = true;
}
and at that point I fear decl_maybe_constant_var_p will not work
properly. Shall this hunk be moved somewhere else (cp_finish_decl?)
where we can already call it, or do the above in start_decl for
cxx_dialect < cxx20 and add a cxx_dialect == cxx20 hunk in cp_finish_decl?
Hmm, I'd expect decl_maybe_constant_var_p to work fine at this point.
Jason