From: Nathan Sidwell Date: Sun, 10 Aug 2003 14:54:22 +0000 (+0000) Subject: re PR c++/10530 (Cannot access non-dependent type within nested template) X-Git-Tag: releases/gcc-3.4.0~4315 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86306a6b111cf8e6bef4c451761f3a458212a756;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9c897331e6b2..4db8e19ede84 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2003-08-10 Nathan Sidwell + + 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 PR c++/5767 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 706691c6b6a4..a4e55c0330da 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a536a70b44a7..34e5185272b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-08-10 Nathan Sidwell + + PR c++/10530 + * g++.dg/template/dependent-name2.C: New test. + 2003-08-08 Andrew Pinski * g++.dg/parse/crash11.C: Put the dg options in comments. diff --git a/gcc/testsuite/g++.dg/template/dependent-name2.C b/gcc/testsuite/g++.dg/template/dependent-name2.C new file mode 100644 index 000000000000..611d5f9c8d95 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name2.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Aug 2003 + +// PR 10530. Thought a type was dependent. + +template +struct Foo { + struct Inner { + typedef int type; + }; +}; + +template struct Bar { + typedef typename Foo::Inner::type type; +}; + +template