re PR c++/52465 (g++ rejects valid code with in-class using declaration)

gcc/testsuite/ChangeLog

2012-04-09  Fabien Chêne  <fabien@gcc.gnu.org>

	PR c++/52465
	* g++.dg/lookup/using52.C: New.

gcc/cp/ChangeLog

2012-04-09  Fabien Chêne  <fabien@gcc.gnu.org>

	PR c++/52465
	* parser.c (cp_parser_class_name): Call strip_using_decl and
	return the target decl.
	* name-lookup.c (strip_using_decl): Returns NULL_TREE if the decl
	to be stripped is NULL_TREE.
	(qualify_lookup): Call strip_using_decl and perform some checks on
	the target decl.

From-SVN: r186355
This commit is contained in:
Fabien Chêne 2012-04-11 22:40:51 +02:00
parent 6cc5558fe8
commit af79925b5f
5 changed files with 44 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2012-04-11 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/52465
* parser.c (cp_parser_class_name): Call strip_using_decl and
return the target decl.
* name-lookup.c (strip_using_decl): Returns NULL_TREE if the decl
to be stripped is NULL_TREE.
(qualify_lookup): Call strip_using_decl and perform some checks on
the target decl.
2012-04-11 Jason Merrill <jason@redhat.com> 2012-04-11 Jason Merrill <jason@redhat.com>
PR debug/45088 PR debug/45088

View File

@ -1,5 +1,5 @@
/* Definitions for C++ name lookup routines. /* Definitions for C++ name lookup routines.
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
@ -400,6 +400,9 @@ pop_binding (tree id, tree decl)
tree tree
strip_using_decl (tree decl) strip_using_decl (tree decl)
{ {
if (decl == NULL_TREE)
return NULL_TREE;
while (TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl)) while (TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
decl = USING_DECL_DECLS (decl); decl = USING_DECL_DECLS (decl);
return decl; return decl;
@ -4115,9 +4118,13 @@ qualify_lookup (tree val, int flags)
return false; return false;
if ((flags & LOOKUP_PREFER_NAMESPACES) && TREE_CODE (val) == NAMESPACE_DECL) if ((flags & LOOKUP_PREFER_NAMESPACES) && TREE_CODE (val) == NAMESPACE_DECL)
return true; return true;
if ((flags & LOOKUP_PREFER_TYPES) if (flags & LOOKUP_PREFER_TYPES)
&& (TREE_CODE (val) == TYPE_DECL || TREE_CODE (val) == TEMPLATE_DECL)) {
return true; tree target_val = strip_using_decl (val);
if (TREE_CODE (target_val) == TYPE_DECL
|| TREE_CODE (target_val) == TEMPLATE_DECL)
return true;
}
if (flags & (LOOKUP_PREFER_NAMESPACES | LOOKUP_PREFER_TYPES)) if (flags & (LOOKUP_PREFER_NAMESPACES | LOOKUP_PREFER_TYPES))
return false; return false;
/* Look through lambda things that we shouldn't be able to see. */ /* Look through lambda things that we shouldn't be able to see. */

View File

@ -17845,6 +17845,8 @@ cp_parser_class_name (cp_parser *parser,
decl = TYPE_NAME (decl); decl = TYPE_NAME (decl);
} }
decl = strip_using_decl (decl);
/* Check to see that it is really the name of a class. */ /* Check to see that it is really the name of a class. */
if (TREE_CODE (decl) == TEMPLATE_ID_EXPR if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
&& TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE

View File

@ -1,3 +1,8 @@
2012-04-11 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/52465
* g++.dg/lookup/using52.C: New.
2012-04-11 Manuel López-Ibáñez <manu@gcc.gnu.org> 2012-04-11 Manuel López-Ibáñez <manu@gcc.gnu.org>
* lib/prune.exp (TEST_ALWAYS_FLAGS): If undefined, set to empty. * lib/prune.exp (TEST_ALWAYS_FLAGS): If undefined, set to empty.

View File

@ -0,0 +1,16 @@
// { dg-do compile }
// PR c++/52645
class A
{
protected:
struct B {};
};
class C : A
{
protected:
using A::B;
struct D : public B {};
};