Commit 9ff9c358 authored by Ryan Scott's avatar Ryan Scott

Check if -XStaticPointers is enabled when renaming static expressions

Summary:
Trying to use `static` expressions without the `-XStaticPointers`
extension enabled can lead to runtime errors. Normally, such a situation isn't
possible, but Template Haskell provides a backdoor that allows it to happen,
as shown in #14204.

To prevent this, we ensure that `-XStaticPointers` is enabled when renaming
`static` expressions.

Test Plan: make test TEST=T14204

Reviewers: facundominguez, austin, bgamari, simonpj

Reviewed By: facundominguez, simonpj

Subscribers: simonpj, rwbarton, thomie

GHC Trac Issues: #14204

Differential Revision: https://phabricator.haskell.org/D3931
parent 0ebc8dc3
......@@ -375,6 +375,16 @@ wired-in. See the Notes about the NameSorts in Name.hs.
-}
rnExpr e@(HsStatic _ expr) = do
-- Normally, you wouldn't be able to construct a static expression without
-- first enabling -XStaticPointers in the first place, since that extension
-- is what makes the parser treat `static` as a keyword. But this is not a
-- sufficient safeguard, as one can construct static expressions by another
-- mechanism: Template Haskell (see #14204). To ensure that GHC is
-- absolutely prepared to cope with static forms, we check for
-- -XStaticPointers here as well.
unlessXOptM LangExt.StaticPointers $
addErr $ hang (text "Illegal static expression:" <+> ppr e)
2 (text "Use StaticPointers to enable this extension")
(expr',fvExpr) <- rnLExpr expr
stage <- getStage
case stage of
......
{-# LANGUAGE TemplateHaskell #-}
module T14204 where
import GHC.StaticPtr
import Language.Haskell.TH
main :: IO ()
main = putStrLn (deRefStaticPtr $(pure (StaticE (LitE (StringL "wat")))))
T14204.hs:8:35: error:
• Illegal static expression: static "wat"
Use StaticPointers to enable this extension
• In the untyped splice: $(pure (StaticE (LitE (StringL "wat"))))
......@@ -394,4 +394,5 @@ test('T13856', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('T13885', normal, compile_and_run, ['-v0'])
test('T13887', normal, compile_and_run, ['-v0'])
test('T13968', normal, compile_fail, ['-v0'])
test('T14204', normal, compile_fail, ['-v0'])
test('T14060', normal, compile_and_run, ['-v0'])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment