aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Chêne <fabien@gcc.gnu.org>2011-05-31 21:02:19 +0200
committerFabien Chêne <fabien@gcc.gnu.org>2011-05-31 21:02:19 +0200
commitff7714547ff7aaaac44011e2184fc876945ad0a5 (patch)
tree97fbbfa522f7cabcc14f432ab9403e0da183ef5f
parentd73b65b6dbed146ca88c93a183eae1cbe7b430b1 (diff)
downloadgcc-ff7714547ff7aaaac44011e2184fc876945ad0a5.zip
gcc-ff7714547ff7aaaac44011e2184fc876945ad0a5.tar.gz
gcc-ff7714547ff7aaaac44011e2184fc876945ad0a5.tar.bz2
re PR c++/48010 (typedef redefinitions are allowed if the redefined type is a nested class type)
gcc/cp/ChangeLog 2010-05-31 Fabien Chene <fabien@gcc.gnu.org> PR c++/48010 * name-lookup.c (supplement_binding_1): If the old binding was a type name, also check that the DECL actually refers to the same type or is not a type. gcc/testsuite/ChangeLog 2010-05-31 Fabien Chene <fabien@gcc.gnu.org> PR c++/48010 * g++.dg/lookup/name-clash9.C: New. From-SVN: r174506
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/name-lookup.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/name-clash9.C8
4 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 10a1d77..7a8042b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2010-05-31 Fabien Chêne <fabien@gcc.gnu.org>
+
+ PR c++/48010
+ * name-lookup.c (supplement_binding_1): If the old binding was a
+ type name, also check that the DECL actually refers to the same
+ type or is not a type.
+
2011-05-31 Jason Merrill <jason@redhat.com>
PR c++/44870
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 0e762fd..7f0f615 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -1,5 +1,5 @@
/* Definitions for C++ name lookup routines.
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
@@ -436,7 +436,9 @@ supplement_binding_1 (cxx_binding *binding, tree decl)
&& DECL_ANTICIPATED (bval)
&& !DECL_HIDDEN_FRIEND_P (bval)))
binding->value = decl;
- else if (TREE_CODE (bval) == TYPE_DECL && DECL_ARTIFICIAL (bval))
+ else if (TREE_CODE (bval) == TYPE_DECL && DECL_ARTIFICIAL (bval)
+ && (TREE_CODE (decl) != TYPE_DECL
+ || same_type_p (TREE_TYPE (decl), TREE_TYPE (bval))))
{
/* The old binding was a type name. It was placed in
VALUE field because it was thought, at the point it was
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f9fae62..10a41bd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-15 Fabien Chêne <fabien@gcc.gnu.org>
+
+ PR c++/48010
+ * g++.dg/lookup/name-clash9.C: New.
+
2011-05-31 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash9.C b/gcc/testsuite/g++.dg/lookup/name-clash9.C
new file mode 100644
index 0000000..4167f47
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/name-clash9.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR c++/48010
+
+struct A
+{
+ struct type {}; // { dg-error "conflicts with previous" }
+ typedef int type; // { dg-error "declaration" }
+};