From 9e4c469a24b5a3bb6e72a9bc59009286501ce400 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 11 Nov 2015 20:16:59 -0500 Subject: [PATCH] decl.c (duplicate_decls): When combining typedefs, remove the new type from the variants list. * decl.c (duplicate_decls): When combining typedefs, remove the new type from the variants list. From-SVN: r230202 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9cbda291ac7..d1bf1219e00 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-11-11 Jason Merrill + + * decl.c (duplicate_decls): When combining typedefs, remove the + new type from the variants list. + 2015-11-11 Jason Merrill * pt.c (instantiate_class_template_1): Set function_depth around diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 76cc1d176e5..383b47d29ed 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2014,7 +2014,22 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) /* For typedefs use the old type, as the new type's DECL_NAME points at newdecl, which will be ggc_freed. */ if (TREE_CODE (newdecl) == TYPE_DECL) - newtype = oldtype; + { + newtype = oldtype; + + /* And remove the new type from the variants list. */ + if (TYPE_NAME (TREE_TYPE (newdecl)) == newdecl) + { + tree remove = TREE_TYPE (newdecl); + for (tree t = TYPE_MAIN_VARIANT (remove); ; + t = TYPE_NEXT_VARIANT (t)) + if (TYPE_NEXT_VARIANT (t) == remove) + { + TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); + break; + } + } + } else /* Merge the data types specified in the two decls. */ newtype = merge_types (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); -- 2.30.2