| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| module m |
| type :: pdt(len) |
| integer, len :: len |
| character(len=len) :: ch |
| end type |
| contains |
| pure real function f(x,y) |
| real, intent(in) :: x, y |
| f = x + y |
| end function |
| impure real function f1(x,y) |
| f1 = x + y |
| end function |
| pure function f2(x,y) |
| real :: f2(1) |
| real, intent(in) :: x, y |
| f2(1) = x + y |
| end function |
| pure real function f3(x,y,z) |
| real, intent(in) :: x, y, z |
| f3 = x + y + z |
| end function |
| pure real function f4(x,y) |
| interface |
| pure real function x(); end function |
| pure real function y(); end function |
| end interface |
| f4 = x() + y() |
| end function |
| pure integer function f5(x,y) |
| real, intent(in) :: x, y |
| f5 = x + y |
| end function |
| pure real function f6(x,y) |
| real, intent(in) :: x(*), y(*) |
| f6 = x(1) + y(1) |
| end function |
| pure real function f7(x,y) |
| real, intent(in), allocatable :: x |
| real, intent(in) :: y |
| f7 = x + y |
| end function |
| pure real function f8(x,y) |
| real, intent(in), pointer :: x |
| real, intent(in) :: y |
| f8 = x + y |
| end function |
| pure real function f9(x,y) |
| real, intent(in), optional :: x |
| real, intent(in) :: y |
| f9 = x + y |
| end function |
| pure real function f10a(x,y) |
| real, intent(in), asynchronous :: x |
| real, intent(in) :: y |
| f10a = x + y |
| end function |
| pure real function f10b(x,y) |
| real, intent(in), target :: x |
| real, intent(in) :: y |
| f10b = x + y |
| end function |
| pure real function f10c(x,y) |
| real, intent(in), value :: x |
| real, intent(in) :: y |
| f10c = x + y |
| end function |
| pure function f11(x,y) result(res) |
| type(pdt(*)), intent(in) :: x, y |
| type(pdt(max(x%len, y%len))) :: res |
| res%ch = x%ch // y%ch |
| end function |
| |
| subroutine errors |
| real :: a(10,10), b, c(10) |
| !ERROR: OPERATION= argument of REDUCE() must be a pure function of two data arguments |
| b = reduce(a, f1) |
| !ERROR: OPERATION= argument of REDUCE() must be a scalar function |
| b = reduce(a, f2) |
| !ERROR: OPERATION= argument of REDUCE() must be a pure function of two data arguments |
| b = reduce(a, f3) |
| !ERROR: OPERATION= argument of REDUCE() may not have dummy procedure arguments |
| b = reduce(a, f4) |
| !ERROR: OPERATION= argument of REDUCE() must have the same type as ARRAY= |
| b = reduce(a, f5) |
| !ERROR: Arguments of OPERATION= procedure of REDUCE() must be both scalar of the same type as ARRAY=, and neither allocatable, pointer, polymorphic, nor optional |
| b = reduce(a, f6) |
| !ERROR: Arguments of OPERATION= procedure of REDUCE() must be both scalar of the same type as ARRAY=, and neither allocatable, pointer, polymorphic, nor optional |
| b = reduce(a, f7) |
| !ERROR: Arguments of OPERATION= procedure of REDUCE() must be both scalar of the same type as ARRAY=, and neither allocatable, pointer, polymorphic, nor optional |
| b = reduce(a, f8) |
| !ERROR: Arguments of OPERATION= procedure of REDUCE() must be both scalar of the same type as ARRAY=, and neither allocatable, pointer, polymorphic, nor optional |
| b = reduce(a, f9) |
| !ERROR: If either argument of the OPERATION= procedure of REDUCE() has the ASYNCHRONOUS, TARGET, or VALUE attribute, both must have that attribute |
| b = reduce(a, f10a) |
| !ERROR: If either argument of the OPERATION= procedure of REDUCE() has the ASYNCHRONOUS, TARGET, or VALUE attribute, both must have that attribute |
| b = reduce(a, f10b) |
| !ERROR: If either argument of the OPERATION= procedure of REDUCE() has the ASYNCHRONOUS, TARGET, or VALUE attribute, both must have that attribute |
| b = reduce(a, f10c) |
| !ERROR: IDENTITY= must be present when the array is empty and the result is scalar |
| b = reduce(a(1:0,:), f) |
| !ERROR: IDENTITY= must be present when the array is empty and the result is scalar |
| b = reduce(a(1:0, 1), f, dim=1) |
| !ERROR: IDENTITY= must be present when DIM=1 and the array has zero extent on that dimension |
| c = reduce(a(1:0, :), f, dim=1) |
| !ERROR: IDENTITY= must be present when DIM=1 and the array has zero extent on that dimension |
| c = reduce(a(1:0, :), f, dim=1) |
| !ERROR: IDENTITY= must be present when DIM=2 and the array has zero extent on that dimension |
| c = reduce(a(:, 1:0), f, dim=2) |
| c(1:0) = reduce(a(1:0, 1:0), f, dim=1) ! ok, result is empty |
| c(1:0) = reduce(a(1:0, 1:0), f, dim=2) ! ok, result is empty |
| !ERROR: MASK= has no .TRUE. element, so IDENTITY= must be present |
| b = reduce(a, f, .false.) |
| !ERROR: MASK= has no .TRUE. element, so IDENTITY= must be present |
| b = reduce(a, f, reshape([(j > 100, j=1, 100)], shape(a))) |
| b = reduce(a, f, reshape([(j == 50, j=1, 100)], shape(a))) ! ok |
| end subroutine |
| subroutine not_errors |
| type(pdt(10)) :: a(10), b |
| b = reduce(a, f11) ! check no bogus type incompatibility diagnostic |
| end subroutine |
| end module |