C PATCH to fix ICE-on-invalid with __atomic_load (PR c/81231)

Marek Polacek polacek@redhat.com
Tue Jul 4 11:44:00 GMT 2017


This patch fixes an ICE-on-invalid with __atomic_*.  We should check
that we're dealing with a complete type before we're accessing its
TYPE_SIZE_UNIT.

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

2017-07-04  Marek Polacek  <polacek@redhat.com>

	PR c/81231
	* c-common.c (sync_resolve_size): Give error for pointers to incomplete
	types.

	* gcc.dg/atomic-pr81231.c: New test.

diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
index f6a9d05..1b6ac8c 100644
--- gcc/c-family/c-common.c
+++ gcc/c-family/c-common.c
@@ -6485,6 +6485,9 @@ sync_resolve_size (tree function, vec<tree, va_gc> *params, bool fetch)
   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
     goto incompatible;
 
+  if (!COMPLETE_TYPE_P (type))
+    goto incompatible;
+
   if (fetch && TREE_CODE (type) == BOOLEAN_TYPE)
     goto incompatible;
 
diff --git gcc/testsuite/gcc.dg/atomic-pr81231.c gcc/testsuite/gcc.dg/atomic-pr81231.c
index e69de29..304e428 100644
--- gcc/testsuite/gcc.dg/atomic-pr81231.c
+++ gcc/testsuite/gcc.dg/atomic-pr81231.c
@@ -0,0 +1,12 @@
+/* PR c/81231 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum E;
+
+void
+foo (void)
+{
+  __atomic_load_n ((enum E *) 0, 0); /* { dg-error "incompatible" } */
+  __atomic_load_n ((enum X *) 0, 0); /* { dg-error "incompatible" } */
+}

	Marek



More information about the Gcc-patches mailing list