| // Copyright (c) 2018, 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. | 
 |  | 
 | // Verify that optimizing compiler does not perform an illegal code motion | 
 | // past CheckNull instruction. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | class C { | 
 |   final String padding = ""; | 
 |   final String field = "1"; // Note: need padding to hit an object header | 
 |   // of the next object after [null] object when | 
 |   // doing illegal null.field read. Need to hit | 
 |   // object header to cause crash. | 
 | } | 
 |  | 
 | int foofoo(C? p) { | 
 |   int sum = 0; | 
 |   for (var i = 0; i < 10; i++) { | 
 |     // Note: need redundant instructions in the loop to trigger Canonicalize | 
 |     // after CSE. Canonicalize then would illegally remove the Redefinition. | 
 |     sum += p!.field.length; | 
 |     sum += p.field.length; | 
 |   } | 
 |   return sum; | 
 | } | 
 |  | 
 | void main() { | 
 |   Expect.equals(20, foofoo(new C())); | 
 |   Expect.throwsTypeError(() => foofoo(null)); | 
 | } |