[C++] Fix ICE on offsetof with volatile struct and static data member array ref (PR c++/85061)

Message ID 20180327085456.GV8577@tucnak
State New
Headers show
Series
  • [C++] Fix ICE on offsetof with volatile struct and static data member array ref (PR c++/85061)
Related show

Commit Message

Jakub Jelinek March 27, 2018, 8:54 a.m.
Hi!

The following testcase ICEs, because we assert that we see a COMPOUND_EXPR
only for static data member in a volatile struct, but as the testcase shows,
we can see it also if using some component of the static data member.

Fixed by using get_base_address, plus, as the check isn't as cheap as
before, turn the assert into a checking assert only.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

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.

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


	Jakub

Comments

Jason Merrill March 27, 2018, 7:53 p.m. | #1
OK.

On Tue, Mar 27, 2018 at 4:54 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!

>

> The following testcase ICEs, because we assert that we see a COMPOUND_EXPR

> only for static data member in a volatile struct, but as the testcase shows,

> we can see it also if using some component of the static data member.

>

> Fixed by using get_base_address, plus, as the check isn't as cheap as

> before, turn the assert into a checking assert only.

>

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

>

> 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.

>

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

>

> --- gcc/c-family/c-common.c.jj  2018-03-13 00:38:23.809662252 +0100

> +++ gcc/c-family/c-common.c     2018-03-24 15:21:36.171485128 +0100

> @@ -6272,7 +6272,7 @@ fold_offsetof_1 (tree expr, enum tree_co

>      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:

> --- gcc/testsuite/g++.dg/ext/builtin-offsetof3.C.jj     2018-03-26 11:54:54.338627270 +0200

> +++ gcc/testsuite/g++.dg/ext/builtin-offsetof3.C        2018-03-26 11:54:07.992610454 +0200

> @@ -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" }

>

>         Jakub

Patch

--- gcc/c-family/c-common.c.jj	2018-03-13 00:38:23.809662252 +0100
+++ gcc/c-family/c-common.c	2018-03-24 15:21:36.171485128 +0100
@@ -6272,7 +6272,7 @@  fold_offsetof_1 (tree expr, enum tree_co
     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:
--- gcc/testsuite/g++.dg/ext/builtin-offsetof3.C.jj	2018-03-26 11:54:54.338627270 +0200
+++ gcc/testsuite/g++.dg/ext/builtin-offsetof3.C	2018-03-26 11:54:07.992610454 +0200
@@ -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" }