re PR c++/37140 (type inherited from base class not recognized)
authorFabien Chêne <fabien@gcc.gnu.org>
Sun, 2 Feb 2014 19:58:06 +0000 (20:58 +0100)
committerFabien Chêne <fabien@gcc.gnu.org>
Sun, 2 Feb 2014 19:58:06 +0000 (20:58 +0100)
2014-02-02  Fabien Chene  <fabien@gcc.gnu.org>
        PR c++/37140
        * parser.c (cp_parser_nonclass_name): Call strip_using_decl and
move the code handling dependent USING_DECLs...
        * name-lookup.c (strip_using_decl): ...Here.

2014-02-02  Fabien Chene  <fabien@gcc.gnu.org>

        PR c++/37140
        * g++.dg/template/using27.C: New.
* g++.dg/template/using28.C: New.
* g++.dg/template/using29.C: New.

From-SVN: r207407

gcc/cp/name-lookup.c

index 3ffcf6971fa4cabb0a7ff082ae9c7178cbecf188..ea16061f2ae7d510c5cb6294da2dacc5c55d9f8b 100644 (file)
@@ -406,7 +406,8 @@ pop_bindings_and_leave_scope (void)
   leave_scope ();
 }
 
-/* Strip non dependent using declarations.  */
+/* Strip non dependent using declarations. If DECL is dependent,
+   surreptitiously create a typename_type and return it.  */
 
 tree
 strip_using_decl (tree decl)
@@ -416,6 +417,23 @@ strip_using_decl (tree decl)
 
   while (TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
     decl = USING_DECL_DECLS (decl);
+
+  if (TREE_CODE (decl) == USING_DECL && DECL_DEPENDENT_P (decl)
+      && USING_DECL_TYPENAME_P (decl))
+    {
+      /* We have found a type introduced by a using
+        declaration at class scope that refers to a dependent
+        type.
+            
+        using typename :: [opt] nested-name-specifier unqualified-id ;
+      */
+      decl = make_typename_type (TREE_TYPE (decl),
+                                DECL_NAME (decl),
+                                typename_type, tf_error);
+      if (decl != error_mark_node)
+       decl = TYPE_NAME (decl);
+    }
+
   return decl;
 }