]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/25161 (Internal compiler error (segfault) instead of error message)
authorJoseph Myers <joseph@codesourcery.com>
Mon, 5 Jun 2006 16:50:45 +0000 (17:50 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 5 Jun 2006 16:50:45 +0000 (17:50 +0100)
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:
* gcc.dg/array-10.c: New test.

From-SVN: r114394

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/array-10.c [new file with mode: 0644]

index ae6f258d2c46fa2266511a00529a0ee8e279984e..3103db36e7710bf8ab753e881a8ab490a90335df 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2006-06-04  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/27601
index e54db4f749cde99071d4fc00827dc33e0b1c4bfd..19d25d29eb3818e2a22c3891ef0a696372650795 100644 (file)
@@ -3899,6 +3899,14 @@ grokdeclarator (const struct c_declarator *declarator,
   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);
 
@@ -4163,6 +4171,12 @@ grokdeclarator (const struct c_declarator *declarator,
                        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
@@ -4246,7 +4260,12 @@ grokdeclarator (const struct c_declarator *declarator,
            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
index bbcee3a36e1f52731b6a43f31211cd700c9886d9..ddb9ccaf79d25b4bf944606d22b5e8608a0eca83 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-05  Joseph S. Myers  <joseph@codesourcery.com>
+
+       PR c/25161
+       PR c/27020
+       * gcc.dg/array-10.c: New test.
+
 2006-06-04  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/27601
diff --git a/gcc/testsuite/gcc.dg/array-10.c b/gcc/testsuite/gcc.dg/array-10.c
new file mode 100644 (file)
index 0000000..aab1538
--- /dev/null
@@ -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" } */