diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2004-06-29 19:01:35 +0200 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2004-06-29 19:01:35 +0200 |
commit | e063a0486f7c503732da742bfa4d27e222ccc52f (patch) | |
tree | b83774bb232127fd4ea92cf995002971484653b5 /gcc/fortran | |
parent | 97e73bd25031f3c7ea03a29c469fbbd4b6db6f8e (diff) | |
download | gcc-e063a0486f7c503732da742bfa4d27e222ccc52f.zip gcc-e063a0486f7c503732da742bfa4d27e222ccc52f.tar.gz gcc-e063a0486f7c503732da742bfa4d27e222ccc52f.tar.bz2 |
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
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 17 |
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c93c9a4..9193234 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2004-06-22 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/15963 + * expr.c (check_intrinsic_op): Allow comparison of characters. + Make logic easier. + 2004-06-26 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> Andrew Vaught <andyv@firstinter.net> diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 6abc924..e9ed270 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); |