| // Copyright (c) 2019, 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. | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 |  | 
 | var field; | 
 |  | 
 | class Class { | 
 |   @pragma('dart2js:noInline') | 
 |   method(int i, int j, int k) {} | 
 | } | 
 |  | 
 | @pragma('dart2js:noInline') | 
 | test1(dynamic c, dynamic n) { | 
 |   if (c is Class) { | 
 |     c.method(field = 41, n, field = 42); | 
 |   } | 
 | } | 
 |  | 
 | @pragma('dart2js:noInline') | 
 | test2(dynamic c, dynamic n) { | 
 |   if (c is! Class) return; | 
 |   c.method(field = 66, n, field = 67); | 
 | } | 
 |  | 
 | @pragma('dart2js:noInline') | 
 | test3(dynamic c, dynamic n) { | 
 |   c.method(field = 86, n, field = 87); | 
 | } | 
 |  | 
 | main() { | 
 |   try { | 
 |     test1(new Class(), 0.5); | 
 |     field = 123; | 
 |     field = 123; | 
 |   } catch (e) {} | 
 |   // CFE inserts the implicit cast directly on the argument expression, making | 
 |   // it fail before later arguments are evaluated. | 
 |   Expect.equals(41, field); | 
 |  | 
 |   try { | 
 |     test2(new Class(), 0.5); | 
 |     field = 213; | 
 |     field = 213; | 
 |   } catch (e) {} | 
 |   // See above comment. | 
 |   Expect.equals(66, field); | 
 |  | 
 |   try { | 
 |     test3(new Class(), 0.5); | 
 |     field = 321; | 
 |     field = 321; | 
 |   } catch (e) {} | 
 |   // dart2js inserts implicit casts, but does so after evaluating all arguments | 
 |   // to ensure semantics match what it would be like to check the types when | 
 |   // entering the callee. | 
 |   Expect.equals(87, field); | 
 | } |