aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/structure_constructor_12.f9015
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index def6f1b..ae912cb 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-05 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/64943
+ * resolve.c (resolve_transfer): Also check structure
+ constructors.
+
2015-02-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64757
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 3b0c12a..0b188da 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8364,7 +8364,8 @@ resolve_transfer (gfc_code *code)
}
if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
- && exp->expr_type != EXPR_FUNCTION))
+ && exp->expr_type != EXPR_FUNCTION
+ && exp->expr_type != EXPR_STRUCTURE))
return;
/* If we are reading, the variable will be changed. Note that
@@ -8375,8 +8376,7 @@ resolve_transfer (gfc_code *code)
_("item in READ")))
return;
- sym = exp->symtree->n.sym;
- ts = &sym->ts;
+ ts = exp->expr_type == EXPR_STRUCTURE ? &exp->ts : &exp->symtree->n.sym->ts;
/* Go to actual component transferred. */
for (ref = exp->ref; ref; ref = ref->next)
@@ -8436,6 +8436,11 @@ resolve_transfer (gfc_code *code)
return;
}
}
+
+ if (exp->expr_type == EXPR_STRUCTURE)
+ return;
+
+ sym = exp->symtree->n.sym;
if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
&& exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a86c9d..cf3a21e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-05 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/64943
+ * gfortran.dg/structure_constructor_12.f90: New.
+
2015-02-05 Jeff Law <law@redhat.com>
PR target/58400
diff --git a/gcc/testsuite/gfortran.dg/structure_constructor_12.f90 b/gcc/testsuite/gfortran.dg/structure_constructor_12.f90
new file mode 100644
index 0000000..aa7e91d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/structure_constructor_12.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! PR fortran/64943
+!
+! Contributed Dominique d'Humieres
+!
+ type :: Test
+ integer :: i
+ end type
+
+ type :: TestReference
+ class(Test), allocatable :: test(:)
+ end type
+print *, TestReference([Test(99), Test(199)]) ! { dg-error "Data transfer element at .1. cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure" }
+end