// 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));
}
