Opened 5 years ago

Last modified 5 years ago

#10185 new bug

Coercible solver incomplete with non-variable transitivity

Reported by: goldfire Owned by:
Priority: low Milestone:
Component: Compiler Version: 7.11
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case: typecheck/should_compile/T10185
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:


If I say

import Data.Coerce
import Data.Proxy

foo :: (Coercible (a b) (c d), Coercible (c d) (e f)) => Proxy (c d) -> a b -> e f
foo _ = coerce

I get an error, because GHC isn't smart enough to figure out transitivity in this case. It can do it with bare variables, but not variable applications. It's possible there's a way to do this, but we'll wait for someone to shout before investing effort.

Do shout if this lack of functionality is ruining your day!

Change History (2)

comment:1 Changed 5 years ago by Richard Eisenberg <eir@…>

In c1edbdfd9148ad9f74bfe41e76c524f3e775aaaa/ghc:

Do proper depth checking in the flattener to avoid looping.

This implements (roughly) the plan put forward in comment:14:ticket:7788,
fixing #7788, #8550, #9554, #10139, and addressing concerns raised in #10079.
There are some regressions w.r.t. GHC 7.8, but only with pathological type
families (like F a = F a). This also (hopefully -- don't have a test case)
fixes #10158. Unsolved problems include #10184 and #10185, which are both
known deficiencies of the approach used here.

As part of this change, the plumbing around detecting infinite loops has
changed. Instead of -fcontext-stack and -ftype-function-depth, we now have
one combined -freduction-depth parameter. Setting it to 0 disbales the
check, which is now the recommended way to get (terminating) code to
typecheck in releases. (The number of reduction steps may well change between
minor GHC releases!)

This commit also introduces a new IntWithInf type in BasicTypes
that represents an integer+infinity. This type is used in a few
places throughout the code.

Tests in
  typecheck/should_compile/T10184  (expected broken)
  typecheck/should_compile/T10185  (expected broken)

This commit also changes performance testsuite numbers, for the better.

comment:2 Changed 5 years ago by goldfire

Test Case: typecheck/should_compile/T10185
Note: See TracTickets for help on using tickets.