| // 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 |
| |
| // @dart = 2.9 |
| |
| 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) { |
| A<dynamic> x = this; |
| x.method(violateType ? 10 : "10"); |
| } |
| |
| @pragma('vm:never-inline') |
| void testSetter(bool violateType) { |
| A<dynamic> x = this; |
| x.property = violateType ? 10 : "10"; |
| } |
| |
| @pragma('vm:never-inline') |
| void testField(bool violateType) { |
| A<dynamic> x = this; |
| x.field = violateType ? 10 : "10"; |
| } |
| } |
| |
| @pragma('vm:never-inline') |
| void loop(A<String> obj, bool violateType) { |
| for (var i = 0; i < 100; i++) { |
| obj.testMethod(violateType); |
| obj.testSetter(violateType); |
| obj.testField(violateType); |
| } |
| } |
| |
| void main() { |
| A<num>().field = 10; |
| final obj = A<String>(); |
| loop(obj, false); |
| loop(obj, false); |
| Expect.throwsTypeError(() => obj.testMethod(true)); |
| Expect.throwsTypeError(() => obj.testSetter(true)); |
| Expect.throwsTypeError(() => obj.testField(true)); |
| } |