diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-04 00:02:19 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-04 00:02:19 +0000 |
commit | 761cd2c44aab46a8c13c6f3e8661402b19ff8efc (patch) | |
tree | 0d6e82f4cfd803fb0c9a0a50ebda71967612bdc1 | |
parent | 09bdec929798f7881334e3c02793f2dce3f310ca (diff) | |
download | gcc-761cd2c44aab46a8c13c6f3e8661402b19ff8efc.tar.gz |
* pt.c (do_type_instantiation): Add complain parm; don't complain
if called recursively.
* cp-tree.h, parse.y: Adjust.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35467 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/parse.y | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 25 |
4 files changed, 27 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 80428d4494c..94aa39be42d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2000-08-02 Jason Merrill <jason@redhat.com> + + * pt.c (do_type_instantiation): Add complain parm; don't complain + if called recursively. + * cp-tree.h, parse.y: Adjust. + 2000-08-02 Zack Weinberg <zack@wolery.cumb.org> * decl2.c: Silently ignore -Wstrict-prototypes; warn about diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index ec2646c806f..a945ab4436c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4260,7 +4260,7 @@ extern void mark_decl_instantiated PARAMS ((tree, int)); extern int more_specialized PARAMS ((tree, tree, tree)); extern void mark_class_instantiated PARAMS ((tree, int)); extern void do_decl_instantiation PARAMS ((tree, tree, tree)); -extern void do_type_instantiation PARAMS ((tree, tree)); +extern void do_type_instantiation PARAMS ((tree, tree, int)); extern tree instantiate_decl PARAMS ((tree, int)); extern tree get_bindings PARAMS ((tree, tree, tree)); extern void add_tree PARAMS ((tree)); diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 763cd6dc12d..ba014967351 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -962,7 +962,7 @@ identifier_defn: explicit_instantiation: TEMPLATE begin_explicit_instantiation typespec ';' - { do_type_instantiation ($3.t, NULL_TREE); + { do_type_instantiation ($3.t, NULL_TREE, 1); yyungetc (';', 1); } end_explicit_instantiation | TEMPLATE begin_explicit_instantiation typed_declspecs declarator @@ -976,7 +976,7 @@ explicit_instantiation: { do_decl_instantiation (NULL_TREE, $3, NULL_TREE); } end_explicit_instantiation | SCSPEC TEMPLATE begin_explicit_instantiation typespec ';' - { do_type_instantiation ($4.t, $1); + { do_type_instantiation ($4.t, $1, 1); yyungetc (';', 1); } end_explicit_instantiation | SCSPEC TEMPLATE begin_explicit_instantiation typed_declspecs diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ecabed9668c..12ba70545e8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9267,9 +9267,15 @@ mark_class_instantiated (t, extern_p) } } +/* Perform an explicit instantiation of template class T. STORAGE, if + non-null, is the RID for extern, inline or static. COMPLAIN is + non-zero if this is called from the parser, zero if called recursively, + since the standard is unclear (as detailed below). */ + void -do_type_instantiation (t, storage) +do_type_instantiation (t, storage, complain) tree t, storage; + int complain; { int extern_p = 0; int nomem_p = 0; @@ -9293,8 +9299,9 @@ do_type_instantiation (t, storage) if (!COMPLETE_TYPE_P (t)) { - cp_error ("explicit instantiation of `%#T' before definition of template", - t); + if (complain) + cp_error ("explicit instantiation of `%#T' before definition of template", + t); return; } @@ -9324,8 +9331,11 @@ do_type_instantiation (t, storage) No program shall both explicitly instantiate and explicitly specialize a template. */ - cp_error ("explicit instantiation of `%#T' after", t); - cp_error_at ("explicit specialization here", t); + if (complain) + { + cp_error ("explicit instantiation of `%#T' after", t); + cp_error_at ("explicit specialization here", t); + } return; } else if (CLASSTYPE_EXPLICIT_INSTANTIATION (t)) @@ -9339,7 +9349,8 @@ do_type_instantiation (t, storage) was `extern'. If EXTERN_P then the second is. If -frepo, chances are we already got marked as an explicit instantion because of the repo file. All these cases are OK. */ - if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository) + if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository + && complain) cp_pedwarn ("duplicate explicit instantiation of `%#T'", t); /* If we've already instantiated the template, just return now. */ @@ -9398,7 +9409,7 @@ do_type_instantiation (t, storage) for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp)) if (IS_AGGR_TYPE (TREE_VALUE (tmp)) && !uses_template_parms (CLASSTYPE_TI_ARGS (TREE_VALUE (tmp)))) - do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage); + do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage, 0); } } |