https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119668
Bug ID: 119668
Summary: C++20 Nested concepts with NTTP triggers ICE
Product: gcc
Version: 13.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: nlebedenko at hotmail dot com
Target Milestone: ---
The following snippet triggers an ICE in GCC 13.3, and GCC 12.4, 11.4, 10.5. It
does not appear in GCC 14.1+.
See it on godbolt: https://godbolt.org/z/3GzTezb7o
```cpp
// playground.cpp
struct Struct0 {};
struct Struct1 {
Struct0 s0;
};
template <Struct1 s1_>
struct Struct2 {
constexpr static Struct1 s1 = s1_;
};
template <Struct0 s0>
concept c0 = true; // can put any condition here
template <Struct1 s1>
concept c1 = c0<s1.s0>;
template <typename S2>
// concept c2 = bool(c1<S2::s1>); // works
concept c2 = c1<S2::s1>; // uh oh!
static_assert(c2<Struct2<Struct1{Struct0{}}>>);
```
Console printout (GCC 13.3):
```
# gcc -std=c++20 -freport-bug playground.cpp
playground.cpp:22:47: internal compiler error: in lvalue_kind, at
cp/tree.cc:223
22 | static_assert(c2<Struct2<Struct1{Struct0{}}>>);
| ^
0x1153292 internal_error(char const*, ...)
???:0
0x1147921 fancy_abort(char const*, int, char const*)
???:0
0x1347298 lvalue_kind(tree_node const*)
???:0
0x13472c2 lvalue_kind(tree_node const*)
???:0
0x1439bff coerce_template_parms(tree_node*, tree_node*, tree_node*, int, bool)
???:0
0xbe96be evaluate_concept_check(tree_node*)
???:0
0x13594fa maybe_constant_value(tree_node*, tree_node*, mce_value)
???:0
0x184e6f7 finish_static_assert(tree_node*, tree_node*, unsigned int, bool,
bool)
???:0
0x17c8209 c_parse_file()
???:0
0x17ae67c c_common_parse_file()
???:0
Please submit a full bug report, with preprocessed source.
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-13/README.Bugs> for instructions.