From ff7714547ff7aaaac44011e2184fc876945ad0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabien=20Ch=C3=AAne?= Date: Tue, 31 May 2011 21:02:19 +0200 Subject: 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 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 PR c++/48010 * g++.dg/lookup/name-clash9.C: New. From-SVN: r174506 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/name-lookup.c | 6 ++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/name-clash9.C | 8 ++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lookup/name-clash9.C 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 + + 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 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 @@ -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 + + PR c++/48010 + * g++.dg/lookup/name-clash9.C: New. + 2011-05-31 Tobias Burnus 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" } +}; -- cgit v1.1