* decl.c (grokdeclarator): Update the name of the TEMPLATE_DECL, as
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Dec 1998 11:46:02 +0000 (11:46 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Dec 1998 11:46:02 +0000 (11:46 +0000)
well as the TYPE_DECL, when a typedef name is assigned to a
previously anonymous type.

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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.old-deja/g++.pt/derived1.C [new file with mode: 0644]

index 40280af..fc5d228 100644 (file)
@@ -1,3 +1,9 @@
+1998-12-09  Mark Mitchell  <mark@markmitchell.com>
+
+       * decl.c (grokdeclarator): Update the name of the TEMPLATE_DECL, as
+       well as the TYPE_DECL, when a typedef name is assigned to a
+       previously anonymous type.
+
 1998-12-08  Andrew MacLeod  <amacleod@cygnus.com>
 
        * cp/except.c (call_eh_info): use __start_cp_handler instead of
index 260053b..6f23465 100644 (file)
@@ -10378,6 +10378,13 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
          if (TYPE_LANG_SPECIFIC (type))
            TYPE_WAS_ANONYMOUS (type) = 1;
 
+         /* If this is a typedef within a template class, the nested
+            type is a (non-primary) template.  The name for the
+            template needs updating as well.  */
+         if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_TEMPLATE_INFO (type))
+           DECL_NAME (CLASSTYPE_TI_TEMPLATE (type)) 
+             = TYPE_IDENTIFIER (type);
+
          /* XXX Temporarily set the scope. 
             When returning, start_decl expects it as NULL_TREE,
             and will then then set it using pushdecl. */
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/derived1.C b/gcc/testsuite/g++.old-deja/g++.pt/derived1.C
new file mode 100644 (file)
index 0000000..e2275f4
--- /dev/null
@@ -0,0 +1,24 @@
+// Build don't link:
+
+class A
+{
+public:
+  typedef int Info;
+};
+
+template <class T>
+class B : public A
+{
+public:
+  typedef struct{
+    int a; 
+    int b;
+  } Info;
+};
+
+void f()
+{
+  B<A>::Info ie;
+  ie.a=1;
+  ie.b=2;
+}