// Copyright (c) 2012, 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.
// Test correctness of side effects tracking used by load to load forwarding.

// @dart = 2.9

// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

import "package:expect/expect.dart";

class C {
  var x;
  var y;
  final z = 123;
}

class D {
  var x = 0.0;
}

var array = [0, 0];

s1(a) {
  a.x = 42;
  a.x = 43;
  return a.x;
}

void foo(a) {
  Expect.equals(42, a.x);
}

s1a(a) {
  a.x = 42;
  foo(a);
  a.x = 43;
  return a.x;
}

s2() {
  var t = new C();
  return t;
}

s3(a, b) {
  a.x = b + 1;
  if (b % 2 == 0) {
    a.x = 0;
  } else {
    a.x = 0;
  }
  return a.x;
}

s4(a, b) {
  a.x = b + 1.0;
  if (b % 2 == 0) {
    a.x = b + 2.0;
  }
  a.x = b + 1.0;
  return a.x;
}

test_with_context() {
  f(a) {
    var b = a + 1;
    return (() => b + 1)();
  }

  for (var i = 0; i < 100000; i++) f(42);
  Expect.equals(44, f(42));
}

test_with_instance() {
  for (var i = 0; i < 20; i++) Expect.equals(43, s1(new C()));
  for (var i = 0; i < 20; i++) Expect.equals(43, s1a(new C()));
  for (var i = 0; i < 20; i++) Expect.equals(123, s2().z);
  for (var i = 0; i < 20; i++) Expect.equals(0, s3(new C(), i));
  for (var i = 0; i < 20; i++) Expect.equals(i + 1.0, s4(new D(), i));
}

arr1(a) {
  a[0] = 42;
  a[0] = 43;
  Expect.equals(a[0], 43);
  return a[0];
}

arr2(a, b) {
  a[0] = 42;
  a[b % 2] = 43;
  Expect.equals(a[b % 2], 43);
  return a[0];
}

test_with_array() {
  for (var i = 0; i < 20; i++) Expect.equals(43, arr1(array));
  for (var i = 0; i < 20; i++) {
    Expect.equals(i % 2 == 0 ? 43 : 42, arr2(array, i));
  }
}

var st = 0;

static1(b) {
  st = 42;
  if (b % 2 == 0) {
    st = 2;
  }
  st = b + 1;
  Expect.equals(st, b + 1);
  return st;
}

test_with_static() {
  for (var i = 0; i < 20; i++) Expect.equals(i + 1, static1(i));
}

main() {
  test_with_instance();
  test_with_array();
  test_with_context();
  test_with_static();
}
