diff options
author | Eric Seidel <gridaphobe@gmail.com> | 2016-04-04 12:05:01 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-04-04 13:05:20 +0200 |
commit | 7407a66d5bd29aa011f5a4228c6e2b2f7f8ad3f8 (patch) | |
tree | a79dbba0a8a0c3a7ecb12e1262487f0d876072c7 /testsuite/tests/partial-sigs | |
parent | 9b6820cdd6bac8b8346be48224627e3feefa9036 (diff) | |
download | haskell-7407a66d5bd29aa011f5a4228c6e2b2f7f8ad3f8.tar.gz |
Don't infer CallStacks
We originally wanted CallStacks to be opt-in, but dealing with let
binders complicated things, forcing us to infer CallStacks. It turns
out that the inference is actually unnecessary though, we can let the
wanted CallStacks bubble up to the outer context by refusing to
quantify over them. Eventually they'll be solved from a given CallStack
or defaulted to the empty CallStack if they reach the top.
So this patch prevents GHC from quantifying over CallStacks, getting us
back to the original plan. There's a small ugliness to do with
PartialTypeSignatures, if the partial theta contains a CallStack
constraint, we *do* want to quantify over the CallStack; the user asked
us to!
Note that this means that
foo :: _ => CallStack
foo = getCallStack callStack
will be an *empty* CallStack, since we won't infer a CallStack for the
hole in the theta. I think this is the right move though, since we want
CallStacks to be opt-in. One can always write
foo :: (HasCallStack, _) => CallStack
foo = getCallStack callStack
to get the CallStack and still have GHC infer the rest of the theta.
Test Plan: ./validate
Reviewers: goldfire, simonpj, austin, hvr, bgamari
Reviewed By: simonpj, bgamari
Subscribers: bitemyapp, thomie
Projects: #ghc
Differential Revision: https://phabricator.haskell.org/D1912
GHC Trac Issues: #11573
Diffstat (limited to 'testsuite/tests/partial-sigs')
-rw-r--r-- | testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr | 7 | ||||
-rw-r--r-- | testsuite/tests/partial-sigs/should_fail/T10999.stderr | 8 |
2 files changed, 5 insertions, 10 deletions
diff --git a/testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr b/testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr index e0daa4e87d..c34b1396c7 100644 --- a/testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr +++ b/testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr @@ -62,8 +62,7 @@ TYPE SIGNATURES enumFromThen :: forall a. Enum a => a -> a -> [a] enumFromThenTo :: forall a. Enum a => a -> a -> a -> [a] enumFromTo :: forall a. Enum a => a -> a -> [a] - error :: - forall a. (?callStack::GHC.Stack.Types.CallStack) => [Char] -> a + error :: forall a. [Char] -> a even :: forall a. Integral a => a -> Bool exp :: forall a. Floating a => a -> a exponent :: forall a. RealFloat a => a -> Int @@ -213,7 +212,7 @@ TYPE SIGNATURES toRational :: forall a. Real a => a -> Rational truncate :: forall a b. (RealFrac a, Integral b) => a -> b uncurry :: forall a b c. (a -> b -> c) -> (a, b) -> c - undefined :: forall t. (?callStack::GHC.Stack.Types.CallStack) => t + undefined :: forall t. t unlines :: [String] -> String until :: forall a. (a -> Bool) -> (a -> a) -> a -> a unwords :: [String] -> String @@ -232,4 +231,4 @@ TYPE CONSTRUCTORS COERCION AXIOMS Dependent modules: [] Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0, - integer-gmp-1.0.0.0] + integer-gmp-1.0.0.1] diff --git a/testsuite/tests/partial-sigs/should_fail/T10999.stderr b/testsuite/tests/partial-sigs/should_fail/T10999.stderr index ef4d9f83c1..c74719addf 100644 --- a/testsuite/tests/partial-sigs/should_fail/T10999.stderr +++ b/testsuite/tests/partial-sigs/should_fail/T10999.stderr @@ -1,7 +1,6 @@ T10999.hs:5:6: error: - Found constraint wildcard ‘_’ - standing for ‘(?callStack::GHC.Stack.Types.CallStack, Ord a)’ + Found constraint wildcard ‘_’ standing for ‘Ord a’ To use the inferred type, enable PartialTypeSignatures In the type signature: f :: _ => () -> _ @@ -9,10 +8,7 @@ T10999.hs:5:6: error: T10999.hs:5:17: error: • Found type wildcard ‘_’ standing for ‘Set.Set a’ Where: ‘a’ is a rigid type variable bound by - the inferred type of - f :: (?callStack::GHC.Stack.Types.CallStack, Ord a) => - () -> Set.Set a - at T10999.hs:6:1 + the inferred type of f :: Ord a => () -> Set.Set a at T10999.hs:6:1 To use the inferred type, enable PartialTypeSignatures • In the type signature: f :: _ => () -> _ |