diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7623f188722038607b94da146fec984887ca8295..54c98b81b59dd604c89d720175f05bfb7a5b53ec 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 8c8017356b8af35de809fd4e57db73e0cf5beb6d..702c48fab12369ac737859116cd4d8dcc1dea72d 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 0000000000000000000000000000000000000000..3d63461f9578b3689efde633f86d4abdc33517b8 --- /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>;