From 4699c56180e1c24d79a26319b34bb2f4209fda3c Mon Sep 17 00:00:00 2001
From: Mark Mitchell <mark@codesourcery.com>
Date: Sat, 22 May 1999 19:00:23 +0000
Subject: [PATCH] pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs,
 INDIRECT_REFs, and COMPONENT_REFs.

	* pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs,
	INDIRECT_REFs, and COMPONENT_REFs.  Handle FIELD_DECLs.

From-SVN: r27108
---
 gcc/cp/ChangeLog                           |  3 +++
 gcc/cp/pt.c                                | 25 ++++++++++++++--------
 gcc/testsuite/g++.old-deja/g++.pt/spec32.C |  5 +++++
 3 files changed, 24 insertions(+), 9 deletions(-)
 create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/spec32.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7623f1887220..54c98b81b59d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 1999-05-22  Mark Mitchell  <mark@codesourcery.com>
 
+	* pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs,
+	INDIRECT_REFs, and COMPONENT_REFs.  Handle FIELD_DECLs.
+	
 	* cp-tree.h (push_nested_namespace): Declare.
 	(pop_nested_namespace): Likewise.
 	* decl.c (push_nested_namespace): New function.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 8c8017356b8a..702c48fab123 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4117,7 +4117,6 @@ for_each_template_parm (t, fn, data)
 
     case FUNCTION_DECL:
     case VAR_DECL:
-      /* ??? What about FIELD_DECLs?  */
       if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
 	  && for_each_template_parm (DECL_TI_ARGS (t), fn, data))
 	return 1;
@@ -4162,6 +4161,7 @@ for_each_template_parm (t, fn, data)
     case VOID_TYPE:
     case BOOLEAN_TYPE:
     case NAMESPACE_DECL:
+    case FIELD_DECL:
       return 0;
 
       /* constants */
@@ -4192,16 +4192,24 @@ for_each_template_parm (t, fn, data)
     case ALIGNOF_EXPR:
       return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
 
+    case TYPENAME_TYPE:
+      if (!fn)
+	return 1;
+      return (for_each_template_parm (TYPE_CONTEXT (t), fn, data)
+	      || for_each_template_parm (TYPENAME_TYPE_FULLNAME (t),
+					 fn, data));
+
     case INDIRECT_REF:
     case COMPONENT_REF:
-      /* We assume that the object must be instantiated in order to build
-	 the COMPONENT_REF, so we test only whether the type of the
-	 COMPONENT_REF uses template parms.  On the other hand, if
-	 there's no type, then this thing must be some expression
+      /* If there's no type, then this thing must be some expression
 	 involving template parameters.  */
-      if (TREE_TYPE (t))
-	return for_each_template_parm (TREE_TYPE (t), fn, data);
-      /* Fall through.  */
+      if (!fn && !TREE_TYPE (t))
+	return 1;
+      if (TREE_CODE (t) == COMPONENT_REF)
+	return (for_each_template_parm (TREE_OPERAND (t, 0), fn, data)
+		|| for_each_template_parm (TREE_OPERAND (t, 1), fn, data));
+      else
+	return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
 
     case MODOP_EXPR:
     case CAST_EXPR:
@@ -4213,7 +4221,6 @@ for_each_template_parm (t, fn, data)
     case DOTSTAR_EXPR:
     case TYPEID_EXPR:
     case LOOKUP_EXPR:
-    case TYPENAME_TYPE:
       if (!fn)
 	return 1;
       /* Fall through.  */
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec32.C b/gcc/testsuite/g++.old-deja/g++.pt/spec32.C
new file mode 100644
index 000000000000..3d63461f9578
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/spec32.C
@@ -0,0 +1,5 @@
+// Build don't link:
+// Origin: Raja R Harinath <harinath@cs.umn.edu>
+
+template<class T1, class T2> class foo;
+template<class T> struct foo<T,typename T::bar>;
-- 
GitLab