c-tree.h: Delete COMPARE_DIFFERENT_TU from enumeration.
* c-tree.h: Delete COMPARE_DIFFERENT_TU from enumeration. * c-typeck.c (same_translation_unit_p): New function. (comptypes): Use it instead of flags parameter to identify structure types from different translation units. * c-decl.c (duplicate_decls): Always call comptypes with COMPTYPE_STRICT flags argument. (c_reset_state): Set BLOCK_SUPERCONTEXT of the block formed to file_scope_decl. From-SVN: r70953
This commit is contained in:
parent
bf7a697f0a
commit
766beae187
|
@ -1,3 +1,14 @@
|
||||||
|
2003-08-30 Zack Weinberg <zack@codesourcery.com>
|
||||||
|
|
||||||
|
* c-tree.h: Delete COMPARE_DIFFERENT_TU from enumeration.
|
||||||
|
* c-typeck.c (same_translation_unit_p): New function.
|
||||||
|
(comptypes): Use it instead of flags parameter to identify
|
||||||
|
structure types from different translation units.
|
||||||
|
* c-decl.c (duplicate_decls): Always call comptypes with
|
||||||
|
COMPTYPE_STRICT flags argument.
|
||||||
|
(c_reset_state): Set BLOCK_SUPERCONTEXT of the block formed
|
||||||
|
to file_scope_decl.
|
||||||
|
|
||||||
2003-08-30 Zack Weinberg <zack@codesourcery.com>
|
2003-08-30 Zack Weinberg <zack@codesourcery.com>
|
||||||
|
|
||||||
* c-tree.h (C_TYPE_INCOMPLETE_VARS): New macro.
|
* c-tree.h (C_TYPE_INCOMPLETE_VARS): New macro.
|
||||||
|
|
13
gcc/c-decl.c
13
gcc/c-decl.c
|
@ -775,10 +775,8 @@ static int
|
||||||
duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
||||||
int different_tu)
|
int different_tu)
|
||||||
{
|
{
|
||||||
int comptype_flags = (different_tu ? COMPARE_DIFFERENT_TU
|
|
||||||
: COMPARE_STRICT);
|
|
||||||
int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl),
|
int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl),
|
||||||
comptype_flags);
|
COMPARE_STRICT);
|
||||||
int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
|
int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
|
||||||
&& DECL_INITIAL (newdecl) != 0);
|
&& DECL_INITIAL (newdecl) != 0);
|
||||||
tree oldtype = TREE_TYPE (olddecl);
|
tree oldtype = TREE_TYPE (olddecl);
|
||||||
|
@ -897,7 +895,7 @@ duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
||||||
|
|
||||||
if (trytype)
|
if (trytype)
|
||||||
{
|
{
|
||||||
types_match = comptypes (newtype, trytype, comptype_flags);
|
types_match = comptypes (newtype, trytype, COMPARE_STRICT);
|
||||||
if (types_match)
|
if (types_match)
|
||||||
oldtype = trytype;
|
oldtype = trytype;
|
||||||
if (! different_binding_level)
|
if (! different_binding_level)
|
||||||
|
@ -983,7 +981,7 @@ duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
||||||
&& ! pedantic
|
&& ! pedantic
|
||||||
/* Return types must still match. */
|
/* Return types must still match. */
|
||||||
&& comptypes (TREE_TYPE (oldtype),
|
&& comptypes (TREE_TYPE (oldtype),
|
||||||
TREE_TYPE (newtype), comptype_flags)
|
TREE_TYPE (newtype), COMPARE_STRICT)
|
||||||
&& TYPE_ARG_TYPES (newtype) == 0))
|
&& TYPE_ARG_TYPES (newtype) == 0))
|
||||||
{
|
{
|
||||||
error ("%Hconflicting types for '%D'",
|
error ("%Hconflicting types for '%D'",
|
||||||
|
@ -992,7 +990,7 @@ duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
||||||
involving an empty arglist vs a nonempty one. */
|
involving an empty arglist vs a nonempty one. */
|
||||||
if (TREE_CODE (olddecl) == FUNCTION_DECL
|
if (TREE_CODE (olddecl) == FUNCTION_DECL
|
||||||
&& comptypes (TREE_TYPE (oldtype),
|
&& comptypes (TREE_TYPE (oldtype),
|
||||||
TREE_TYPE (newtype), comptype_flags)
|
TREE_TYPE (newtype), COMPARE_STRICT)
|
||||||
&& ((TYPE_ARG_TYPES (oldtype) == 0
|
&& ((TYPE_ARG_TYPES (oldtype) == 0
|
||||||
&& DECL_INITIAL (olddecl) == 0)
|
&& DECL_INITIAL (olddecl) == 0)
|
||||||
||
|
||
|
||||||
|
@ -1135,7 +1133,7 @@ duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
|
||||||
/* Type for passing arg must be consistent
|
/* Type for passing arg must be consistent
|
||||||
with that declared for the arg. */
|
with that declared for the arg. */
|
||||||
if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type),
|
if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type),
|
||||||
comptype_flags))
|
COMPARE_STRICT))
|
||||||
{
|
{
|
||||||
const location_t *locus = &DECL_SOURCE_LOCATION (newdecl);
|
const location_t *locus = &DECL_SOURCE_LOCATION (newdecl);
|
||||||
error ("%Hprototype for '%D' follows and argument %d "
|
error ("%Hprototype for '%D' follows and argument %d "
|
||||||
|
@ -6701,6 +6699,7 @@ c_reset_state (void)
|
||||||
current_scope = global_scope;
|
current_scope = global_scope;
|
||||||
file_scope_decl = current_file_decl;
|
file_scope_decl = current_file_decl;
|
||||||
DECL_INITIAL (file_scope_decl) = poplevel (1, 0, 0);
|
DECL_INITIAL (file_scope_decl) = poplevel (1, 0, 0);
|
||||||
|
BLOCK_SUPERCONTEXT (DECL_INITIAL (file_scope_decl)) = file_scope_decl;
|
||||||
truly_local_externals = NULL_TREE;
|
truly_local_externals = NULL_TREE;
|
||||||
|
|
||||||
/* Start a new global binding level. */
|
/* Start a new global binding level. */
|
||||||
|
|
|
@ -244,8 +244,7 @@ extern bool c_warn_unused_global_decl (tree);
|
||||||
|
|
||||||
/* For use with comptypes. */
|
/* For use with comptypes. */
|
||||||
enum {
|
enum {
|
||||||
COMPARE_STRICT = 0,
|
COMPARE_STRICT = 0
|
||||||
COMPARE_DIFFERENT_TU = 1
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern tree require_complete_type (tree);
|
extern tree require_complete_type (tree);
|
||||||
|
|
|
@ -50,6 +50,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
static int missing_braces_mentioned;
|
static int missing_braces_mentioned;
|
||||||
|
|
||||||
static tree qualify_type (tree, tree);
|
static tree qualify_type (tree, tree);
|
||||||
|
static int same_translation_unit_p (tree, tree);
|
||||||
static int tagged_types_tu_compatible_p (tree, tree, int);
|
static int tagged_types_tu_compatible_p (tree, tree, int);
|
||||||
static int comp_target_types (tree, tree, int);
|
static int comp_target_types (tree, tree, int);
|
||||||
static int function_types_compatible_p (tree, tree, int);
|
static int function_types_compatible_p (tree, tree, int);
|
||||||
|
@ -564,7 +565,7 @@ comptypes (tree type1, tree type2, int flags)
|
||||||
|
|
||||||
case ENUMERAL_TYPE:
|
case ENUMERAL_TYPE:
|
||||||
case UNION_TYPE:
|
case UNION_TYPE:
|
||||||
if (val != 1 && (flags & COMPARE_DIFFERENT_TU))
|
if (val != 1 && !same_translation_unit_p (t1, t2))
|
||||||
val = tagged_types_tu_compatible_p (t1, t2, flags);
|
val = tagged_types_tu_compatible_p (t1, t2, flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -606,6 +607,34 @@ comp_target_types (tree ttl, tree ttr, int reflexive)
|
||||||
|
|
||||||
/* Subroutines of `comptypes'. */
|
/* Subroutines of `comptypes'. */
|
||||||
|
|
||||||
|
/* Determine whether two types derive from the same translation unit.
|
||||||
|
If the CONTEXT chain ends in a null, that type's context is still
|
||||||
|
being parsed, so if two types have context chains ending in null,
|
||||||
|
they're in the same translation unit. */
|
||||||
|
static int
|
||||||
|
same_translation_unit_p (tree t1, tree t2)
|
||||||
|
{
|
||||||
|
while (t1 && TREE_CODE (t1) != TRANSLATION_UNIT_DECL)
|
||||||
|
switch (TREE_CODE_CLASS (TREE_CODE (t1)))
|
||||||
|
{
|
||||||
|
case 'd': t1 = DECL_CONTEXT (t1); break;
|
||||||
|
case 't': t1 = TYPE_CONTEXT (t1); break;
|
||||||
|
case 'b': t1 = BLOCK_SUPERCONTEXT (t1); break;
|
||||||
|
default: abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (t2 && TREE_CODE (t2) != TRANSLATION_UNIT_DECL)
|
||||||
|
switch (TREE_CODE_CLASS (TREE_CODE (t2)))
|
||||||
|
{
|
||||||
|
case 'd': t2 = DECL_CONTEXT (t1); break;
|
||||||
|
case 't': t2 = TYPE_CONTEXT (t2); break;
|
||||||
|
case 'b': t2 = BLOCK_SUPERCONTEXT (t2); break;
|
||||||
|
default: abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return t1 == t2;
|
||||||
|
}
|
||||||
|
|
||||||
/* The C standard says that two structures in different translation
|
/* The C standard says that two structures in different translation
|
||||||
units are compatible with each other only if the types of their
|
units are compatible with each other only if the types of their
|
||||||
fields are compatible (among other things). So, consider two copies
|
fields are compatible (among other things). So, consider two copies
|
||||||
|
|
Loading…
Reference in New Issue