diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-23 09:44:08 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-23 09:44:08 +0000 |
commit | 245d37272b71bb409c4d79e2b4d1eb56583661d9 (patch) | |
tree | 2862f6b164d5a15639114c27d3cb1153d64a8bf6 /gcc/cp/name-lookup.c | |
parent | fde3b594648f36626fa9ae322d0b44287400a6bb (diff) | |
download | gcc-245d37272b71bb409c4d79e2b4d1eb56583661d9.tar.gz |
/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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190618 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/name-lookup.c')
-rw-r--r-- | gcc/cp/name-lookup.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index f8dbfa1b628..22bc5e7c006 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. */ |