From 4bb91707a857eebd6b9357da7fabcec87a942340 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sun, 12 Feb 2017 16:10:22 +0000 Subject: [PATCH] re PR fortran/65542 (SPREAD intrinsic incorrectly accepted in initialization expressions with -std=f95) 2017-02-12 Thomas Koenig PR fortran/65542 * intrinsic.c (gfc_intrinsic_func_interface): Return an error for -std=f95 for disallowed transformational functions in initialization expressions. 2017-02-12 Thomas Koenig PR fortran/65542 * gfortran.dg/spread_init_expr_2.f90: New test case. From-SVN: r245376 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/intrinsic.c | 21 +++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.dg/spread_init_expr_2.f90 | 5 +++++ 4 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/spread_init_expr_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3488f01e7cd..dc5e50e9ab9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-02-12 Thomas Koenig + + PR fortran/65542 + * intrinsic.c (gfc_intrinsic_func_interface): Return an error + for -std=f95 for disallowed transformational functions in + initialization expressions. + 2017-02-09 Cesar Philippidis Joseph Myers diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index e059a312dfd..923572d888c 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -4680,6 +4680,27 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) return MATCH_ERROR; } + /* F95, 7.1.6.1: Only transformational functions REPEAT, RESHAPE, + SELECTED_INT_KIND, SELECTED_REAL_KIND, TRANSFER, and TRIM are allowed in + initialization expressions. */ + + if (gfc_init_expr_flag && isym->transformational) + { + gfc_isym_id id = isym->id; + if (id != GFC_ISYM_REPEAT && id != GFC_ISYM_RESHAPE + && id != GFC_ISYM_SI_KIND && id != GFC_ISYM_SR_KIND + && id != GFC_ISYM_TRANSFER && id != GFC_ISYM_TRIM + && !gfc_notify_std (GFC_STD_F2003, "Transformational function %qs " + "at %L is invalid in an initialization " + "expression", name, &expr->where)) + { + if (!error_flag) + gfc_pop_suppress_errors (); + + return MATCH_ERROR; + } + } + gfc_current_intrinsic_where = &expr->where; /* Bypass the generic list for min, max and ISO_C_Binding's c_loc. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cdec4d631f8..429fe944fe3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-12 Thomas Koenig + + PR fortran/65542 + * gfortran.dg/spread_init_expr_2.f90: New test case. + 2017-02-11 Jakub Jelinek PR sanitizer/79341 diff --git a/gcc/testsuite/gfortran.dg/spread_init_expr_2.f90 b/gcc/testsuite/gfortran.dg/spread_init_expr_2.f90 new file mode 100644 index 00000000000..19c27fadca8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/spread_init_expr_2.f90 @@ -0,0 +1,5 @@ +! { dg-do compile } +! { dg-options "-std=f95" } +module bug + integer :: ibug(42) = spread(42, 1, 42) ! { dg-error "invalid in an initialization expression" } +end module -- 2.30.2