Commit d75ff184 by Richard Sandiford Committed by Richard Sandiford

decl.c (duplicate_decls): Don't try to unify an implicit typedef with an explicit one.

	* decl.c (duplicate_decls): Don't try to unify an implicit typedef
	with an explicit one.
	(lookup_tag): Extract the tag of an explicit typedef.

From-SVN: r52159
parent df51a245
2002-04-11 Richard Sandiford <rsandifo@redhat.com>
* decl.c (duplicate_decls): Don't try to unify an implicit typedef
with an explicit one.
(lookup_tag): Extract the tag of an explicit typedef.
2002-04-10 Nathan Sidwell <nathan@codesourcery.com>
PR c++/5507
......
......@@ -3426,6 +3426,18 @@ duplicate_decls (newdecl, olddecl)
}
}
/* Do not merge an implicit typedef with an explicit one. In:
class A;
...
typedef class A A __attribute__ ((foo));
the attribute should apply only to the typedef. */
if (TREE_CODE (olddecl) == TYPE_DECL
&& (DECL_IMPLICIT_TYPEDEF_P (olddecl)
|| DECL_IMPLICIT_TYPEDEF_P (newdecl)))
return 0;
/* If new decl is `static' and an `extern' was seen previously,
warn about it. */
warn_extern_redeclared_static (newdecl, olddecl);
......@@ -5336,10 +5348,23 @@ lookup_tag (form, name, binding_level, thislevel_only)
else
old = BINDING_TYPE (old);
/* If it has an original type, it is a typedef, and we
should not return it. */
/* If the declaration has an original type, it must a
typedef. When it is an explicit typedef of the form:
typedef struct A A;
the original type will be the tag that we want.
We should not return any other kind of typedef.
Detect the valid case by checking that the original
type has the same name and context as the typedef. */
if (old && DECL_ORIGINAL_TYPE (TYPE_NAME (old)))
old = NULL_TREE;
{
old = DECL_ORIGINAL_TYPE (TYPE_NAME (old));
if (TYPE_IDENTIFIER (old) != name
|| context_for_name_lookup (TYPE_NAME (old)) != tail)
old = NULL_TREE;
}
if (old && TREE_CODE (old) != form
&& (form == ENUMERAL_TYPE || TREE_CODE (old) == ENUMERAL_TYPE))
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment