diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1998-04-17 00:26:13 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1998-04-16 20:26:13 -0400 |
commit | 3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a (patch) | |
tree | 81efd47d1e3126e525d2882ec155781cd81f24d7 /gcc | |
parent | e009aaf31fe0817ed9935c668817b2b83e141ba4 (diff) | |
download | gcc-3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a.zip gcc-3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a.tar.gz gcc-3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/decl.c | 9 | ||||
-rw-r--r-- | gcc/cp/pt.c | 24 |
3 files changed, 36 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4bcf751..94e4029 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +Fri Apr 17 00:24:22 1998 Jason Merrill <jason@yorick.cygnus.com> + + * 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 cb2b005..8f5b90c 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 76a2706..6fce6bb 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; |