// Copyright (c) 2019, 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.

// @dart = 2.9

// VMOptions=--dwarf-stack-traces

// This test verifies that null checks are handled correctly
// with --dwarf-stack-traces option (dartbug.com/35851).

import "package:expect/expect.dart";

class A {
  void foo() {
    Expect.fail('A.foo should not be reachable');
  }

  dynamic get bar {
    Expect.fail('A.bar should not be reachable');
  }

  set bazz(int x) {
    Expect.fail('A.bazz should not be reachable');
  }
}

A myNull;
double doubleNull;
int intNull;

main(List<String> args) {
  // Make sure value of `myNull` is not a compile-time null and
  // devirtualization happens.
  if (args.length > 42) {
    myNull = new A();
    doubleNull = 3.14;
    intNull = 2;
  }

  Expect.throws(() => myNull.foo(), (e) => e is NoSuchMethodError);

  Expect.throws(() => myNull.foo, (e) => e is NoSuchMethodError);

  Expect.throws(() => myNull.bar, (e) => e is NoSuchMethodError);

  Expect.throws(() => myNull.bar(), (e) => e is NoSuchMethodError);

  Expect.throws(() {
    myNull.bazz = 3;
  }, (e) => e is NoSuchMethodError);

  Expect.throws(() => doubleNull + 2.17, (e) => e is NoSuchMethodError);

  Expect.throws(() => 9.81 - doubleNull, (e) => e is NoSuchMethodError);

  Expect.throws(() => intNull * 7, (e) => e is NoSuchMethodError);
}
