Commit af79925b by Fabien Chêne

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
parent 6cc5558f
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
......
/* 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) ...@@ -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) ...@@ -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)) {
tree target_val = strip_using_decl (val);
if (TREE_CODE (target_val) == TYPE_DECL
|| TREE_CODE (target_val) == TEMPLATE_DECL)
return true; 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. */
......
...@@ -17845,6 +17845,8 @@ cp_parser_class_name (cp_parser *parser, ...@@ -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
......
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.
......
// { dg-do compile }
// PR c++/52645
class A
{
protected:
struct B {};
};
class C : A
{
protected:
using A::B;
struct D : public B {};
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment