summary refs log tree commit diff stats
path: root/compiler/sem.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/sem.nim')
-rwxr-xr-xcompiler/sem.nim28
1 files changed, 18 insertions, 10 deletions
diff --git a/compiler/sem.nim b/compiler/sem.nim
index 904adf955..c1ea6d1af 100755
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -37,7 +37,7 @@ proc addResultNode(c: PContext, n: PNode)
 proc instGenericContainer(c: PContext, n: PNode, header: PType): PType
 
 proc typeMismatch(n: PNode, formal, actual: PType) = 
-  GlobalError(n.Info, errGenerated, msgKindToString(errTypeMismatch) &
+  LocalError(n.Info, errGenerated, msgKindToString(errTypeMismatch) &
       typeToString(actual) & ") " &
       `%`(msgKindToString(errButExpectedX), [typeToString(formal)]))
 
@@ -45,6 +45,9 @@ proc fitNode(c: PContext, formal: PType, arg: PNode): PNode =
   result = IndexTypesMatch(c, formal, arg.typ, arg)
   if result == nil:
     typeMismatch(arg, formal, arg.typ)
+    # error correction:
+    result = copyNode(arg)
+    result.typ = formal
 
 proc isTopLevel(c: PContext): bool {.inline.} = 
   result = c.tab.tos <= 2
@@ -62,7 +65,7 @@ proc semStmtScope(c: PContext, n: PNode): PNode
 
 proc ParamsTypeCheck(c: PContext, typ: PType) {.inline.} =
   if not typeAllowed(typ, skConst):
-    GlobalError(typ.n.info, errXisNoType, typeToString(typ))
+    LocalError(typ.n.info, errXisNoType, typeToString(typ))
 
 proc expectMacroOrTemplateCall(c: PContext, n: PNode): PSym
 
@@ -80,13 +83,15 @@ proc evalTypedExpr(c: PContext, e: PNode): PNode =
   if result == nil:
     result = evalConstExpr(c.module, e)
     if result == nil or result.kind == nkEmpty:
-      GlobalError(e.info, errConstExprExpected)
+      LocalError(e.info, errConstExprExpected)
+      # error correction:
+      result = e
 
 proc semConstExpr(c: PContext, n: PNode): PNode =
   var e = semExprWithType(c, n)
   if e == nil:
-    GlobalError(n.info, errConstExprExpected)
-    return nil
+    LocalError(n.info, errConstExprExpected)
+    return n
   result = evalTypedExpr(c, e)
 
 include seminst, semcall
@@ -129,12 +134,15 @@ proc forceBool(c: PContext, n: PNode): PNode =
   if result == nil: result = n
 
 proc semConstBoolExpr(c: PContext, n: PNode): PNode = 
-  result = fitNode(c, getSysType(tyBool), semExprWithType(c, n))
-  if result == nil: 
-    GlobalError(n.info, errConstExprExpected)
-    return 
+  let nn = semExprWithType(c, n)
+  result = fitNode(c, getSysType(tyBool), nn)
+  if result == nil:
+    LocalError(n.info, errConstExprExpected)
+    return nn
   result = getConstExpr(c.module, result)
-  if result == nil: GlobalError(n.info, errConstExprExpected)
+  if result == nil: 
+    LocalError(n.info, errConstExprExpected)
+    result = nn
 
 include semtypes, semexprs, semgnrc, semstmts