From 4699c56180e1c24d79a26319b34bb2f4209fda3c Mon Sep 17 00:00:00 2001 From: Mark Mitchell 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 7623f188722..54c98b81b59 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 1999-05-22 Mark Mitchell + * 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 8c8017356b8..702c48fab12 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 00000000000..3d63461f957 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/spec32.C @@ -0,0 +1,5 @@ +// Build don't link: +// Origin: Raja R Harinath + +template class foo; +template struct foo; -- 2.30.2