Commit af4e7bac by Richard Sandiford

Revert previous patch.

From-SVN: r52166
parent 94ed0002
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> 2002-04-10 Nathan Sidwell <nathan@codesourcery.com>
PR c++/5507 PR c++/5507
......
...@@ -3426,18 +3426,6 @@ duplicate_decls (newdecl, olddecl) ...@@ -3426,18 +3426,6 @@ 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, /* If new decl is `static' and an `extern' was seen previously,
warn about it. */ warn about it. */
warn_extern_redeclared_static (newdecl, olddecl); warn_extern_redeclared_static (newdecl, olddecl);
...@@ -5348,23 +5336,10 @@ lookup_tag (form, name, binding_level, thislevel_only) ...@@ -5348,23 +5336,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
else else
old = BINDING_TYPE (old); old = BINDING_TYPE (old);
/* If the declaration has an original type, it must a /* If it has an original type, it is a typedef, and we
typedef. When it is an explicit typedef of the form: should not return it. */
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))) 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 if (old && TREE_CODE (old) != form
&& (form == ENUMERAL_TYPE || TREE_CODE (old) == ENUMERAL_TYPE)) && (form == ENUMERAL_TYPE || TREE_CODE (old) == ENUMERAL_TYPE))
{ {
......
2002-04-11 Richard Sandiford <rsandifo@redhat.com>
* g++.dg/ext/attrib5.C: New test.
2002-04-10 Janis Johnson <janis187@us.ibm.com> 2002-04-10 Janis Johnson <janis187@us.ibm.com>
* g77.f-torture/execute/6177.f: New test. * g77.f-torture/execute/6177.f: New test.
......
// There were two related problems here, depending on the vintage. At
// one time:
//
// typedef struct A { ... } A __attribute__ ((aligned (16)));
//
// would cause original_types to go into an infinite loop. At other
// times, the attributes applied to an explicit typedef would be lost
// (check_b2 would have a negative size).
// First check that the declaration is accepted and has an effect.
typedef struct A { int i; } A __attribute__ ((aligned (16)));
int check_A[__alignof__ (A) >= 16 ? 1 : -1];
// Check that the alignment is only applied to the typedef.
struct B { int i; };
namespace N { typedef B B; };
typedef struct B B __attribute__((aligned (16)));
N::B b1;
B b2;
int check_b1[__alignof__ (b1) == __alignof__ (int) ? 1 : -1];
int check_b2[__alignof__ (b2) >= 16 ? 1 : -1];
// The fix for this case involved a change to lookup_tag. This
// bit just checks against a possible regression.
namespace N { struct C; };
typedef struct N::C C; // { dg-error "previous declaration" }
struct C; // { dg-error "conflicting types" }
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