Complain sensibly if you try to use scoped type variables in Template Haskell
authorsimonpj@microsoft.com <unknown>
Wed, 16 Jan 2008 15:16:12 +0000 (15:16 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 16 Jan 2008 15:16:12 +0000 (15:16 +0000)
This fixes Trac #2024; worth merging onto 6.8 branch.

compiler/deSugar/DsMeta.hs

index 3317ffa..9859167 100644 (file)
@@ -424,7 +424,7 @@ repTy (HsForAllTy _ tvs ctxt ty)  =
 
 repTy (HsTyVar n)
   | isTvOcc (nameOccName n)       = do 
-                                     tv1 <- lookupBinder n
+                                     tv1 <- lookupTvOcc n
                                      repTvar tv1
   | otherwise                    = do 
                                      tc1 <- lookupOcc n
@@ -917,6 +917,18 @@ lookupOcc n
                Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n) 
     }
 
+lookupTvOcc :: Name -> DsM (Core TH.Name)
+-- Type variables can't be staged and are not lexically scoped in TH
+lookupTvOcc n  
+  = do {  mb_val <- dsLookupMetaEnv n ;
+          case mb_val of
+               Just (Bound x)  -> return (coreVar x)
+               other           -> failWithDs msg
+    }
+  where
+    msg = vcat  [ ptext SLIT("Illegal lexically-scoped type variable") <+> quotes (ppr n)
+               , ptext SLIT("Lexically scoped type variables are not supported by Template Haskell") ]
+
 globalVar :: Name -> DsM (Core TH.Name)
 -- Not bound by the meta-env
 -- Could be top-level; or could be local