diff options
Diffstat (limited to 'gcc/fortran/trans-const.c')
-rw-r--r-- | gcc/fortran/trans-const.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/gcc/fortran/trans-const.c b/gcc/fortran/trans-const.c index 121740c..ae7c271 100644 --- a/gcc/fortran/trans-const.c +++ b/gcc/fortran/trans-const.c @@ -274,30 +274,58 @@ gfc_conv_constant_to_tree (gfc_expr * expr) { gcc_assert (expr->expr_type == EXPR_CONSTANT); + /* If it is converted from Hollerith constant, we build string constant + and VIEW_CONVERT to its type. */ + switch (expr->ts.type) { case BT_INTEGER: - return gfc_conv_mpz_to_tree (expr->value.integer, expr->ts.kind); + if (expr->from_H) + return build1 (VIEW_CONVERT_EXPR, + gfc_get_int_type (expr->ts.kind), + gfc_build_string_const (expr->value.character.length, + expr->value.character.string)); + else + return gfc_conv_mpz_to_tree (expr->value.integer, expr->ts.kind); case BT_REAL: - return gfc_conv_mpfr_to_tree (expr->value.real, expr->ts.kind); + if (expr->from_H) + return build1 (VIEW_CONVERT_EXPR, + gfc_get_real_type (expr->ts.kind), + gfc_build_string_const (expr->value.character.length, + expr->value.character.string)); + else + return gfc_conv_mpfr_to_tree (expr->value.real, expr->ts.kind); case BT_LOGICAL: - return build_int_cst (gfc_get_logical_type (expr->ts.kind), + if (expr->from_H) + return build1 (VIEW_CONVERT_EXPR, + gfc_get_logical_type (expr->ts.kind), + gfc_build_string_const (expr->value.character.length, + expr->value.character.string)); + else + return build_int_cst (gfc_get_logical_type (expr->ts.kind), expr->value.logical); case BT_COMPLEX: - { - tree real = gfc_conv_mpfr_to_tree (expr->value.complex.r, + if (expr->from_H) + return build1 (VIEW_CONVERT_EXPR, + gfc_get_complex_type (expr->ts.kind), + gfc_build_string_const (expr->value.character.length, + expr->value.character.string)); + else + { + tree real = gfc_conv_mpfr_to_tree (expr->value.complex.r, expr->ts.kind); - tree imag = gfc_conv_mpfr_to_tree (expr->value.complex.i, + tree imag = gfc_conv_mpfr_to_tree (expr->value.complex.i, expr->ts.kind); - return build_complex (gfc_typenode_for_spec (&expr->ts), - real, imag); - } + return build_complex (gfc_typenode_for_spec (&expr->ts), + real, imag); + } case BT_CHARACTER: + case BT_HOLLERITH: return gfc_build_string_const (expr->value.character.length, expr->value.character.string); |