summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authoraarne <aarne@chalmers.se>2011-02-25 17:01:10 +0000
committeraarne <aarne@chalmers.se>2011-02-25 17:01:10 +0000
commit445a3aafebe02c415c76392399bdf77a00e680f5 (patch)
treedc8a3350f1dc2ebd90eb35d632273c629f2b97c3 /src/compiler
parent77b02544fb91a658346f25019cbf2a21b79f9081 (diff)
Predef.error surfaces as error message in compilation and cc command
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/GF/Compile/Compute/Concrete.hs10
-rw-r--r--src/compiler/GF/Compile/Optimize.hs4
-rw-r--r--src/compiler/GFI.hs5
3 files changed, 15 insertions, 4 deletions
diff --git a/src/compiler/GF/Compile/Compute/Concrete.hs b/src/compiler/GF/Compile/Compute/Concrete.hs
index 830a86c25..e38f646e4 100644
--- a/src/compiler/GF/Compile/Compute/Concrete.hs
+++ b/src/compiler/GF/Compile/Compute/Concrete.hs
@@ -12,7 +12,7 @@
-- Computation of source terms. Used in compilation and in @cc@ command.
-----------------------------------------------------------------------------
-module GF.Compile.Compute.Concrete (computeConcrete, computeTerm,computeConcreteRec) where
+module GF.Compile.Compute.Concrete (computeConcrete, computeTerm,computeConcreteRec,checkPredefError) where
import GF.Data.Operations
import GF.Grammar.Grammar
@@ -20,6 +20,7 @@ import GF.Infra.Ident
import GF.Infra.Option
import GF.Infra.Modules
import GF.Data.Str
+import GF.Grammar.ShowTerm
import GF.Grammar.Printer
import GF.Grammar.Predef
import GF.Grammar.Macros
@@ -466,3 +467,10 @@ getArgType t = case t of
V ty _ -> return ty
T (TComp ty) _ -> return ty
_ -> Bad (render (text "cannot get argument type of table" $$ nest 2 (ppTerm Unqualified 0 t)))
+
+
+checkPredefError :: SourceGrammar -> Term -> Err Term
+checkPredefError sgr t = case t of
+ App (Q (mod,f)) s | mod == cPredef && f == cError -> Bad $ showTerm sgr TermPrintOne Unqualified s
+ _ -> composOp (checkPredefError sgr) t
+
diff --git a/src/compiler/GF/Compile/Optimize.hs b/src/compiler/GF/Compile/Optimize.hs
index 43d7cde95..10f6c08be 100644
--- a/src/compiler/GF/Compile/Optimize.hs
+++ b/src/compiler/GF/Compile/Optimize.hs
@@ -112,7 +112,8 @@ partEval opts gr (context, val) trm = errIn (render (text "partial evaluation" <
trm3 <- if rightType trm2
then computeTerm gr subst trm2
else recordExpand val trm2 >>= computeTerm gr subst
- return $ mkAbs [(Explicit,v) | v <- vars] trm3
+ trm4 <- checkPredefError gr trm3
+ return $ mkAbs [(Explicit,v) | v <- vars] trm4
where
-- don't eta expand records of right length (correct by type checking)
rightType (R rs) = case val of
@@ -199,3 +200,4 @@ replace old new trm =
R _ | trm == old -> new
App x y -> App (replace old new x) (replace old new y)
_ -> composSafeOp (replace old new) trm
+
diff --git a/src/compiler/GFI.hs b/src/compiler/GFI.hs
index 53784ec10..665d843cb 100644
--- a/src/compiler/GFI.hs
+++ b/src/compiler/GFI.hs
@@ -12,7 +12,7 @@ import GF.Grammar hiding (Ident)
import GF.Grammar.Parser (runP, pExp)
import GF.Grammar.ShowTerm
import GF.Compile.Rename
-import GF.Compile.Compute.Concrete (computeConcrete)
+import GF.Compile.Compute.Concrete (computeConcrete,checkPredefError)
import GF.Compile.TypeCheck.Concrete (inferLType)
import GF.Infra.Dependencies
import GF.Infra.CheckM
@@ -124,7 +124,8 @@ loop opts gfenv0 = do
mo <- maybe (Bad "no source grammar in scope") return $ greatestResource gr
((t,_),_) <- runCheck $ do t <- renameSourceTerm gr mo t
inferLType gr [] t
- computeConcrete sgr t
+ t1 <- computeConcrete sgr t
+ checkPredefError sgr t1
case runP pExp (encodeUnicode utf8 s) of
Left (_,msg) -> putStrLn msg