diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-01-25 14:30:32 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-01-25 14:30:32 +0100 |
commit | 315d905fd552d1ace2196310e527407f9b5bdbd8 (patch) | |
tree | 73b33d0e48ad303f479fa34730ef70addcf7d6d7 /gcc | |
parent | 9ffa621eadf61d2f13af900392d250870519d011 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/interface.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/redefined_intrinsic_assignment_2.f90 | 68 |
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" } } |