Support SCC pragmas in declaration context
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Wed, 20 Jul 2016 09:33:43 +0000 (09:33 +0000)
committerÖmer Sinan Ağacan <omeragacan@gmail.com>
Wed, 20 Jul 2016 09:33:57 +0000 (09:33 +0000)
commit98b2c5088a6f1a3b40c6eedc69d9204ba53690d3
tree4807efab791526b79352a36b396e67c021278778
parent0df3f4cdd1dfff42461e3f5c3962f1ecd7c90652
Support SCC pragmas in declaration context

Not having SCCs at the top level is becoming annoying real quick. For
simplest cases, it's possible to do this transformation:

    f x y = ...
    =>
    f = {-# SCC f #-} \x y -> ...

However, it doesn't work when there's a `where` clause:

    f x y = <t is in scope>
      where t = ...
    =>
    f = {-# SCC f #-} \x y -> <t is out of scope>
      where t = ...

Or when we have a "equation style" definition:

    f (C1 ...) = ...
    f (C2 ...) = ...
    f (C3 ...) = ...
    ...

(usual solution is to rename `f` to `f'` and define a new `f` with a
`SCC`)

This patch implements support for SCC annotations in declaration
contexts. This is now a valid program:

    f x y = ...
      where
        g z = ...
        {-# SCC g #-}
    {-# SCC f #-}

Test Plan: This passes slow validate (no new failures added).

Reviewers: goldfire, mpickering, austin, bgamari, simonmar

Reviewed By: bgamari, simonmar

Subscribers: simonmar, thomie, mpickering

Differential Revision: https://phabricator.haskell.org/D2407
14 files changed:
compiler/deSugar/DsMeta.hs
compiler/hsSyn/HsBinds.hs
compiler/parser/Parser.y
compiler/rename/RnBinds.hs
compiler/typecheck/TcBinds.hs
compiler/typecheck/TcSigs.hs
docs/users_guide/8.2.1-notes.rst
docs/users_guide/profiling.rst
testsuite/config/ghc
testsuite/tests/profiling/should_run/all.T
testsuite/tests/profiling/should_run/toplevel_scc_1.hs [new file with mode: 0644]
testsuite/tests/profiling/should_run/toplevel_scc_1.prof.sample [new file with mode: 0644]
testsuite/tests/profiling/should_run/toplevel_scc_1.stdin [new file with mode: 0644]
testsuite/tests/profiling/should_run/toplevel_scc_1.stdout [new file with mode: 0644]