https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123811
Bug ID: 123811
Summary: Two conversion operators that differ only in
constraints cause ICE with checking
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: luigighiron at gmail dot com
Target Milestone: ---
The following program causes an ICE when checking is enabled in GCC:
template<typename>constexpr static bool always_true=true;
struct S{
template<typename T>operator T()const{
return{};
}
template<typename T>requires always_true<T>explicit operator T()const{
return{};
}
};
int main(){
int x((S()));
int y=S();
}
always_true can be specialized, so these conversion operators are functionally
different. With checking disabled this code is accepted, but fails at linking
because of duplicate definitions. The error message emitted is:
<source>:13:1: error: Two symbols with same comdat_group are not linked by the
same_comdat_group list.
13 | }
| ^
_ZNK1ScvT_IiEEv/3 (S::operator T() const [with T = int])
Type: function definition analyzed
Visibility: semantic_interposition no_reorder public weak comdat
comdat_group:_ZNK1ScvT_IiEEv one_only
previous sharing asm name: 2
References:
Referring:
Function flags: body
Called by: main/1
Calls:
_ZNK1ScvT_IiEEv/2 (S::operator T() const [with T = int])
Type: function definition analyzed
Visibility: semantic_interposition no_reorder public weak comdat
comdat_group:_ZNK1ScvT_IiEEv one_only
next sharing asm name: 3
References:
Referring:
Function flags: body
Called by: main/1
Calls:
<source>:13:1: internal compiler error: symtab_node::verify failed
0x2952808 diagnostics::context::diagnostic_impl(rich_location*,
diagnostics::metadata const*, diagnostics::option_id, char const*,
__va_list_tag (*) [1], diagnostics::kind)
???:0
0x294754b internal_error(char const*, ...)
???:0
0xfaed0d symtab_node::verify_symtab_nodes()
???:0
0xfc9616 symbol_table::finalize_compilation_unit()
???:0