OSDN Git Service

2011-01-25 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2011 13:30:32 +0000 (13:30 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2011 13:30:32 +0000 (13:30 +0000)
        PR fortran/47448
        * interface.c (gfc_check_operator_interface): Fix
        defined-assignment check.

2011-01-25  Tobias Burnus  <burnus@net-b.de>

        PR fortran/47448
        * gfortran.dg/redefined_intrinsic_assignment_2.f90: New.

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

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f90 [new file with mode: 0644]

index 489caca..c5ba0e5 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-25  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/47448
+       * interface.c (gfc_check_operator_interface): Fix
+       defined-assignment check.
+
 2011-01-23  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/47421
index 1febb5d..c5b690e 100644 (file)
@@ -654,11 +654,12 @@ gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
 
       /* Allowed are (per F2003, 12.3.2.1.2 Defined assignments):
         - First argument an array with different rank than second,
-        - Types and kinds do not conform, and
+        - First argument is a scalar and second an array,
+        - Types and kinds do not conform, or
         - First argument is of derived type.  */
       if (sym->formal->sym->ts.type != BT_DERIVED
          && sym->formal->sym->ts.type != BT_CLASS
-         && (r1 == 0 || r1 == r2)
+         && (r2 == 0 || r1 == r2)
          && (sym->formal->sym->ts.type == sym->formal->next->sym->ts.type
              || (gfc_numeric_ts (&sym->formal->sym->ts)
                  && gfc_numeric_ts (&sym->formal->next->sym->ts))))
index 66ded37..4977ae6 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-25  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/47448
+       * gfortran.dg/redefined_intrinsic_assignment_2.f90: New.
+
 2011-01-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/47427
diff --git a/gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f90 b/gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f90
new file mode 100644 (file)
index 0000000..ba70902
--- /dev/null
@@ -0,0 +1,68 @@
+! { dg-do compile }
+!
+! PR fortran/47448
+!
+! ASSIGNMENT(=) checks. Defined assignment is allowed if and only if
+! it does not override an intrinsic assignment.
+!
+
+module test1
+  interface assignment(=)
+     module procedure valid, valid2
+  end interface
+contains
+  ! Valid: scalar = array
+  subroutine valid (lhs,rhs)
+    integer, intent(out) ::  lhs
+    integer, intent(in) :: rhs(:)
+    lhs = rhs(1) 
+  end subroutine valid
+
+  ! Valid: array of different ranks
+  subroutine valid2 (lhs,rhs)
+    integer, intent(out) ::  lhs(:)
+    integer, intent(in) :: rhs(:,:)
+    lhs(:) = rhs(:,1) 
+  end subroutine valid2
+end module test1
+
+module test2
+  interface assignment(=)
+     module procedure invalid
+  end interface
+contains
+  ! Invalid: scalar = scalar
+  subroutine invalid (lhs,rhs) ! { dg-error "must not redefine an INTRINSIC type assignment" }
+    integer, intent(out) ::  lhs
+    integer, intent(in) :: rhs
+    lhs = rhs
+  end subroutine invalid
+end module test2
+
+module test3
+  interface assignment(=)
+     module procedure invalid2
+  end interface
+contains
+  ! Invalid: array = scalar
+  subroutine invalid2 (lhs,rhs) ! { dg-error "must not redefine an INTRINSIC type assignment" }
+    integer, intent(out) ::  lhs(:)
+    integer, intent(in) :: rhs
+    lhs(:) = rhs
+  end subroutine invalid2
+end module test3
+
+module test4
+  interface assignment(=)
+     module procedure invalid3
+  end interface
+contains
+  ! Invalid: array = array for same rank
+  subroutine invalid3 (lhs,rhs) ! { dg-error "must not redefine an INTRINSIC type assignment" }
+    integer, intent(out) ::  lhs(:)
+    integer, intent(in) :: rhs(:)
+    lhs(:) = rhs(:)
+  end subroutine invalid3
+end module test4
+
+! { dg-final { cleanup-modules "test1" } }