Fix astdef typ deref (#10245)

This commit is contained in:
Alexander Ivanov 2019-04-05 17:43:36 +03:00 • committed by Andreas Rumpf
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 != {}: {tfNotNil, tfNeedsInit} * v.typ.flags != {}:
if v.astdef.isNil: if v.astdef.isNil:
message(c.config, v.info, warnProveInit, v.name.s) 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) message(c.config, v.info, warnProveInit, v.name.s)
#include liftdestructors #include liftdestructors

View file

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