https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116442
Bug ID: 116442
Summary: ICE when calling immediate function in NSDMI with
aggregate initialization
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: mital at mitalashok dot co.uk
Target Milestone: ---
<https://eel.is/c++draft/expr.const#example-9> has:
consteval int id(int i) { return i; }
struct A {
int x;
int y = id(x);
};
template<class T>
constexpr int k(int) { // k<int> is not an immediate function
because A(42) is a
return A(42).y; // constant expression and thus not
immediate-escalating
}
Which is justified by <http://eel.is/c++draft/expr.const#16.sentence-3>:
> An aggregate initialization is an immediate invocation if it evaluates a
> default member initializer that has a subexpression that is an
> immediate-escalating expression.
So since k<int> isn't an immediate function, we should be able to take it's
address: <https://godbolt.org/z/r9eWf96sW>
int(*p)(int) = &k<int>;
<source>:13:16: error: taking address of an immediate function 'constexpr int
k(int) [with T = int]'
13 | int(*p)(int) = &k<int>;
| ^~~~~~~
<source>:10:10: note: 'constexpr int k(int) [with T = int]' was promoted to an
immediate function because its body contains an immediate-escalating expression
'id((&*this)->A::x)'
10 | return A(42).y; // constant expression and thus not
immediate-escalating
| ^~~~~
A similar test when not put in a `constexpr` function (so that it can't be
marked immediate-escalating): <https://godbolt.org/z/Ts47hnaqK>
consteval int id(int i) { return i; }
struct A {
int x;
int y = id(x);
};
int main() {
return A{42}.y;
}
Leads to an ICE:
test.cpp: In function ‘int main()’:
test.cpp:9:14: error: call to consteval function ‘id((&*this)->A::x)’ is not a
constant expression
9 | return A{42}.y;
| ^
test.cpp:9:14: internal compiler error: in cxx_eval_constant_expression, at
cp/constexpr.cc:8413
0x2792a05 internal_error(char const*, ...)
../../gcc/gcc/diagnostic-global-context.cc:491
0xa712e8 fancy_abort(char const*, int, char const*)
../../gcc/gcc/diagnostic.cc:1772
0x78a5b7 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.cc:8413
0xad6ba5 cxx_eval_indirect_ref
../../gcc/gcc/cp/constexpr.cc:5964
0xad6ba5 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.cc:7842
0xad863c cxx_eval_component_reference
../../gcc/gcc/cp/constexpr.cc:4567
0xad863c cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.cc:8015
0xad3232 cxx_bind_parameters_in_call
../../gcc/gcc/cp/constexpr.cc:1885
0xad3232 cxx_eval_call_expression
../../gcc/gcc/cp/constexpr.cc:3040
0xad6c23 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.cc:7559
0xae2df6 cxx_eval_outermost_constant_expr
../../gcc/gcc/cp/constexpr.cc:8845
0xae3a13 cxx_constant_value(tree_node*, tree_node*, int)
../../gcc/gcc/cp/constexpr.cc:9001
0xb0f891 cxx_constant_value(tree_node*, int)
../../gcc/gcc/cp/cp-tree.h:8704
0xb0f891 cp_fold_immediate_r
../../gcc/gcc/cp/cp-gimplify.cc:1282
0xb142ff cp_fold_r
../../gcc/gcc/cp/cp-gimplify.cc:1372
0x173a9ac walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../gcc/gcc/tree.cc:11479
0x173ae06 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../gcc/gcc/tree.cc:11567
0xb14397 cp_fold_r
../../gcc/gcc/cp/cp-gimplify.cc:1476
0x173a9ac walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../gcc/gcc/tree.cc:11479
0x173abc2 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*,
tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, false, default_hash_traits<tree_node*> >*))
../../gcc/gcc/tree.cc:11713
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Clang and MSVC also do not accept this properly, but they just reject it
instead of crashing. See related discussion for Clang:
https://github.com/llvm/llvm-project/issues/104908