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

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

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

gcc/cp/ChangeLog

2012-04-15  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: r186473
This commit is contained in:
Fabien Chêne 2012-04-15 22:22:44 +02:00
parent 882eae6250
commit 4ed4833744
5 changed files with 44 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2012-04-15 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-13 Jason Merrill <jason@redhat.com>
PR c++/52824

View File

@ -1,5 +1,5 @@
/* 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.
Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
@ -400,6 +400,9 @@ pop_binding (tree id, tree decl)
tree
strip_using_decl (tree decl)
{
if (decl == NULL_TREE)
return NULL_TREE;
while (TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
decl = USING_DECL_DECLS (decl);
return decl;
@ -4115,9 +4118,13 @@ qualify_lookup (tree val, int flags)
return false;
if ((flags & LOOKUP_PREFER_NAMESPACES) && TREE_CODE (val) == NAMESPACE_DECL)
return true;
if ((flags & LOOKUP_PREFER_TYPES)
&& (TREE_CODE (val) == TYPE_DECL || TREE_CODE (val) == TEMPLATE_DECL))
return true;
if (flags & LOOKUP_PREFER_TYPES)
{
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))
return false;
/* Look through lambda things that we shouldn't be able to see. */

View File

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

View File

@ -1,3 +1,8 @@
2012-04-15 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/52465
* g++.dg/lookup/using52.C: New.
2012-04-13 Jason Merrill <jason@redhat.com>
PR c++/52824

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 {};
};