This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch for bugs 25161 and 27020


This patch fixes bugs 25161 and 27020, regressions involving VLAs
whose sizes are TREE_CONSTANT in places where such VLAs are not
allowed.  The copying of types before setting C_TYPE_VARIABLE_SIZE is
needed because otherwise the first typeof test runs into the error in
variable_size ("variable-size type declared outside of any function"),
which sets the size to 1, and so int[1] is wrongly marked as variable,
causing the next int[1] from an erroneous type to be marked as
variable (and so causing the c_begin_vm_scope problems to reappear).
The duplicate checks in two places for VM types at file scope, instead
of disallowing VM types for TYPENAME as well in the latter place and
so eliminating the need for the earlier checks, is because I don't
think the error in variable_size for VM types at file scope is always
correct for C; for example, it should be OK to use such a type inside
sizeof.

Bootstrapped with no regressions on i686-pc-linux-gnu.  Applied to
mainline.  Will apply to 4.1 and 4.0 branches subject to testing
there.

2006-06-05  Joseph S. Myers  <joseph@codesourcery.com>

	PR c/25161
	PR c/27020
	* c-decl.c (grokdeclarator): Disallow variably modified types at
	file scope.  Avoid marking shared array type of constant size as
	VLA.

testsuite:
2006-06-05  Joseph S. Myers  <joseph@codesourcery.com>

	PR c/25161
	PR c/27020
	* gcc.dg/array-10.c: New test.

diff -rupN GCC.orig/gcc/c-decl.c GCC/gcc/c-decl.c
--- GCC.orig/gcc/c-decl.c	2006-06-01 15:10:17.000000000 +0000
+++ GCC/gcc/c-decl.c	2006-06-04 22:34:03.000000000 +0000
@@ -3936,6 +3936,14 @@ grokdeclarator (const struct c_declarato
   if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS)
     warn_deprecated_use (declspecs->type);
 
+  if ((decl_context == NORMAL || decl_context == FIELD)
+      && current_scope == file_scope
+      && variably_modified_type_p (type, NULL_TREE))
+    {
+      error ("variably modified %qs at file scope", name);
+      type = integer_type_node;
+    }
+
   typedef_type = type;
   size_varies = C_TYPE_VARIABLE_SIZE (type);
 
@@ -4206,6 +4214,12 @@ grokdeclarator (const struct c_declarato
 			size = integer_one_node;
 		      }
 		  }
+		else if ((decl_context == NORMAL || decl_context == FIELD)
+			 && current_scope == file_scope)
+		  {
+		    error ("variably modified %qs at file scope", name);
+		    size = integer_one_node;
+		  }
 		else
 		  {
 		    /* Make sure the array size remains visibly
@@ -4304,7 +4318,12 @@ grokdeclarator (const struct c_declarato
 	    if (type != error_mark_node)
 	      {
 		if (size_varies)
-		  C_TYPE_VARIABLE_SIZE (type) = 1;
+		  {
+		    if (size && TREE_CODE (size) == INTEGER_CST)
+		      type
+			= build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
+		    C_TYPE_VARIABLE_SIZE (type) = 1;
+		  }
 
 		/* The GCC extension for zero-length arrays differs from
 		   ISO flexible array members in that sizeof yields
diff -rupN GCC.orig/gcc/testsuite/gcc.dg/array-10.c GCC/gcc/testsuite/gcc.dg/array-10.c
--- GCC.orig/gcc/testsuite/gcc.dg/array-10.c	1970-01-01 00:00:00.000000000 +0000
+++ GCC/gcc/testsuite/gcc.dg/array-10.c	2006-06-05 00:47:06.000000000 +0000
@@ -0,0 +1,33 @@
+/* Test invalid array sizes at file scope: should not cause ICEs.
+   Bugs 25161 and 27020.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int a;
+
+int b0[a]; /* { dg-error "at file scope" } */
+int (*b1)[a]; /* { dg-error "at file scope" } */
+int (*b2())[a]; /* { dg-error "at file scope" } */
+struct b3 { int x[a]; }; /* { dg-error "at file scope" } */
+struct b4 { int (*x)[a]; }; /* { dg-error "at file scope" } */
+typeof (int [a]) b5; /* { dg-error "at file scope|outside of any function" } */
+
+int c0[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */
+int (*c1)[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */
+int (*c2())[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */
+struct c3 { int x[(__SIZE_TYPE__)&a]; }; /* { dg-error "at file scope" } */
+struct c4 { int (*x)[(__SIZE_TYPE__)&a]; }; /* { dg-error "at file scope" } */
+typeof (int [(__SIZE_TYPE__)&a]) c5; /* { dg-error "at file scope" } */
+
+int d0[1/0]; /* { dg-error "at file scope" } */
+/* { dg-warning "division by zero" "" { target *-*-* } 23 } */
+int (*d1)[1/0]; /* { dg-error "at file scope" } */
+/* { dg-warning "division by zero" "" { target *-*-* } 25 } */
+int (*d2())[1/0]; /* { dg-error "at file scope" } */
+/* { dg-warning "division by zero" "" { target *-*-* } 27 } */
+struct d3 { int x[1/0]; }; /* { dg-error "at file scope" } */
+/* { dg-warning "division by zero" "" { target *-*-* } 29 } */
+struct d4 { int (*x)[1/0]; }; /* { dg-error "at file scope" } */
+/* { dg-warning "division by zero" "" { target *-*-* } 31 } */
+typeof (int [1/0]) d5; /* { dg-error "at file scope" } */

-- 
Joseph S. Myers               http://www.srcf.ucam.org/~jsm28/gcc/
    jsm@polyomino.org.uk (personal mail)
    joseph@codesourcery.com (CodeSourcery mail)
    jsm28@gcc.gnu.org (Bugzilla assignments and CCs)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]