mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
6cc5558fe8
commit
af79925b5f
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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 {};
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue