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

            Bug ID: 115219
           Summary: ICE on conditionally noexcept class operator delete
           Product: gcc
           Version: 14.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pobrn at protonmail dot com
  Target Milestone: ---

Consider the following piece of C++ code:

```
#include <new>
#include <type_traits>

template<typename Derived>
struct B {
    static void *
    operator new(std::size_t s, std::size_t)
    { return ::operator new(s); }

    static void
    operator delete(void *)
    noexcept(std::is_nothrow_destructible_v<Derived>)
    { }
};

struct A : B<A> { };

void test() {
    new (42) A();
}
```

gcc 14.1.1 and trunk (on CE) trigger the following ICE (
https://gcc.godbolt.org/z/z7av1Mf3Y ):

```
<source>: In function 'void test()':
<source>:19:16: internal compiler error: in type_throw_all_p, at
cp/except.cc:1234
   19 |     new (42) A();
      |                ^
0x268e9ac internal_error(char const*, ...)
        ???:0
0xa5b247 fancy_abort(char const*, int, char const*)
        ???:0
0xb08bb3 fnptr_conv_p(tree_node*, tree_node*)
        ???:0
0xaa0ae6 instantiate_type(tree_node*, tree_node*, int)
        ???:0
0xa75b7e build_op_delete_call(tree_code, tree_node*, tree_node*, bool,
tree_node*, tree_node*, int)
        ???:0
0xb82ab0 build_new(unsigned int, vec<tree_node*, va_gc, vl_embed>**,
tree_node*, tree_node*, vec<tree_node*, va_gc, vl_embed>**, int, int)
        ???:0
0xc63d8a c_parse_file()
        ???:0
0xdb95b9 c_common_parse_file()
        ???:0
```

Removing the conditional noexcept specification makes the ICE go away.

Here is a more detailed stack trace from the arch linux build of gcc (about
14.1.1):

```
Breakpoint 1, internal_error (gmsgid=gmsgid@entry=0x2b4b860 "in %s, at %s:%d")
at /usr/src/debug/gcc/gcc/gcc/diagnostic.cc:2227
2227    {
(gdb) bt
#0  internal_error (gmsgid=gmsgid@entry=0x2b4b860 "in %s, at %s:%d") at
/usr/src/debug/gcc/gcc/gcc/diagnostic.cc:2227
#1  0x0000000000703e88 in fancy_abort (file=0x2b5c798
"/usr/src/debug/gcc/gcc/gcc/cp/except.cc", line=1234, function=0x2aa87dc
"type_throw_all_p") at /usr/src/debug/gcc/gcc/gcc/diagnostic.cc:2353
#2  0x00000000006b97f2 in type_throw_all_p (type=<optimized out>) at
/usr/src/debug/gcc/gcc/gcc/cp/except.cc:1231
#3  type_throw_all_p (type=<optimized out>) at
/usr/src/debug/gcc/gcc/gcc/cp/except.cc:1231
#4  noexcept_conv_p (to=0x7ffff6c24498, from=0x7ffff6a15930) at
/usr/src/debug/gcc/gcc/gcc/cp/cvt.cc:2130
#5  fnptr_conv_p (to=<optimized out>, from=<optimized out>) at
/usr/src/debug/gcc/gcc/gcc/cp/cvt.cc:2157
#6  0x000000000072a772 in instantiate_type (lhstype=0x7ffff6c24498,
rhs=0x7ffff6a10690, complain=0) at /usr/src/debug/gcc/gcc/gcc/cp/class.cc:9085
#7  0x000000000072cede in build_op_delete_call (code=DELETE_EXPR,
addr=0x7ffff6a1e1e0, size=0x7ffff6e212d0, global_p=<optimized out>,
placement=0x7ffff6a1b340, alloc_fn=0x7ffff6de9700, complain=3)
    at /usr/src/debug/gcc/gcc/gcc/cp/call.cc:7893
#8  0x0000000000804299 in build_new_1
(placement=placement@entry=0x7fffffffcd78, type=<optimized out>,
nelts=<optimized out>, nelts@entry=0x0, init=init@entry=0x7fffffffcd70, 
    globally_qualified_p=globally_qualified_p@entry=false,
complain=complain@entry=3) at /usr/src/debug/gcc/gcc/gcc/cp/init.cc:3784
#9  0x00000000008055ca in build_new (loc=64384747, placement=0x7fffffffcd78,
type=<optimized out>, nelts=0x0, init=0x7fffffffcd70, use_global_new=0,
complain=3) at /usr/src/debug/gcc/gcc/gcc/cp/init.cc:4054
#10 0x0000000000867ab7 in cp_parser_new_expression
(parser=parser@entry=0x7ffff6fb4dc8) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:9659
#11 0x000000000086258b in cp_parser_unary_expression (parser=0x7ffff6fb4dc8,
pidk=<optimized out>, address_p=<optimized out>, cast_p=<optimized out>,
decltype_p=<optimized out>)
    at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:9245
#12 0x0000000000864664 in cp_parser_binary_expression
(parser=parser@entry=0x7ffff6fb4dc8, cast_p=cast_p@entry=false,
no_toplevel_fold_p=no_toplevel_fold_p@entry=false,
decltype_p=decltype_p@entry=false, 
    prec=prec@entry=PREC_NOT_OPERATOR, pidk=pidk@entry=0x0) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:10393
#13 0x00000000008653bd in cp_parser_assignment_expression
(parser=parser@entry=0x7ffff6fb4dc8, pidk=pidk@entry=0x0,
cast_p=cast_p@entry=false, decltype_p=decltype_p@entry=false)
    at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:10737
#14 0x0000000000865994 in cp_parser_expression
(parser=parser@entry=0x7ffff6fb4dc8, pidk=pidk@entry=0x0,
cast_p=cast_p@entry=false, decltype_p=decltype_p@entry=false,
warn_comma_p=warn_comma_p@entry=false)
    at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:10903
#15 0x000000000086622e in cp_parser_expression_statement
(parser=0x7ffff6fb4dc8, in_statement_expr=0x0) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:13166
#16 0x0000000000876d31 in cp_parser_statement
(parser=parser@entry=0x7ffff6fb4dc8,
in_statement_expr=in_statement_expr@entry=0x0,
in_compound=in_compound@entry=true, if_p=if_p@entry=0x0, chain=chain@entry=0x0, 
    loc_after_labels=loc_after_labels@entry=0x0) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:12947
#17 0x0000000000877b0c in cp_parser_statement_seq_opt
(parser=parser@entry=0x7ffff6fb4dc8,
in_statement_expr=in_statement_expr@entry=0x0) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:13418
#18 0x0000000000877d40 in cp_parser_compound_statement (parser=0x7ffff6fb4dc8,
in_statement_expr=0x0, bcs_flags=<optimized out>, function_body=true) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:13272
#19 0x0000000000883042 in cp_parser_function_body (parser=0x7ffff6fb4dc8,
in_function_try_block=false) at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:25987
#20 cp_parser_ctor_initializer_opt_and_function_body (parser=0x7ffff6fb4dc8,
in_function_try_block=false) at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:26038
#21 0x00000000008a8d2b in cp_parser_function_definition_after_declarator
(parser=parser@entry=0x7ffff6fb4dc8, inline_p=inline_p@entry=false) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:32729
#22 0x00000000008a9e50 in
cp_parser_function_definition_from_specifiers_and_declarator
(parser=0x7ffff6fb4dc8, decl_specifiers=<optimized out>, attributes=0x0,
declarator=0x31fb9a0)
    at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:32647
#23 cp_parser_init_declarator (parser=0x7ffff6fb4dc8, flags=<optimized out>,
decl_specifiers=<optimized out>, checks=0x0,
function_definition_allowed_p=<optimized out>, member_p=false, 
    declares_class_or_enum=0, function_definition_p=0x7fffffffd6f8,
maybe_range_for_decl=0x0, init_loc=0x7fffffffd6f0, auto_result=0x7fffffffd700)
at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:23366
#24 0x0000000000873c72 in cp_parser_simple_declaration (parser=0x7ffff6fb4dc8,
function_definition_allowed_p=<optimized out>, maybe_range_for_decl=0x0) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:15900
#25 0x0000000000878ccd in cp_parser_declaration (parser=0x7ffff6fb4dc8,
prefix_attrs=0x0) at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:15573
#26 0x0000000000879734 in cp_parser_toplevel_declaration
(parser=0x7ffff6fb4dc8) at /usr/src/debug/gcc/gcc/gcc/cp/parser.cc:15594
#27 cp_parser_translation_unit (parser=0x7ffff6fb4dc8) at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:5279
#28 0x00000000009c4ed1 in c_parse_file () at
/usr/src/debug/gcc/gcc/gcc/cp/parser.cc:51269
#29 c_common_parse_file () at
/usr/src/debug/gcc/gcc/gcc/c-family/c-opts.cc:1311
#30 0x0000000000fa020f in compile_file () at
/usr/src/debug/gcc/gcc/gcc/toplev.cc:449
#31 0x000000000070d122 in do_compile () at
/usr/src/debug/gcc/gcc/gcc/toplev.cc:2154
#32 toplev::main (this=<optimized out>, argc=<optimized out>, argv=<optimized
out>) at /usr/src/debug/gcc/gcc/gcc/toplev.cc:2310
#33 0x000000000070da36 in main (argc=<optimized out>, argv=<optimized out>) at
/usr/src/debug/gcc/gcc/gcc/main.cc:39
```

Reply via email to