| // Copyright (c) 2020, 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. |
| |
| @pragma('dart2js:never-inline') |
| /*member: foo1:function() { |
| return 72; |
| }*/ |
| foo1() { |
| var a = 'Hello'; |
| var b = 0; |
| return a.codeUnitAt(b); |
| // Constant folds to 'return 72;' |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*spec|canary.member: foo2:function() { |
| return B.JSString_methods.codeUnitAt$1("Hello", A._asInt("x")); |
| }*/ |
| /*prod.member: foo2:function() { |
| return B.JSString_methods.codeUnitAt$1("Hello", "x"); |
| }*/ |
| foo2() { |
| var a = 'Hello'; |
| dynamic b = 'x'; |
| return a.codeUnitAt(b); |
| // No folding of index type error. |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: foo3:function() { |
| return A.ioore("Hello", 55); |
| return "Hello".charCodeAt(55); |
| }*/ |
| foo3() { |
| var a = 'Hello'; |
| dynamic b = 55; |
| return a.codeUnitAt(b); |
| // Index always out of range. |
| // The code after the always-fail check is unfortunate. |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: foo4:function(i) { |
| if (!(i >= 0 && i < 5)) |
| return A.ioore("Hello", i); |
| return "Hello".charCodeAt(i); |
| }*/ |
| foo4(int i) { |
| return 'Hello'.codeUnitAt(i); |
| // Normal bounds check. |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: foo5:function(i) { |
| if (!(i < 5)) |
| return A.ioore("Hello", i); |
| return "Hello".charCodeAt(i); |
| }*/ |
| foo5(int i) { |
| return 'Hello'.codeUnitAt(i); |
| // High-only bounds check. |
| } |
| |
| @pragma('dart2js:never-inline') |
| @pragma('dart2js:index-bounds:trust') |
| /*member: foo6:function(i) { |
| return "Hello".charCodeAt(i); |
| }*/ |
| foo6(int i) { |
| return 'Hello'.codeUnitAt(i); |
| // No bound check, as requested. |
| } |
| |
| @pragma('dart2js:never-inline') |
| @pragma('dart2js:index-bounds:trust') |
| /*spec|canary.member: foo7:function(i) { |
| return "Hello".charCodeAt(A._asInt(i)); |
| }*/ |
| /*prod.member: foo7:function(i) { |
| return B.JSString_methods.codeUnitAt$1("Hello", i); |
| }*/ |
| foo7(dynamic i) { |
| return 'Hello'.codeUnitAt(i); |
| // No folding of index type error even when bounds check removed. |
| } |
| |
| /*member: main:ignore*/ |
| main() { |
| foo1(); |
| foo2(); |
| foo3(); |
| foo4(-9); |
| foo4(0); |
| foo4(100); |
| foo5(0); |
| foo5(100); |
| foo6(-9); |
| foo6(0); |
| foo6(100); |
| foo7(0); |
| foo7('x'); |
| } |