decl.c (grokdeclarator): Strip the injected-class-name typedef if we are building a declaration or...

* decl.c (grokdeclarator): Strip the injected-class-name typedef
	if we are building a declaration or compound type.

From-SVN: r186346
This commit is contained in:
Jason Merrill 2012-04-11 13:55:25 -04:00 committed by Jason Merrill
parent 701bd2a2cc
commit 6a091e8bd8
5 changed files with 21 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2012-04-11 Jason Merrill <jason@redhat.com>
PR debug/45088
* decl.c (grokdeclarator): Strip the injected-class-name typedef
if we are building a declaration or compound type.
PR c++/52906
* decl.c (check_tag_decl): Don't complain about attributes if we
don't even have a type.

View File

@ -8943,6 +8943,17 @@ grokdeclarator (const cp_declarator *declarator,
error ("qualifiers are not allowed on declaration of %<operator %T%>",
ctor_return_type);
/* If we're using the injected-class-name to form a compound type or a
declaration, replace it with the underlying class so we don't get
redundant typedefs in the debug output. But if we are returning the
type unchanged, leave it alone so that it's available to
maybe_get_template_decl_from_type_decl. */
if (CLASS_TYPE_P (type)
&& DECL_SELF_REFERENCE_P (TYPE_NAME (type))
&& type == TREE_TYPE (TYPE_NAME (type))
&& (declarator || type_quals))
type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
type_quals |= cp_type_quals (type);
type = cp_build_qualified_type_real
(type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl)

View File

@ -1,5 +1,9 @@
2012-04-11 Jason Merrill <jason@redhat.com>
PR debug/45088
* g++.dg/debug/dwarf2/self-ref-1.C: Define virtual destructor.
* g++.dg/debug/dwarf2/self-ref-1.C: Likewise.
PR c++/52906
* g++.dg/ext/attrib45.C: New.

View File

@ -5,7 +5,7 @@
struct A
{
virtual ~A();
virtual ~A(){}
};
struct B : public A

View File

@ -6,7 +6,7 @@
template<class T>
struct A
{
virtual ~A();
virtual ~A(){}
};
struct B : public A<int>