Files
RedBear-OS/local/recipes/dev/libclc/source/flang/test/Lower/select-case-statement.f90
T
vasilito cb424d7448 build: static patch-sanity linter (shift-left the malformed-patch class)
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).
2026-08-01 05:13:02 +03:00

508 lines
15 KiB
Fortran

! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
! CHECK-LABEL: sinteger
function sinteger(n)
integer sinteger
nn = -88
! CHECK: fir.select_case {{.*}} : i32
! CHECK-SAME: upper, %c1
! CHECK-SAME: point, %c2
! CHECK-SAME: point, %c3
! CHECK-SAME: interval, %c4{{.*}} %c5
! CHECK-SAME: point, %c6
! CHECK-SAME: point, %c7
! CHECK-SAME: interval, %c8{{.*}} %c15
! CHECK-SAME: lower, %c21
! CHECK-SAME: unit
select case(n)
case (:1)
nn = 1
case (2)
nn = 2
case default
nn = 0
case (3)
nn = 3
case (4:5+1-1)
nn = 4
case (6)
nn = 6
case (7,8:15,21:)
nn = 7
end select
sinteger = nn
end
! CHECK-LABEL: slogical
subroutine slogical(L)
logical :: L
n1 = 0
n2 = 0
n3 = 0
n4 = 0
n5 = 0
n6 = 0
n7 = 0
n8 = 0
select case (L)
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %false
! CHECK: cond_br
case (.false.)
n2 = 1
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %true
! CHECK: cond_br
case (.true.)
n3 = 2
end select
select case (L)
case default
n4 = 3
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %false
! CHECK: cond_br
case (.false.)
n5 = 1
! CHECK: cmpi eq, {{.*}} %true
! CHECK: cond_br
case (.true.)
n5 = 2
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %false
! CHECK: cond_br
case (.false.)
n6 = 1
case default
n6 = 3
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %true
! CHECK: cond_br
case (.true.)
n7 = 2
case default
n7 = 3
end select
select case (L)
! CHECK: cmpi eq, {{.*}} %false
! CHECK: cond_br
case (.false.)
n8 = 1
! CHECK: cmpi eq, {{.*}} %true
! CHECK: cond_br
case (.true.)
n8 = 2
! CHECK-NOT: constant 888
case default ! dead
n8 = 888
end select
print*, n1, n2, n3, n4, n5, n6, n7, n8
end
! CHECK-LABEL: scharacter
subroutine scharacter(c)
character(*) :: c
nn = 0
select case (c)
case default
nn = -1
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi sle, {{.*}} %c0
! CHECK-NEXT: cond_br
case (:'d')
nn = 10
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi sge, {{.*}} %c0
! CHECK-NEXT: cond_br
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi sle, {{.*}} %c0
! CHECK-NEXT: cond_br
case ('ff':'ffff')
nn = 20
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi eq, {{.*}} %c0
! CHECK-NEXT: cond_br
case ('m')
nn = 30
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi eq, {{.*}} %c0
! CHECK-NEXT: cond_br
case ('qq')
nn = 40
! CHECK: CharacterCompareScalar1
! CHECK-NEXT: constant 0
! CHECK-NEXT: cmpi sge, {{.*}} %c0
! CHECK-NEXT: cond_br
case ('x':)
nn = 50
end select
print*, nn
end
! CHECK-LABEL: func @_QPscharacter1
subroutine scharacter1(s)
! CHECK-DAG: %[[V_0:[0-9]+]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>>
character(len=3) :: s
! CHECK-DAG: %[[V_1:[0-9]+]] = fir.alloca i32 {bindc_name = "n", uniq_name = "_QFscharacter1En"}
! CHECK: fir.store %c0{{.*}} to %[[V_1]] : !fir.ref<i32>
n = 0
! CHECK: %[[V_8:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_9:[0-9]+]] = arith.cmpi sge, %[[V_8]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_9]], ^bb1, ^bb16
! CHECK: ^bb1: // pred: ^bb0
if (lge(s,'00')) then
! CHECK: %[[V_18:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
! CHECK: %[[V_20:[0-9]+]] = fir.box_addr %[[V_18]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
! CHECK: %[[V_42:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_43:[0-9]+]] = arith.cmpi eq, %[[V_42]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_43]], ^bb3, ^bb2
! CHECK: ^bb2: // pred: ^bb1
select case(trim(s))
case('11')
n = 1
case default
continue
! CHECK: %[[V_48:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_49:[0-9]+]] = arith.cmpi eq, %[[V_48]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_49]], ^bb6, ^bb5
! CHECK: ^bb3: // pred: ^bb1
! CHECK: fir.store %c1{{.*}} to %[[V_1]] : !fir.ref<i32>
! CHECK: ^bb4: // pred: ^bb13
! CHECK: ^bb5: // pred: ^bb2
case('22')
n = 2
! CHECK: %[[V_54:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_55:[0-9]+]] = arith.cmpi eq, %[[V_54]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_55]], ^bb8, ^bb7
! CHECK: ^bb6: // pred: ^bb2
! CHECK: fir.store %c2{{.*}} to %[[V_1]] : !fir.ref<i32>
! CHECK: ^bb7: // pred: ^bb5
case('33')
n = 3
case('44':'55','66':'77','88':)
n = 4
! CHECK: %[[V_60:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_61:[0-9]+]] = arith.cmpi sge, %[[V_60]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_61]], ^bb9, ^bb10
! CHECK: ^bb8: // pred: ^bb5
! CHECK: fir.store %c3{{.*}} to %[[V_1]] : !fir.ref<i32>
! CHECK: ^bb9: // pred: ^bb7
! CHECK: %[[V_66:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_67:[0-9]+]] = arith.cmpi sle, %[[V_66]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_67]], ^bb14, ^bb10
! CHECK: ^bb10: // 2 preds: ^bb7, ^bb9
! CHECK: %[[V_72:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_73:[0-9]+]] = arith.cmpi sge, %[[V_72]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_73]], ^bb11, ^bb12
! CHECK: ^bb11: // pred: ^bb10
! CHECK: %[[V_78:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_79:[0-9]+]] = arith.cmpi sle, %[[V_78]], %c0{{.*}} : i32
! CHECK: ^bb12: // 2 preds: ^bb10, ^bb11
! CHECK: %[[V_84:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[V_85:[0-9]+]] = arith.cmpi sge, %[[V_84]], %c0{{.*}} : i32
! CHECK: cond_br %[[V_85]], ^bb14, ^bb13
! CHECK: ^bb13: // pred: ^bb12
! CHECK: ^bb14: // 3 preds: ^bb9, ^bb11, ^bb12
! CHECK: fir.store %c4{{.*}} to %[[V_1]] : !fir.ref<i32>
! CHECK: ^bb15: // 5 preds: ^bb3, ^bb4, ^bb6, ^bb8, ^bb14
! CHECK: fir.freemem %[[V_20]] : !fir.heap<!fir.char<1,?>>
end select
end if
! CHECK: %[[V_89:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<i32>
print*, n
end subroutine
! CHECK-LABEL: func @_QPscharacter2
subroutine scharacter2(s)
! CHECK-DAG: %[[V_0:[0-9]+]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>>
! CHECK: %[[V_1:[0-9]+]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>>
character(len=3) :: s
n = -10
! CHECK: %[[V_12:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
! CHECK: %[[V_13:[0-9]+]] = fir.box_addr %[[V_12]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
! CHECK: br ^bb1
! CHECK: ^bb1: // pred: ^bb0
! CHECK: fir.store %c9{{.*}}
! CHECK: br ^bb2
! CHECK: ^bb2: // pred: ^bb1
! CHECK: fir.freemem %[[V_13]] : !fir.heap<!fir.char<1,?>>
select case(trim(s))
case default
n = 9
end select
print*, n
n = -2
! CHECK: %[[V_28:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
! CHECK: %[[V_29:[0-9]+]] = fir.box_addr %[[V_28]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
! CHECK: br ^bb3
! CHECK: ^bb3: // pred: ^bb2
! CHECK: fir.freemem %[[V_29]] : !fir.heap<!fir.char<1,?>>
select case(trim(s))
end select
print*, n
end subroutine
! CHECK-LABEL: func @_QPsempty
! empty select case blocks
subroutine sempty(n)
! CHECK: %[[selectI1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
! CHECK: fir.select_case %[[selectI1]] : i32 [#fir.point, %c1{{.*}}, ^bb1, #fir.point, %c2{{.*}}, ^bb2, unit, ^bb3]
! CHECK: ^bb1: // pred: ^bb0
! CHECK: fir.call @_FortranAioBeginExternalListOutput
! CHECK: br ^bb4
! CHECK: ^bb2: // pred: ^bb0
! CHECK: br ^bb4
! CHECK: ^bb3: // pred: ^bb0
! CHECK: fir.call @_FortranAioBeginExternalListOutput
! CHECK: br ^bb4
select case (n)
case (1)
print*, n, 'i:case 1'
case (2)
! print*, n, 'i:case 2'
case default
print*, n, 'i:case default'
end select
! CHECK: ^bb4: // 3 preds: ^bb1, ^bb2, ^bb3
! CHECK: %[[cmpC1:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[selectC1:[0-9]+]] = arith.cmpi eq, %[[cmpC1]], %c0{{.*}} : i32
! CHECK: cond_br %[[selectC1]], ^bb6, ^bb5
! CHECK: ^bb5: // pred: ^bb4
! CHECK: %[[cmpC2:[0-9]+]] = fir.call @_FortranACharacterCompareScalar1
! CHECK: %[[selectC2:[0-9]+]] = arith.cmpi eq, %[[cmpC2]], %c0{{.*}} : i32
! CHECK: cond_br %[[selectC2]], ^bb8, ^bb7
! CHECK: ^bb6: // pred: ^bb4
! CHECK: fir.call @_FortranAioBeginExternalListOutput
! print*, n, 'c:case 2'
! CHECK: br ^bb10
! CHECK: ^bb7: // pred: ^bb5
! CHECK: br ^bb9
! CHECK: ^bb8: // pred: ^bb5
! CHECK: br ^bb10
! CHECK: ^bb9: // pred: ^bb7
! CHECK: fir.call @_FortranAioBeginExternalListOutput
! CHECK: br ^bb10
! CHECK: ^bb10: // 3 preds: ^bb6, ^bb8, ^bb9
select case (char(ichar('0')+n))
case ('1')
print*, n, 'c:case 1'
case ('2')
! print*, n, 'c:case 2'
case default
print*, n, 'c:case default'
end select
! CHECK: return
end subroutine
! CHECK-LABEL: func @_QPsgoto
! select case with goto exit
subroutine sgoto
n = 0
do i=1,8
! CHECK: %[[i:[0-9]+]] = fir.alloca {{.*}} "_QFsgotoEi"
! CHECK: ^bb2: // pred: ^bb1
! CHECK: %[[selector:[0-9]+]] = fir.load %[[i]] : !fir.ref<i32>
! CHECK: fir.select_case %[[selector]] : i32 [#fir.upper, %c2{{.*}}, ^bb3, #fir.lower, %c5{{.*}}, ^bb4, unit, ^bb7]
! CHECK: ^bb3: // pred: ^bb2
! CHECK: arith.muli %c10{{[^0]}}
! CHECK: br ^bb8
! CHECK: ^bb4: // pred: ^bb2
! CHECK: arith.muli %c1000{{[^0]}}
! CHECK: cond_br {{.*}}, ^bb5, ^bb6
! CHECK: ^bb5: // pred: ^bb4
! CHECK: br ^bb8
! CHECK: ^bb6: // pred: ^bb4
! CHECK: arith.muli %c10000{{[^0]}}
! CHECK: br ^bb8
! CHECK: ^bb7: // pred: ^bb2
! CHECK: arith.muli %c100{{[^0]}}
! CHECK: br ^bb8
! CHECK: ^bb8: // 4 preds: ^bb3, ^bb5, ^bb6, ^bb7
! CHECK: fir.call @_FortranAioBeginExternalListOutput
! CHECK: br ^bb1
! CHECK: ^bb9: // pred: ^bb1
select case(i)
case (:2)
n = i * 10
case (5:)
n = i * 1000
if (i <= 6) goto 9
n = i * 10000
case default
n = i * 100
9 end select
print*, n
enddo
! CHECK: return
end
! CHECK-LABEL: func @_QPswhere
subroutine swhere(num)
implicit none
integer, intent(in) :: num
real, dimension(1) :: array
array = 0.0
select case (num)
! CHECK: ^bb1: // pred: ^bb0
case (1)
where (array >= 0.0)
array = 42
end where
! CHECK: cf.br ^bb3
! CHECK: ^bb2: // pred: ^bb0
case default
array = -1
end select
! CHECK: cf.br ^bb3
! CHECK: ^bb3: // 2 preds: ^bb1, ^bb2
print*, array(1)
end subroutine swhere
! CHECK-LABEL: func @_QPsforall
subroutine sforall(num)
implicit none
integer, intent(in) :: num
real, dimension(1) :: array
array = 0.0
select case (num)
! CHECK: ^bb1: // pred: ^bb0
case (1)
where (array >= 0.0)
array = 42
end where
! CHECK: cf.br ^bb3
! CHECK: ^bb2: // pred: ^bb0
case default
array = -1
end select
! CHECK: cf.br ^bb3
! CHECK: ^bb3: // 2 preds: ^bb1, ^bb2
print*, array(1)
end subroutine sforall
! CHECK-LABEL: func @_QPsnested
subroutine snested(str)
character(*), optional :: str
integer :: num
if (present(str)) then
select case (trim(str))
case ('a')
num = 10
case default
num = 20
end select
! CHECK: ^bb5: // 2 preds: ^bb3, ^bb4
! CHECK: fir.freemem %{{[0-9]+}} : !fir.heap<!fir.char<1,?>>
! CHECK: cf.br ^bb7
else
num = 30
end if
! CHECK: ^bb7: // 2 preds: ^bb5, ^bb6
end subroutine snested
! CHECK-LABEL: main
program p
integer sinteger, v(10)
n = -10
do j = 1, 4
do k = 1, 10
n = n + 1
v(k) = sinteger(n)
enddo
! expected output: 1 1 1 1 1 1 1 1 1 1
! 1 2 3 4 4 6 7 7 7 7
! 7 7 7 7 7 0 0 0 0 0
! 7 7 7 7 7 7 7 7 7 7
print*, v
enddo
print*
call slogical(.false.) ! expected output: 0 1 0 3 1 1 3 1
call slogical(.true.) ! expected output: 0 0 2 3 2 3 2 2
print*
call scharacter('aa') ! expected output: 10
call scharacter('d') ! expected output: 10
call scharacter('f') ! expected output: -1
call scharacter('ff') ! expected output: 20
call scharacter('fff') ! expected output: 20
call scharacter('ffff') ! expected output: 20
call scharacter('fffff') ! expected output: -1
call scharacter('jj') ! expected output: -1
call scharacter('m') ! expected output: 30
call scharacter('q') ! expected output: -1
call scharacter('qq') ! expected output: 40
call scharacter('qqq') ! expected output: -1
call scharacter('vv') ! expected output: -1
call scharacter('xx') ! expected output: 50
call scharacter('zz') ! expected output: 50
print*
call scharacter1('99 ') ! expected output: 4
call scharacter1('88 ') ! expected output: 4
call scharacter1('77 ') ! expected output: 4
call scharacter1('66 ') ! expected output: 4
call scharacter1('55 ') ! expected output: 4
call scharacter1('44 ') ! expected output: 4
call scharacter1('33 ') ! expected output: 3
call scharacter1('22 ') ! expected output: 2
call scharacter1('11 ') ! expected output: 1
call scharacter1('00 ') ! expected output: 0
call scharacter1('. ') ! expected output: 0
call scharacter1(' ') ! expected output: 0
print*
call scharacter2('99 ') ! expected output: 9 -2
call scharacter2('22 ') ! expected output: 9 -2
call scharacter2('. ') ! expected output: 9 -2
call scharacter2(' ') ! expected output: 9 -2
print*
call sempty(0) ! expected output: 0 i:case default 0; c:case default
call sempty(1) ! expected output: 1 i:case 1; 1 c:case 1
call sempty(2) ! no output
call sempty(3) ! expected output: 3 i:case default; 3 c:case default
print*
call sgoto ! expected output: 10 20 300 400 5000 6000 70000 80000
print*
call swhere(1) ! expected output: 42.
call sforall(1) ! expected output: 42.
end