Index: tests/compiler/dart2js_extra/consistent_index_error_string_test.dart |
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..836a13d7a2caf7115f55f3c2459fe5aa3238e0c7 |
--- /dev/null |
+++ b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart |
@@ -0,0 +1,147 @@ |
+// Copyright (c) 2015, 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"; |
+import "dart:typed_data"; |
+ |
+// Test that optimized indexing and slow path indexing produce the same error. |
+ |
+@NoInline() |
+@AssumeDynamic() |
+confuse(x) => x; |
+ |
+class TooHigh { |
+ static load1() { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ try { |
+ return confuse(a)[3]; // dynamic receiver for indexer. |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ |
+ static load2() { |
+ try { |
+ confuse(load2x)(3); |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ static load2x(i) { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ return a[i]; // 'a' is String of unknown length. |
+ } |
+ |
+ static test() { |
+ var e1 = load1(); |
+ var e2 = load2(); |
+ print(" A: '$e1'\n B: '$e2'"); |
+ Expect.equals('$e1', '$e2'); |
+ } |
+} |
+ |
+class Negative { |
+ static load1() { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ try { |
+ return confuse(a)[-3]; // dynamic receiver for indexer. |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ |
+ static load2() { |
+ try { |
+ confuse(load2x)(-3); |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ static load2x(i) { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ return a[i]; // 'a' is String of unknown length. |
+ } |
+ |
+ static test() { |
+ var e1 = load1(); |
+ var e2 = load2(); |
+ print(" A: '$e1'\n B: '$e2'"); |
+ Expect.equals('$e1', '$e2'); |
+ } |
+} |
+ |
+class Empty { |
+ static load1() { |
+ var a = confuse(true) ? '' : 'ABCDE'; |
+ try { |
+ return confuse(a)[-3]; // dynamic receiver for indexer. |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ |
+ static load2() { |
+ try { |
+ confuse(load2x)(-3); |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ static load2x(i) { |
+ var a = confuse(true) ? '' : 'ABCDE'; |
+ return a[i]; // 'a' is String of unknown length. |
+ } |
+ |
+ static test() { |
+ var e1 = load1(); |
+ var e2 = load2(); |
+ print(" A: '$e1'\n B: '$e2'"); |
+ Expect.equals('$e1', '$e2'); |
+ } |
+} |
+ |
+class BadType { |
+ static load1() { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ try { |
+ return confuse(a)['a']; // dynamic receiver for indexer. |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ |
+ static load2() { |
+ try { |
+ confuse(load2x)('a'); |
+ } catch (e) { |
+ return e; |
+ } |
+ Expect.fail('unreached'); |
+ } |
+ static load2x(i) { |
+ var a = confuse(true) ? 'AB' : 'ABCDE'; |
+ return a[i]; // 'a' is String of unknown length. |
+ } |
+ |
+ static test() { |
+ var e1 = load1(); |
+ var e2 = load2(); |
+ print(" A: '$e1'\n B: '$e2'"); |
+ Expect.equals('$e1', '$e2'); |
+ } |
+} |
+ |
+main() { |
+ TooHigh.test(); |
+ Negative.test(); |
+ Empty.test(); |
+ BadType.test(); |
+} |