blob: 077b53a494c8e19f765918e60b86c0be2f7a5dc6 [file] [log] [blame]
// 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));
}