Fix #10495.
authorRichard Eisenberg <eir@cis.upenn.edu>
Mon, 8 Jun 2015 19:57:33 +0000 (15:57 -0400)
committerRichard Eisenberg <eir@cis.upenn.edu>
Tue, 16 Jun 2015 18:22:51 +0000 (14:22 -0400)
This change means that the intricate reasoning in TcErrors
around getting messages just right for nominal equalities
is skipped for representational equalities.

compiler/typecheck/TcErrors.hs
testsuite/tests/typecheck/should_fail/T10495.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/T10495.stderr [new file with mode: 0644]
testsuite/tests/typecheck/should_fail/all.T

index a4c4703..415ac26 100644 (file)
@@ -919,6 +919,7 @@ mkTyVarEqErr dflags ctxt extra ct oriented tv1 ty2
                             -- be oriented the other way round;
                             -- see TcCanonical.canEqTyVarTyVar
   || isSigTyVar tv1 && not (isTyVarTy ty2)
+  || ctEqRel ct == ReprEq  -- the cases below don't really apply to ReprEq
   = mkErrorMsgFromCt ctxt ct (vcat [ misMatchOrCND ctxt ct oriented ty1 ty2
                                    , extraTyVarInfo ctxt tv1 ty2
                                    , extra ])
@@ -1042,13 +1043,19 @@ misMatchOrCND ctxt ct oriented ty1 ty2
     isGivenCt ct
        -- If the equality is unconditionally insoluble
        -- or there is no context, don't report the context
-  = misMatchMsg oriented (ctEqRel ct) ty1 ty2
+  = misMatchMsg oriented eq_rel ty1 ty2
   | otherwise
-  = couldNotDeduce givens ([mkTcEqPred ty1 ty2], orig)
+  = couldNotDeduce givens ([eq_pred], orig)
   where
+    eq_rel = ctEqRel ct
     givens = [ given | given@(_, _, no_eqs, _) <- getUserGivens ctxt, not no_eqs]
              -- Keep only UserGivens that have some equalities
-    orig   = TypeEqOrigin { uo_actual = ty1, uo_expected = ty2 }
+
+    (eq_pred, orig) = case eq_rel of
+      NomEq  -> ( mkTcEqPred ty1 ty2
+                , TypeEqOrigin { uo_actual = ty1, uo_expected = ty2 })
+      ReprEq -> ( mkCoerciblePred ty1 ty2
+                , CoercibleOrigin ty1 ty2 )
 
 couldNotDeduce :: [UserGiven] -> (ThetaType, CtOrigin) -> SDoc
 couldNotDeduce givens (wanteds, orig)
diff --git a/testsuite/tests/typecheck/should_fail/T10495.hs b/testsuite/tests/typecheck/should_fail/T10495.hs
new file mode 100644 (file)
index 0000000..2573f51
--- /dev/null
@@ -0,0 +1,5 @@
+module T10495 where
+
+import Data.Coerce
+
+foo = coerce
diff --git a/testsuite/tests/typecheck/should_fail/T10495.stderr b/testsuite/tests/typecheck/should_fail/T10495.stderr
new file mode 100644 (file)
index 0000000..6e92505
--- /dev/null
@@ -0,0 +1,6 @@
+
+T10495.hs:5:7: error:
+    Couldn't match representation of type ‘a0’ with that of ‘b0’
+    Relevant bindings include foo :: a0 -> b0 (bound at T10495.hs:5:1)
+    In the expression: coerce
+    In an equation for ‘foo’: foo = coerce
index eeb410f..7b0f5fb 100644 (file)
@@ -367,3 +367,4 @@ test('T10285',
 test('T10351', normal, compile_fail, [''])
 test('T10534', extra_clean(['T10534a.hi', 'T10534a.o']),
      multimod_compile_fail, ['T10534', '-v0'])
+test('T10495', normal, compile_fail, [''])