re PR fortran/80164 (ICE in gfc_format_decoder at gcc/fortran/error.c:933)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 28 Jun 2017 02:17:40 +0000 (02:17 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 28 Jun 2017 02:17:40 +0000 (02:17 +0000)
2017-06-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/80164
* trans-stmt.c (gfc_trans_call): If no code expr, use code->loc
as warning/error locus.

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

From-SVN: r249718

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

index 88fd0b327d7cc2d5310a9c770e81f2705ffc4b40..fbf0b4ded408ad6f43acabf11845cc88c33bb6e6 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/80164
+       * trans-stmt.c (gfc_trans_call): If no code expr, use code->loc
+       as warning/error locus.
+
 2017-06-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/81160
index e4f1da54ac71fbd760efe449fb54b1c146bd19b8..a1e1dff72e0a02b4797e0efd7870e1bd03958f35 100644 (file)
@@ -452,7 +452,11 @@ gfc_trans_call (gfc_code * code, bool dependency_check,
         subscripts.  This could be prevented in the elemental case
         as temporaries are handled separatedly
         (below in gfc_conv_elemental_dependencies).  */
-      gfc_conv_loop_setup (&loop, &code->expr1->where);
+      if (code->expr1)
+       gfc_conv_loop_setup (&loop, &code->expr1->where);
+      else
+       gfc_conv_loop_setup (&loop, &code->loc);
+
       gfc_mark_ss_chain_used (ss, 1);
 
       /* Convert the arguments, checking for dependencies.  */
index 56123195e8dfca7371014496e47517193a23468c..46879b7998d67181cd809944c8ef02d16f51b289 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/80164
+       * gfortran.dg/array_temporaries_4.f90: New test.
+
 2017-06-27  Andrew Pinski  <apinski@cavium.com>
 
        * gcc.dg/tree-ssa/copy-sign-1.c: New testcase.
diff --git a/gcc/testsuite/gfortran.dg/array_temporaries_4.f90 b/gcc/testsuite/gfortran.dg/array_temporaries_4.f90
new file mode 100644 (file)
index 0000000..d022ce8
--- /dev/null
@@ -0,0 +1,59 @@
+! { dg-do compile }
+! { dg-options "-Warray-temporaries" }
+! Tests the fix for PR80164, in which the compiler segfaulted on this
+! when using -Warray-temporaries
+!
+!******************************************************************************
+module global
+  type :: a
+    integer :: b
+    character(8):: c
+  end type a
+  interface assignment(=)
+    module procedure a_to_a, c_to_a, a_to_c
+  end interface
+  interface operator(.ne.)
+    module procedure a_ne_a
+  end interface
+
+  type(a) :: x(4), y(4)
+  logical :: l1(4), t = .true., f= .false.
+contains
+!******************************************************************************
+  elemental subroutine a_to_a (m, n)
+    type(a), intent(in) :: n
+    type(a), intent(out) :: m
+    m%b = len ( trim(n%c))
+    m%c = n%c
+  end subroutine a_to_a
+  elemental subroutine c_to_a (m, n)
+    character(8), intent(in) :: n
+    type(a), intent(out) :: m
+    m%b = m%b + 1
+    m%c = n
+  end subroutine c_to_a
+  elemental subroutine a_to_c (m, n)
+    type(a), intent(in) :: n
+    character(8), intent(out) :: m
+    m = n%c
+  end subroutine a_to_c
+!******************************************************************************
+  elemental logical function a_ne_a (m, n)
+    type(a), intent(in) :: n
+    type(a), intent(in) :: m
+    a_ne_a = (m%b .ne. n%b) .or. (m%c .ne. n%c)
+  end function a_ne_a
+!******************************************************************************
+  elemental function foo (m)
+    type(a) :: foo
+    type(a), intent(in) :: m
+    foo%b = 0
+    foo%c = m%c
+  end function foo  
+end module global
+!******************************************************************************
+program test
+  use global
+  x = (/a (0, "one"),a (0, "two"),a (0, "three"),a (0, "four")/) ! { dg-warning "Creating array temporary" }
+  y = x
+end program test