From e063a0486f7c503732da742bfa4d27e222ccc52f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tobias=20Schl=C3=BCter?= Date: Tue, 29 Jun 2004 19:01:35 +0200 Subject: [PATCH] re PR fortran/15963 (Error when comparing characters in restricted expression) fortran/ PR fortran/15963 * expr.c (check_intrinsic_op): Allow comparison of characters. Make logic easier. testsuite/ PR fortran/15963 * gfortran.fortran-torture/execute/initialization_1.f90: New test. From-SVN: r83859 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/expr.c | 17 +++++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ .../execute/initialization_1.f90 | 10 ++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.fortran-torture/execute/initialization_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c93c9a49a53..9193234effc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2004-06-22 Tobias Schlueter + + PR fortran/15963 + * expr.c (check_intrinsic_op): Allow comparison of characters. + Make logic easier. + 2004-06-26 Tobias Schlueter Andrew Vaught diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 6abc9244c51..e9ed27040ee 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1167,6 +1167,17 @@ check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *)) case INTRINSIC_GE: case INTRINSIC_LT: case INTRINSIC_LE: + if ((*check_function) (e->op2) == FAILURE) + return FAILURE; + + if (!(et0 (e->op1) == BT_CHARACTER && et0 (e->op2) == BT_CHARACTER) + && !(numeric_type (et0 (e->op1)) && numeric_type (et0 (e->op2)))) + { + gfc_error ("Numeric or CHARACTER operands are required in " + "expression at %L", &e->where); + return FAILURE; + } + break; case INTRINSIC_PLUS: case INTRINSIC_MINUS: @@ -1179,10 +1190,8 @@ check_intrinsic_op (gfc_expr * e, try (*check_function) (gfc_expr *)) if (!numeric_type (et0 (e->op1)) || !numeric_type (et0 (e->op2))) goto not_numeric; - if (e->operator != INTRINSIC_POWER) - break; - - if (check_function == check_init_expr && et0 (e->op2) != BT_INTEGER) + if (e->operator == INTRINSIC_POWER + && check_function == check_init_expr && et0 (e->op2) != BT_INTEGER) { gfc_error ("Exponent at %L must be INTEGER for an initialization " "expression", &e->op2->where); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e60bb1e5a53..ae3a5d2c1b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-06-25 Tobias Schlueter + + PR fortran/15963 + * gfortran.fortran-torture/execute/initialization_1.f90: New test. + 2004-06-29 Richard Henderson * gcc.dg/tree-ssa/20040430-1.c: Expect zero if's. diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/initialization_1.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/initialization_1.f90 new file mode 100644 index 00000000000..2ccb45a2388 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/execute/initialization_1.f90 @@ -0,0 +1,10 @@ +! PR 15963 -- checks character comparison in initialization expressions +character(8), parameter :: a(5) = (/ "H", "E", "L", "L", "O" /) +call x(a) +contains +subroutine x(a) +character(8), intent(in) :: a(:) +integer :: b(count(a < 'F')) +if (size(b) /= 1) call abort() +end subroutine x +end -- 2.30.2