diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-07 15:44:12 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-07 15:44:12 +0000 |
commit | 4ee588cca5de310347ca711cc0c27aa78ee29b81 (patch) | |
tree | bbc39d5158cb55376023d1e1dafbfdeb94061479 | |
parent | 962dee4bd440e37c66761ddb9e6857992e03a091 (diff) | |
download | gcc-4ee588cca5de310347ca711cc0c27aa78ee29b81.tar.gz |
* pt.c (maybe_process_partial_specialization): Complain about
specialization in wrong namespace.
* tree.c (decl_namespace_context): New fn.
g++.pt/explicit73.C
* decl2.c (arg_assoc_type): Handle TEMPLATE_TEMPLATE_PARM.
* pt.c (coerce_template_template_parms): Handle nested
template template parameters.
g++.pt/nttp[12].C
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25072 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 18 | ||||
-rw-r--r-- | gcc/cp/tree.c | 18 |
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2248d9c9f39..975769f4105 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +1999-02-07 Jason Merrill <jason@yorick.cygnus.com> + + * pt.c (maybe_process_partial_specialization): Complain about + specialization in wrong namespace. + * tree.c (decl_namespace_context): New fn. + +1999-02-06 Kriang Lerdsuwanakij <lerdsuwa@scf-fs.usc.edu> + + * decl2.c (arg_assoc_type): Handle TEMPLATE_TEMPLATE_PARM. + * pt.c (coerce_template_template_parms): Handle nested + template template parameters. + Sat Feb 6 18:08:40 1999 Jeffrey A Law (law@cygnus.com) * typeck2.c: Update email addrsses. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 1d7385c4223..6bed0bcded3 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3288,6 +3288,7 @@ extern tree break_out_target_exprs PROTO((tree)); extern tree get_type_decl PROTO((tree)); extern tree vec_binfo_member PROTO((tree, tree)); extern tree hack_decl_function_context PROTO((tree)); +extern tree decl_namespace_context PROTO((tree)); extern tree lvalue_type PROTO((tree)); extern tree error_type PROTO((tree)); extern tree make_temp_vec PROTO((int)); diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index ba458595f6b..87a25778748 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -4483,6 +4483,7 @@ arg_assoc_type (k, type) /* Associate the return type. */ return arg_assoc_type (k, TREE_TYPE (type)); case TEMPLATE_TYPE_PARM: + case TEMPLATE_TEMPLATE_PARM: return 0; case LANG_TYPE: if (type == unknown_type_node) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index dd805da3967..72cf9d0b60f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -672,6 +672,13 @@ maybe_process_partial_specialization (type) if (CLASSTYPE_IMPLICIT_INSTANTIATION (type) && TYPE_SIZE (type) == NULL_TREE) { + if (current_namespace + != decl_namespace_context (CLASSTYPE_TI_TEMPLATE (type))) + { + cp_pedwarn ("specializing `%#T' in different namespace", type); + cp_pedwarn_at (" from definition of `%#D'", + CLASSTYPE_TI_TEMPLATE (type)); + } SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type); if (processing_template_decl) push_template_decl (TYPE_MAIN_DECL (type)); @@ -2804,8 +2811,15 @@ coerce_template_template_parms (parm_parms, arg_parms, in_decl, outer_args) /* We encounter instantiations of templates like template <template <template <class> class> class TT> class C; */ - sorry ("nested template template parameter"); - return 0; + { + tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm); + tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg); + + if (!coerce_template_template_parms (parmparm, argparm, + in_decl, outer_args)) + return 0; + } + break; case PARM_DECL: /* The tsubst call is used to handle cases such as diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 3e5048f9f10..bc5a18eba7d 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2384,6 +2384,24 @@ hack_decl_function_context (decl) return decl_function_context (decl); } +/* Returns the namespace that contains DECL, whether directly or + indirectly. */ + +tree +decl_namespace_context (decl) + tree decl; +{ + while (1) + { + if (TREE_CODE (decl) == NAMESPACE_DECL) + return decl; + else if (TYPE_P (decl)) + decl = CP_DECL_CONTEXT (TYPE_MAIN_DECL (decl)); + else + decl = CP_DECL_CONTEXT (decl); + } +} + /* Return truthvalue of whether T1 is the same tree structure as T2. Return 1 if they are the same. Return 0 if they are understandably different. |