on master help sign in
Fix name shadowing bug in case/destructuring let
a6f8de5Edwin Brady
src/Idris/AbsSyntax.hs+1
@@ -1073,3 +1073,4 @@ shadow n n' t = sm t where
1073 sm (PHidden x) = PHidden (sm x)
1073 sm (PHidden x) = PHidden (sm x)
1074 sm x = x
1074 sm x = x
1075
1075
1076+
src/Idris/ElabTerm.hs+11−3
@@ -318,15 +318,23 @@ elab ist info pattern tcgen fn tm
318 _ -> n
318 _ -> n
319 elab' ina x = fail $ "Something's gone wrong. Did you miss a semi-colon somewhere?"
319 elab' ina x = fail $ "Something's gone wrong. Did you miss a semi-colon somewhere?"
320
320
321− caseBlock :: FC -> Name -> [(Name, Binder Term)] -> [(PTerm, PTerm)] -> [PClause]
321+ caseBlock :: FC -> Name -> [(Name, Binder Term)] ->
322+ [(PTerm, PTerm)] -> [PClause]
322 caseBlock fc n env opts
323 caseBlock fc n env opts
323 = let args = map mkarg (map fst (init env)) in
324 = let args = map mkarg (map fst (init env)) in
324 map (mkClause args) opts
325 map (mkClause args) opts
325 where -- mkarg (MN _ _) = Placeholder
326 where -- mkarg (MN _ _) = Placeholder
326 mkarg n = PRef fc n
327 mkarg n = PRef fc n
328+ -- may be shadowed names in the new pattern - so replace the
329+ -- old ones with an _
327 mkClause args (l, r)
330 mkClause args (l, r)
331+ = let args' = map (shadowed (allNamesIn l)) args
328− = PClause fc n (PApp fc (PRef fc n)
332+ lhs = PApp fc (PRef fc n)
329− (map pexp args ++ [pexp l])) [] r []
333+ (map pexp args' ++ [pexp l]) in
334+ PClause fc n lhs [] r []
335+
336+ shadowed new (PRef _ n) | n `elem` new = Placeholder
337+ shadowed new t = t
330
338
331 elabArgs ina failed retry [] _
339 elabArgs ina failed retry [] _
332-- | retry = let (ns, ts) = unzip (reverse failed) in
340-- | retry = let (ns, ts) = unzip (reverse failed) in