File tree Expand file tree Collapse file tree
src/Fable.Transforms/Rust Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -5360,14 +5360,15 @@ module Compiler =
53605360 |> Seq.toList
53615361
53625362 member _.ClearAllImports ( ctx ) =
5363- for import in imports do
5363+ let importsList = imports |> Seq.toList
5364+
5365+ for import in importsList do
53645366 import.Value.Depths <-
53655367 // remove all import depths at this module level or deeper
53665368 import.Value.Depths |> List.filter ( fun d -> d < ctx.ModuleDepth)
53675369
53685370 if import.Value.Depths.Length = 0 then
53695371 imports.Remove( import.Key) |> ignore
5370-
53715372 ctx.UsedNames.RootScope.Remove( import.Value.LocalIdent) |> ignore
53725373
53735374 member _.GetAllModules () = importModules.Keys |> Seq.toList
Original file line number Diff line number Diff line change @@ -703,7 +703,23 @@ let ``test Bitwise XOR on large unsigned integer works`` () =
703703let ``test Zero fill shift right for unsigned`` () =
704704 0x80000000 >>> 1 |> equal - 1073741824
705705 0x80000000 u >>> 1 |> equal 1073741824 u
706- 0x80000000 UL>>> 1 |> equal 1073741824 UL
706+ 0x80000000 UL >>> 1 |> equal 1073741824 UL
707+
708+ [<Fact>]
709+ let ``Zero fill right shift is logical for unsigned integer types`` () =
710+ // For unsigned types, >>> is zero-fill (logical) - the high bit is NOT sign-extended
711+ 0xFF uy >>> 1 |> equal 127 uy // uint8: 0x7F
712+ 0xFFFF us >>> 1 |> equal 32767 us // uint16: 0x7FFF
713+ 0xFFFFFFFF u >>> 1 |> equal 2147483647 u // uint32: 0x7FFFFFFF
714+ 0xFFFFFFFFFFFFFFFF UL >>> 1 |> equal 9223372036854775807 UL // uint64: 0x7FFFFFFFFFFFFFFF
715+
716+ [<Fact>]
717+ let ``Arithmetic right shift preserves sign for signed integer types`` () =
718+ // For signed types, >>> is arithmetic (sign-propagating) - the sign bit IS extended
719+ - 2 y >>> 1 |> equal - 1 y // int8: 0xFF = -1
720+ - 2 s >>> 1 |> equal - 1 s // int16: 0xFFFF = -1
721+ - 2 >>> 1 |> equal - 1 // int32: 0xFFFFFFFF = -1
722+ - 2 L >>> 1 |> equal - 1 L // int64: 0xFFFFFFFFFFFFFFFF = -1
707723
708724// TODO: ~~~ on unsigned integers uses LogicalNotDynamic which is not supported by Fable
709725// [<Fact>]
Original file line number Diff line number Diff line change @@ -127,6 +127,20 @@ let tests =
127127 0x80000000 u >>> 1 |> equal 1073741824 u
128128 0x80000000 UL >>> 1 |> equal 1073741824 UL
129129
130+ testCase " Zero fill right shift is logical for unsigned integer types" <| fun () ->
131+ // For unsigned types, >>> is zero-fill (logical) - the high bit is NOT sign-extended
132+ 0xFF uy >>> 1 |> equal 127 uy // uint8: 0x7F
133+ 0xFFFF us >>> 1 |> equal 32767 us // uint16: 0x7FFF
134+ 0xFFFFFFFF u >>> 1 |> equal 2147483647 u // uint32: 0x7FFFFFFF
135+ 0xFFFFFFFFFFFFFFFF UL >>> 1 |> equal 9223372036854775807 UL // uint64: 0x7FFFFFFFFFFFFFFF
136+
137+ testCase " Arithmetic right shift preserves sign for signed integer types" <| fun () ->
138+ // For signed types, >>> is arithmetic (sign-propagating) - the sign bit IS extended
139+ - 2 y >>> 1 |> equal - 1 y // int8: 0xFF = -1
140+ - 2 s >>> 1 |> equal - 1 s // int16: 0xFFFF = -1
141+ - 2 >>> 1 |> equal - 1 // int32: 0xFFFFFFFF = -1
142+ - 2 L >>> 1 |> equal - 1 L // int64: 0xFFFFFFFFFFFFFFFF = -1
143+
130144 testCase " UInt64 multiplication with 0 returns uint" <| fun () -> // See #1480
131145 0x0 UL * 0x1 UL |> equal 0x0 UL
132146
Original file line number Diff line number Diff line change @@ -139,7 +139,23 @@ let ``test Bitwise shift right can be generated`` () = // See #1530
139139let ``test Zero fill shift right for unsigned`` () = // See #646
140140 0x80000000 >>> 1 |> equal - 1073741824
141141 0x80000000 u >>> 1 |> equal 1073741824 u
142- 0x80000000 UL>>> 1 |> equal 1073741824 UL
142+ 0x80000000 UL >>> 1 |> equal 1073741824 UL
143+
144+ [<Fact>]
145+ let ``test Zero fill right shift is logical for unsigned integer types`` () =
146+ // For unsigned types, >>> is zero-fill (logical) - the high bit is NOT sign-extended
147+ 0xFF uy >>> 1 |> equal 127 uy // uint8: 0x7F
148+ 0xFFFF us >>> 1 |> equal 32767 us // uint16: 0x7FFF
149+ 0xFFFFFFFF u >>> 1 |> equal 2147483647 u // uint32: 0x7FFFFFFF
150+ 0xFFFFFFFFFFFFFFFF UL >>> 1 |> equal 9223372036854775807 UL // uint64: 0x7FFFFFFFFFFFFFFF
151+
152+ [<Fact>]
153+ let ``test Arithmetic right shift preserves sign for signed integer types`` () =
154+ // For signed types, >>> is arithmetic (sign-propagating) - the sign bit IS extended
155+ - 2 y >>> 1 |> equal - 1 y // int8: 0xFF = -1
156+ - 2 s >>> 1 |> equal - 1 s // int16: 0xFFFF = -1
157+ - 2 >>> 1 |> equal - 1 // int32: 0xFFFFFFFF = -1
158+ - 2 L >>> 1 |> equal - 1 L // int64: 0xFFFFFFFFFFFFFFFF = -1
143159
144160[<Fact>]
145161let ``test UInt64 multiplication with 0 returns uint`` () = // See #1480
Original file line number Diff line number Diff line change @@ -136,7 +136,23 @@ let ``Bitwise shift right can be generated`` () = // See #1530
136136let ``Zero fill shift right for unsigned`` () = // See #646
137137 0x80000000 >>> 1 |> equal - 1073741824
138138 0x80000000 u >>> 1 |> equal 1073741824 u
139- 0x80000000 UL>>> 1 |> equal 1073741824 UL
139+ 0x80000000 UL >>> 1 |> equal 1073741824 UL
140+
141+ [<Fact>]
142+ let ``Zero fill right shift is logical for unsigned integer types`` () =
143+ // For unsigned types, >>> is zero-fill (logical) - the high bit is NOT sign-extended
144+ 0xFF uy >>> 1 |> equal 127 uy // uint8: 0x7F
145+ 0xFFFF us >>> 1 |> equal 32767 us // uint16: 0x7FFF
146+ 0xFFFFFFFF u >>> 1 |> equal 2147483647 u // uint32: 0x7FFFFFFF
147+ 0xFFFFFFFFFFFFFFFF UL >>> 1 |> equal 9223372036854775807 UL // uint64: 0x7FFFFFFFFFFFFFFF
148+
149+ [<Fact>]
150+ let ``Arithmetic right shift preserves sign for signed integer types`` () =
151+ // For signed types, >>> is arithmetic (sign-propagating) - the sign bit IS extended
152+ - 2 y >>> 1 |> equal - 1 y // int8: 0xFF = -1
153+ - 2 s >>> 1 |> equal - 1 s // int16: 0xFFFF = -1
154+ - 2 >>> 1 |> equal - 1 // int32: 0xFFFFFFFF = -1
155+ - 2 L >>> 1 |> equal - 1 L // int64: 0xFFFFFFFFFFFFFFFF = -1
140156
141157[<Fact>]
142158let ``UInt64 multiplication with 0 returns uint`` () = // See #1480
You can’t perform that action at this time.
0 commit comments