diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-08-10 18:26:13 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2019-08-10 18:26:13 +0000 |
commit | 878f88b7d14a33b031aaf0ae797bb39d21f74676 (patch) | |
tree | a46d0e4c5948327c1c6686fd1403fc7756bd9259 /gcc/fortran/expr.c | |
parent | 884efbd523b7191edd7763ae8bba8afc96e3c238 (diff) | |
download | gcc-878f88b7d14a33b031aaf0ae797bb39d21f74676.zip gcc-878f88b7d14a33b031aaf0ae797bb39d21f74676.tar.gz gcc-878f88b7d14a33b031aaf0ae797bb39d21f74676.tar.bz2 |
decl.c (match_old_style_init): Use a clearer error message.
2019-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
* decl.c (match_old_style_init): Use a clearer error message.
* expr.c (gfc_check_assign): Update BOZ checking to provide a stricter
adherence to the Fortran standard. Use gfc_invalid_boz () to
relax errors into warnings.
* gfortran.h (gfc_isym_id): Add new ids GFC_ISYM_DFLOAT,
GFC_ISYM_FLOAT, GFC_ISYM_REALPART, and GFC_ISYM_SNGL
* intrinsic.c (add_functions): Use new ids to split REAL generic into
REAL, FLOAT, DFLOAT, SNGL, and REALPART generics.
(gfc_intrinsic_func_interface): Allow new intrinsics in an
initialization expression
* resolve.c (resolve_operator): Deal with BOZ as operands.
Use gfc_invalid_boz to allow for errors or warnings via the
-fallow-invalid-boz option. A BOZ cannot be an operand to an
unary operator. Both operands of a binary operator cannot be BOZ.
For binary operators, convert a BOZ operand into the type and
kind of the other operand for REAL or INTEGER operand.
* trans-intrinsic.c: Use new ids to cause conversions to happen.
2019-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.dg/boz_8.f90: Adjust error messages.
* gfortran.dg/nan_4.f90: Ditto.
* gfortran.dg/boz_1.f90: Add -fallow-invalid-boz to dg-options,
and test for warnings.
* gfortran.dg/boz_3.f90: Ditto.
* gfortran.dg/boz_4.f90: Ditto.
* gfortran.dg/dec_structure_6.f90: Ditto.
* gfortran.dg/ibits.f90: Ditto.
From-SVN: r274257
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index a10a17d..900242d 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3641,29 +3641,44 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform, && !gfc_check_conformance (lvalue, rvalue, "array assignment")) return false; - if (rvalue->ts.type == BT_BOZ && lvalue->ts.type != BT_INTEGER - && lvalue->symtree->n.sym->attr.data - && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to " - "initialize non-integer variable %qs", - &rvalue->where, lvalue->symtree->n.sym->name)) - return false; - else if (rvalue->ts.type == BT_BOZ && !lvalue->symtree->n.sym->attr.data - && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside " - "a DATA statement and outside INT/REAL/DBLE/CMPLX", - &rvalue->where)) - return false; - /* Handle the case of a BOZ literal on the RHS. */ if (rvalue->ts.type == BT_BOZ) { - /* FIXME BOZ. Need gfc_invalid_boz() here?. */ + if (lvalue->symtree->n.sym->attr.data) + { + if (lvalue->ts.type == BT_INTEGER + && gfc_boz2int (rvalue, lvalue->ts.kind)) + return true; + + if (lvalue->ts.type == BT_REAL + && gfc_boz2real (rvalue, lvalue->ts.kind)) + { + if (gfc_invalid_boz ("BOZ literal constant near %L cannot " + "be assigned to a REAL variable", + &rvalue->where)) + return false; + return true; + } + } + + if (!lvalue->symtree->n.sym->attr.data + && gfc_invalid_boz ("BOZ literal constant at %L is neither a " + "data-stmt-constant nor an actual argument to " + "INT, REAL, DBLE, or CMPLX intrinsic function", + &rvalue->where)) + return false; + if (lvalue->ts.type == BT_INTEGER && gfc_boz2int (rvalue, lvalue->ts.kind)) return true; + if (lvalue->ts.type == BT_REAL && gfc_boz2real (rvalue, lvalue->ts.kind)) return true; + gfc_error ("BOZ literal constant near %L cannot be assigned to a " + "%qs variable", &rvalue->where, gfc_typename (&lvalue->ts)); + return false; } |