Files
sdk/tests/language_2/this/as_dynamic_call_checks_test.dart
T
Robert Nystrom fc1b1ecc71 Move files under language_2 into subdirectories.
Change-Id: Idbcc965a27e9ffeedf5e0a1068b019de4193070f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/127745
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Alexander Thomas <athom@google.com>
2019-12-11 19:18:00 +00:00

54 lines
1.4 KiB
Dart

// 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.
//
// VMOptions=--no-background-compilation --optimization-counter-threshold=10
import "package:expect/expect.dart";
class A<T> {
T field;
@pragma('vm:never-inline')
set property(T v) {}
@pragma('vm:never-inline')
void method(T x) {}
@pragma('vm:never-inline')
void testMethod({bool violateType: false}) {
dynamic x = this;
x.method(violateType ? 10 : "10");
}
@pragma('vm:never-inline')
void testSetter({bool violateType: false}) {
dynamic x = this;
x.property = violateType ? 10 : "10";
}
@pragma('vm:never-inline')
void testField({bool violateType: false}) {
dynamic x = this;
x.field = violateType ? 10 : "10";
}
}
@pragma('vm:never-inline')
void loop(A<String> obj, {bool violateType: false}) {
for (var i = 0; i < 100; i++) {
obj.testMethod(violateType: violateType);
obj.testSetter(violateType: violateType);
obj.testField(violateType: violateType);
}
}
void main() {
final obj = A<String>();
loop(obj, violateType: false);
loop(obj, violateType: false);
Expect.throwsTypeError(() => obj.testMethod(violateType: true));
Expect.throwsTypeError(() => obj.testSetter(violateType: true));
Expect.throwsTypeError(() => obj.testField(violateType: true));
}