aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-01-25 14:30:32 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2011-01-25 14:30:32 +0100
commit315d905fd552d1ace2196310e527407f9b5bdbd8 (patch)
tree73b33d0e48ad303f479fa34730ef70addcf7d6d7 /gcc
parent9ffa621eadf61d2f13af900392d250870519d011 (diff)
downloadgcc-315d905fd552d1ace2196310e527407f9b5bdbd8.zip
gcc-315d905fd552d1ace2196310e527407f9b5bdbd8.tar.gz
gcc-315d905fd552d1ace2196310e527407f9b5bdbd8.tar.bz2
re PR fortran/47448 (Invalid check for ASSIGNMENT(=))
2011-01-25 Tobias Burnus <burnus@net-b.de> 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. From-SVN: r169228
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/interface.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f9068
4 files changed, 82 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 489caca..c5ba0e5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 1febb5d..c5b690e 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -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))))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 66ded37..4977ae6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ba70902
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f90
@@ -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" } }