on master help sign in
Fix name shadowing bug in case/destructuring let

Fixes issue #96

commita6f8de57553bea8d6fb5f947eae3bbd1a016f481 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateMon 26 Nov 2012, 16:50 (14 years ago) parente7c9256
2 files changed+12−3
src/Idris/AbsSyntax.hs+1 src/Idris/ElabTerm.hs+11−3
src/Idris/AbsSyntax.hs+1
@@ -1073,3 +1073,4 @@ shadow n n' t = sm t where
10731073 sm (PHidden x) = PHidden (sm x)
10741074 sm x = x
10751075
1076+
src/Idris/ElabTerm.hs+11−3
@@ -318,15 +318,23 @@ elab ist info pattern tcgen fn tm
318318 _ -> n
319319 elab' ina x = fail $ "Something's gone wrong. Did you miss a semi-colon somewhere?"
320320
321− caseBlock :: FC -> Name -> [(Name, Binder Term)] -> [(PTerm, PTerm)] -> [PClause]
321+ caseBlock :: FC -> Name -> [(Name, Binder Term)] ->
322+ [(PTerm, PTerm)] -> [PClause]
322323 caseBlock fc n env opts
323324 = let args = map mkarg (map fst (init env)) in
324325 map (mkClause args) opts
325326 where -- mkarg (MN _ _) = Placeholder
326327 mkarg n = PRef fc n
328+ -- may be shadowed names in the new pattern - so replace the
329+ -- old ones with an _
327330 mkClause args (l, r)
328− = PClause fc n (PApp fc (PRef fc n)
329− (map pexp args ++ [pexp l])) [] r []
331+ = let args' = map (shadowed (allNamesIn l)) args
332+ lhs = PApp fc (PRef fc n)
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
330338
331339 elabArgs ina failed retry [] _
332340-- | retry = let (ns, ts) = unzip (reverse failed) in