// 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.

// Formatting can break multitests, so don't format them.
// dart format off

class A {
  static String? s = "something";
  var a = "anything";
  var x;

  foo() => null;
  bar(y) => y;
  static sfoo() => null;
  static sbar(y) => y;

  A.next();

  A(); //# 00: ok
  A() : this.next(); //# 01: ok

  A() : x = s; //# 02: ok
  A() : x = sfoo(); //# 03: ok
  A() : x = sbar(null); //# 04: ok
  A() : x = a; //# 05: compile-time error
  A() : x = foo(); //# 06: compile-time error
  A() : x = bar(null); //# 07: compile-time error
  A() : x = bar(this); //# 08: compile-time error
  A() : x = this; //# 09: compile-time error
  A() : x = this.a; //# 10: compile-time error
  A() : x = this.foo(); //# 11: compile-time error
  A() : x = this.bar(null); //# 12: compile-time error
  A() : x = this.bar(this); //# 13: compile-time error
  A() : x = sbar(this); //# 14: compile-time error
  A() : x = sbar(this.a); //# 15: compile-time error
  A() : x = sbar(this.foo()); //# 16: compile-time error
  A() : x = sbar(this.bar(null)); //# 17: compile-time error
  A() : x = sbar(this.bar(this)); //# 18: compile-time error

  A() : this.x = (() => null); //# 19: ok
  A() : this.x = (() => s)(); //# 20: ok
  A() : this.x = ((c) => c); //# 21: ok
  A() : this.x = ((c) => s)(null); //# 22: ok
  A() : this.x = ((c) => c)(this); //# 23: compile-time error
  A() : this.x = (() => this); //# 24: compile-time error
  A() : this.x = (() => this.a)(); //# 25: compile-time error
  A() : this.x = ((c) => this.foo()); //# 26: compile-time error
  A() : this.x = ((c) => a)(null); //# 27: compile-time error
  A() : this.x = ((c) => foo())(s); //# 28: compile-time error
  A() : this.x = sbar((() { return null; })); //# 29: ok
  A() : this.x = sbar((() { return s; })()); //# 30: ok
  A() : this.x = sbar(((c) { return c; })); //# 31: ok
  A() : this.x = sbar(((c) { return s; })(null)); //# 32: ok
  A() : this.x = sbar(((c) { return c; })(this)); //# 33: compile-time error
  A() : this.x = sbar((() { return this; })); //# 34: compile-time error
  A() : this.x = sbar((() { return this.a; })()); //# 35: compile-time error
  A() : this.x = sbar(((c) { return this.foo(); })); //# 36: compile-time error
  A() : this.x = sbar(((c) { return a; })(null)); //# 37: compile-time error
  A() : this.x = sbar(((c) { return foo(); })(s)); //# 38: compile-time error

  A() : this.x = (s = null); //# 39: ok
  A() : this.x = (a = null); //# 40: compile-time error
  A() : this.x = (this.a = null); //# 41: compile-time error
}

main() {}
