aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-08-23 09:44:08 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-08-23 09:44:08 +0000
commit8597cab14b29f161d4847976f604058e0ac983ea (patch)
tree2862f6b164d5a15639114c27d3cb1153d64a8bf6
parentfb489f55b58e5725bf04fbd26181c3c196fb5f32 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/name-lookup.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/using53.C53
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" }
+}