cxx_pretty_printer::multiplicative_expression didn't handle RDIV_EXPR, so when we tried to print a RDIV_EXPR, we printed it as a pm-expression. That led to printing it as a cast-expression. That led to printing it as a primary-expression. That led to printing it as a multiplicative expression. That led to printing it as a pm-expression. That led to printing it as a cast-expression. That led to printing it as a primary-expression. That led to... a crash.
Bootstrapped/regtested on x86_64-linux, ok for trunk? 2018-03-23 Marek Polacek <pola...@redhat.com> PR c++/85045 * cxx-pretty-print.c (cxx_pretty_printer::multiplicative_expression): Handle RDIV_EXPR. * g++.dg/cpp0x/Wnarrowing5.C: New test. diff --git gcc/cp/cxx-pretty-print.c gcc/cp/cxx-pretty-print.c index ca99997f5e1..8527a326c57 100644 --- gcc/cp/cxx-pretty-print.c +++ gcc/cp/cxx-pretty-print.c @@ -899,11 +899,12 @@ cxx_pretty_printer::multiplicative_expression (tree e) case MULT_EXPR: case TRUNC_DIV_EXPR: case TRUNC_MOD_EXPR: + case RDIV_EXPR: multiplicative_expression (TREE_OPERAND (e, 0)); pp_space (this); if (code == MULT_EXPR) pp_star (this); - else if (code == TRUNC_DIV_EXPR) + else if (code == TRUNC_DIV_EXPR || code == RDIV_EXPR) pp_slash (this); else pp_modulo (this); diff --git gcc/testsuite/g++.dg/cpp0x/Wnarrowing5.C gcc/testsuite/g++.dg/cpp0x/Wnarrowing5.C index e69de29bb2d..9acdc6b0c91 100644 --- gcc/testsuite/g++.dg/cpp0x/Wnarrowing5.C +++ gcc/testsuite/g++.dg/cpp0x/Wnarrowing5.C @@ -0,0 +1,11 @@ +// PR c++/85045 +// { dg-do compile { target c++11 } } + +typedef struct tt { + unsigned short h; +} tt; + +void mainScreen(float a) +{ + tt numlrect = {int(100/a)}; // { dg-error "narrowing conversion" } +} Marek