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

Reply via email to