re PR fortran/78757 (ICE with function returning a pointer to a character)
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Dec 2016 19:41:13 +0000 (20:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Dec 2016 19:41:13 +0000 (20:41 +0100)
PR fortran/78757
* trans-expr.c (gfc_conv_procedure_call): Emit DECL_EXPR for the
type pstr var points to.

* gfortran.dg/char_result_16.f90: New test.

From-SVN: r243761

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_result_16.f90 [new file with mode: 0644]

index 7f66ed5f5abb20db7dc6d1e0d1a76bd6814b321d..e4605048b171de037a47d1caaf50c0429abb7378 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/78757
+       * trans-expr.c (gfc_conv_procedure_call): Emit DECL_EXPR for the
+       type pstr var points to.
+
 2016-12-15  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/78798
index f908c25b9cb36b86ba4081a3af877e96d479818e..823c96aa4cd2154e27bce9ea898b36b3293f6fc8 100644 (file)
@@ -6009,6 +6009,19 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
            {
              var = gfc_create_var (type, "pstr");
 
+             /* Emit a DECL_EXPR for the VLA type.  */
+             tmp = TREE_TYPE (type);
+             if (TYPE_SIZE (tmp)
+                 && TREE_CODE (TYPE_SIZE (tmp)) != INTEGER_CST)
+               {
+                 tmp = build_decl (input_location, TYPE_DECL, NULL_TREE, tmp);
+                 DECL_ARTIFICIAL (tmp) = 1;
+                 DECL_IGNORED_P (tmp) = 1;
+                 tmp = fold_build1_loc (input_location, DECL_EXPR,
+                                        TREE_TYPE (tmp), tmp);
+                 gfc_add_expr_to_block (&se->pre, tmp);
+               }
+
              if ((!comp && sym->attr.allocatable)
                  || (comp && comp->attr.allocatable))
                {
index 30f89311da84ab9edaabdf3919d1183bd180dc6a..c0b849324d21eebf41ff4e0b0bf97c001ea29cf3 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/78757
+       * gfortran.dg/char_result_16.f90: New test.
+
 2016-12-16  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/aarch64/ubfiz_lsl_1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/char_result_16.f90 b/gcc/testsuite/gfortran.dg/char_result_16.f90
new file mode 100644 (file)
index 0000000..adb86d5
--- /dev/null
@@ -0,0 +1,16 @@
+! PR fortran/78757
+! { dg-do compile }
+! { dg-options "-O1" }
+
+program pr78757
+  implicit none
+  character (len = 30), target :: x
+  character (len = 30), pointer :: s
+  s => foo (30_8)
+contains
+  function foo (i)
+    integer (8) :: i
+    character (len = i), pointer :: foo
+    foo => x
+  end function foo
+end program pr78757