Always do polymorphic typed quote check, c.f. #10384
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Tue, 5 May 2015 17:53:00 +0000 (10:53 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Sat, 9 May 2015 08:26:06 +0000 (01:26 -0700)
Summary:
Since quotes are enabled in stage1, we need to do the
staging check.  This also "fixes" #10384 by adding
a test for the polymorphic local variable test.

Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Test Plan: validate

Reviewers: simonpj, austin

Subscribers: bgamari, thomie

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

GHC Trac Issues: #10384

compiler/typecheck/TcExpr.hs
testsuite/tests/quotes/T10384.hs [new file with mode: 0644]
testsuite/tests/quotes/T10384.stderr [new file with mode: 0644]
testsuite/tests/quotes/all.T

index 353b2b7..155cdb4 100644 (file)
@@ -16,9 +16,7 @@ module TcExpr ( tcPolyExpr, tcPolyExprNC, tcMonoExpr, tcMonoExprNC,
 #include "HsVersions.h"
 
 import {-# SOURCE #-}   TcSplice( tcSpliceExpr, tcTypedBracket, tcUntypedBracket )
 #include "HsVersions.h"
 
 import {-# SOURCE #-}   TcSplice( tcSpliceExpr, tcTypedBracket, tcUntypedBracket )
-#ifdef GHCI
 import DsMeta( liftStringName, liftName )
 import DsMeta( liftStringName, liftName )
-#endif
 
 import HsSyn
 import TcHsSyn
 
 import HsSyn
 import TcHsSyn
@@ -1234,13 +1232,6 @@ tcTagToEnum loc fun_name arg res_ty
 -}
 
 checkThLocalId :: Id -> TcM ()
 -}
 
 checkThLocalId :: Id -> TcM ()
-#ifndef GHCI  /* GHCI and TH is off */
---------------------------------------
--- Check for cross-stage lifting
-checkThLocalId _id
-  = return ()
-
-#else         /* GHCI and TH is on */
 checkThLocalId id
   = do  { mb_local_use <- getStageAndBindLevel (idName id)
         ; case mb_local_use of
 checkThLocalId id
   = do  { mb_local_use <- getStageAndBindLevel (idName id)
         ; case mb_local_use of
@@ -1303,7 +1294,6 @@ checkCrossStageLifting _ _ = return ()
 polySpliceErr :: Id -> SDoc
 polySpliceErr id
   = ptext (sLit "Can't splice the polymorphic local variable") <+> quotes (ppr id)
 polySpliceErr :: Id -> SDoc
 polySpliceErr id
   = ptext (sLit "Can't splice the polymorphic local variable") <+> quotes (ppr id)
-#endif /* GHCI */
 
 {-
 Note [Lifting strings]
 
 {-
 Note [Lifting strings]
diff --git a/testsuite/tests/quotes/T10384.hs b/testsuite/tests/quotes/T10384.hs
new file mode 100644 (file)
index 0000000..773deb0
--- /dev/null
@@ -0,0 +1,3 @@
+{-# LANGUAGE TemplateHaskell, RankNTypes, ScopedTypeVariables #-}
+module A where
+x = \(y :: forall a. a -> a) -> [|| y ||]
diff --git a/testsuite/tests/quotes/T10384.stderr b/testsuite/tests/quotes/T10384.stderr
new file mode 100644 (file)
index 0000000..f2360fd
--- /dev/null
@@ -0,0 +1,6 @@
+
+T10384.hs:3:37: error:
+    Can't splice the polymorphic local variable ‘y’
+    In the Template Haskell quotation [|| y ||]
+    In the expression: [|| y ||]
+    In the expression: \ (y :: forall a. a -> a) -> [|| y ||]
index a3dfb8b..a56a50c 100644 (file)
@@ -15,6 +15,7 @@ test('T8455', normal, compile, ['-v0'])
 test('T8633', normal, compile_and_run, [''])
 test('T8759a', normal, compile_fail, ['-v0'])
 test('T9824', normal, compile, ['-v0'])
 test('T8633', normal, compile_and_run, [''])
 test('T8759a', normal, compile_fail, ['-v0'])
 test('T9824', normal, compile, ['-v0'])
+test('T10384', normal, compile_fail, [''])
 
 test('TH_tf2', normal, compile, ['-v0'])
 test('TH_ppr1', normal, compile_and_run, [''])
 
 test('TH_tf2', normal, compile, ['-v0'])
 test('TH_ppr1', normal, compile_and_run, [''])