| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package non_null |
| |
| class Foo(val tag: String) { |
| var bar: Bar? = null |
| fun foo() { |
| println("Foo::$tag") |
| } |
| } |
| |
| class Bar(var bar1: String?, var bar2: String?, var bar3: String?) { |
| constructor() : this(null, null, null) |
| |
| fun bar() { |
| println("Bar::$bar1::$bar2::$bar3") |
| } |
| } |
| |
| fun neverThrowNPE(a: Foo?) { |
| if (a != null) { |
| a!!.foo() |
| a.bar?.bar1 = a.tag + "$1" |
| a.bar?.bar2 = a.tag + "$2" |
| a.bar?.bar3 = a.tag + "$3" |
| a.bar?.bar() |
| } else { |
| println("-null-") |
| } |
| } |
| |
| fun main(args: Array<String>) { |
| val foo = Foo("tag") |
| neverThrowNPE(foo) |
| foo.bar = Bar() |
| neverThrowNPE(foo) |
| neverThrowNPE(null) |
| } |