The attached fix parallels the one for the equivalent C bug 95580 where the pretty printers don't correctly handle MEM_REF arguments with type void* or other pointers to an incomplete type.
The incorrect handling was exposed by the recent change to -Wuninitialized which includes such expressions in diagnostics. Martin
PR c++/95768 - pretty-printer ICE on -Wuninitialized with allocated storage gcc/cp/ChangeLog: PR c++/95768 * error.c (dump_expr): Handle sizeless operand types such as void*. gcc/testsuite/ChangeLog: PR c++/95768 * g++.dg/pr95768.C: New test. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 0d6375e5e14..3a7254fdce1 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2374,32 +2374,37 @@ dump_expr (cxx_pretty_printer *pp, tree t, int flags) break; case MEM_REF: - if (TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR - && integer_zerop (TREE_OPERAND (t, 1))) - dump_expr (pp, TREE_OPERAND (TREE_OPERAND (t, 0), 0), flags); - else - { - pp_cxx_star (pp); - if (!integer_zerop (TREE_OPERAND (t, 1))) - { - pp_cxx_left_paren (pp); - if (!integer_onep (TYPE_SIZE_UNIT - (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)))))) - { - pp_cxx_left_paren (pp); - dump_type (pp, ptr_type_node, flags); - pp_cxx_right_paren (pp); - } - } - dump_expr (pp, TREE_OPERAND (t, 0), flags); - if (!integer_zerop (TREE_OPERAND (t, 1))) - { - pp_cxx_ws_string (pp, "+"); - dump_expr (pp, fold_convert (ssizetype, TREE_OPERAND (t, 1)), - flags); - pp_cxx_right_paren (pp); - } - } + { + tree arg = TREE_OPERAND (t, 0); + tree offset = TREE_OPERAND (t, 1); + + if (TREE_CODE (arg) == ADDR_EXPR + && integer_zerop (offset)) + dump_expr (pp, TREE_OPERAND (arg, 0), flags); + else + { + pp_cxx_star (pp); + if (!integer_zerop (offset)) + { + pp_cxx_left_paren (pp); + tree argtype = TREE_TYPE (arg); + if (tree size = TYPE_SIZE_UNIT (TREE_TYPE (argtype))) + if (!integer_onep (size)) + { + pp_cxx_left_paren (pp); + dump_type (pp, ptr_type_node, flags); + pp_cxx_right_paren (pp); + } + } + dump_expr (pp, arg, flags); + if (!integer_zerop (offset)) + { + pp_cxx_ws_string (pp, "+"); + dump_expr (pp, fold_convert (ssizetype, offset), flags); + pp_cxx_right_paren (pp); + } + } + } break; case NEGATE_EXPR: diff --git a/gcc/testsuite/g++.dg/pr95768.C b/gcc/testsuite/g++.dg/pr95768.C new file mode 100644 index 00000000000..babfcb49bf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr95768.C @@ -0,0 +1,32 @@ +/* PR c++/95768 - pretty-printer ICE on -Wuninitialized with allocated storage + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +extern "C" void *malloc (__SIZE_TYPE__); + +struct f +{ + int i; + static int e (int); + void operator= (int) { e (i); } +}; + +struct m { + int i; + f length; +}; + +struct n { + m *o() { return (m *)this; } +}; + +struct p { + n *header; + p () { + header = (n *)malloc (0); + m b = *header->o(); // { dg-warning "-Wuninitialized" } + b.length = 0; + } +}; + +void detach2() { p(); }