PR c++/30852
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Mar 2007 07:31:47 +0000 (07:31 +0000)
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Mar 2007 07:31:47 +0000 (07:31 +0000)
* c-common.c (fold_offsetof_1): Handle COMPOUND_EXPR.

* semantics.c (finish_offsetof): Handle COMPOUND_EXPR.

* g++.dg/ext/offsetof1.C: Add cases with volatile.

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

gcc/ChangeLog
gcc/c-common.c
gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/offsetof1.C

index 21c0770..76b69f5 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-08  Volker Reichelt  <reichelt@netcologne.de>
+
+       PR c++/30852
+       * c-common.c (fold_offsetof_1): Handle COMPOUND_EXPR.
+
 2007-03-08  Alexandre Oliva  <aoliva@redhat.com>
 
        * c-decl.c (grokdeclarator): Disable warnings for anonymous
index db64da5..0bcd462 100644 (file)
@@ -6443,6 +6443,12 @@ fold_offsetof_1 (tree expr, tree stop_ref)
       off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t);
       break;
 
+    case COMPOUND_EXPR:
+      /* Handle static members of volatile structs.  */
+      t = TREE_OPERAND (expr, 1);
+      gcc_assert (TREE_CODE (t) == VAR_DECL);
+      return fold_offsetof_1 (t, stop_ref);
+
     default:
       gcc_unreachable ();
     }
index 35e0f9f..3872284 100644 (file)
@@ -1,5 +1,8 @@
 2007-03-08  Volker Reichelt  <reichelt@netcologne.de>
 
+       PR c++/30852
+       * semantics.c (finish_offsetof): Handle COMPOUND_EXPR.
+
        PR c++/30534
        * pt.c (any_template_arguments_need_structural_equality_p):
        Robustify.
index c21fd2c..30f4214 100644 (file)
@@ -2933,7 +2933,8 @@ finish_offsetof (tree expr)
       || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
       || TREE_CODE (TREE_TYPE (expr)) == UNKNOWN_TYPE)
     {
-      if (TREE_CODE (expr) == COMPONENT_REF)
+      if (TREE_CODE (expr) == COMPONENT_REF
+         || TREE_CODE (expr) == COMPOUND_EXPR)
        expr = TREE_OPERAND (expr, 1);
       error ("cannot apply %<offsetof%> to member function %qD", expr);
       return error_mark_node;
index 28c386f..81dd95d 100644 (file)
@@ -1,5 +1,8 @@
 2007-03-08  Volker Reichelt  <reichelt@netcologne.de>
 
+       PR c++/30852
+       * g++.dg/ext/offsetof1.C: Add cases with volatile.
+
        PR c++/30534
        * g++.dg/template/arg5.C: New test.
 
index 123a9e3..1468c0a 100644 (file)
@@ -8,8 +8,10 @@ struct bar {
 };
 
 int a = __builtin_offsetof(bar, foo);  // { dg-error "static data member" }
+int av = __builtin_offsetof(volatile bar, foo);  // { dg-error "static data member" }
 int b = __builtin_offsetof(bar, baz);  // { dg-error "member function" }
 int b0 = __builtin_offsetof(bar, baz[0]);  // { dg-error "function" }
+int bv0 = __builtin_offsetof(volatile bar, baz[0]);  // { dg-error "function" }
 int c = __builtin_offsetof(bar, ~bar);  // { dg-error "member function" }
 
 typedef int I;