diff options
-rw-r--r-- | compiler/rename/RnExpr.hs | 10 | ||||
-rw-r--r-- | testsuite/tests/th/T14204.hs | 8 | ||||
-rw-r--r-- | testsuite/tests/th/T14204.stderr | 5 | ||||
-rw-r--r-- | testsuite/tests/th/all.T | 1 |
4 files changed, 24 insertions, 0 deletions
diff --git a/compiler/rename/RnExpr.hs b/compiler/rename/RnExpr.hs index 5ccefb8467..99e3f7068a 100644 --- a/compiler/rename/RnExpr.hs +++ b/compiler/rename/RnExpr.hs @@ -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 diff --git a/testsuite/tests/th/T14204.hs b/testsuite/tests/th/T14204.hs new file mode 100644 index 0000000000..e952dbd5a7 --- /dev/null +++ b/testsuite/tests/th/T14204.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE TemplateHaskell #-} +module T14204 where + +import GHC.StaticPtr +import Language.Haskell.TH + +main :: IO () +main = putStrLn (deRefStaticPtr $(pure (StaticE (LitE (StringL "wat"))))) diff --git a/testsuite/tests/th/T14204.stderr b/testsuite/tests/th/T14204.stderr new file mode 100644 index 0000000000..90150e2050 --- /dev/null +++ b/testsuite/tests/th/T14204.stderr @@ -0,0 +1,5 @@ + +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")))) diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T index 1e737ace8f..aa973f7203 100644 --- a/testsuite/tests/th/all.T +++ b/testsuite/tests/th/all.T @@ -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']) |