re PR c++/10530 (Cannot access non-dependent type within nested template)
authorNathan Sidwell <nathan@codesourcery.com>
Sun, 10 Aug 2003 14:54:22 +0000 (14:54 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Sun, 10 Aug 2003 14:54:22 +0000 (14:54 +0000)
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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/dependent-name2.C [new file with mode: 0644]

index 9c897331e6b2dcf4f9a1ef4bfaca931b82e6f053..4db8e19ede84e357c1309e297f01685757849136 100644 (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
index 706691c6b6a4d19b7fec60659fcccac8c7e82713..a4e55c0330da7c3968a163a81a8bfb1d93d344fb 100644 (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)
index a536a70b44a7f78b4ee031694ddb3b48905f431a..34e5185272b7831ed97b0d246373f10b4636b151 100644 (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.
diff --git a/gcc/testsuite/g++.dg/template/dependent-name2.C b/gcc/testsuite/g++.dg/template/dependent-name2.C
new file mode 100644 (file)
index 0000000..611d5f9
--- /dev/null
@@ -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);
+}