aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2007-12-16 23:12:55 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2007-12-16 23:12:55 +0100
commitb7970354e8de6cb3920c97efc95a0f7f9101e3ca (patch)
treeda5650c91beaf561fa5a4c477fe7a043661e8638
parentdf80a455ed1e2478e4f296f58cbd5181db4998b5 (diff)
downloadgcc-b7970354e8de6cb3920c97efc95a0f7f9101e3ca.zip
gcc-b7970354e8de6cb3920c97efc95a0f7f9101e3ca.tar.gz
gcc-b7970354e8de6cb3920c97efc95a0f7f9101e3ca.tar.bz2
re PR fortran/34495 (accepts invalid initialization expressions withTRANSFER)
2007-12-16 Tobias Burnus <burnus@net-b.de> PR fortran/34495 * intrinsic.c (add_functions): Mark float and sngl as STD_GNU. (gfc_intrinsic_func_interface): Reject REAL, DBLE and CMPLX in initialization expressions for -std=f95. 2007-12-16 Tobias Burnus <burnus@net-b.de> PR fortran/34495 * gfortran.dg/initialization_16.f90: New. From-SVN: r130994
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/intrinsic.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/initialization_16.f9015
4 files changed, 37 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index cf54102..5f6e1dc 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-12-16 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/34495
+ * intrinsic.c (add_functions): Mark float and sngl as STD_GNU.
+ (gfc_intrinsic_func_interface): Reject REAL, DBLE and CMPLX
+ in initialization expressions for -std=f95.
+
2007-12-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/34305
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 467f771..aaaa620 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -2047,11 +2047,11 @@ add_functions (void)
gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
a, BT_UNKNOWN, dr, REQUIRED);
- add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
+ add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
gfc_check_i, gfc_simplify_float, NULL,
a, BT_INTEGER, di, REQUIRED);
- add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
+ add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
NULL, gfc_simplify_sngl, NULL,
a, BT_REAL, dd, REQUIRED);
@@ -3388,6 +3388,14 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag)
if (check_intrinsic_standard (name, isym->standard, &expr->where) == FAILURE)
return MATCH_ERROR;
+ if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
+ || isym->id == GFC_ISYM_CMPLX)
+ && gfc_init_expr
+ && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
+ "as initialization expression at %L", name,
+ &expr->where) == FAILURE)
+ return MATCH_ERROR;
+
gfc_current_intrinsic_where = &expr->where;
/* Bypass the generic list for min and max. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 82411bd..0c14c4e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-16 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/34495
+ * gfortran.dg/initialization_16.f90: New.
+
2007-12-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/34305
diff --git a/gcc/testsuite/gfortran.dg/initialization_16.f90 b/gcc/testsuite/gfortran.dg/initialization_16.f90
new file mode 100644
index 0000000..185099a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/initialization_16.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-std=f95 -Wall" }
+!
+! PR fortran/34495
+!
+! Check for invalid Fortran 95 initialization expressions
+!
+program main
+ implicit none
+ real, parameter :: r1 = real(33) ! { dg-error "Fortran 2003: Function 'real' as initialization expression" }
+ real, parameter :: r2 = dble(33) ! { dg-error "Fortran 2003: Function 'dble' as initialization expression" }
+ real, parameter :: r4 = cmplx(33,33)! { dg-error "Fortran 2003: Function 'cmplx' as initialization expression" }
+ print *, sngl(1.0d0) ! { dg-error "not included in the selected standard" }
+ print *, float(1.0) ! { dg-error "not included in the selected standard" }
+end program main