re PR c++/10530 (Cannot access non-dependent type within nested template)

cp:
	PR c++/10530
	* pt.c (dependent_type_p_r): A dependent template-id is a class
	type with dependent template arguments, or a bound template
	template parameter.
	(type_dependent_expression_p): A template function decl cannot
	have a dependent context.
testsuite:
	PR c++/10530
	* g++.dg/template/dependent-name2.C: New test.

From-SVN: r70293
This commit is contained in:
Nathan Sidwell 2003-08-10 14:54:22 +00:00 committed by Nathan Sidwell
parent 3372178cc3
commit 86306a6b11
4 changed files with 49 additions and 14 deletions

View File

@ -1,3 +1,12 @@
2003-08-10 Nathan Sidwell <nathan@codesourcery.com>
PR c++/10530
* pt.c (dependent_type_p_r): A dependent template-id is a class
type with dependent template arguments, or a bound template
template parameter.
(type_dependent_expression_p): A template function decl cannot
have a dependent context.
2003-08-07 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/5767

View File

@ -11348,25 +11348,23 @@ dependent_type_p_r (tree type)
return true;
return dependent_type_p (TREE_TYPE (type));
}
/* -- a template-id in which either the template name is a template
parameter or any of the template arguments is a dependent type or
an expression that is type-dependent or value-dependent.
This language seems somewhat confused; for example, it does not
discuss template template arguments. Therefore, we use the
definition for dependent template arguments in [temp.dep.temp]. */
if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INFO (type)
&& (dependent_template_id_p
(CLASSTYPE_TI_TEMPLATE (type),
CLASSTYPE_TI_ARGS (type))))
parameter ... */
if (TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
return true;
else if (TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
/* ... or any of the template arguments is a dependent type or
an expression that is type-dependent or value-dependent. */
else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INFO (type)
&& any_dependent_template_arguments_p (CLASSTYPE_TI_ARGS (type)))
return true;
/* All TYPEOF_TYPEs are dependent; if the argument of the `typeof'
expression is not type-dependent, then it should already been
have resolved. */
if (TREE_CODE (type) == TYPEOF_TYPE)
return true;
/* The standard does not specifically mention types that are local
to template functions or local classes, but they should be
considered dependent too. For example:
@ -11616,9 +11614,8 @@ type_dependent_expression_p (tree expression)
if (TREE_CODE (expression) == FUNCTION_DECL
&& DECL_LANG_SPECIFIC (expression)
&& DECL_TEMPLATE_INFO (expression)
&& (dependent_template_id_p
(DECL_TI_TEMPLATE (expression),
INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
&& (any_dependent_template_arguments_p
(INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
return true;
if (TREE_TYPE (expression) == unknown_type_node)

View File

@ -1,3 +1,8 @@
2003-08-10 Nathan Sidwell <nathan@codesourcery.com>
PR c++/10530
* g++.dg/template/dependent-name2.C: New test.
2003-08-08 Andrew Pinski <pinskia@physics.uc.edu>
* g++.dg/parse/crash11.C: Put the dg options in comments.

View File

@ -0,0 +1,24 @@
// { dg-do compile }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 1 Aug 2003 <nathan@codesourcery.com>
// PR 10530. Thought a type was dependent.
template <typename T>
struct Foo {
struct Inner {
typedef int type;
};
};
template <typename A> struct Bar {
typedef typename Foo<int>::Inner::type type;
};
template <template <typename T> class TPL> void Foo ()
{
TPL<int> x;
f (x);
}