aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-04-17 00:26:13 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-04-16 20:26:13 -0400
commit3a56f0abd34dc9e5cafbae220b843ee2c5b73f4a (patch)
tree81efd47d1e3126e525d2882ec155781cd81f24d7 /gcc
parente009aaf31fe0817ed9935c668817b2b83e141ba4 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/cp/decl.c9
-rw-r--r--gcc/cp/pt.c24
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;