aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2018-08-25 17:41:34 +0200
committerJanus Weil <janus@gcc.gnu.org>2018-08-25 17:41:34 +0200
commit3d6fc627f6cb78ecf280622c05eed59e9150a5c7 (patch)
tree06d8adf521a462ffce4c28e2e3c335cee13a6d1e /gcc
parentefa57feec8e47a9f6e4b62a21658f614b4aeb7d5 (diff)
downloadgcc-3d6fc627f6cb78ecf280622c05eed59e9150a5c7.zip
gcc-3d6fc627f6cb78ecf280622c05eed59e9150a5c7.tar.gz
gcc-3d6fc627f6cb78ecf280622c05eed59e9150a5c7.tar.bz2
re PR fortran/86545 (ICE in transfer_expr on invalid WRITE statement)
fix PR 86545 2018-08-25 Janus Weil <janus@gcc.gnu.org> PR fortran/86545 * resolve.c (resolve_transfer): Correctly determine typespec for generic function calls, in order to throw a proper error. 2018-08-25 Janus Weil <janus@gcc.gnu.org> PR fortran/86545 * gfortran.dg/generic_35.f90: New test case. From-SVN: r263854
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/generic_35.f9031
4 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0d81a49..22c4052 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-25 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/86545
+ * resolve.c (resolve_transfer): Correctly determine typespec for
+ generic function calls, in order to throw a proper error.
+
2018-08-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/86837
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 43a8470..ded2762 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -9280,7 +9280,6 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
static void
resolve_transfer (gfc_code *code)
{
- gfc_typespec *ts;
gfc_symbol *sym, *derived;
gfc_ref *ref;
gfc_expr *exp;
@@ -9316,7 +9315,9 @@ resolve_transfer (gfc_code *code)
_("item in READ")))
return;
- ts = exp->expr_type == EXPR_STRUCTURE ? &exp->ts : &exp->symtree->n.sym->ts;
+ const gfc_typespec *ts = exp->expr_type == EXPR_STRUCTURE
+ || exp->expr_type == EXPR_FUNCTION
+ ? &exp->ts : &exp->symtree->n.sym->ts;
/* Go to actual component transferred. */
for (ref = exp->ref; ref; ref = ref->next)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index da37cb1..13601d2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-25 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/86545
+ * gfortran.dg/generic_35.f90: New test case.
+
2018-08-24 David Malcolm <dmalcolm@redhat.com>
PR 87091
diff --git a/gcc/testsuite/gfortran.dg/generic_35.f90 b/gcc/testsuite/gfortran.dg/generic_35.f90
new file mode 100644
index 0000000..24ac270
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/generic_35.f90
@@ -0,0 +1,31 @@
+! { dg-do compile }
+!
+! PR 86545: ICE in transfer_expr on invalid WRITE statement
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+module m
+
+ type tString
+ character(len=:), allocatable :: cs
+ end type
+
+ interface my_trim
+ module procedure trim_string
+ end interface
+
+contains
+
+ elemental function trim_string(self) result(str)
+ type(tString) :: str
+ class(tString), intent(in) :: self
+ end function
+
+end module
+
+
+program p
+ use m
+ type(tString) :: s
+ write(*,*) my_trim(s) ! { dg-error "cannot have ALLOCATABLE components" }
+end