@@ -1155,16 +1155,6 @@ update_label_decls (struct c_scope *scope)
}
}
-/* Set the TYPE_CONTEXT of all of TYPE's variants to CONTEXT. */
-
-static void
-set_type_context (tree type, tree context)
-{
- for (type = TYPE_MAIN_VARIANT (type); type;
- type = TYPE_NEXT_VARIANT (type))
- TYPE_CONTEXT (type) = context;
-}
-
/* Exit a scope. Restore the state of the identifier-decl mappings
that were in effect when this scope was entered. Return a BLOCK
node containing all the DECLs in this scope that are of interest
@@ -1253,7 +1243,6 @@ pop_scope (void)
case ENUMERAL_TYPE:
case UNION_TYPE:
case RECORD_TYPE:
- set_type_context (p, context);
/* Types may not have tag-names, in which case the type
appears in the bindings list with b->id NULL. */
@@ -1364,12 +1353,7 @@ pop_scope (void)
the TRANSLATION_UNIT_DECL. This makes same_translation_unit_p
work. */
if (scope == file_scope)
- {
DECL_CONTEXT (p) = context;
- if (TREE_CODE (p) == TYPE_DECL
- && TREE_TYPE (p) != error_mark_node)
- set_type_context (TREE_TYPE (p), context);
- }
gcc_fallthrough ();
/* Parameters go in DECL_ARGUMENTS, not BLOCK_VARS, and have
@@ -2318,21 +2302,18 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
{
if (DECL_INITIAL (olddecl))
{
- /* If both decls are in the same TU and the new declaration
- isn't overriding an extern inline reject the new decl.
- In c99, no overriding is allowed in the same translation
- unit. */
- if ((!DECL_EXTERN_INLINE (olddecl)
- || DECL_EXTERN_INLINE (newdecl)
- || (!flag_gnu89_inline
- && (!DECL_DECLARED_INLINE_P (olddecl)
- || !lookup_attribute ("gnu_inline",
- DECL_ATTRIBUTES (olddecl)))
- && (!DECL_DECLARED_INLINE_P (newdecl)
- || !lookup_attribute ("gnu_inline",
- DECL_ATTRIBUTES (newdecl))))
- )
- && same_translation_unit_p (newdecl, olddecl))
+ /* If the new declaration isn't overriding an extern inline
+ reject the new decl. In c99, no overriding is allowed
+ in the same translation unit. */
+ if (!DECL_EXTERN_INLINE (olddecl)
+ || DECL_EXTERN_INLINE (newdecl)
+ || (!flag_gnu89_inline
+ && (!DECL_DECLARED_INLINE_P (olddecl)
+ || !lookup_attribute ("gnu_inline",
+ DECL_ATTRIBUTES (olddecl)))
+ && (!DECL_DECLARED_INLINE_P (newdecl)
+ || !lookup_attribute ("gnu_inline",
+ DECL_ATTRIBUTES (newdecl)))))
{
auto_diagnostic_group d;
error ("redefinition of %q+D", newdecl);
@@ -3360,18 +3341,11 @@ pushdecl (tree x)
type to the composite of all the types of that declaration.
After the consistency checks, it will be reset to the
composite of the visible types only. */
- if (b && (TREE_PUBLIC (x) || same_translation_unit_p (x, b->decl))
- && b->u.type)
+ if (b && b->u.type)
TREE_TYPE (b->decl) = b->u.type;
- /* The point of the same_translation_unit_p check here is,
- we want to detect a duplicate decl for a construct like
- foo() { extern bar(); } ... static bar(); but not if
- they are in different translation units. In any case,
- the static does not go in the externals scope. */
- if (b
- && (TREE_PUBLIC (x) || same_translation_unit_p (x, b->decl))
- && duplicate_decls (x, b->decl))
+ /* the static does not go in the externals scope. */
+ if (b && duplicate_decls (x, b->decl))
{
tree thistype;
if (vistype)
@@ -1259,7 +1259,7 @@ comptypes_internal (const_tree type1, const_tree type2, bool *enum_and_int_p,
case ENUMERAL_TYPE:
case RECORD_TYPE:
case UNION_TYPE:
- if (val != 1 && !same_translation_unit_p (t1, t2))
+ if (val != 1 && false)
{
tree a1 = TYPE_ATTRIBUTES (t1);
tree a2 = TYPE_ATTRIBUTES (t2);
@@ -1268,11 +1268,11 @@ comptypes_internal (const_tree type1, const_tree type2, bool *enum_and_int_p,
&& ! attribute_list_contained (a2, a1))
break;
- if (attrval != 2)
- return tagged_types_tu_compatible_p (t1, t2, enum_and_int_p,
- different_types_p);
val = tagged_types_tu_compatible_p (t1, t2, enum_and_int_p,
different_types_p);
+
+ if (attrval != 2)
+ return val;
}
break;
@@ -1347,40 +1347,7 @@ comp_target_types (location_t location, tree ttl, tree ttr)
/* Subroutines of `comptypes'. */
-/* Determine whether two trees derive from the same translation unit.
- If the CONTEXT chain ends in a null, that tree's context is still
- being parsed, so if two trees have context chains ending in null,
- they're in the same translation unit. */
-
-bool
-same_translation_unit_p (const_tree t1, const_tree t2)
-{
- while (t1 && TREE_CODE (t1) != TRANSLATION_UNIT_DECL)
- switch (TREE_CODE_CLASS (TREE_CODE (t1)))
- {
- case tcc_declaration:
- t1 = DECL_CONTEXT (t1); break;
- case tcc_type:
- t1 = TYPE_CONTEXT (t1); break;
- case tcc_exceptional:
- t1 = BLOCK_SUPERCONTEXT (t1); break; /* assume block */
- default: gcc_unreachable ();
- }
- while (t2 && TREE_CODE (t2) != TRANSLATION_UNIT_DECL)
- switch (TREE_CODE_CLASS (TREE_CODE (t2)))
- {
- case tcc_declaration:
- t2 = DECL_CONTEXT (t2); break;
- case tcc_type:
- t2 = TYPE_CONTEXT (t2); break;
- case tcc_exceptional:
- t2 = BLOCK_SUPERCONTEXT (t2); break; /* assume block */
- default: gcc_unreachable ();
- }
-
- return t1 == t2;
-}
/* Allocate the seen two types, assuming that they are compatible. */
@@ -1531,6 +1498,7 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
case UNION_TYPE:
{
struct tagged_tu_seen_cache *tu = alloc_tagged_tu_seen_cache (t1, t2);
+
if (list_length (TYPE_FIELDS (t1)) != list_length (TYPE_FIELDS (t2)))
{
tu->val = 0;
@@ -1609,7 +1577,7 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
return 0;
}
}
- tu->val = needs_warning ? 2 : 10;
+ tu->val = needs_warning ? 2 : 1;
return tu->val;
}
@@ -1617,6 +1585,12 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
{
struct tagged_tu_seen_cache *tu = alloc_tagged_tu_seen_cache (t1, t2);
+ if (list_length (TYPE_FIELDS (t1)) != list_length (TYPE_FIELDS (t2)))
+ {
+ tu->val = 0;
+ return 0;
+ }
+
for (s1 = TYPE_FIELDS (t1), s2 = TYPE_FIELDS (t2);
s1 && s2;
s1 = DECL_CHAIN (s1), s2 = DECL_CHAIN (s2))