aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-06-19 18:04:46 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-06-19 18:04:46 +0000
commitc9935123aef8eac547cdd0e8b06811fc776a6b32 (patch)
treeb9bc470b02b25d6245435882c21c59a4da8ea708
parentee3aab6826f7dbfe0f1a509cb429f4a4d755f38b (diff)
downloadgcc-c9935123aef8eac547cdd0e8b06811fc776a6b32.zip
gcc-c9935123aef8eac547cdd0e8b06811fc776a6b32.tar.gz
gcc-c9935123aef8eac547cdd0e8b06811fc776a6b32.tar.bz2
re PR fortran/69398 ([OOP] ICE on class with duplicate dimension attribute specified)
2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/69398 * decl.c (attr_decl): Check for duplicate DIMENSION attribute for a CLASS entity. 2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/69398 * gfortran.dg/pr69398.f90: New test. From-SVN: r272481
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr69398.f9011
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 62edba7..2014342 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/69398
+ * decl.c (attr_decl): Check for duplicate DIMENSION attribute for a
+ CLASS entity.
+
+2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org>
+
PR fortran/87907
* resolve.c (resolve_contained_fntype): Do not dereference a NULL
pointer.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 5fc06e4..7fcb60a 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -8372,6 +8372,15 @@ attr_decl1 (void)
to the first component, or '_data' field. */
if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class)
{
+ /* gfc_set_array_spec sets sym->attr not CLASS_DATA(sym)->attr. Check
+ for duplicate attribute here. */
+ if (CLASS_DATA(sym)->attr.dimension == 1 && as)
+ {
+ gfc_error ("Duplicate DIMENSION attribute at %C");
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
if (!gfc_copy_attr (&CLASS_DATA(sym)->attr, &current_attr, &var_locus))
{
m = MATCH_ERROR;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aa41d2a..5b81695 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/69398
+ * gfortran.dg/pr69398.f90: New test.
+
+2019-06-19 Steven G. Kargl <kargl@gcc.gnu.org>
+
PR fortran/87907
* gfortran.dg/pr87907.f90: New testcase.
diff --git a/gcc/testsuite/gfortran.dg/pr69398.f90 b/gcc/testsuite/gfortran.dg/pr69398.f90
new file mode 100644
index 0000000..6863746
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr69398.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/69398
+! Contributed by Gerhard Steinmetz
+program p
+ type t
+ end type
+ class(t), allocatable :: z(:)
+ target :: z(:) ! { dg-error "Duplicate DIMENSION attribute" }
+ allocate (z(2))
+end
+