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
This commit is contained in:
Paolo Carlini 2012-08-23 09:44:08 +00:00 committed by Paolo Carlini
parent fb489f55b5
commit 8597cab14b
4 changed files with 77 additions and 2 deletions

View File

@ -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.

View File

@ -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. */

View File

@ -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:

View File

@ -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" }
}