- -- Take short cuts only if the literal is not using rebindable syntax
- | isIntTy ty = mk_con_pat intDataCon (HsIntPrim int_val)
- | isWordTy ty = mk_con_pat wordDataCon (HsWordPrim int_val)
- | isFloatTy ty = mk_con_pat floatDataCon (HsFloatPrim rat_val)
- | isDoubleTy ty = mk_con_pat doubleDataCon (HsDoublePrim rat_val)
--- | isStringTy lit_ty = mk_con_pat stringDataCon (HsStringPrim str_val)
+ -- False: Take short cuts only if the literal is not using rebindable syntax
+ --
+ -- Once that is settled, look for cases where the type of the
+ -- entire overloaded literal matches the type of the underlying literal,
+ -- and in that case take the short cut
+ -- NB: Watch out for wierd cases like Trac #3382
+ -- f :: Int -> Int
+ -- f "blah" = 4
+ -- which might be ok if we hvae 'instance IsString Int'
+ --
+
+ | isIntTy ty, Just int_lit <- mb_int_lit = mk_con_pat intDataCon (HsIntPrim int_lit)
+ | isWordTy ty, Just int_lit <- mb_int_lit = mk_con_pat wordDataCon (HsWordPrim int_lit)
+ | isFloatTy ty, Just rat_lit <- mb_rat_lit = mk_con_pat floatDataCon (HsFloatPrim rat_lit)
+ | isDoubleTy ty, Just rat_lit <- mb_rat_lit = mk_con_pat doubleDataCon (HsDoublePrim rat_lit)
+ | isStringTy ty, Just str_lit <- mb_str_lit = tidyLitPat (HsString str_lit)