re PR c++/85061 (ICE with __builtin_offsetof applied to static member)
authorJakub Jelinek <jakub@redhat.com>
Tue, 27 Mar 2018 19:59:30 +0000 (21:59 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 27 Mar 2018 19:59:30 +0000 (21:59 +0200)
PR c++/85061
* c-common.c (fold_offsetof_1) <case COMPOUND_EXPR>: Assert that
get_base_address of the second operand is a VAR_P, rather than the
operand itself, and use gcc_checking_assert instead of gcc_assert.

* g++.dg/ext/builtin-offsetof3.C: New test.

From-SVN: r258902

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/builtin-offsetof3.C [new file with mode: 0644]

index f728311..e3558d7 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/85061
+       * c-common.c (fold_offsetof_1) <case COMPOUND_EXPR>: Assert that
+       get_base_address of the second operand is a VAR_P, rather than the
+       operand itself, and use gcc_checking_assert instead of gcc_assert.
+
 2018-03-23  Marek Polacek  <polacek@redhat.com>
 
        PR c++/85045
index e1df1d3..7e6905e 100644 (file)
@@ -6272,7 +6272,7 @@ fold_offsetof_1 (tree expr, enum tree_code ctx)
     case COMPOUND_EXPR:
       /* Handle static members of volatile structs.  */
       t = TREE_OPERAND (expr, 1);
-      gcc_assert (VAR_P (t));
+      gcc_checking_assert (VAR_P (get_base_address (t)));
       return fold_offsetof_1 (t);
 
     default:
index 9cd81d9..93557dd 100644 (file)
@@ -1,5 +1,8 @@
 2018-03-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/85061
+       * g++.dg/ext/builtin-offsetof3.C: New test.
+
        PR c++/85076
        * g++.dg/cpp1y/pr85076.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/ext/builtin-offsetof3.C b/gcc/testsuite/g++.dg/ext/builtin-offsetof3.C
new file mode 100644 (file)
index 0000000..79c358b
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/85061
+// { dg-do compile }
+
+struct B { int a, b; };
+struct A
+{
+  static int x[2];
+  static int y;
+  static B z;
+};
+
+int i = __builtin_offsetof (volatile A, x[0]); // { dg-error "cannot apply 'offsetof' to static data member 'A::x'" }
+int j = __builtin_offsetof (volatile A, y);    // { dg-error "cannot apply 'offsetof' to static data member 'A::y'" }
+int k = __builtin_offsetof (volatile A, z.a);  // { dg-error "cannot apply 'offsetof' to a non constant address" }