aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-05-22 19:00:23 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-05-22 19:00:23 +0000
commit4699c56180e1c24d79a26319b34bb2f4209fda3c (patch)
tree60c41b570dd9241e15bcd384ed6d89d85844dded
parentba50acac81ba0674e185fa5db13cec03726dd6b1 (diff)
downloadgcc-4699c56180e1c24d79a26319b34bb2f4209fda3c.zip
gcc-4699c56180e1c24d79a26319b34bb2f4209fda3c.tar.gz
gcc-4699c56180e1c24d79a26319b34bb2f4209fda3c.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c25
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/spec32.C5
3 files changed, 24 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7623f18..54c98b8 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 8c80173..702c48f 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 0000000..3d63461
--- /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>;