Bug 109692 - [12/13/14/15 Regression] ICE on concept as default template parameter to iife lambda in fold expression in static member template function since r12-8110-ge2c7070ac77405
Summary: [12/13/14/15 Regression] ICE on concept as default template parameter to iife...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 13.0
: P4 normal
Target Milestone: 12.4
Assignee: Not yet assigned to anyone
URL:
Keywords: c++-lambda, error-recovery, ice-on-valid-code, rejects-valid
Depends on:
Blocks:
 
Reported: 2023-05-02 06:17 UTC by Sirraide
Modified: 2024-04-26 10:50 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2023-05-02 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sirraide 2023-05-02 06:17:25 UTC
The following code raises an ICE on GCC (trunk) and all versions later than and including GCC 11.3. Earlier versions simply fail to instantiate the template. Both Clang and MSVC accept the code (see also this godbolt link: https://godbolt.org/z/x5Ys9sPzx):
```c++
template <typename opt> concept always_true = true;

template <typename ...params>
struct variadic {
    template <typename opt> static void callee() { }
    static void bug() {
        ([]<bool x = always_true<params>>() { 
            if constexpr (x) callee<params>(); 
        }(), ...);
    }
};

int main() { variadic<int>::bug(); }
```

GCC (trunk) on godbolt gives me this stack trace:
<source>: In instantiation of 'variadic<int>::bug()::<lambda()> [with bool x = true]':
<source>:9:10:   required from 'static void variadic<params>::bug() [with params = {int}]'
<source>:13:32:   required from here
<source>:8:44: error: template argument 1 is invalid
    8 |             if constexpr (x) callee<params>();
      |                              ~~~~~~~~~~~~~~^~
<source>:8:44: error: template argument 1 is invalid
<source>:8:44: internal compiler error: in constructor_name_p, at cp/name-lookup.cc:4721
0x23605ae internal_error(char const*, ...)
	???:0
0xa6dd64 fancy_abort(char const*, int, char const*)
	???:0
0xc81ee5 instantiate_decl(tree_node*, bool, bool)
	???:0
0xb5c9e1 maybe_instantiate_decl(tree_node*)
	???:0
0xb5e45e mark_used(tree_node*, int)
	???:0
0xa9da44 build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int)
	???:0
0xcc7264 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool, bool, int)
	???:0
0xc79864 tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*)
	???:0
0xc81ee5 instantiate_decl(tree_node*, bool, bool)
	???:0
0xcad44b instantiate_pending_templates(int)
	???:0
0xb61635 c_parse_final_cleanups()
	???:0
0xd91568 c_common_parse_file()
	???:0
Comment 1 Martin Liška 2023-05-02 14:26:30 UTC
Started with r12-8110-ge2c7070ac77405.
Comment 2 Richard Biener 2024-01-12 10:43:55 UTC
So indeed GCC 11.2 doesn't ICE but errors like

t.C: In instantiation of 'static void variadic<params>::bug() [with params = {int}]':
t.C:13:29:   required from here
t.C:9:47: error: no match for call to '(variadic<int>::bug()::<lambda()>) ()'
    7 |                         ([]<bool x = always_true<params>>() {
      |                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    8 |                                      if constexpr (x) callee<params>();
      |                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    9 |                                              }(), ...);
      |                                              ~^~
t.C:7:26: note: candidate: 'template<bool x> variadic<int>::bug()::<lambda()>'
    7 |                         ([]<bool x = always_true<params>>() {
      |                          ^
t.C:7:26: note:   template argument deduction/substitution failed:

but I regard we should accept this.  Given the ICE is error-recovery the
regression should be P4 and that we reject the code isn't a regression.

Separating these bugs might be nice.  Since it's marked as regression it's P4.