diff options
author | Joachim Breitner <mail@joachim-breitner.de> | 2015-03-22 17:51:51 +0100 |
---|---|---|
committer | Joachim Breitner <mail@joachim-breitner.de> | 2015-03-23 13:41:34 +0100 |
commit | f6f1e9258453bd94a132eab641d4db74c6961e26 (patch) | |
tree | 8461f9ca386ff507754f34e0737129b66776cd81 | |
parent | b4efac59ef5aac74d382d1fd57652982edddbe75 (diff) | |
download | haskell-f6f1e9258453bd94a132eab641d4db74c6961e26.tar.gz |
New lint check: Check idArity invariants (#10181)wip/T10181
The arity of an id should not be larger than what the type allows, and
it should also not contradict the strictness signature. This adds a lint
check for that.
This broke test T8743, uncovering a bug in the SOURCE import machinery,
which is now filed as #10182.
-rw-r--r-- | compiler/coreSyn/CoreLint.hs | 20 | ||||
-rw-r--r-- | testsuite/tests/stranal/should_compile/all.T | 4 |
2 files changed, 22 insertions, 2 deletions
diff --git a/compiler/coreSyn/CoreLint.hs b/compiler/coreSyn/CoreLint.hs index 690836a1aa..a81c9c39ed 100644 --- a/compiler/coreSyn/CoreLint.hs +++ b/compiler/coreSyn/CoreLint.hs @@ -56,6 +56,8 @@ import Util import InstEnv ( instanceDFunId ) import OptCoercion ( checkAxInstCo ) import UniqSupply +import CoreArity ( typeArity ) +import Demand ( splitStrictSig, isBotRes ) import HscTypes import DynFlags @@ -487,6 +489,24 @@ lintSingleBinding top_lvl_flag rec_flag (binder,rhs) -- StrictSig dmd_ty -> idArity binder >= dmdTypeDepth dmd_ty || exprIsTrivial rhs) -- (mkArityMsg binder) + -- Check that the binder's arity is within the bounds imposed by + -- the type and the strictness signature. See Note [exprArity invariant] + -- and Note [Trimming arity] + ; checkL (idArity binder <= length (typeArity (idType binder))) + (ptext (sLit "idArity") <+> ppr (idArity binder) <+> + ptext (sLit "exceeds typeArity") <+> + ppr (length (typeArity (idType binder))) <> colon <+> + ppr binder) + + ; case splitStrictSig (idStrictness binder) of + (demands, result_info) | isBotRes result_info -> + checkL (idArity binder <= length demands) + (ptext (sLit "idArity") <+> ppr (idArity binder) <+> + ptext (sLit "exceeds arity imposed by the strictness signature") <+> + ppr (idStrictness binder) <> colon <+> + ppr binder) + _ -> return () + ; lintIdUnfolding binder binder_ty (idUnfolding binder) } -- We should check the unfolding, if any, but this is tricky because diff --git a/testsuite/tests/stranal/should_compile/all.T b/testsuite/tests/stranal/should_compile/all.T index 184ff1ec88..eae3ba01b3 100644 --- a/testsuite/tests/stranal/should_compile/all.T +++ b/testsuite/tests/stranal/should_compile/all.T @@ -18,8 +18,8 @@ test('newtype', req_profiling, compile, ['-prof -auto-all']) test('T1988', normal, compile, ['']) test('T8467', normal, compile, ['']) test('T8037', normal, compile, ['']) -test('T8743', [ extra_clean(['T8743.o-boot', 'T8743.hi-boot']) ], multimod_compile, ['T8743', '-v0']) +test('T8743', [ extra_clean(['T8743.o-boot', 'T8743.hi-boot']), expect_broken(10182) ], multimod_compile, ['T8743', '-v0']) test('T9208', when(compiler_debugged(), expect_broken(9208)), compile, ['']) # T9208 fails (and should do so) if you have assertion checking on in the compiler -# Hence the above expect_broken. See comments in the Trac ticket
\ No newline at end of file +# Hence the above expect_broken. See comments in the Trac ticket |