diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/sem.nim | 19 | ||||
-rw-r--r-- | compiler/semexprs.nim | 6 | ||||
-rw-r--r-- | compiler/semobjconstr.nim | 18 | ||||
-rw-r--r-- | compiler/semstmts.nim | 2 |
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: |