Fix -fno-code for modules that use -XQuasiQuotes
authorDouglas Wilson <douglas.wilson@gmail.com>
Mon, 3 Jul 2017 20:54:29 +0000 (16:54 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 3 Jul 2017 22:58:11 +0000 (18:58 -0400)
In commit 53c78be0aab76a3107c4dacbb1d177afacdd37fa object code is
generated for modules depended on by modules that use -XTemplateHaskell.
This turns the same logic on for modules that use -XQuasiQuotes.

A test is added.

Note that I've based this of D3646, as it has a function I want to use.

Test Plan: ./validate

Reviewers: austin, bgamari, alexbiehl

Reviewed By: alexbiehl

Subscribers: alexbiehl, rwbarton, thomie

GHC Trac Issues: #13863

Differential Revision: https://phabricator.haskell.org/D3677

compiler/main/GHC.hs
compiler/main/GhcMake.hs
compiler/main/HscTypes.hs
testsuite/tests/quasiquotation/T13863/A.hs [new file with mode: 0644]
testsuite/tests/quasiquotation/T13863/B.hs [new file with mode: 0644]
testsuite/tests/quasiquotation/T13863/all.T [new file with mode: 0644]

index 2102009..4a45bea 100644 (file)
@@ -23,7 +23,7 @@ module GHC (
         gcatch, gbracket, gfinally,
         printException,
         handleSourceError,
-        needsTemplateHaskell,
+        needsTemplateHaskellOrQQ,
 
         -- * Flags and settings
         DynFlags(..), GeneralFlag(..), Severity(..), HscTarget(..), gopt,
@@ -1075,15 +1075,6 @@ compileCore simplify fn = do
 getModuleGraph :: GhcMonad m => m ModuleGraph -- ToDo: DiGraph ModSummary
 getModuleGraph = liftM hsc_mod_graph getSession
 
--- | Determines whether a set of modules requires Template Haskell.
---
--- Note that if the session's 'DynFlags' enabled Template Haskell when
--- 'depanal' was called, then each module in the returned module graph will
--- have Template Haskell enabled whether it is actually needed or not.
-needsTemplateHaskell :: ModuleGraph -> Bool
-needsTemplateHaskell ms =
-    any (xopt LangExt.TemplateHaskell . ms_hspp_opts) ms
-
 -- | Return @True@ <==> module is loaded.
 isLoaded :: GhcMonad m => ModuleName -> m Bool
 isLoaded m = withSession $ \hsc_env ->
index 134a060..5935a77 100644 (file)
@@ -1994,7 +1994,7 @@ enableCodeGenForTH target nodemap =
       [ ms
       | mss <- Map.elems nodemap
       , Right ms <- mss
-      , xopt LangExt.TemplateHaskell (ms_hspp_opts ms)
+      , needsTemplateHaskellOrQQ $ [ms]
       ]
     transitive_deps_set marked_mods modSums = foldl' go marked_mods modSums
     go marked_mods ms
index fa9c18a..9f1da3f 100644 (file)
@@ -12,6 +12,7 @@ module HscTypes (
         HscEnv(..), hscEPS,
         FinderCache, FindResult(..), InstalledFindResult(..),
         Target(..), TargetId(..), pprTarget, pprTargetId,
+        needsTemplateHaskellOrQQ,
         ModuleGraph, emptyMG, mapMG,
         HscStatus(..),
         IServ(..),
@@ -199,6 +200,7 @@ import Platform
 import Util
 import UniqDSet
 import GHC.Serialized   ( Serialized )
+import qualified GHC.LanguageExtensions as LangExt
 
 import Foreign
 import Control.Monad    ( guard, liftM, ap )
@@ -2608,12 +2610,28 @@ soExt platform
 -- 'GHC.topSortModuleGraph' and 'Digraph.flattenSCC' to achieve this.
 type ModuleGraph = [ModSummary]
 
+
+-- | Determines whether a set of modules requires Template Haskell or
+-- Quasi Quotes
+--
+-- Note that if the session's 'DynFlags' enabled Template Haskell when
+-- 'depanal' was called, then each module in the returned module graph will
+-- have Template Haskell enabled whether it is actually needed or not.
+needsTemplateHaskellOrQQ :: ModuleGraph -> Bool
+needsTemplateHaskellOrQQ mg = any isTemplateHaskellOrQQNonBoot mg
+
 emptyMG :: ModuleGraph
 emptyMG = []
 
 mapMG :: (ModSummary -> ModSummary) -> ModuleGraph -> ModuleGraph
 mapMG = map
 
+isTemplateHaskellOrQQNonBoot :: ModSummary -> Bool
+isTemplateHaskellOrQQNonBoot ms =
+  (xopt LangExt.TemplateHaskell (ms_hspp_opts ms)
+    || xopt LangExt.QuasiQuotes (ms_hspp_opts ms)) &&
+  not (isBootSummary ms)
+
 -- | A single node in a 'ModuleGraph'. The nodes of the module graph
 -- are one of:
 --
diff --git a/testsuite/tests/quasiquotation/T13863/A.hs b/testsuite/tests/quasiquotation/T13863/A.hs
new file mode 100644 (file)
index 0000000..0d3137c
--- /dev/null
@@ -0,0 +1,8 @@
+{-# OPTIONS_GHC -Wno-missing-fields#-}
+module A where
+
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+
+aquoter :: QuasiQuoter
+aquoter = QuasiQuoter {quoteType = conT . mkName }
diff --git a/testsuite/tests/quasiquotation/T13863/B.hs b/testsuite/tests/quasiquotation/T13863/B.hs
new file mode 100644 (file)
index 0000000..649a551
--- /dev/null
@@ -0,0 +1,7 @@
+{-# LANGUAGE QuasiQuotes #-}
+module B where
+
+import A
+
+foo:: [aquoter|Int|] -> [aquoter|String|]
+foo = show
diff --git a/testsuite/tests/quasiquotation/T13863/all.T b/testsuite/tests/quasiquotation/T13863/all.T
new file mode 100644 (file)
index 0000000..c29dc20
--- /dev/null
@@ -0,0 +1 @@
+test('T13863', [req_interp, omit_ways(prof_ways), extra_files(['A.hs', 'B.hs'])], multimod_compile, ['B', '-fno-code -v0'])
\ No newline at end of file