From: simonpj@microsoft.com Date: Wed, 10 Oct 2007 16:47:31 +0000 (+0000) Subject: Fix Trac #1759: do not let ticks get in the way of spotting trivially-true guards X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=fe131871441f3a0b0f5ed7e8978cb89f05be97c7 Fix Trac #1759: do not let ticks get in the way of spotting trivially-true guards GHC spots that an 'otherwise' guard is true, and uses that knowledge to avoid reporting spurious missing-pattern or overlaps with -Wall. The HPC ticks were disguising the 'otherwise', which led to this failure. Now we check. The key change is defining DsGRHSs.isTrueLHsExpr. Test is ds062 --- diff --git a/compiler/deSugar/DsGRHSs.lhs b/compiler/deSugar/DsGRHSs.lhs index 146771d..265df11 100644 --- a/compiler/deSugar/DsGRHSs.lhs +++ b/compiler/deSugar/DsGRHSs.lhs @@ -105,10 +105,8 @@ matchGuards [] ctx rhs rhs_ty -- NB: The success of this clause depends on the typechecker not -- wrapping the 'otherwise' in empty HsTyApp or HsWrap constructors -- If it does, you'll get bogus overlap warnings -matchGuards (ExprStmt (L _ (HsVar v)) _ _ : stmts) ctx rhs rhs_ty - | v `hasKey` otherwiseIdKey - || v `hasKey` getUnique trueDataConId - -- trueDataConId doesn't have the same unique as trueDataCon +matchGuards (ExprStmt e _ _ : stmts) ctx rhs rhs_ty + | isTrueLHsExpr e = matchGuards stmts ctx rhs rhs_ty matchGuards (ExprStmt expr _ _ : stmts) ctx rhs rhs_ty @@ -128,6 +126,19 @@ matchGuards (BindStmt pat bind_rhs _ _ : stmts) ctx rhs rhs_ty = matchGuards stmts ctx rhs rhs_ty `thenDs` \ match_result -> dsLExpr bind_rhs `thenDs` \ core_rhs -> matchSinglePat core_rhs ctx pat rhs_ty match_result + +isTrueLHsExpr :: LHsExpr Id -> Bool +-- Returns True if we're sure that the expression is True +-- I.e. * 'True' datacon +-- * 'otherwise' Id +-- * Trivial wappings of these +isTrueLHsExpr (L _ (HsVar v)) = v `hasKey` otherwiseIdKey + || v `hasKey` getUnique trueDataConId + -- trueDataConId doesn't have the same unique as trueDataCon +isTrueLHsExpr (L _ (HsTick _ _ e)) = isTrueLHsExpr e +isTrueLHsExpr (L _ (HsBinTick _ _ e)) = isTrueLHsExpr e +isTrueLHsExpr (L _ (HsPar e)) = isTrueLHsExpr e +isTrueLHsExpr other = False \end{code} Should {\em fail} if @e@ returns @D@