diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-04-10 10:51:09 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-04-10 10:51:09 +0000 |
commit | 7ac7b28f2e8891ab210369c1f2cefed50f6e9416 (patch) | |
tree | 40d42e8cdf16609c879bd94a10ba65ae98811a9c | |
parent | fe0ce42629c3f2d99a4591e596840b2933dd3c1f (diff) | |
download | gcc-7ac7b28f2e8891ab210369c1f2cefed50f6e9416.zip gcc-7ac7b28f2e8891ab210369c1f2cefed50f6e9416.tar.gz gcc-7ac7b28f2e8891ab210369c1f2cefed50f6e9416.tar.bz2 |
error.c (dump_type_real): If a typename is a template-id, put out the template arguments.
* error.c (dump_type_real): If a typename is a template-id, put
out the template arguments.
(dump_expr): Handle TEMPLATE_ID_EXPR.
* pt.c (lookup_template_class): Now that full arguments are
available everywhere, remove code that tried to guess them.
From-SVN: r26335
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/error.c | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/memclass20.C | 18 |
4 files changed, 44 insertions, 30 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6c64951..4d1db9c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +1999-04-10 Mark Mitchell <mark@codesourcery.com> + + * error.c (dump_type_real): If a typename is a template-id, put + out the template arguments. + (dump_expr): Handle TEMPLATE_ID_EXPR. + * pt.c (lookup_template_class): Now that full arguments are + available everywhere, remove code that tried to guess them. + 1999-04-09 Mark Mitchell <mark@codesourcery.com> * decl.c (make_typename_type): Complain if we don't find a type diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 055f92a..025e932 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -321,7 +321,7 @@ dump_type_real (t, v, canonical_name) OB_PUTS ("typename "); dump_type_real (TYPE_CONTEXT (t), 0, canonical_name); OB_PUTS ("::"); - OB_PUTID (TYPE_IDENTIFIER (t)); + dump_decl (TYPENAME_TYPE_FULLNAME (t), v); break; case TYPEOF_TYPE: @@ -1766,6 +1766,10 @@ dump_expr (t, nop) dump_expr (TREE_OPERAND (t, 0), nop); break; + case TEMPLATE_ID_EXPR: + dump_decl (t, 0); + break; + case TREE_LIST: if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL) { diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a4060c0..154ee1b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3568,9 +3568,9 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) if (context) push_decl_namespace (context); if (current_class_type != NULL_TREE) - template = + template = maybe_get_template_decl_from_type_decl - (IDENTIFIER_CLASS_VALUE (d1)); + (IDENTIFIER_CLASS_VALUE (d1))); if (template == NULL_TREE) template = lookup_name_nonclass (d1); if (context) @@ -3650,14 +3650,15 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) else { tree template_type = TREE_TYPE (template); + tree gen_tmpl; tree type_decl; tree found = NULL_TREE; int arg_depth; int parm_depth; int is_partial_instantiation; - template = most_general_template (template); - parmlist = DECL_TEMPLATE_PARMS (template); + gen_tmpl = most_general_template (template); + parmlist = DECL_TEMPLATE_PARMS (gen_tmpl); parm_depth = TMPL_PARMS_DEPTH (parmlist); arg_depth = TMPL_ARGS_DEPTH (arglist); @@ -3679,36 +3680,19 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) TEMPLATE will be `template <class T> template <class U> struct S1<T>::S2'. We must fill in the missing arguments. */ - my_friendly_assert (context != NULL_TREE, 0); - while (!IS_AGGR_TYPE_CODE (TREE_CODE (context)) - && context != global_namespace) - context = DECL_REAL_CONTEXT (context); - - if (context == global_namespace) - /* This is bad. We cannot get enough arguments, even from - the surrounding context, to resolve this class. One - case where this might happen is (illegal) code like: - - template <class U> - template <class T> - struct S { - A(const A<T>& a) {} - }; - - We should catch this error sooner (at the opening curly - for `S', but it is better to be safe than sorry here. */ - { - cp_error ("invalid use of `%D'", template); - return error_mark_node; - } - - arglist = add_to_template_args (TYPE_TI_ARGS (context), - arglist); + arglist + = add_outermost_template_args (TYPE_TI_ARGS (TREE_TYPE (template)), + arglist); arg_depth = TMPL_ARGS_DEPTH (arglist); } + /* Now we should enough arguments. */ my_friendly_assert (parm_depth == arg_depth, 0); + /* From here on, we're only interested in the most general + template. */ + template = gen_tmpl; + /* Calculate the BOUND_ARGS. These will be the args that are actually tsubst'd into the definition to create the instantiation. */ diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memclass20.C b/gcc/testsuite/g++.old-deja/g++.pt/memclass20.C new file mode 100644 index 0000000..c57c27d --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/memclass20.C @@ -0,0 +1,18 @@ +// Build don't link: +// Origin: Mark Mitchell <mark@codesourcery.com> + +template <class X, class Y> +struct S{}; + +template <class X> +struct S<int, X> { + template <class W> + struct I {}; +}; + +template <class T> +void f() { + typename S<T, T>::I<T> si; +} + +template void f<int>(); |