2010-10-02 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Oct 2010 08:00:50 +0000 (08:00 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Oct 2010 08:00:50 +0000 (08:00 +0000)
PR fortran/42831
* gfortran.dg/dependency_37.f90:  New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164900 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dependency_37.f90 [new file with mode: 0644]

index 1abe409..4d947da 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-02  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/42831
+       * gfortran.dg/dependency_37.f90:  New test.
+
 2010-10-01  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/shift_mask.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/dependency_37.f90 b/gcc/testsuite/gfortran.dg/dependency_37.f90
new file mode 100644 (file)
index 0000000..73721c9
--- /dev/null
@@ -0,0 +1,49 @@
+! { dg-do compile }
+! { dg-options "-Warray-temporaries" }
+! PR 48231 - this used to create an unnecessary temporary.
+module UnitValue_Module
+  type :: UnitValue
+    real          :: Value = 1.0
+  end type
+
+  interface operator(*)
+    module procedure ProductReal_LV
+  end interface operator(*)
+
+  interface assignment(=)
+    module procedure Assign_LV_Real
+  end interface assignment(=)
+contains
+
+  elemental function ProductReal_LV(Multiplier, Multiplicand) result(P_R_LV)
+    real, intent(in)            :: Multiplier
+    type(UnitValue), intent(in) :: Multiplicand
+    type(UnitValue)             :: P_R_LV
+    P_R_LV%Value = Multiplier * Multiplicand%Value
+  end function ProductReal_LV
+
+  elemental subroutine Assign_LV_Real(LeftHandSide, RightHandSide)
+    real, intent(inout)         :: LeftHandSide
+    type(UnitValue), intent(in) :: RightHandSide
+    LeftHandSide = RightHandSide%Value
+  end subroutine Assign_LV_Real
+end module UnitValue_Module
+
+program TestProgram
+  use UnitValue_Module
+
+  type :: TableForm
+    real, dimension(:,:), allocatable :: RealData
+  end type TableForm
+
+  REAL :: CENTIMETER
+  type(TableForm), pointer :: Table
+
+  allocate(Table)
+  allocate(Table%RealData(10,5))
+
+  CENTIMETER = 42
+  Table%RealData = 1
+  Table%RealData(:,1) = Table%RealData(:,1) * CENTIMETER
+end program TestProgram
+! { dg-final { cleanup-modules "UnitValue_Module" } }