OSDN Git Service

2012-04-15 Fabien Chêne <fabien@gcc.gnu.org>
authorfabien <fabien@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 15 Apr 2012 20:22:44 +0000 (20:22 +0000)
committerfabien <fabien@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 15 Apr 2012 20:22:44 +0000 (20:22 +0000)
    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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186473 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/using52.C [new file with mode: 0644]

index a3a58f6..e75d32a 100644 (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
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/52824
index 2351342..fedf626 100644 (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.
    Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
 
    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)
 {
 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;
   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;
     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.  */
   if (flags & (LOOKUP_PREFER_NAMESPACES | LOOKUP_PREFER_TYPES))
     return false;
   /* Look through lambda things that we shouldn't be able to see.  */
index c4b4dd4..5bff67d 100644 (file)
@@ -17841,6 +17841,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.  */
   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
       && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
   /* 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
index 853c746..82324c6 100644 (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
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/52824
diff --git a/gcc/testsuite/g++.dg/lookup/using52.C b/gcc/testsuite/g++.dg/lookup/using52.C
new file mode 100644 (file)
index 0000000..bf26207
--- /dev/null
@@ -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 {};
+};