diff options
author | johnvg | 2003-01-15 14:44:45 +0000 |
---|---|---|
committer | johnvg | 2003-01-15 14:44:45 +0000 |
commit | fc688529eb069e6f32ca9cc324418c3042a4eeb8 (patch) | |
tree | 5d6f9db637da0022458177040b6a29c96c9446ac /frontend/convertcases.icl | |
parent | fix label names for unboxed lists of records with dynamics (diff) |
bug fix for non explicit cases with local variables in
case alternative(s)
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1311 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/convertcases.icl')
-rw-r--r-- | frontend/convertcases.icl | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl index 6f70852..c735625 100644 --- a/frontend/convertcases.icl +++ b/frontend/convertcases.icl @@ -696,6 +696,7 @@ where (case_guards, ds) = distribute_lets_in_patterns new_di ref_counts_in_patterns case_guards ds (case_default, ds=:{ds_var_heap}) = distribute_lets_in_default new_di ref_counts_in_default case_default ds (outer_vars, ds_var_heap) = foldSt (is_outer_var new_di) tot_ref_counts (False, ds.ds_var_heap) + # ds_var_heap = foldSt reset_local_let_var local_lets ds_var_heap ->> ("outer_vars", di_depth, outer_vars) (case_expr, ds) = distributeLets di case_expr { ds & ds_var_heap = ds_var_heap} kees = { kees & case_guards = case_guards, case_expr = case_expr, @@ -710,7 +711,7 @@ where | is_guard case_guards case_default case_explicit case_expr = (CaseKindGuard, var_heap) case_kind outer_vars {case_expr, case_explicit} var_heap - | case_explicit || outer_vars || not (is_lhs_var case_expr var_heap) + | case_explicit || outer_vars || not (is_lhs_var case_expr var_heap) = (CaseKindTransform, var_heap) // otherwise = (CaseKindLeave, var_heap) @@ -819,11 +820,15 @@ where = var_heap <:= (var_info_ptr, VI_LetExpression { lei & lei_depth = lei_depth, lei_count = lei_count, lei_status = LES_Moved }) // -*-> ("reset_local_let_var", var_info_ptr) ->> ("reset_local_let_var", lei.lei_var.fv_name.id_name, lei.lei_depth, lei.lei_count, " ->> ", lei_depth, lei_count) - + is_outer_var {di_depth, di_explicit_case_depth} {cv_variable} (outer, var_heap) - # (VI_LetExpression lei=:{lei_depth}, var_heap) = readPtr cv_variable var_heap - = (outer || ((di_explicit_case_depth < lei_depth) && (lei_depth <= di_depth)), var_heap) - ->> ("is_outer_var", lei.lei_var.fv_name.id_name, lei.lei_depth, di_depth, di_explicit_case_depth) + | outer + = (True,var_heap) + # (VI_LetExpression {lei_depth,lei_status}, var_heap) = readPtr cv_variable var_heap + | di_explicit_case_depth < lei_depth && + (lei_depth < di_depth || (lei_depth == di_depth && case lei_status of LES_Moved -> False; _ -> True)) + = (True,var_heap) + = (False,var_heap); distribute_lets_in_pattern_expr di=:{di_depth} local_vars pattern_expr ds=:{ds_var_heap} # ds_var_heap = foldSt (mark_local_let_var_of_pattern_expr di_depth) local_vars ds_var_heap |