diff options
-rw-r--r-- | gcc/cp/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/typedef3.C | 25 |
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cffacb0e2f3..9e690446789 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -5,6 +5,8 @@ Tue Apr 21 22:00:04 1998 Mark Mitchell <mmitchell@usa.net> * decl2.c (check_member_template): Set DECL_IGNORED for member class templates, too. + * decl2.c (grokfield): Remangle the name of a member TYPE_DECL. + Tue Apr 21 18:59:11 1998 Benjamin Kosnik <bkoz@rhino.cygnus.com> * decl.c (duplicate_decls): Only check DECL_FRIEND_P if function. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 6b24edc0e0e..52900c478c8 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1579,6 +1579,12 @@ grokfield (declarator, declspecs, init, asmspec_tree, attrlist) DECL_CLASS_CONTEXT (value) = current_class_type; CLASSTYPE_LOCAL_TYPEDECLS (current_class_type) = 1; + /* Now that we've updated the context, we need to remangle the + name for this TYPE_DECL. */ + DECL_ASSEMBLER_NAME (value) = DECL_NAME (value); + DECL_ASSEMBLER_NAME (value) = + get_identifier (build_overload_name (TREE_TYPE (value), 1, 1)); + pushdecl_class_level (value); return value; } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/typedef3.C b/gcc/testsuite/g++.old-deja/g++.pt/typedef3.C new file mode 100644 index 00000000000..110e4814515 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/typedef3.C @@ -0,0 +1,25 @@ +// Build don't link: + +template <class T> +void f(T, T) +{ +} + +struct A { + typedef enum { + VAL1 + } result_t; +}; + +struct B { + typedef enum { + VAL2 + } result_t; +}; + + +void g() +{ + f(A::VAL1, A::VAL1); + f(B::VAL2, B::VAL2); +} |