summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog2
-rw-r--r--gcc/cp/decl2.c6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/typedef3.C25
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);
+}