Fix astdef typ deref (#10245)

This commit is contained in:
Alexander Ivanov
2019-04-05 17:43:36 +03:00
committed by Andreas Rumpf
parent 3a5a0f6d46
commit f101f09256
2 changed files with 12 additions and 3 deletions

View File

@@ -336,7 +336,7 @@ proc checkNilable(c: PContext; v: PSym) =
{tfNotNil, tfNeedsInit} * v.typ.flags != {}:
if v.astdef.isNil:
message(c.config, v.info, warnProveInit, v.name.s)
elif tfNotNil in v.typ.flags and tfNotNil notin v.astdef.typ.flags:
elif tfNotNil in v.typ.flags and not v.astdef.typ.isNil and tfNotNil notin v.astdef.typ.flags:
message(c.config, v.info, warnProveInit, v.name.s)
#include liftdestructors

View File

@@ -1,3 +1,5 @@
{.experimental: "notnil".}
import macros
block:
@@ -11,8 +13,10 @@ block:
block:
template myAttr(a: string) {.pragma.}
type MyObj = object
myField1, myField2 {.myAttr: "hi".}: int
type
MyObj = object
myField1, myField2 {.myAttr: "hi".}: int
var o: MyObj
static:
assert o.myField2.hasCustomPragma(myAttr)
@@ -206,11 +210,16 @@ block:
template myAttr2(x: int) {.pragma.}
template myAttr3(x: string) {.pragma.}
type
MyObj2 = ref object
MyObjNotNil = MyObj2 not nil
let a {.myAttr,myAttr2(2),myAttr3:"test".}: int = 0
let b {.myAttr,myAttr2(2),myAttr3:"test".} = 0
var x {.myAttr,myAttr2(2),myAttr3:"test".}: int = 0
var y {.myAttr,myAttr2(2),myAttr3:"test".}: int
var z {.myAttr,myAttr2(2),myAttr3:"test".} = 0
var z2 {.myAttr.}: MyObjNotNil
template check(s: untyped) =
doAssert s.hasCustomPragma(myAttr)