diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2004-03-28 17:45:57 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-03-28 17:45:57 +0000 |
commit | 18d5f9820c77f9d84ec379117bef8ed18bcc3ba8 (patch) | |
tree | e95abdb07c80f3f34dfb27ad9081ce47469bc52a /gcc/c-decl.c | |
parent | f26e5597f0272d7e4e20fe2c3728a064276f6ab0 (diff) | |
download | gcc-18d5f9820c77f9d84ec379117bef8ed18bcc3ba8.zip gcc-18d5f9820c77f9d84ec379117bef8ed18bcc3ba8.tar.gz gcc-18d5f9820c77f9d84ec379117bef8ed18bcc3ba8.tar.bz2 |
re PR c/14734 (Error recovery problem with undeclared array bounds)
* 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
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b2a0bf5..05bc8be 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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 (); } |