diff options
Diffstat (limited to 'ghc/compiler/rename/RnExpr.lhs')
-rw-r--r-- | ghc/compiler/rename/RnExpr.lhs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/ghc/compiler/rename/RnExpr.lhs b/ghc/compiler/rename/RnExpr.lhs index e483327fff..3e73732fab 100644 --- a/ghc/compiler/rename/RnExpr.lhs +++ b/ghc/compiler/rename/RnExpr.lhs @@ -122,9 +122,12 @@ rnPat neg@(NegPatIn pat) rnPat pat `thenRn` \ (pat', fvs) -> returnRn (NegPatIn pat', fvs) where - valid_neg_pat (LitPatIn (HsInt _)) = True - valid_neg_pat (LitPatIn (HsFrac _)) = True - valid_neg_pat _ = False + valid_neg_pat (LitPatIn (HsInt _)) = True + valid_neg_pat (LitPatIn (HsIntPrim _)) = True + valid_neg_pat (LitPatIn (HsFrac _)) = True + valid_neg_pat (LitPatIn (HsFloatPrim _)) = True + valid_neg_pat (LitPatIn (HsDoublePrim _)) = True + valid_neg_pat _ = False rnPat (ParPatIn pat) = rnPat pat `thenRn` \ (pat', fvs) -> @@ -312,6 +315,12 @@ rnExpr (OpApp e1 op _ e2) returnRn (final_e, fv_e1 `plusFV` fv_op `plusFV` fv_e2) +-- constant-fold some negate applications on unboxed literals. Since +-- negate is a polymorphic function, we have to do these here. +rnExpr (NegApp (HsLit (HsIntPrim i)) _) = rnExpr (HsLit (HsIntPrim (-i))) +rnExpr (NegApp (HsLit (HsFloatPrim i)) _) = rnExpr (HsLit (HsFloatPrim (-i))) +rnExpr (NegApp (HsLit (HsDoublePrim i)) _) = rnExpr (HsLit (HsDoublePrim (-i))) + rnExpr (NegApp e n) = rnExpr e `thenRn` \ (e', fv_e) -> lookupImplicitOccRn negate_RDR `thenRn` \ neg -> |