cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
163 lines
3.1 KiB
Fortran
163 lines
3.1 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
integer :: y
|
|
procedure() :: a
|
|
procedure(real) :: b
|
|
call a ! OK - can be function or subroutine
|
|
!ERROR: Cannot call subroutine 'a' like a function
|
|
c = a()
|
|
!ERROR: Cannot call function 'b' like a subroutine
|
|
call b
|
|
!ERROR: Cannot call function 'y' like a subroutine
|
|
call y
|
|
call x
|
|
!ERROR: Cannot call subroutine 'x' like a function
|
|
z = x()
|
|
end
|
|
|
|
subroutine s
|
|
!ERROR: Cannot call function 'f' like a subroutine
|
|
call f
|
|
!ERROR: Cannot call subroutine 's' like a function
|
|
i = s()
|
|
contains
|
|
function f()
|
|
end
|
|
end
|
|
|
|
subroutine s2
|
|
! subroutine vs. function is determined by use
|
|
external :: a, b
|
|
call a()
|
|
!ERROR: Cannot call subroutine 'a' like a function
|
|
x = a()
|
|
x = b()
|
|
!ERROR: Cannot call function 'b' like a subroutine
|
|
call b()
|
|
end
|
|
|
|
subroutine s3
|
|
! subroutine vs. function is determined by use, even in internal subprograms
|
|
external :: a
|
|
procedure() :: b
|
|
contains
|
|
subroutine s3a()
|
|
x = a()
|
|
call b()
|
|
end
|
|
subroutine s3b()
|
|
!ERROR: Cannot call function 'a' like a subroutine
|
|
call a()
|
|
!ERROR: Cannot call subroutine 'b' like a function
|
|
x = b()
|
|
end
|
|
end
|
|
|
|
module m1
|
|
!Function vs subroutine in a module is resolved to a subroutine if
|
|
!no other information.
|
|
external :: exts, extf, extunk
|
|
procedure() :: procs, procf, procunk
|
|
contains
|
|
subroutine s
|
|
call exts()
|
|
call procs()
|
|
x = extf()
|
|
x = procf()
|
|
end
|
|
end
|
|
|
|
module m2
|
|
use m1
|
|
contains
|
|
subroutine test
|
|
call exts() ! ok
|
|
call procs() ! ok
|
|
call extunk() ! ok
|
|
call procunk() ! ok
|
|
x = extf() ! ok
|
|
x = procf() ! ok
|
|
!ERROR: Cannot call subroutine 'extunk' like a function
|
|
!ERROR: Function result characteristics are not known
|
|
x = extunk()
|
|
!ERROR: Cannot call subroutine 'procunk' like a function
|
|
!ERROR: Function result characteristics are not known
|
|
x = procunk()
|
|
end
|
|
end
|
|
|
|
module modulename
|
|
end
|
|
|
|
! Call to entity in global scope, even with IMPORT, NONE
|
|
subroutine s4
|
|
block
|
|
import, none
|
|
integer :: i
|
|
!ERROR: 'modulename' is not a callable procedure
|
|
call modulename()
|
|
end block
|
|
end
|
|
|
|
! Call to entity in global scope, even with IMPORT, NONE
|
|
subroutine s5
|
|
block
|
|
import, none
|
|
integer :: i
|
|
i = foo()
|
|
!ERROR: Cannot call function 'foo' like a subroutine
|
|
call foo()
|
|
end block
|
|
end
|
|
|
|
subroutine s6
|
|
call a6()
|
|
end
|
|
!ERROR: 'a6' was previously called as a subroutine
|
|
function a6()
|
|
a6 = 0.0
|
|
end
|
|
|
|
subroutine s7
|
|
x = a7()
|
|
end
|
|
!ERROR: 'a7' was previously called as a function
|
|
subroutine a7()
|
|
end
|
|
|
|
!OK: use of a8 and b8 is consistent
|
|
subroutine s8
|
|
call a8()
|
|
x = b8()
|
|
end
|
|
subroutine a8()
|
|
end
|
|
function b8()
|
|
b8 = 0.0
|
|
end
|
|
|
|
subroutine s9
|
|
type t
|
|
procedure(), nopass, pointer :: p1, p2
|
|
end type
|
|
type(t) x
|
|
print *, x%p1()
|
|
call x%p2
|
|
!ERROR: Cannot call function 'p1' like a subroutine
|
|
call x%p1
|
|
!ERROR: Cannot call subroutine 'p2' like a function
|
|
print *, x%p2()
|
|
end subroutine
|
|
|
|
subroutine s10
|
|
call a10
|
|
!ERROR: Actual argument for 'a=' may not be a procedure
|
|
print *, abs(a10)
|
|
end
|
|
|
|
subroutine s11
|
|
real, pointer :: p(:)
|
|
!ERROR: A NULL() pointer is not allowed for 'a=' intrinsic argument
|
|
print *, rank(null())
|
|
print *, rank(null(mold=p)) ! ok
|
|
end
|