From 5eddced53a0b1a080297ae5420768750ae9e282d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Dec 2008 22:10:16 +0100 Subject: [PATCH] re PR c++/35336 (Broken diagnostic: 'bit_field_ref' not supported by dump_expr) PR c++/35336 * c-pretty-print.c (pp_c_postfix_expression): Handle BIT_FIELD_REF. (pp_c_expression): Likewise. * error.c (dump_expr): Handle BIT_FIELD_REF. * g++.dg/other/error30.C: New test. From-SVN: r142497 --- gcc/ChangeLog | 6 ++++++ gcc/c-pretty-print.c | 31 ++++++++++++++++++++++++++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/error.c | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/error30.C | 14 +++++++++++++ 6 files changed, 62 insertions(+) create mode 100644 gcc/testsuite/g++.dg/other/error30.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f86e4f7fdbd1..5318c3e41da6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-05 Jakub Jelinek + + PR c++/35336 + * c-pretty-print.c (pp_c_postfix_expression): Handle BIT_FIELD_REF. + (pp_c_expression): Likewise. + 2008-12-05 Michael Meissner PR c/38416 diff --git a/gcc/c-pretty-print.c b/gcc/c-pretty-print.c index 9ee2738ca82a..cf1c6c3f52c2 100644 --- a/gcc/c-pretty-print.c +++ b/gcc/c-pretty-print.c @@ -1444,6 +1444,36 @@ pp_c_postfix_expression (c_pretty_printer *pp, tree e) } break; + case BIT_FIELD_REF: + { + tree type = TREE_TYPE (e); + + type = signed_or_unsigned_type_for (TYPE_UNSIGNED (type), type); + if (type + && tree_int_cst_equal (TYPE_SIZE (type), TREE_OPERAND (e, 1))) + { + HOST_WIDE_INT bitpos = tree_low_cst (TREE_OPERAND (e, 2), 0); + HOST_WIDE_INT size = tree_low_cst (TYPE_SIZE (type), 0); + if ((bitpos % size) == 0) + { + pp_c_left_paren (pp); + pp_c_left_paren (pp); + pp_type_id (pp, type); + pp_c_star (pp); + pp_c_right_paren (pp); + pp_c_ampersand (pp); + pp_expression (pp, TREE_OPERAND (e, 0)); + pp_c_right_paren (pp); + pp_c_left_bracket (pp); + pp_wide_integer (pp, bitpos / size); + pp_c_right_bracket (pp); + break; + } + } + pp_unsupported_tree (pp, e); + } + break; + case COMPLEX_CST: case VECTOR_CST: pp_c_compound_literal (pp, e); @@ -1955,6 +1985,7 @@ pp_c_expression (c_pretty_printer *pp, tree e) case ARRAY_REF: case CALL_EXPR: case COMPONENT_REF: + case BIT_FIELD_REF: case COMPLEX_CST: case COMPLEX_EXPR: case VECTOR_CST: diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c70307ca2f85..dab6ed0def0e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2008-12-05 Jakub Jelinek + + PR c++/35336 + * error.c (dump_expr): Handle BIT_FIELD_REF. + 2008-12-05 Sebastian Pop PR bootstrap/38262 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index a2db1575fe70..4a63f1df8137 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2071,6 +2071,7 @@ dump_expr (tree t, int flags) case UNEQ_EXPR: case LTGT_EXPR: case COMPLEX_EXPR: + case BIT_FIELD_REF: pp_expression (cxx_pp, t); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4843d5b5075..b841930c2c6c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-05 Jakub Jelinek + + PR c++/35336 + * g++.dg/other/error30.C: New test. + 2008-12-05 Janis Johnson * lib/target-supports.exp (check_effective_target_hard_dfp): New. diff --git a/gcc/testsuite/g++.dg/other/error30.C b/gcc/testsuite/g++.dg/other/error30.C new file mode 100644 index 000000000000..2df0e64075cf --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error30.C @@ -0,0 +1,14 @@ +// PR c++/35336 +// { dg-do compile } +// { dg-bogus "not supported by" "" { target *-*-* } 0 } + +struct A +{ + int i : 2; +}; + +void foo (bool b) +{ + A a; + (a.i || b) (); // { dg-error "cannot be used as" } +}