From 3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 17 Apr 1998 00:26:13 +0000 Subject: [PATCH] decl.c (duplicate_decls): Fix check for when it's safe to free the new decl. * decl.c (duplicate_decls): Fix check for when it's safe to free the new decl. * pt.c (mangle_class_name_for_template): Don't pass a typedef type to type_as_string. From Mark Mitchell: (unify): Use comptypes to compare type args. From-SVN: r19252 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/decl.c | 9 ++++++--- gcc/cp/pt.c | 24 ++++++++++++++++++++---- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4bcf751ece6..94e4029c0ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +Fri Apr 17 00:24:22 1998 Jason Merrill + + * decl.c (duplicate_decls): Fix check for when it's safe to free + the new decl. + + * pt.c (mangle_class_name_for_template): Don't pass a typedef type + to type_as_string. + From Mark Mitchell: + (unify): Use comptypes to compare type args. + Thu Apr 16 17:47:30 1998 Jeffrey A Law (law@cygnus.com) * pt.c (build_template_parm_index): Add prototype. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index cb2b0059675..8f5b90c41ac 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3088,9 +3088,12 @@ duplicate_decls (newdecl, olddecl) TREE_VALUE (decls) = olddecl; } - if ((char *)newdecl + ROUND (function_size) - + ROUND (sizeof (struct lang_decl)) - == obstack_next_free (&permanent_obstack)) + if (((char *)newdecl + ROUND (function_size) == (char *)nl + && ((char *)newdecl + ROUND (function_size) + + ROUND (sizeof (struct lang_decl)) + == obstack_next_free (&permanent_obstack))) + || ((char *)newdecl + ROUND (function_size) + == obstack_next_free (&permanent_obstack))) { DECL_MAIN_VARIANT (newdecl) = olddecl; DECL_LANG_SPECIFIC (olddecl) = ol; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 76a2706638d..6fce6bb1fea 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2546,9 +2546,15 @@ mangle_class_name_for_template (name, parms, arglist, ctx) char* s; if (TREE_CODE (ctx) == FUNCTION_DECL) - s = fndecl_as_string(ctx, 0); + s = fndecl_as_string (ctx, 0); else if (TREE_CODE_CLASS (TREE_CODE (ctx)) == 't') - s = type_as_string(ctx, 0); + { + /* We can't use a typedef type name here. */ + ctx = build_type_variant (TYPE_MAIN_VARIANT (ctx), + TYPE_READONLY (ctx), + TYPE_VOLATILE (ctx)); + s = type_as_string (ctx, 0); + } else my_friendly_abort (0); cat (s); @@ -2566,6 +2572,12 @@ mangle_class_name_for_template (name, parms, arglist, ctx) if (i) ccat (','); + /* We can't use a typedef type name here. */ + if (TREE_CODE_CLASS (TREE_CODE (arg)) == 't') + arg = build_type_variant (TYPE_MAIN_VARIANT (arg), + TYPE_READONLY (arg), + TYPE_VOLATILE (arg)); + if (TREE_CODE (parm) == TYPE_DECL) { cat (type_as_string (arg, 0)); @@ -5627,7 +5639,9 @@ unify (tparms, targs, ntparms, parm, arg, strict, explicit_mask) } #endif /* Simple cases: Value already set, does match or doesn't. */ - if (targ == arg || (targ && explicit_mask && explicit_mask[idx])) + if (targ != NULL_TREE + && (comptypes (targ, arg, 1) + || (explicit_mask && explicit_mask[idx]))) return 0; else if (targ) return 1; @@ -5697,7 +5711,9 @@ unify (tparms, targs, ntparms, parm, arg, strict, explicit_mask) } /* Simple cases: Value already set, does match or doesn't. */ - if (targ == arg || (targ && explicit_mask && explicit_mask[idx])) + if (targ != NULL_TREE + && (comptypes (targ, arg, 1) + || (explicit_mask && explicit_mask[idx]))) return 0; else if (targ) return 1;