Simpify constraints from a TH bracket eagerly
authorsimonpj@microsoft.com <unknown>
Wed, 9 Feb 2011 17:50:03 +0000 (17:50 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 9 Feb 2011 17:50:03 +0000 (17:50 +0000)
See Trac #4949, where having a TH bracket implication
was messing things up.  Better to get rid of it right away.

compiler/typecheck/TcSplice.lhs

index 2e81314..1956e5b 100644 (file)
@@ -348,10 +348,22 @@ tcBracket brack res_ty
           -- instance), but we aren't otherwise interested in the
           -- results. Nor do we care about ambiguous dictionaries etc.
           -- We will type check this bracket again at its usage site.
-       ; _ <- newImplication BracketSkol [] [] $
-              setStage brack_stage $
-              do { meta_ty <- tc_bracket cur_stage brack
-                 ; unifyType meta_ty res_ty }
+         --
+         -- We build a single implication constraint with a BracketSkol;
+         -- that in turn tells simplifyCheck to report only definite
+         -- errors
+       ; (_,lie) <- captureConstraints $
+                   newImplication BracketSkol [] [] $
+                   setStage brack_stage $
+                   do { meta_ty <- tc_bracket cur_stage brack
+                      ; unifyType meta_ty res_ty }
+
+          -- It's best to simplify the constraint now, even though in 
+         -- principle some later unification might be useful for it,
+         -- because we don't want these essentially-junk TH implication
+         -- contraints floating around nested inside other constraints
+         -- See for example Trac #4949
+       ; _ <- simplifyTop lie
 
         -- Return the original expression, not the type-decorated one
        ; pendings <- readMutVar pending_splices