re PR c++/48010 (typedef redefinitions are allowed if the redefined type is a nested...
authorFabien Chêne <fabien@gcc.gnu.org>
Tue, 31 May 2011 19:02:19 +0000 (21:02 +0200)
committerFabien Chêne <fabien@gcc.gnu.org>
Tue, 31 May 2011 19:02:19 +0000 (21:02 +0200)
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

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/name-clash9.C [new file with mode: 0644]

index 10a1d776df906baf34e444ace710ea4056ec5c9a..7a8042b6194c2b5c18d1c7d34c1b984df8a79a36 100644 (file)
@@ -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
index 0e762fd6aca0e64ee5c59246d30d9d606ecf4ba5..7f0f6153998de9b1f1180d8cf6da68e11ef3175b 100644 (file)
@@ -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
index f9fae6282e4b2eef640473abddadc13fe244d556..10a41bd30d9b46438fd91c8c4ef59f3dfded7831 100644 (file)
@@ -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 (file)
index 0000000..4167f47
--- /dev/null
@@ -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" }
+};