diff options
author | Thomas Winant <thomas.winant@cs.kuleuven.be> | 2015-02-18 10:13:37 -0600 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2015-02-18 19:18:49 -0600 |
commit | e9d72cefeda243d5962d0615fe7ad22ff615d134 (patch) | |
tree | 05313ea9536546845836852da4a1f54475cadfa5 /testsuite/tests | |
parent | 35d464bf54373cbe37e1e3310cc6a95f63f257f0 (diff) | |
download | haskell-e9d72cefeda243d5962d0615fe7ad22ff615d134.tar.gz |
Fix #10045
Summary:
SPJ's solution is to only bring the `TcId` (which includes the type) of a
binder into scope when it had a non-partial type signature.
Take care of this by only storing the `TcId` in `TcSigInfo` of non-partial
type signatures, hence the change to `sig_poly_id :: Maybe TcId`. Only in case
of a `Just` will we bring the `TcId` in scope. We still need to know the name
of the binder, even when it has a partial type signature, so add a `sig_name
:: Name` field. The field `sig_partial :: Bool` is no longer necessary, so
reimplement `isPartialSig` in terms of `sig_poly_id`.
Note that the new test case fails, but not because of a panic, but because the
`Num a` constraint is missing. Adding an extra-constraints wildcard to
`copy`'s signature would fix it.
Test Plan: validate
Reviewers: simonpj, austin
Reviewed By: simonpj
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D646
GHC Trac Issues: #10045
Diffstat (limited to 'testsuite/tests')
-rw-r--r-- | testsuite/tests/partial-sigs/should_fail/Trac10045.hs | 8 | ||||
-rw-r--r-- | testsuite/tests/partial-sigs/should_fail/Trac10045.stderr | 45 | ||||
-rw-r--r-- | testsuite/tests/partial-sigs/should_fail/all.T | 1 |
3 files changed, 54 insertions, 0 deletions
diff --git a/testsuite/tests/partial-sigs/should_fail/Trac10045.hs b/testsuite/tests/partial-sigs/should_fail/Trac10045.hs new file mode 100644 index 0000000000..e7c07470aa --- /dev/null +++ b/testsuite/tests/partial-sigs/should_fail/Trac10045.hs @@ -0,0 +1,8 @@ +module Trac10045 where + +newtype Meta = Meta () + +foo (Meta ws1) = + let copy :: _ + copy w from = copy w 1 + in copy ws1 1 diff --git a/testsuite/tests/partial-sigs/should_fail/Trac10045.stderr b/testsuite/tests/partial-sigs/should_fail/Trac10045.stderr new file mode 100644 index 0000000000..8c8e42f704 --- /dev/null +++ b/testsuite/tests/partial-sigs/should_fail/Trac10045.stderr @@ -0,0 +1,45 @@ + +Trac10045.hs:6:17: + Found hole ‘_’ with type: t1 -> a -> t2 + Where: ‘t1’ is a rigid type variable bound by + the inferred type of copy :: Num a => t1 -> a -> t2 + at Trac10045.hs:7:9 + ‘t2’ is a rigid type variable bound by + the inferred type of copy :: Num a => t1 -> a -> t2 + at Trac10045.hs:7:9 + ‘a’ is a rigid type variable bound by + the inferred type of copy :: Num a => t1 -> a -> t2 + at Trac10045.hs:7:9 + To use the inferred type, enable PartialTypeSignatures + Relevant bindings include + ws1 :: () (bound at Trac10045.hs:5:11) + foo :: Meta -> t (bound at Trac10045.hs:5:1) + In the type signature for ‘copy’: _ + In the expression: + let + copy :: _ + copy w from = copy w 1 + in copy ws1 1 + In an equation for ‘foo’: + foo (Meta ws1) + = let + copy :: _ + copy w from = copy w 1 + in copy ws1 1 + +Trac10045.hs:7:9: + No instance for (Num a) + When checking that ‘copy’ has the specified type + copy :: forall t t1 a. t -> a -> t1 + Probable cause: the inferred type is ambiguous + In the expression: + let + copy :: _ + copy w from = copy w 1 + in copy ws1 1 + In an equation for ‘foo’: + foo (Meta ws1) + = let + copy :: _ + copy w from = copy w 1 + in copy ws1 1 diff --git a/testsuite/tests/partial-sigs/should_fail/all.T b/testsuite/tests/partial-sigs/should_fail/all.T index 7e56d15c71..c49a36fe34 100644 --- a/testsuite/tests/partial-sigs/should_fail/all.T +++ b/testsuite/tests/partial-sigs/should_fail/all.T @@ -18,6 +18,7 @@ test('ScopedNamedWildcardsBad', normal, compile_fail, ['']) test('TidyClash', normal, compile_fail, ['']) # Bug test('TidyClash2', expect_fail, compile_fail, ['']) +test('Trac10045', normal, compile_fail, ['']) test('UnnamedConstraintWildcard1', normal, compile_fail, ['']) test('UnnamedConstraintWildcard2', normal, compile_fail, ['']) test('WildcardInADT1', normal, compile_fail, ['']) |