OSDN Git Service

PR c++/35336
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Dec 2008 21:10:16 +0000 (21:10 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Dec 2008 21:10:16 +0000 (21:10 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142497 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-pretty-print.c
gcc/cp/ChangeLog
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/error30.C [new file with mode: 0644]

index f86e4f7..5318c3e 100644 (file)
@@ -1,3 +1,9 @@
+2008-12-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/35336
+       * c-pretty-print.c (pp_c_postfix_expression): Handle BIT_FIELD_REF.
+       (pp_c_expression): Likewise.
+
 2008-12-05  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR c/38416
index 9ee2738..cf1c6c3 100644 (file)
@@ -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:
index c70307c..dab6ed0 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/35336
+       * error.c (dump_expr): Handle BIT_FIELD_REF.
+
 2008-12-05  Sebastian Pop  <sebastian.pop@amd.com>
 
        PR bootstrap/38262
index a2db157..4a63f1d 100644 (file)
@@ -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;
 
index f4843d5..b841930 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/35336
+       * g++.dg/other/error30.C: New test.
+
 2008-12-05  Janis Johnson  <janis187@us.ibm.com>
 
        * 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 (file)
index 0000000..2df0e64
--- /dev/null
@@ -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" }
+}