re PR c/14734 (Error recovery problem with undeclared array bounds)
authorZack Weinberg <zack@gcc.gnu.org>
Sun, 28 Mar 2004 17:45:57 +0000 (17:45 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Sun, 28 Mar 2004 17:45:57 +0000 (17:45 +0000)
* c-decl.c: Verify that C_SIZEOF_STRUCT_LANG_IDENTIFIER is correct.
(struct c_binding, struct c_scope): Add chain_next
attributes to GTY markers.
(struct lang_identifier, struct lang_tree_node): Define
here...
* c-tree.h: ... not here.  No longer need to declare struct
c_binding either.  Do define C_SIZEOF_STRUCT_LANG_IDENTIFIER.
* c-lang.c, objc/objc-lang.c: Set LANG_HOOKS_IDENTIFIER_SIZE
to C_SIZEOF_STRUCT_LANG_IDENTIFIER.

PR 14734, 11944
* c-decl.c (get_parm_info): If error_mark_node is encountered
in the bindings chain, unbind and discard it; don't abort.
* testsuite/gcc.dg/noncompile/undeclared-2.c: New test.

From-SVN: r80042

gcc/ChangeLog
gcc/c-decl.c
gcc/c-lang.c
gcc/c-tree.h
gcc/objc/objc-lang.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/noncompile/undeclared-2.c [new file with mode: 0644]

index bb64ccc6b22a45491cad82cc934e8269ee5881d0..ea7988319bf73adcaede2a6449ea0752f35341e6 100644 (file)
@@ -1,8 +1,24 @@
+2004-03-28  Zack Weinberg  <zack@codesourcery.com>
+
+       * c-decl.c: Verify that C_SIZEOF_STRUCT_LANG_IDENTIFIER is correct.
+       (struct c_binding, struct c_scope): Add chain_next
+       attributes to GTY markers.
+       (struct lang_identifier, struct lang_tree_node): Define
+       here...
+       * c-tree.h: ... not here.  No longer need to declare struct
+       c_binding either.  Do define C_SIZEOF_STRUCT_LANG_IDENTIFIER.
+       * c-lang.c, objc/objc-lang.c: Set LANG_HOOKS_IDENTIFIER_SIZE
+       to C_SIZEOF_STRUCT_LANG_IDENTIFIER.
+
+       PR 14734, 11944
+       * c-decl.c (get_parm_info): If error_mark_node is encountered
+       in the bindings chain, unbind and discard it; don't abort.
+
 2004-03-28  Olga Golovonevsky <olga@il.ibm.com>
-            Dorit Naishlos <dorit@il.ibm.com>
+           Dorit Naishlos <dorit@il.ibm.com>
 
-        * config/rs6000/altivec.md: (andvv16qi3, andv8hi3, one_cmplv16qi2,
-        one_cmplv8hi2, one_cmplv4si2, iorv16qi3, iorv8hi3,): New modelling.
+       * config/rs6000/altivec.md: (andvv16qi3, andv8hi3, one_cmplv16qi2,
+       one_cmplv8hi2, one_cmplv4si2, iorv16qi3, iorv8hi3,): New modelling.
 
 2004-03-28  Stephane Carrez  <stcarrez@nerim.fr>
 
          with TYPE_ORIG_SIZE_TYPE.
 
 2004-03-25  Aldy Hernandez  <aldyh@redhat.com>
-        PR 14219
-        * c-typeck.c (build_binary_op): Do not allow comparisons of
-        vectors.
+
+       PR 14219
+       * c-typeck.c (build_binary_op): Do not allow comparisons of
+       vectors.
 
 2004-03-26  James A. Morrison  <ja2morri@uwaterloo.ca>
 
 2004-03-25  Richard Henderson  <rth@redhat.com>
 
        PR 11527
-        * c-typeck.c (pop_init_level): Emit pending init elements earlier
-        rather than later.
+       * c-typeck.c (pop_init_level): Emit pending init elements earlier
+       rather than later.
 
 2004-03-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
index b2a0bf5c87c3b7254915fed5e457d79154ef0eb5..05bc8beb59ad6b68676effbfd2010a779a337b2d 100644 (file)
@@ -160,7 +160,7 @@ bool c_override_global_bindings_to_false;
    suppress further errors about that identifier in the current
    function.  */
 
-struct c_binding GTY(())
+struct c_binding GTY((chain_next ("%h.prev")))
 {
   tree decl;                   /* the decl bound */
   tree id;                     /* the identifier it's bound to */
@@ -184,6 +184,34 @@ struct c_binding GTY(())
 #define I_LABEL_DECL(node) \
  (I_LABEL_BINDING(node) ? I_LABEL_BINDING(node)->decl : 0)
 
+/* Each C symbol points to three linked lists of c_binding structures.
+   These describe the values of the identifier in the three different
+   namespaces defined by the language.  */
+
+struct lang_identifier GTY(())
+{
+  struct c_common_identifier common_id;
+  struct c_binding *symbol_binding; /* vars, funcs, constants, typedefs */
+  struct c_binding *tag_binding;    /* struct/union/enum tags */
+  struct c_binding *label_binding;  /* labels */
+};
+
+/* Validate c-lang.c's assumptions.  */
+extern char C_SIZEOF_STRUCT_LANG_IDENTIFIER_isnt_accurate
+[(sizeof(struct lang_identifier) == C_SIZEOF_STRUCT_LANG_IDENTIFIER) ? 1 : -1];
+
+/* The resulting tree type.  */
+
+union lang_tree_node
+  GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
+       chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE ? (union lang_tree_node *)TYPE_NEXT_VARIANT (&%h.generic) : (union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
+{
+  union tree_node GTY ((tag ("0"),
+                       desc ("tree_node_structure (&%h)")))
+    generic;
+  struct lang_identifier GTY ((tag ("1"))) identifier;
+};
+
 /* Each c_scope structure describes the complete contents of one
    scope.  Four scopes are distinguished specially: the innermost or
    current scope, the innermost function scope, the file scope (always
@@ -229,7 +257,7 @@ struct c_binding GTY(())
    pop_scope relies on this.  */
 
 
-struct c_scope GTY(())
+struct c_scope GTY((chain_next ("%h.outer")))
 {
   /* The scope containing this one.  */
   struct c_scope *outer;
@@ -4811,6 +4839,13 @@ get_parm_info (bool ellipsis)
             and TYPE_DECLs appear here when we have an embedded struct
             or union.  No warnings for this - we already warned about the
             type itself.  */
+         TREE_CHAIN (decl) = others;
+         others = decl;
+         /* fall through */
+
+       case ERROR_MARK:
+         /* error_mark_node appears here when we have an undeclared
+            variable.  Just throw it away.  */
          if (b->id)
            {
 #ifdef ENABLE_CHECKING
@@ -4818,16 +4853,12 @@ get_parm_info (bool ellipsis)
 #endif
              I_SYMBOL_BINDING (b->id) = b->shadowed;
            }
-
-         TREE_CHAIN (decl) = others;
-         others = decl;
          break;
 
          /* Other things that might be encountered.  */
        case LABEL_DECL:
        case FUNCTION_DECL:
        case VAR_DECL:
-       case ERROR_MARK:
        default:
          abort ();
        }
index 391e8bddfaf76e21a461659fa0e339c0ff3a7f3d..93dc4052916c78fd47effb058762abfa435804dc 100644 (file)
@@ -41,6 +41,8 @@ enum c_language_kind c_language = clk_c;
 
 #undef LANG_HOOKS_NAME
 #define LANG_HOOKS_NAME "GNU C"
+#undef LANG_HOOKS_IDENTIFIER_SIZE
+#define LANG_HOOKS_IDENTIFIER_SIZE C_SIZEOF_STRUCT_LANG_IDENTIFIER
 #undef LANG_HOOKS_INIT
 #define LANG_HOOKS_INIT c_objc_common_init
 #undef LANG_HOOKS_FINISH
index eb167ca050ea9070c17004d7c82b67b54cc96bb4..01f86e999f248b37dccff4b7384e01241f7da957 100644 (file)
@@ -24,34 +24,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include "c-common.h"
 
-/* Each C symbol points to three linked lists of c_binding structures.
-   These describe the values of the identifier in the three different
-   namespaces defined by the language.  The contents of these lists
-   are private to c-decl.c.  */
-
-struct c_binding;
-
-/* Language-dependent contents of an identifier.  */
-
-struct lang_identifier GTY(())
-{
-  struct c_common_identifier common_id;
-  struct c_binding *symbol_binding; /* vars, funcs, constants, typedefs */
-  struct c_binding *tag_binding;    /* struct/union/enum tags */
-  struct c_binding *label_binding;  /* labels */
-};
-
-/* The resulting tree type.  */
-
-union lang_tree_node
-  GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
-       chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE ? (union lang_tree_node *)TYPE_NEXT_VARIANT (&%h.generic) : (union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
-{
-  union tree_node GTY ((tag ("0"),
-                       desc ("tree_node_structure (&%h)")))
-    generic;
-  struct lang_identifier GTY ((tag ("1"))) identifier;
-};
+/* struct lang_identifier is private to c-decl.c, but langhooks.c needs to
+   know how big it is.  This is sanity-checked in c-decl.c.  */
+#define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
+  (sizeof (struct c_common_identifier) + 3 * sizeof (void *))
 
 /* Language-specific declaration information.  */
 
index 877867ac39ddaf40930fcce16266477a9e53c649..2853ded31c8999738971f4959e360e3173132e72 100644 (file)
@@ -35,6 +35,8 @@ enum c_language_kind c_language = clk_objc;
 
 #undef LANG_HOOKS_NAME
 #define LANG_HOOKS_NAME "GNU Objective-C"
+#undef LANG_HOOKS_IDENTIFIER_SIZE
+#define LANG_HOOKS_IDENTIFIER_SIZE C_SIZEOF_STRUCT_LANG_IDENTIFIER
 #undef LANG_HOOKS_INIT
 #define LANG_HOOKS_INIT objc_init
 #undef LANG_HOOKS_FINISH
index 0b19b8c6049686d8d14f5d6393e0e9b9bf59fafd..96a962568fe2644bba9331bdf7f53a53f6ff4d8d 100644 (file)
@@ -1,3 +1,7 @@
+2004-03-28  Zack Weinberg  <zack@codesourcery.com>
+
+       * gcc.dg/noncompile/undeclared-2.c: New test.
+
 2004-03-28  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * gcc.dg/940409-1.c: Remove XFAIL.
diff --git a/gcc/testsuite/gcc.dg/noncompile/undeclared-2.c b/gcc/testsuite/gcc.dg/noncompile/undeclared-2.c
new file mode 100644 (file)
index 0000000..36cd0ea
--- /dev/null
@@ -0,0 +1,3 @@
+/* Invalid, but should not ICE.  PRs 11944, 14734.  */
+
+void foo(const int[i]);  /* { dg-error "undeclared|for each" } */