https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126804

            Bug ID: 126804
           Summary: [contracts] parameter pack of non-reference type used
                    as an argument to a function in a contract assertion
                    ICEs
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: waffl3x at gcc dot gnu.org
  Target Milestone: ---

https://godbolt.org/z/eYd9YMv16
```
bool take(int const&) { return true; }

template<typename... Args>
void f(Args... args)
  pre(take(args...)) {}

template void f(int);
```
during RTL pass: expand
<stdin>: In function 'void f(Args ...) [with Args = {int}]':
<stdin>:5:11: internal compiler error: in make_decl_rtl, at varasm.cc:1487
0x2cad2b0 internal_error(char const*, ...)
        ../../src/gcc/diagnostic-global-context.cc:787
0xa9c163 fancy_abort(char const*, int, char const*)
        ../../src/gcc/diagnostics/context.cc:1813
0x9a2a87 make_decl_rtl(tree_node*)
        ../../src/gcc/varasm.cc:1487
0x10e97fc expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../src/gcc/expr.cc:11752
0x10f61c7 expand_expr(tree_node*, rtx_def*, machine_mode, expand_modifier)
        ../../src/gcc/expr.h:323
0x10f61c7 expand_expr_addr_expr_1
        ../../src/gcc/expr.cc:9347
0x10f6865 expand_expr_addr_expr
        ../../src/gcc/expr.cc:9468
0x10e78bc expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../src/gcc/expr.cc:13065
0xf780f0 expand_normal(tree_node*)
        ../../src/gcc/expr.h:329
0xf780f0 precompute_register_parameters
        ../../src/gcc/calls.cc:1025
0xf7fb0f expand_call(tree_node*, rtx_def*, int)
        ../../src/gcc/calls.cc:3506
0x10e94c6 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        ../../src/gcc/expr.cc:12816
0x10f6c2d store_expr(tree_node*, rtx_def*, int, bool, bool)
        ../../src/gcc/expr.cc:6830
0x10fa137 expand_assignment(tree_node*, tree_node*, bool)
        ../../src/gcc/expr.cc:6526
0x10fa137 expand_assignment(tree_node*, tree_node*, bool)
        ../../src/gcc/expr.cc:6015
0xf98694 expand_call_stmt
        ../../src/gcc/cfgexpand.cc:3233
0xf98694 expand_gimple_stmt_1
        ../../src/gcc/cfgexpand.cc:4273
0xf98694 expand_gimple_stmt
        ../../src/gcc/cfgexpand.cc:4420
0xf9a537 expand_gimple_basic_block
        ../../src/gcc/cfgexpand.cc:6537
0xf9c667 execute
        ../../src/gcc/cfgexpand.cc:7288

Also occurs in a postcondition, there are 2 other bugs that prevent
explicit instantiation from working here (in different ways) so this
case is slightly different.
https://godbolt.org/z/esfEGa9zj
```
bool take(int const&) { return true; }

template<typename... Args>
void f(Args const... args)
  post(take(args...)) {}

void go()
{ f(42); }
```

Reply via email to