diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-08-23 09:44:08 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-08-23 09:44:08 +0000 |
commit | 8597cab14b29f161d4847976f604058e0ac983ea (patch) | |
tree | 2862f6b164d5a15639114c27d3cb1153d64a8bf6 | |
parent | fb489f55b58e5725bf04fbd26181c3c196fb5f32 (diff) | |
download | gcc-8597cab14b29f161d4847976f604058e0ac983ea.zip gcc-8597cab14b29f161d4847976f604058e0ac983ea.tar.gz gcc-8597cab14b29f161d4847976f604058e0ac983ea.tar.bz2 |
re PR c++/20420 (Incorrectly Accepts double declarations)
/cp
2012-08-23 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/20420
* name-lookup.c (supplement_binding_1): Handle specially enums
only in class templates.
(validate_nonmember_using_decl): Enforce 7.3.3/10 about duplicate
using declarations at function scope.
/testsuite
2012-08-23 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/20420
* g++.dg/lookup/using53.C: New.
From-SVN: r190618
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/using53.C | 53 |
4 files changed, 77 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0d9de13..58e6e1f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2012-08-23 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/20420 + * name-lookup.c (supplement_binding_1): Handle specially enums + only in class templates. + (validate_nonmember_using_decl): Enforce 7.3.3/10 about duplicate + using declarations at function scope. + 2012-08-21 Richard Guenther <rguenther@suse.de> * cp-tree.h (TREE_INDIRECT_USING): Use TREE_LANG_FLAG_0 accessor. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index f8dbfa1..22bc5e7 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -441,7 +441,8 @@ supplement_binding_1 (cxx_binding *binding, tree decl) template in order to handle late matching of underlying type on an opaque-enum-declaration followed by an enum-specifier. */ - || (TREE_CODE (TREE_TYPE (target_decl)) == ENUMERAL_TYPE + || (processing_template_decl + && TREE_CODE (TREE_TYPE (target_decl)) == ENUMERAL_TYPE && TREE_CODE (TREE_TYPE (target_bval)) == ENUMERAL_TYPE && (dependent_type_p (ENUM_UNDERLYING_TYPE (TREE_TYPE (target_decl))) @@ -2420,7 +2421,15 @@ validate_nonmember_using_decl (tree decl, tree scope, tree name) gcc_assert (DECL_P (decl)); /* Make a USING_DECL. */ - return push_using_decl (scope, name); + tree using_decl = push_using_decl (scope, name); + + if (using_decl == NULL_TREE + && at_function_scope_p () + && TREE_CODE (decl) == VAR_DECL) + /* C++11 7.3.3/10. */ + error ("%qD is already declared in this scope", name); + + return using_decl; } /* Process local and global using-declarations. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6f8cae8..7e011ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-08-23 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/20420 + * g++.dg/lookup/using53.C: New. + 2012-08-23 Georg-Johann Lay <avr@gjlay.de> * gcc.dg/fixed-point/convert.c: Split into manageable parts: diff --git a/gcc/testsuite/g++.dg/lookup/using53.C b/gcc/testsuite/g++.dg/lookup/using53.C new file mode 100644 index 0000000..a108b50 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using53.C @@ -0,0 +1,53 @@ +// PR c++/20420 + +class B +{ +protected: + enum E { E1, E2, E3 }; + struct S { int i; E e; }; +}; + +class D : private B +{ +public: + using B::E; // { dg-message "previous" } + using B::S; // { dg-message "previous" } + +private: + enum E {}; // { dg-error "conflicts" } + struct S {}; // { dg-error "conflicts" } +}; + +template<typename T> +class BT +{ +protected: + enum E { E1, E2, E3 }; + struct S { int i; E e; }; +}; + +template<typename T> +class DT : private BT<T> +{ +public: + using BT<T>::E; // { dg-message "previous" } + using BT<T>::S; // { dg-message "previous" } + +private: + enum E {}; // { dg-error "conflicts" } + struct S {}; // { dg-error "conflicts" } +}; + +template class DT<int>; + +namespace N +{ + int i; +} + +void +f () +{ + using N::i; + using N::i; // { dg-error "declared" } +} |