on master help sign in
Fix #783, resolve scoping bug with shadowing in case patterns
6b6d7e2Evan Czaplicki
compiler/Transform/Substitute.hs+6−1
@@ -52,7 +52,12 @@ subst old new expression =
52 V.Local -> if x == old then new else expression
52 V.Local -> if x == old then new else expression
53
53
54 Case e cases ->
54 Case e cases ->
55− Case (f e) $ map (second f) cases
55+ Case (f e) (map substCase cases)
56+ where
57+ substCase (pattern, expr) =
58+ if Set.member old (Pattern.boundVars pattern)
59+ then (pattern, expr)
60+ else (pattern, f expr)
56
61
57 Data tag values ->
62 Data tag values ->
58 Data tag (map f values)
63 Data tag (map f values)
tests/libraries/Test/CodeGen.elm+11
@@ -25,6 +25,13 @@ caseQualified =
25 Maybe.Just x -> x
25 Maybe.Just x -> x
26 Nothing -> 0
26 Nothing -> 0
27
27
28+caseScope : String
29+caseScope =
30+ case "Not this one!" of
31+ string ->
32+ case "Hi" of
33+ string -> string
34+
28tests : Test
35tests : Test
29tests =
36tests =
30 let primes =
37 let primes =
@@ -37,8 +44,12 @@ tests =
37 [ test "let" <| assertEqual 42 letQualified
44 [ test "let" <| assertEqual 42 letQualified
38 , test "case" <| assertEqual 42 caseQualified
45 , test "case" <| assertEqual 42 caseQualified
39 ]
46 ]
47+ scope =
48+ suite "Scoping"
49+ [ test "case" <| assertEqual "Hi" caseScope ]
40 in
50 in
41 suite "CodeGen"
51 suite "CodeGen"
42 [ primes
52 [ primes
43 , qualifiedPatterns
53 , qualifiedPatterns
54+ , scope
44 ]
55 ]