aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2017-11-23 09:52:04 +0000
committerPaul Thomas <pault@gcc.gnu.org>2017-11-23 09:52:04 +0000
commitf36a7f04f65f3e11e2c656e4171657acf59f3655 (patch)
treefb63a6bad613369a7c94717b06feb22ab3cf50b0 /gcc
parentd7a160a45ea7ed09247788c708721c2813cf0007 (diff)
downloadgcc-f36a7f04f65f3e11e2c656e4171657acf59f3655.zip
gcc-f36a7f04f65f3e11e2c656e4171657acf59f3655.tar.gz
gcc-f36a7f04f65f3e11e2c656e4171657acf59f3655.tar.bz2
re PR fortran/82814 (ICE from submodule character function)
2017-11-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/82814 * trans-types.c (gfc_sym_type): If a character function result is missing the charlen backend_decl, use the one from the name- space procedure symbol, if present. 2017-11-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/82814 * gfortran.dg/submodule_31.f08: New test. From-SVN: r255094
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-types.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/submodule_31.f0854
4 files changed, 72 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index cf1b320a..036bf7b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-23 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/82814
+ * trans-types.c (gfc_sym_type): If a character function result
+ is missing the charlen backend_decl, use the one from the name-
+ space procedure symbol, if present.
+
2017-11-22 David Malcolm <dmalcolm@redhat.com>
PR c++/62170
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index b4ddfdb..6868329 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2201,6 +2201,12 @@ gfc_sym_type (gfc_symbol * sym)
if (sym->backend_decl && !sym->attr.function)
return TREE_TYPE (sym->backend_decl);
+ if (sym->attr.result
+ && sym->ts.type == BT_CHARACTER
+ && sym->ts.u.cl->backend_decl == NULL_TREE
+ && sym->ns->proc_name->ts.u.cl->backend_decl != NULL_TREE)
+ sym->ts.u.cl->backend_decl = sym->ns->proc_name->ts.u.cl->backend_decl;
+
if (sym->ts.type == BT_CHARACTER
&& ((sym->attr.function && sym->attr.is_bind_c)
|| (sym->attr.result
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ff35bca..58b9276 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-11-23 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/82814
+ * gfortran.dg/submodule_31.f08: New test.
+
2017-11-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/23094
diff --git a/gcc/testsuite/gfortran.dg/submodule_31.f08 b/gcc/testsuite/gfortran.dg/submodule_31.f08
new file mode 100644
index 0000000..72594d0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/submodule_31.f08
@@ -0,0 +1,54 @@
+! { dg-do run }
+!
+! Test the fix for PR82814 in which an ICE occurred for the submodule allocation.
+!
+! Contributed by "Werner Blokbuster" <werner.blokbuster@gmail.com>
+!
+module u
+
+ implicit none
+
+ interface unique
+ module function uniq_char(input) result(uniq)
+ character(*), intent(in) :: input(:)
+ character(size(input)), allocatable :: uniq(:)
+ end function uniq_char
+ end interface unique
+
+contains
+
+ module function uniq2(input) result(uniq)
+ character(*), intent(in) :: input(:)
+ character(size(input)), allocatable :: uniq(:)
+ allocate(uniq(1))
+ uniq = 'A'
+ end function uniq2
+
+end module u
+
+
+submodule (u) z
+
+ implicit none
+
+contains
+
+ module function uniq_char(input) result(uniq)
+ character(*), intent(in) :: input(:)
+ character(size(input)), allocatable :: uniq(:)
+ allocate(uniq(1)) ! This used to ICE
+ uniq = 'A'
+ end function uniq_char
+
+end submodule z
+
+
+program test_uniq
+ use u
+ implicit none
+ character(1), dimension(4) :: chr = ['1','2','1','2']
+
+ write(*,*) unique(chr)
+ write(*,*) uniq2(chr)
+
+end program test_uniq