Fix defaulting for overloaded strings
[ghc-hetmet.git] / compiler / typecheck / TcSimplify.lhs
index 708b8e4..47c92af 100644 (file)
@@ -849,10 +849,11 @@ bindIrredsR loc qtvs co_vars reft givens irreds
                -- The givens can include methods
                -- See Note [Pruning the givens in an implication constraint]
 
-          -- If there are no 'givens', then it's safe to 
+          -- If there are no 'givens' *and* the refinement is empty
+          -- (the refinement is like more givens), then it's safe to 
           -- partition the 'wanteds' by their qtvs, thereby trimming irreds
           -- See Note [Freeness and implications]
-       ; irreds' <- if null givens'
+       ; irreds' <- if null givens' && isEmptyRefinement reft
                     then do
                        { let qtv_set = mkVarSet qtvs
                              (frees, real_irreds) = partition (isFreeWrtTyVars qtv_set) irreds
@@ -862,7 +863,8 @@ bindIrredsR loc qtvs co_vars reft givens irreds
        
        ; let all_tvs = qtvs ++ co_vars -- Abstract over all these
        ; (implics, bind) <- makeImplicationBind loc all_tvs reft givens' irreds'
-                               -- This call does the real work
+                       -- This call does the real work
+                       -- If irreds' is empty, it does something sensible
        ; extendLIEs implics
        ; return bind } 
 
@@ -875,6 +877,8 @@ makeImplicationBind :: InstLoc -> [TcTyVar] -> Refinement
 -- The binding looks like
 --     (ir1, .., irn) = f qtvs givens
 -- where f is (evidence for) the new implication constraint
+--     f :: forall qtvs. {reft} givens => (ir1, .., irn)
+-- qtvs includes coercion variables
 --
 -- This binding must line up the 'rhs' in reduceImplication
 makeImplicationBind loc all_tvs reft
@@ -2190,9 +2194,8 @@ tc_simplify_top doc interactive wanteds
        -- OK, so there are some errors
        {       -- Use the defaulting rules to do extra unification
                -- NB: irreds are already zonked
-       ; extended_default <- if interactive then return True
-                             else doptM Opt_ExtendedDefaultRules
-       ; disambiguate extended_default irreds1 -- Does unification
+       ; dflags <- getDOpts
+       ; disambiguate interactive dflags irreds1       -- Does unification
        ; (irreds2, binds2) <- topCheckLoop doc irreds1
 
                -- Deal with implicit parameter
@@ -2240,10 +2243,10 @@ Since we're not using the result of @foo@, the result if (presumably)
 @void@.
 
 \begin{code}
-disambiguate :: Bool -> [Inst] -> TcM ()
+disambiguate :: Bool -> DynFlags -> [Inst] -> TcM ()
        -- Just does unification to fix the default types
        -- The Insts are assumed to be pre-zonked
-disambiguate extended_defaulting insts
+disambiguate interactive dflags insts
   | null defaultable_groups
   = do { traceTc (text "disambigutate" <+> vcat [ppr unaries, ppr bad_tvs, ppr defaultable_groups])
        ;     return () }
@@ -2256,10 +2259,17 @@ disambiguate extended_defaulting insts
                                        -- use [Integer, Double]
                                do { integer_ty <- tcMetaTy integerTyConName
                                   ; checkWiredInTyCon doubleTyCon
-                                  ; return [integer_ty, doubleTy] }
+                                  ; string_ty <- tcMetaTy stringTyConName
+                                  ; if ovl_strings     -- Add String if -foverloaded-strings
+                                       then return [integer_ty,doubleTy,string_ty] 
+                                       else return [integer_ty,doubleTy] }
+
        ; traceTc (text "disambigutate" <+> vcat [ppr unaries, ppr bad_tvs, ppr defaultable_groups])
        ; mapM_ (disambigGroup default_tys) defaultable_groups  }
   where
+   extended_defaulting = interactive || dopt Opt_ExtendedDefaultRules dflags
+   ovl_strings = dopt Opt_OverloadedStrings dflags
+
    unaries :: [(Inst,Class, TcTyVar)]  -- (C tv) constraints
    bad_tvs :: TcTyVarSet         -- Tyvars mentioned by *other* constraints
    (unaries, bad_tvs) = getDefaultableDicts insts
@@ -2271,21 +2281,26 @@ disambiguate extended_defaulting insts
 
    defaultable_group :: [(Inst,Class,TcTyVar)] -> Bool
    defaultable_group ds@((_,_,tv):_)
-       =  not (isImmutableTyVar tv)    -- Note [Avoiding spurious errors]
+       =  isTyConableTyVar tv  -- Note [Avoiding spurious errors]
        && not (tv `elemVarSet` bad_tvs)
        && defaultable_classes [c | (_,c,_) <- ds]
    defaultable_group [] = panic "defaultable_group"
 
    defaultable_classes clss 
        | extended_defaulting = any isInteractiveClass clss
-       | otherwise = all isStandardClass clss && any isNumericClass clss
+       | otherwise           = all is_std_class clss && (any is_num_class clss)
 
        -- In interactive mode, or with -fextended-default-rules,
        -- we default Show a to Show () to avoid graututious errors on "show []"
    isInteractiveClass cls 
-       = isNumericClass cls
-       || (classKey cls `elem` [showClassKey, eqClassKey, ordClassKey])
+       = is_num_class cls || (classKey cls `elem` [showClassKey, eqClassKey, ordClassKey])
+
+   is_num_class cls = isNumericClass cls || (ovl_strings && (cls `hasKey` isStringClassKey))
+       -- is_num_class adds IsString to the standard numeric classes, 
+       -- when -foverloaded-strings is enabled
 
+   is_std_class cls = isStandardClass cls || (ovl_strings && (cls `hasKey` isStringClassKey))
+       -- Similarly is_std_class
 
 disambigGroup :: [Type]                        -- The default types
              -> [(Inst,Class,TcTyVar)] -- All standard classes of form (C a)