| // 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) | 
 | } |