Commit 6a091e8b by Jason Merrill Committed by Jason Merrill

decl.c (grokdeclarator): Strip the injected-class-name typedef if we are…

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
parent 701bd2a2
2012-04-11 Jason Merrill <jason@redhat.com> 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 PR c++/52906
* decl.c (check_tag_decl): Don't complain about attributes if we * decl.c (check_tag_decl): Don't complain about attributes if we
don't even have a type. don't even have a type.
......
...@@ -8943,6 +8943,17 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -8943,6 +8943,17 @@ grokdeclarator (const cp_declarator *declarator,
error ("qualifiers are not allowed on declaration of %<operator %T%>", error ("qualifiers are not allowed on declaration of %<operator %T%>",
ctor_return_type); 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_quals |= cp_type_quals (type);
type = cp_build_qualified_type_real type = cp_build_qualified_type_real
(type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl) (type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl)
......
2012-04-11 Jason Merrill <jason@redhat.com> 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 PR c++/52906
* g++.dg/ext/attrib45.C: New. * g++.dg/ext/attrib45.C: New.
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
struct A struct A
{ {
virtual ~A(); virtual ~A(){}
}; };
struct B : public A struct B : public A
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
template<class T> template<class T>
struct A struct A
{ {
virtual ~A(); virtual ~A(){}
}; };
struct B : public A<int> struct B : public A<int>
......
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