summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2000-08-04 00:02:19 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2000-08-04 00:02:19 +0000
commit761cd2c44aab46a8c13c6f3e8661402b19ff8efc (patch)
tree0d6e82f4cfd803fb0c9a0a50ebda71967612bdc1
parent09bdec929798f7881334e3c02793f2dce3f310ca (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/parse.y4
-rw-r--r--gcc/cp/pt.c25
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);
}
}