From: Brendan Kehoe Date: Fri, 12 Jun 1998 12:56:22 +0000 (+0000) Subject: pt.c (check_explicit_specialization): If DECLARATOR turned into an error_mark_node... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f2e48b67c89f44445b0de9c529163b8aef7ee266;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index aced3652088..ee9d746318b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +1998-06-12 Brendan Kehoe + + * 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 * 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 dbe9f5f8d38..e6c5fff4086 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 537361edbc5..69856b7e8dd 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. */