aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBrendan Kehoe <brendan@cygnus.com>1998-06-12 12:56:22 +0000
committerBrendan Kehoe <brendan@gcc.gnu.org>1998-06-12 08:56:22 -0400
commitf2e48b67c89f44445b0de9c529163b8aef7ee266 (patch)
tree56757757a80d6d16d66fd71f0274e1a096021b6d /gcc
parent38831dfe51e50e0c24de08cd1657efd69ca809ac (diff)
downloadgcc-f2e48b67c89f44445b0de9c529163b8aef7ee266.zip
gcc-f2e48b67c89f44445b0de9c529163b8aef7ee266.tar.gz
gcc-f2e48b67c89f44445b0de9c529163b8aef7ee266.tar.bz2
pt.c (check_explicit_specialization): If DECLARATOR turned into an error_mark_node from lookup_template_function...
* pt.c (check_explicit_specialization): If DECLARATOR turned into an error_mark_node from lookup_template_function, return the same. (determine_specialization): Also make sure TEMPLATE_ID isn't an error_mark_node, before we try to read its operands. * decl.c (grokdeclarator): If we got an error_mark_node from check_explicit_specialization, just return it right back. From-SVN: r20444
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/cp/pt.c14
3 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aced365..ee9d746 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+1998-06-12 Brendan Kehoe <brendan@cygnus.com>
+
+ * pt.c (check_explicit_specialization): If DECLARATOR turned into
+ an error_mark_node from lookup_template_function, return the same.
+ (determine_specialization): Also make sure TEMPLATE_ID isn't an
+ error_mark_node, before we try to read its operands.
+ * decl.c (grokdeclarator): If we got an error_mark_node from
+ check_explicit_specialization, just return it right back.
+
1998-06-12 Mark Mitchell <mark@markmitchell.com>
* class.c (instantiate_type): Don't treat template-ids that don't
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index dbe9f5f..e6c5fff 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10193,6 +10193,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (decl == NULL_TREE)
return NULL_TREE;
+ /* Among other times, could occur from check_explicit_specialization
+ returning an error_mark_node. */
+ if (decl == error_mark_node)
+ return error_mark_node;
+
if (ctype == NULL_TREE && DECL_LANGUAGE (decl) != lang_c
&& (! DECL_USE_TEMPLATE (decl) ||
name_mangling_version < 1))
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 537361e..69856b7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -784,14 +784,19 @@ determine_specialization (template_id, decl, targs_out,
int need_member_template;
int complain;
{
- tree fns = TREE_OPERAND (template_id, 0);
- tree targs_in = TREE_OPERAND (template_id, 1);
+ tree fns, targs_in;
tree templates = NULL_TREE;
tree fn;
int i;
*targs_out = NULL_TREE;
+ if (template_id == error_mark_node)
+ return error_mark_node;
+
+ fns = TREE_OPERAND (template_id, 0);
+ targs_in = TREE_OPERAND (template_id, 1);
+
if (fns == error_mark_node)
return error_mark_node;
@@ -1084,7 +1089,10 @@ check_explicit_specialization (declarator, decl, template_count, flags)
lookup_template_function (fns, NULL_TREE);
}
- if (TREE_CODE (TREE_OPERAND (declarator, 0)) == LOOKUP_EXPR)
+ if (declarator == error_mark_node)
+ return error_mark_node;
+
+ if (TREE_CODE (TREE_OPERAND (declarator, 0)) == LOOKUP_EXPR)
{
/* A friend declaration. We can't do much, because we don't
know what this resolves to, yet. */