aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Reichelt <reichelt@netcologne.de>2007-03-08 07:31:47 +0000
committerVolker Reichelt <reichelt@gcc.gnu.org>2007-03-08 07:31:47 +0000
commit1916c916caf5b22b43ba62974586ffbd3b89b406 (patch)
tree383e9344ece683592f3f56bb28e93c5962c79459
parentcc891727f0647d3123c9776250dc08edeec91e51 (diff)
downloadgcc-1916c916caf5b22b43ba62974586ffbd3b89b406.zip
gcc-1916c916caf5b22b43ba62974586ffbd3b89b406.tar.gz
gcc-1916c916caf5b22b43ba62974586ffbd3b89b406.tar.bz2
re PR c++/30852 (Trouble with __builtin_offsetof and volatile)
PR c++/30852 * 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. From-SVN: r122686
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-common.c6
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/semantics.c3
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/ext/offsetof1.C2
6 files changed, 21 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21c0770..76b69f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-common.c b/gcc/c-common.c
index db64da5..0bcd462 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -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 ();
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 35e0f9f..3872284 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index c21fd2c..30f4214 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 28c386f..81dd95d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C
index 123a9e3..1468c0a 100644
--- a/gcc/testsuite/g++.dg/ext/offsetof1.C
+++ b/gcc/testsuite/g++.dg/ext/offsetof1.C
@@ -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;