aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-07-23 23:02:07 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-07-23 23:02:07 +0000
commitc078c9f4478d6d27dd8d2b7f8a6f8e9a5849dc47 (patch)
treec72194e001bd05a0bba95d8d5aff368862f1f588 /gcc
parent8dc63166e0b859546ba53093c5fc6c09925210dd (diff)
downloadgcc-c078c9f4478d6d27dd8d2b7f8a6f8e9a5849dc47.zip
gcc-c078c9f4478d6d27dd8d2b7f8a6f8e9a5849dc47.tar.gz
gcc-c078c9f4478d6d27dd8d2b7f8a6f8e9a5849dc47.tar.bz2
re PR fortran/54072 (BOZ with -std=f2008: wrongly accepted to TRANSFER/ABS/...; two BOZ not rejected for IOR/IEOR/IAND)
2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/54072 * check.c (gfc_invalid_boz): Fix comment. (illegal_boz_arg): New function. (gfc_check_transfer): Use to arguments. (gfc_check_storage_size): Ditto. (gfc_check_complex): Remove leftover comment from BOZ patch. * primary.c (match_boz_constant): Remove leftover comment. 2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/54072 * gfortran.dg/illegal_boz_arg_1.f90: New tests. From-SVN: r273748
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/check.c33
-rw-r--r--gcc/fortran/primary.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/illegal_boz_arg_1.f909
5 files changed, 51 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7cac310..622f576 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,15 @@
2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/54072
+ * check.c (gfc_invalid_boz): Fix comment.
+ (illegal_boz_arg): New function.
+ (gfc_check_transfer): Use to arguments.
+ (gfc_check_storage_size): Ditto.
+ (gfc_check_complex): Remove leftover comment from BOZ patch.
+ * primary.c (match_boz_constant): Remove leftover comment.
+
+2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org>
+
* arith.c (gfc_convert_integer, gfc_convert_real, gfc_convert_complex):
Move to ...
* primary.c (convert_integer, convert_real, convert_complex): ... here.
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 1543f13..376edd3 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -35,10 +35,10 @@ along with GCC; see the file COPYING3. If not see
#include "target-memory.h"
/* A BOZ literal constant can appear in a limited number of contexts.
- gfc_invalid_boz() is a help function to simplify error/warning generation.
- Note, gfortran accepts the nonstandard 'X' for 'Z' the nonstandard
- suffix location. If -fallow-invalid-boz is used, then issue a warning;
- otherwise issue an error. */
+ gfc_invalid_boz() is a helper function to simplify error/warning
+ generation. gfortran accepts the nonstandard 'X' for 'Z', and gfortran
+ allows the BOZ indicator to appear as a suffix. If -fallow-invalid-boz
+ is used, then issue a warning; otherwise issue an error. */
bool
gfc_invalid_boz (const char *msg, locus *loc)
@@ -54,6 +54,20 @@ gfc_invalid_boz (const char *msg, locus *loc)
}
+/* Issue an error for an illegal BOZ argument. */
+static bool
+illegal_boz_arg (gfc_expr *x)
+{
+ if (x->ts.type == BT_BOZ)
+ {
+ gfc_error ("BOZ literal constant at %L cannot be an actual argument "
+ "to %qs", &x->where, gfc_current_intrinsic);
+ return true;
+ }
+
+ return false;
+}
+
/* Some precedures take two arguments such that both cannot be BOZ. */
static bool
@@ -2202,8 +2216,6 @@ gfc_check_co_sum (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat,
bool
gfc_check_complex (gfc_expr *x, gfc_expr *y)
{
-
- /* FIXME BOZ. What to do with complex? */
if (!boz_args_check (x, y))
return false;
@@ -5894,6 +5906,12 @@ gfc_check_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
return false;
}
+ if (source->ts.type == BT_BOZ && illegal_boz_arg (source))
+ return false;
+
+ if (mold->ts.type == BT_BOZ && illegal_boz_arg (mold))
+ return false;
+
/* MOLD shall be a scalar or array of any type. */
if (mold->ts.type == BT_PROCEDURE
&& mold->symtree->n.sym->attr.subroutine == 1)
@@ -7125,6 +7143,9 @@ gfc_check_storage_size (gfc_expr *a, gfc_expr *kind)
return false;
}
+ if (a->ts.type == BT_BOZ && illegal_boz_arg (a))
+ return false;
+
if (kind == NULL)
return true;
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index da524e9..1cc1018 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -494,7 +494,6 @@ match_boz_constant (gfc_expr **result)
e->boz.str = XCNEWVEC (char, length + 1);
strncpy (e->boz.str, buffer, length);
- /* FIXME BOZ. */
if (!gfc_in_match_data ()
&& (!gfc_notify_std(GFC_STD_F2003, "BOZ used outside a DATA "
"statement at %L", &e->where)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 43e7862..342ba98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/54072
+ * gfortran.dg/illegal_boz_arg_1.f90: New tests.
+
+2019-07-23 Steven G. Kargl <kargl@gcc.gnu.org>
+
* gfortran.dg/achar_5.f90: Fix for new BOZ handling.
* arithmetic_overflow_1.f90: Ditto.
* gfortran.dg/boz_11.f90: Ditto.
diff --git a/gcc/testsuite/gfortran.dg/illegal_boz_arg_1.f90 b/gcc/testsuite/gfortran.dg/illegal_boz_arg_1.f90
new file mode 100644
index 0000000..8a79a52
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/illegal_boz_arg_1.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+program foo
+ implicit none
+ integer :: i = 42
+ print *, storage_size(z'1234') ! { dg-error "cannot be an actual" }
+ print *, transfer(z'1234', i) ! { dg-error "cannot be an actual" }
+ print *, transfer(i, z'1234') ! { dg-error "cannot be an actual" }
+ print *, transfer(i, i, z'1234') ! { dg-error "must be INTEGER" }
+end program foo