* decl.c (grokdeclarator): Strip the injected-class-name typedef
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Apr 2012 17:55:25 +0000 (17:55 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Apr 2012 17:55:25 +0000 (17:55 +0000)
if we are building a declaration or compound type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186346 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C

index 1f34600..525ce99 100644 (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.
index 8b22192..711ceef 100644 (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)
index 5fbbcfc..7773d30 100644 (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.
 
index 81bcb27..06db9dc 100644 (file)
@@ -5,7 +5,7 @@
 
 struct A
 {
-    virtual ~A();
+    virtual ~A(){}
 };
 
 struct B : public A
index b1c5401..d5463c0 100644 (file)
@@ -6,7 +6,7 @@
 template<class T>
 struct A
 {
-    virtual ~A();
+    virtual ~A(){}
 };
 
 struct B : public A<int>