diff options
author | Brendan Kehoe <brendan@cygnus.com> | 1998-06-12 12:56:22 +0000 |
---|---|---|
committer | Brendan Kehoe <brendan@gcc.gnu.org> | 1998-06-12 08:56:22 -0400 |
commit | f2e48b67c89f44445b0de9c529163b8aef7ee266 (patch) | |
tree | 56757757a80d6d16d66fd71f0274e1a096021b6d /gcc | |
parent | 38831dfe51e50e0c24de08cd1657efd69ca809ac (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 14 |
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. */ |