On Mon, Nov 17, 2025 at 01:26:28PM -0500, Marek Polacek wrote:
> > For the https://gcc.gnu.org/pipermail/gcc/2025-November/246977.html
> > issues I've filed https://github.com/cplusplus/CWG/issues/805
> > and got there some responses. One possibility is to change
> > the iterating expansion statement http://eel.is/c++draft/stmt.expand#5.2
> > line from
> > constexpr auto&& range = expansion-initializer;
> > to
> > constexpr decltype(auto) range = (expansion-initializer);
> > (for our partly pre-CWG3044 implementation with static before it).
> >
> > The following patch on top of the 2 earlier expansion-stmt patches
> > attempts to implement it, though not sure if it should be committed
> > until at least a CWG is filed for it with some proposed resolution.
>
> FWIW, I think we should wait a little.
Sure, I just wanted to post it publicly, so that others can check it out.
> This sounds like CWG 2126 which we partially implement (PR101588):
>
> "a temporary object of non-volatile const-qualified literal type whose
> lifetime is extended to that of a variable that is usable in constant
> expressions" is usable in a constant expression
>
> std::span<const int> is a literal type so it should work?
std::span<const int> doesn't have const-qualified type though, only
the reference type that will refer to it has const std::span<const int>&
type.
The CWG2126 example uses const-qualified type:
typedef const int CI[3];
constexpr CI &ci = CI{11, 22, 33};
static_assert(ci[1] == 22, "");
> > + location_t range_loc = cp_expr_loc_or_loc (range_expr, loc);
> > + range_expr
> > + = finish_parenthesized_expr (cp_expr (range_expr, range_loc));
> > + tree auto_node = make_decltype_auto ();
> > + tree range_type
> > + = cp_build_qualified_type (auto_node, TYPE_QUAL_CONST);
> > + range_type = do_auto_deduction (range_type, range_expr,
> > + auto_node);
> > +
> > + /* Create the __range variable. */
> > + range_temp = build_decl (input_location, VAR_DECL,
> > + for_range__identifier, range_type);
> > + TREE_USED (range_temp) = 1;
> > + DECL_ARTIFICIAL (range_temp) = 1;
>
> This is so close to build_range_temp that I think it should get
> a "bool expansion_stmt_p" parm so that we can reuse the do_auto_deduction
> and further code.
Perhaps, it looked small enough for me, just 4 function calls and two flag
setting stmts, the rest is different. But can change sure, or part of
build_range_temp could be outlined to finish_range_temp that this could use.
Jakub