aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/intrinsic.c
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2020-06-11 20:29:45 +0200
committerHarald Anlauf <anlauf@gmx.de>2020-06-11 20:29:45 +0200
commit7fd614ee818983274eb5e47cbb8ec68b20994963 (patch)
treeaea6cae53ec66c1965fd4e11cfe0d8396fcb63e2 /gcc/fortran/intrinsic.c
parent1c140cfbfa4b465a29ef26f1fdfef04c671e3c9c (diff)
downloadgcc-7fd614ee818983274eb5e47cbb8ec68b20994963.zip
gcc-7fd614ee818983274eb5e47cbb8ec68b20994963.tar.gz
gcc-7fd614ee818983274eb5e47cbb8ec68b20994963.tar.bz2
PR fortran/95544 - Fix ICE in NULL() argument to intrinsics
Fortran 2018: An argument to an intrinsic procedure other than ASSOCIATED, NULL, or PRESENT shall be a data object. An EXPR_NULL is not a data object. Add checks for intrinsics. 2020-06-11 Steven G. Kargl <kargl@gcc.gnu.org> Harald Anlauf <anlauf@gmx.de> gcc/fortran/ PR fortran/95544 * check.c (invalid_null_arg): Rename to gfc_invalid_null_arg. (gfc_check_associated, gfc_check_kind, gfc_check_merge) (gfc_check_shape, gfc_check_size, gfc_check_spread) (gfc_check_transfer): Adjust. (gfc_check_len_lentrim, gfc_check_trim): Check for NULL() argument. * gfortran.h: Declare gfc_invalid_null_arg (). * intrinsic.c (check_arglist): Check for NULL() argument.
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r--gcc/fortran/intrinsic.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 17f5efc..60d91f6 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -4442,6 +4442,18 @@ check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym,
return false;
}
+ /* F2018, p. 328: An argument to an intrinsic procedure other than
+ ASSOCIATED, NULL, or PRESENT shall be a data object. An EXPR_NULL
+ is not a data object. */
+ if (actual->expr->expr_type == EXPR_NULL
+ && (!(sym->id == GFC_ISYM_ASSOCIATED
+ || sym->id == GFC_ISYM_NULL
+ || sym->id == GFC_ISYM_PRESENT)))
+ {
+ gfc_invalid_null_arg (actual->expr);
+ return false;
+ }
+
/* If the formal argument is INTENT([IN]OUT), check for definability. */
if (formal->intent == INTENT_INOUT || formal->intent == INTENT_OUT)
{