aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2018-12-16 03:33:05 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2018-12-16 03:33:05 +0000
commit19adb97a310cd398814c5ccb75580b1658433cfc (patch)
tree93d70adc2dad5bf9a72be8b8a2f4b2b31a89d633 /gcc
parent3dd6f5737587b7838b2d0b79cc3259e1303081af (diff)
downloadgcc-19adb97a310cd398814c5ccb75580b1658433cfc.zip
gcc-19adb97a310cd398814c5ccb75580b1658433cfc.tar.gz
gcc-19adb97a310cd398814c5ccb75580b1658433cfc.tar.bz2
re PR fortran/87994 (ICE in match_data_constant, at fortran/decl.c:399)
2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/87944 * decl.c (match_data_constant): Allow inquiry parameter as data constant in data statement. 2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/87944 * gfortran.dg/pr87994_1.f90: New test. * gfortran.dg/pr87994_2.f90: Ditto. * gfortran.dg/pr87994_3.f90: Ditto. From-SVN: r267184
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/decl.c8
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gfortran.dg/pr87994_1.f907
-rw-r--r--gcc/testsuite/gfortran.dg/pr87994_2.f907
-rw-r--r--gcc/testsuite/gfortran.dg/pr87994_3.f908
6 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 2fe463a..0034c3b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,4 +1,10 @@
-2019-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
+2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/87944
+ * decl.c (match_data_constant): Allow inquiry parameter as data
+ constant in data statement.
+
+2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/88138
* decl.c (variable_decl): Check that a derived isn't being assigned
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 78555ce..1dd3225 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -399,6 +399,14 @@ match_data_constant (gfc_expr **result)
}
else if (m == MATCH_YES)
{
+ /* If a parameter inquiry ends up here, symtree is NULL but **result
+ contains the right constant expression. Check here. */
+ if ((*result)->symtree == NULL
+ && (*result)->expr_type == EXPR_CONSTANT
+ && ((*result)->ts.type == BT_INTEGER
+ || (*result)->ts.type == BT_REAL))
+ return m;
+
/* F2018:R845 data-stmt-constant is initial-data-target.
A data-stmt-constant shall be ... initial-data-target if and
only if the corresponding data-stmt-object has the POINTER
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7977fda..597ba50 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/87944
+ * gfortran.dg/pr87994_1.f90: New test.
+ * gfortran.dg/pr87994_2.f90: Ditto.
+ * gfortran.dg/pr87994_3.f90: Ditto.
+
2018-12-16 Jakub Jelinek <jakub@redhat.com>
PR c++/88482
@@ -10,7 +17,7 @@
* g++.dg/eh/builtin11.C: New test.
* g++.dg/parse/crash55.C: Adjust expected diagnostics.
-2019-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
+2018-12-15 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/88138
* gfortran.dg/pr88138.f90: new test.
diff --git a/gcc/testsuite/gfortran.dg/pr87994_1.f90 b/gcc/testsuite/gfortran.dg/pr87994_1.f90
new file mode 100644
index 0000000..ed0d6b4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr87994_1.f90
@@ -0,0 +1,7 @@
+! { dg-do run }
+! PR fortran/87994
+program p
+ real :: a, b
+ data b /a%kind/
+ if (b /= kind(a)) stop 1
+end
diff --git a/gcc/testsuite/gfortran.dg/pr87994_2.f90 b/gcc/testsuite/gfortran.dg/pr87994_2.f90
new file mode 100644
index 0000000..6f20b0a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr87994_2.f90
@@ -0,0 +1,7 @@
+! { dg-do run }
+! PR fortran/87994
+program p
+ real, parameter :: a = 1.0
+ data b /a%kind/
+ if (b /= kind(a)) stop 1
+end
diff --git a/gcc/testsuite/gfortran.dg/pr87994_3.f90 b/gcc/testsuite/gfortran.dg/pr87994_3.f90
new file mode 100644
index 0000000..c67bc0c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr87994_3.f90
@@ -0,0 +1,8 @@
+! { dg-do run }
+! PR fortran/87994
+program p
+ integer, parameter :: a = 1
+ integer :: b
+ data b /a%kind/
+ if (b /= kind(a)) stop = 1
+end