From fdd84500aecd4edcab10770d77f28c602b618359 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 3 Apr 2007 08:50:42 -0700 Subject: [PATCH] expr.c (store_expr): If get_signed_or_unsigned_type doesn't yield an appropriate type... * expr.c (store_expr): If get_signed_or_unsigned_type doesn't yield an appropriate type, use the mode instead. From-SVN: r123477 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a56ebc63e2..e3b491aea99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-04-03 Richard Henderson + + * expr.c (store_expr): If get_signed_or_unsigned_type doesn't yield + an appropriate type, use the mode instead. + 2007-04-03 Richard Sandiford * config.gcc (mips-wrs-vxworks): Add vx-common.h to tm_file. diff --git a/gcc/expr.c b/gcc/expr.c index 653eb56ce96..77cc44a83d3 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4383,9 +4383,19 @@ store_expr (tree exp, rtx target, int call_param_p) { if (TYPE_UNSIGNED (TREE_TYPE (exp)) != SUBREG_PROMOTED_UNSIGNED_P (target)) - exp = fold_convert - (get_signed_or_unsigned_type - (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)), exp); + { + /* Some types, e.g. Fortran's logical*4, won't have a signed + version, so use the mode instead. */ + tree ntype + = (get_signed_or_unsigned_type + (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp))); + if (ntype == NULL) + ntype = lang_hooks.types.type_for_mode + (TYPE_MODE (TREE_TYPE (exp)), + SUBREG_PROMOTED_UNSIGNED_P (target)); + + exp = fold_convert (ntype, exp); + } exp = fold_convert (lang_hooks.types.type_for_mode (GET_MODE (SUBREG_REG (target)), -- 2.30.2