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

class A {
  A();
  A.foo();
}

class B extends A {
  B.c1() : super.foo;
//                  ^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.

  B.foo();
  B.c2() : this.foo;
      //   ^^^^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
      // [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
      //   ^^^^^^^^
      // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
      // [cfe] Can't access 'this' in a field initializer.
      // [cfe] Expected an assignment after the field name.
      //        ^^^
      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER

  B.c3() : super;
  //            ^
  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
  // [cfe] Expected '(' after this.
  ;
//^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_CLASS_MEMBER
// [cfe] Expected a class member, but got ';'.

  B();
  B.c4() : this;
      //   ^^^^
      // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
      // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
      // [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
      // [cfe] Expected an assignment after the field name.
      //       ^
      // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
      // [cfe] Expected '.' before this.
      // [cfe] Expected an identifier, but got ''.
}

main() {
  new B.c1();
  new B.c2();
  new B.c3();
  new B.c4();
}
