https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126546
Bug ID: 126546
Summary: [c++26] [reflection] reflect-expression rejects
pack-index-specifier operand (^^Ts...[0])
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: 121539739 at qq dot com
Target Milestone: ---
With -std=c++26 -freflection, applying the reflection operator to a
pack-index-specifier in type position is rejected:
```cpp
#include <meta>
template <class... Ts>
consteval auto first() { return ^^Ts...[0]; }
static_assert(first<int, double>() == ^^int);
```
Command line:
g++ -std=c++26 -freflection -c repro.cpp
Actual output:
repro.cpp:4:35: error: '^^' cannot be applied to a pack index
[-Wtemplate-body]
4 | consteval auto first() { return ^^Ts...[0]; }
| ^~
Expected: accepted, with ^^Ts...[0] representing the type denoted by
the pack-index-specifier (here, int).
Ts...[0] in type position is a pack-index-specifier
([dcl.type.pack.index]), so "Ts...[0]" forms a valid type-id.
[expr.reflect]/6 places exactly two restrictions on the
"^^ type-id" form: placeholder types are ill-formed (6.1) and
alias templates get special treatment (6.2); otherwise, per (6.3),
"R represents the type denoted by the type-id". Nothing excludes a
pack-index-specifier.
Note that [expr.reflect]/7.4 (Note 3) does make
*pack-index-expressions* ill-formed — but that applies to the
"^^ id-expression" form only. The operand here is a type-id, not
an id-expression, and the error is emitted for the type case.
For reference, Clang's P2996 implementation ("x86-64 clang
(reflection - C++26)" on Compiler Explorer) accept the testcase,
including the static_assert that the result equals ^^int.