| // 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. |
| |
| // @dart = 2.9 |
| |
| // 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.throwsNoSuchMethodError(() => foofoo(null)); |
| } |