summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-04-23 05:36:38 -0700
committerGitHub <noreply@github.com>2021-04-23 14:36:38 +0200
commit2abc936d511342265d2ef27c4b079dd49332d65a (patch)
tree9c6b945447a8a2b31c9c752e92f8984cb630f3ae /compiler
parent3516f57e172cef22f583f43c7b16fd1f63921c6e (diff)
downloadNim-2abc936d511342265d2ef27c4b079dd49332d65a.tar.gz
`typeof(voidStmt)` now works (#17807)
* `typeof(voidStmt)` now works
* remove typeOrVoid
* add condsyms, and reference cligen https://github.com/c-blake/cligen/pull/193
* fixup
* changelog [skip ci]
* fixup
Diffstat (limited to 'compiler')
-rw-r--r--compiler/condsyms.nim1
-rw-r--r--compiler/sem.nim1
-rw-r--r--compiler/semdata.nim3
-rw-r--r--compiler/semexprs.nim4
4 files changed, 8 insertions, 1 deletions
diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim
index bdecd7e53..6a49584c8 100644
--- a/compiler/condsyms.nim
+++ b/compiler/condsyms.nim
@@ -133,3 +133,4 @@ proc initDefines*(symbols: StringTableRef) =
   defineSymbol("nimHasCustomLiterals")
   defineSymbol("nimHasUnifiedTuple")
   defineSymbol("nimHasIterable")
+  defineSymbol("nimHasTypeofVoid")
diff --git a/compiler/sem.nim b/compiler/sem.nim
index 4020fc4d6..b80795354 100644
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -525,6 +525,7 @@ proc myOpen(graph: ModuleGraph; module: PSym; idgen: IdGenerator): PPassContext
   var c = newContext(graph, module)
   c.idgen = idgen
   c.enforceVoidContext = newType(tyTyped, nextTypeId(idgen), nil)
+  c.voidType = newType(tyVoid, nextTypeId(idgen), nil)
 
   if c.p != nil: internalError(graph.config, module.info, "sem.myOpen")
   c.semConstExpr = semConstExpr
diff --git a/compiler/semdata.nim b/compiler/semdata.nim
index 1c1a5159c..082a4813e 100644
--- a/compiler/semdata.nim
+++ b/compiler/semdata.nim
@@ -90,6 +90,9 @@ type
   TContext* = object of TPassContext # a context represents the module
                                      # that is currently being compiled
     enforceVoidContext*: PType
+      # for `if cond: stmt else: foo`, `foo` will be evaluated under
+      # enforceVoidContext != nil
+    voidType*: PType # for typeof(stmt)
     module*: PSym              # the module sym belonging to the context
     currentScope*: PScope      # current scope
     moduleScope*: PScope       # scope for modules
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 97f88869e..2e229d861 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -83,7 +83,9 @@ proc semExprCheck(c: PContext, n: PNode, flags: TExprFlags): PNode =
 
 proc semExprWithType(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
   result = semExprCheck(c, n, flags)
-  if result.typ == nil or result.typ == c.enforceVoidContext:
+  if result.typ == nil and efInTypeof in flags:
+    result.typ = c.voidType
+  elif result.typ == nil or result.typ == c.enforceVoidContext:
     localError(c.config, n.info, errExprXHasNoType %
                 renderTree(result, {renderNoComments}))
     result.typ = errorType(c)