re PR c++/37140 (type inherited from base class not recognized)

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
This commit is contained in:
Fabien Chêne 2014-02-02 20:58:06 +01:00
parent 2ace77c21a
commit 7f82286eb6

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