| // Copyright (c) 2017, the Dart 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. |
| |
| // @dart = 2.7 |
| |
| /*member: main:[null]*/ |
| main() { |
| simpleDo(); |
| doNull(); |
| doNotNull(); |
| doNullFalse(); |
| doNotNullTrue(); |
| doUnion(); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Simple int based do-while loop. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: simpleDo:[null]*/ |
| simpleDo() { |
| var i = 0; |
| do { |
| i = i /*invoke: [subclass=JSPositiveInt]*/ + 1; |
| } while (i /*invoke: [subclass=JSPositiveInt]*/ < 10); |
| i. /*invoke: [subclass=JSPositiveInt]*/ abs(); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Do-while loop with null test. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: doNull:[exact=JSString]*/ |
| doNull() { |
| var o; |
| do { |
| o = o. /*invoke: [null|exact=JSString]*/ toString(); |
| } while (o == null); |
| return o; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Do-while loop with not-null test. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: doNotNull:[exact=JSString]*/ |
| doNotNull() { |
| var o = ''; |
| do { |
| o = o. /*invoke: [exact=JSString]*/ toString(); |
| } while (o /*invoke: [null|exact=JSString]*/ != null); |
| return o; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Do-while loop with null test known to be false. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: doNullFalse:[exact=JSString]*/ |
| doNullFalse() { |
| var o = ''; |
| do { |
| o = o. /*invoke: [exact=JSString]*/ toString(); |
| } while (o /*invoke: [null|exact=JSString]*/ == null); |
| return o; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Do-while loop with not-null test known to be true. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: doNotNullTrue:[exact=JSString]*/ |
| doNotNullTrue() { |
| var o = null; |
| do { |
| o = o. /*invoke: [null|exact=JSString]*/ toString(); |
| } while (o != null); |
| return o; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| /// Do-while loop with not-null test that mixes field accesses. |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| /*member: Class1.:[exact=Class1]*/ |
| class Class1 { |
| /*member: Class1.field:[null|exact=Class2]*/ |
| var field; |
| } |
| |
| /*member: Class2.:[exact=Class2]*/ |
| class Class2 { |
| /*member: Class2.field:[null|exact=Class1]*/ |
| var field; |
| } |
| |
| /*member: _doUnion:Union(null, [exact=Class1], [exact=Class2])*/ |
| _doUnion(/*[exact=Class1]*/ o) { |
| do { |
| o = o. /*Union(null, [exact=Class1], [exact=Class2])*/ field; |
| } while (o != null); |
| return o; |
| } |
| |
| /*member: doUnion:[null]*/ |
| doUnion() { |
| var c1 = new Class1(); |
| var c2 = new Class2(); |
| c1. /*update: [exact=Class1]*/ field = c2; |
| c2. /*update: [exact=Class2]*/ field = c1; |
| _doUnion(c1); |
| } |