summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semstmts.nim2
-rw-r--r--tests/pragmas/tcustom_pragma.nim13
2 files changed, 12 insertions, 3 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 6fd87d26f..93af6ddbb 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -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
diff --git a/tests/pragmas/tcustom_pragma.nim b/tests/pragmas/tcustom_pragma.nim
index 9f2fc024b..719af4d50 100644
--- a/tests/pragmas/tcustom_pragma.nim
+++ b/tests/pragmas/tcustom_pragma.nim
@@ -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)