Another round of External Core fixes
[ghc-hetmet.git] / compiler / parser / RdrHsSyn.lhs
index 1a6b3fe..e3bb369 100644 (file)
@@ -73,6 +73,7 @@ import ForeignCall    ( CCallConv, Safety, CCallTarget(..), CExportSpec(..),
                          DNCallSpec(..), DNKind(..), CLabelString )
 import OccName         ( srcDataName, varName, isDataOcc, isTcOcc, 
                          occNameString )
+import PrelNames       ( forall_tv_RDR )
 import SrcLoc
 import OrdList         ( OrdList, fromOL )
 import Bag             ( Bag, emptyBag, snocBag, consBag, foldrBag )
@@ -401,7 +402,12 @@ tyConToDataCon loc tc
   | isTcOcc (rdrNameOcc tc)
   = return (L loc (setRdrNameSpace tc srcDataName))
   | otherwise
-  = parseError loc (showSDoc (text "Not a constructor:" <+> quotes (ppr tc)))
+  = parseErrorSDoc loc (msg $$ extra)
+  where
+    msg = text "Not a data constructor:" <+> quotes (ppr tc)
+    extra | tc == forall_tv_RDR
+         = text "Perhaps you intended to use -XExistentialQuantification"
+         | otherwise = empty
 
 ----------------------------------------------------------------------------
 -- Various Syntactic Checks
@@ -515,7 +521,9 @@ checkTyClHdr (L l cxt) ty
 extractTyVars :: [LHsType RdrName] -> P [LHsTyVarBndr RdrName]
 extractTyVars tvs = collects tvs []
   where
-        -- Collect all variables (1st arg serves as an accumulator)
+        -- Collect all variables (2nd arg serves as an accumulator)
+    collect :: LHsType RdrName -> [LHsTyVarBndr RdrName]
+                               -> P [LHsTyVarBndr RdrName]
     collect (L l (HsForAllTy _ _ _ _)) =
       const $ parseError l "Forall type not allowed as type parameter"
     collect (L l (HsTyVar tv))
@@ -768,8 +776,8 @@ checkFunBind :: SrcSpan
              -> P (HsBind RdrName)
 checkFunBind lhs_loc fun is_infix pats opt_sig (L rhs_span grhss)
   | isQual (unLoc fun)
-  = parseError (getLoc fun) ("Qualified name in function definition: "  ++ 
-                            showRdrName (unLoc fun))
+  = parseErrorSDoc (getLoc fun) 
+       (ptext SLIT("Qualified name in function definition:") <+> ppr (unLoc fun))
   | otherwise
   = do ps <- checkPatterns pats
        let match_span = combineSrcSpans lhs_loc rhs_span
@@ -1021,6 +1029,7 @@ parseDImport (L loc entity) = parse0 comps
   parse2 _ _ [] = d'oh
   parse2 isStatic kind (('[':x):xs) =
      case x of
+        [] -> d'oh
         vs | last vs == ']' -> parse3 isStatic kind (init vs) xs
         _ -> d'oh
   parse2 isStatic kind xs = parse3 isStatic kind "" xs
@@ -1067,5 +1076,8 @@ showRdrName :: RdrName -> String
 showRdrName r = showSDoc (ppr r)
 
 parseError :: SrcSpan -> String -> P a
-parseError span s = failSpanMsgP span s
+parseError span s = parseErrorSDoc span (text s)
+
+parseErrorSDoc :: SrcSpan -> SDoc -> P a
+parseErrorSDoc span s = failSpanMsgP span s
 \end{code}