http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48655

           Summary: False positive with -Warray-temporaries and
                    a=transpose(a)
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: fortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: tkoe...@gcc.gnu.org


Well, the front end generates the temporary, but the middle end removes it
again.

ig25@linux-fd1f:~/Dokumente/ig25/Transpose> cat foo.f90               
subroutine foo(a,x)                               
  real, dimension(3,3), intent(out) :: a                                   
  real, intent(in) :: x

  a(1,1) = 1.0
  a(2,1) = 1.3 + x
  a(3,1) = 1.0    
  a(1,2) = 1.43   
  a(2,2) = 2*x    
  a(3,2) = x**2   
  a(1,3) = -x     
  a(2,3) = -x**2  
  a(3,3) = 2.1    
  a = transpose(a)
end subroutine foo

ig25@linux-fd1f:~/Dokumente/ig25/Transpose> gfortran -O3 -c
-fdump-tree-optimized -fdump-tree-original -Warray-temporaries foo.f90          
foo.f90:14.6:                                                                   

  a = transpose(a)
      1
Warnung: Creating array temporary at (1)
ig25@linux-fd1f:~/Dokumente/ig25/Transpose> cat foo.f90.142t.optimized

;; Function foo (foo_)

foo (real(kind=4)[9] * restrict a, real(kind=4) & restrict x)
{
  real(kind=4) D.1549;
  real(kind=4) D.1586;
  real(kind=4) D.1585;
  real(kind=4) D.1584;
  real(kind=4) D.1583;
  real(kind=4) D.1582;

<bb 2>:
  *a_5(D)[0] = 1.0e+0;
  D.1582_7 = *x_6(D);
  D.1583_8 = D.1582_7 + 1.2999999523162841796875e+0;
  D.1584_10 = D.1582_7 * 2.0e+0;
  *a_5(D)[4] = D.1584_10;
  D.1549_12 = D.1582_7 * D.1582_7;
  D.1585_14 = -D.1582_7;
  D.1586_17 = -D.1549_12;
  *a_5(D)[8] = 2.099999904632568359375e+0;
  *a_5(D)[1] = 1.42999994754791259765625e+0;
  *a_5(D)[2] = D.1585_14;
  *a_5(D)[3] = D.1583_8;
  *a_5(D)[5] = D.1586_17;
  *a_5(D)[6] = 1.0e+0;
  *a_5(D)[7] = D.1549_12;
  return;

}

Reply via email to