summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/sem.nim19
-rw-r--r--compiler/semexprs.nim6
-rw-r--r--compiler/semobjconstr.nim18
-rw-r--r--compiler/semstmts.nim2
4 files changed, 26 insertions, 19 deletions
diff --git a/compiler/sem.nim b/compiler/sem.nim
index f4d992e25..3a4ff2cd9 100644
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -46,6 +46,7 @@ proc addParams(c: PContext, n: PNode, kind: TSymKind)
 proc maybeAddResult(c: PContext, s: PSym, n: PNode)
 proc tryExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode
 proc activate(c: PContext, n: PNode)
+proc checkDefaultConstruction(c: PContext, typ: PType, info: TLineInfo)
 proc semQuoteAst(c: PContext, n: PNode): PNode
 proc finishMethod(c: PContext, s: PSym)
 proc evalAtCompileTime(c: PContext, n: PNode): PNode
@@ -58,24 +59,6 @@ proc isArrayConstr(n: PNode): bool {.inline.} =
   result = n.kind == nkBracket and
     n.typ.skipTypes(abstractInst).kind == tyArray
 
-type
-  ObjConstrContext = object
-    typ: PType             # The constructed type
-    initExpr: PNode        # The init expression (nkObjConstr)
-    requiresFullInit: bool # A `requiresInit` derived type will
-                           # set this to true while visiting
-                           # parent types.
-
-  InitStatus = enum # This indicates the result of object construction
-    initUnknown
-    initFull     # All  of the fields have been initialized
-    initPartial  # Some of the fields have been initialized
-    initNone     # None of the fields have been initialized
-    initConflict # Fields from different branches have been initialized
-
-proc semConstructType(c: PContext, initExpr: PNode,
-                      t: PType, flags: TExprFlags): InitStatus
-
 template semIdeForTemplateOrGenericCheck(conf, n, requiresCheck) =
   # we check quickly if the node is where the cursor is
   when defined(nimsuggest):
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index d6659f76b..58f3f9316 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -2264,6 +2264,12 @@ proc semMagic(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode =
   of mSizeOf:
     markUsed(c, n.info, s)
     result = semSizeof(c, setMs(n, s))
+  of mDefault:
+    result = semDirectOp(c, n, flags)
+    c.config.internalAssert result[1].typ.kind == tyTypeDesc
+    let typ = result[1].typ.base
+    if typ.kind in {tyObject, tyTuple}:
+      checkDefaultConstruction(c, typ, n.info)
   else:
     result = semDirectOp(c, n, flags)
 
diff --git a/compiler/semobjconstr.nim b/compiler/semobjconstr.nim
index 2d226aa33..b9931f527 100644
--- a/compiler/semobjconstr.nim
+++ b/compiler/semobjconstr.nim
@@ -11,6 +11,21 @@
 
 # included from sem.nim
 
+type
+  ObjConstrContext = object
+    typ: PType             # The constructed type
+    initExpr: PNode        # The init expression (nkObjConstr)
+    requiresFullInit: bool # A `requiresInit` derived type will
+                           # set this to true while visiting
+                           # parent types.
+
+  InitStatus = enum # This indicates the result of object construction
+    initUnknown
+    initFull     # All  of the fields have been initialized
+    initPartial  # Some of the fields have been initialized
+    initNone     # None of the fields have been initialized
+    initConflict # Fields from different branches have been initialized
+
 proc mergeInitStatus(existing: var InitStatus, newStatus: InitStatus) =
   case newStatus
   of initConflict:
@@ -336,6 +351,9 @@ proc semConstructType(c: PContext, initExpr: PNode,
     constrCtx.requiresFullInit = constrCtx.requiresFullInit or
                                  tfRequiresInit in t.flags
 
+proc checkDefaultConstruction(c: PContext, typ: PType, info: TLineInfo) =
+  discard semConstructType(c, newNodeI(nkObjConstr, info), typ, {})
+
 proc semObjConstr(c: PContext, n: PNode, flags: TExprFlags): PNode =
   var t = semTypeNode(c, n[0], nil)
   result = newNodeIT(nkObjConstr, n.info, t)
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 812d1ff71..373e5fcdb 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -616,7 +616,7 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
         b[j] = newSymNode(v)
       if def.kind == nkEmpty:
         if v.typ.kind in {tyObject, tyTuple}:
-          discard semConstructType(c, newNodeI(nkObjConstr, v.info), v.typ, {})
+          checkDefaultConstruction(c, v.typ, v.info)
         else:
           checkNilable(c, v)
       if sfCompileTime in v.flags: