From 33964bf4af75b5e6de8ef1b51979a6d96032b54b Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 9 Dec 1998 11:46:02 +0000 Subject: [PATCH] decl.c (grokdeclarator): Update the name of the TEMPLATE_DECL... * 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. From-SVN: r24218 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/decl.c | 7 ++++++ gcc/testsuite/g++.old-deja/g++.pt/derived1.C | 24 ++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/derived1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 40280afc8a2..fc5d228611b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +1998-12-09 Mark Mitchell + + * 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 * cp/except.c (call_eh_info): use __start_cp_handler instead of diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 260053b3bc4..6f23465ee44 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 00000000000..e2275f4328d --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/derived1.C @@ -0,0 +1,24 @@ +// Build don't link: + +class A +{ +public: + typedef int Info; +}; + +template +class B : public A +{ +public: + typedef struct{ + int a; + int b; + } Info; +}; + +void f() +{ + B::Info ie; + ie.a=1; + ie.b=2; +} -- 2.30.2