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

            Bug ID: 70488
           Summary: ICE in tree.c:7345 triggered by warning of placement
                    new too small
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: samschetgcc at gmail dot com
  Target Milestone: ---

GCC built from revision 234633 fails with an ICE when trying to warn that the
buffer provided by placement new is too small if the array is a variable length
array on the stack:

when compiling this code:

struct failure_case {size_t s;};

void break_func(unsigned int s) {
    char temp_buffer[sizeof(failure_case) + s];
    failure_case *f = new (temp_buffer) failure_case;
};


$ ~/test_bin/bin/g++ repr_bug.cc
repr_bug.cc: In function ‘void break_func(int)’:
repr_bug.cc:16:41: internal compiler error: in tree_to_uhwi, at tree.c:7345
     failure_case *f = new (temp_buffer) failure_case;
                                         ^~~~~~~~~~~~
0xf79502 tree_to_uhwi(tree_node const*)
        ../../trunk/gcc/tree.c:7345
0x763a8a warn_placement_new_too_small
        ../../trunk/gcc/cp/init.c:2438
0x763a8a build_new_1
        ../../trunk/gcc/cp/init.c:2994
0x765095 build_new(vec<tree_node*, va_gc, vl_embed>**, tree_node*, tree_node*,
vec<tree_node*, va_gc, vl_embed>**, int, int)
        ../../trunk/gcc/cp/init.c:3449
0x6fd366 cp_parser_new_expression
        ../../trunk/gcc/cp/parser.c:8140
0x6fd967 cp_parser_unary_expression
        ../../trunk/gcc/cp/parser.c:7848
0x707957 cp_parser_cast_expression
        ../../trunk/gcc/cp/parser.c:8665
0x707eed cp_parser_binary_expression
        ../../trunk/gcc/cp/parser.c:8766
0x7087b0 cp_parser_assignment_expression
        ../../trunk/gcc/cp/parser.c:9053
0x708bc7 cp_parser_constant_expression
        ../../trunk/gcc/cp/parser.c:9323
0x7093b4 cp_parser_initializer_clause
        ../../trunk/gcc/cp/parser.c:20791
0x70abab cp_parser_initializer
        ../../trunk/gcc/cp/parser.c:20734
0x71c71d cp_parser_init_declarator
        ../../trunk/gcc/cp/parser.c:18604
0x71d070 cp_parser_simple_declaration
        ../../trunk/gcc/cp/parser.c:12372
0x71d3aa cp_parser_block_declaration
        ../../trunk/gcc/cp/parser.c:12248
0x71deb9 cp_parser_declaration_statement
        ../../trunk/gcc/cp/parser.c:11860
0x71aa93 cp_parser_statement
        ../../trunk/gcc/cp/parser.c:10528
0x71b4a4 cp_parser_statement_seq_opt
        ../../trunk/gcc/cp/parser.c:10806
0x71b5af cp_parser_compound_statement
        ../../trunk/gcc/cp/parser.c:10760
0x71b70d cp_parser_function_body
        ../../trunk/gcc/cp/parser.c:20653
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

When removing the parameter addition, no warning is emitted and the code
compiles fine. Also, using a static size that is too small simply generates a
warning.

As a side note, the warning in this case could be considered spurious (although
overflow *could* generate too small of a buffer).

Reply via email to