// 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.
// Redirection constructors must not have a function body.

// @dart = 2.9

class A {
  var x;
  A(this.x) {}

  // Redirecting constructor must not have a function body.
  A.illegalBody(x) : this(3) {}
  //                         ^
  // [analyzer] SYNTACTIC_ERROR.REDIRECTING_CONSTRUCTOR_WITH_BODY
  // [cfe] Redirecting constructors can't have a body.

  // Redirecting constructor must not initialize any fields.
  A.illegalInit() : this(3), x = 5;
  //                         ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
  //                           ^
  // [cfe] A redirecting constructor can't have other initializers.

  // Redirecting constructor must not have initializing formal parameters.
  A.illegalFormal(this.x) : this(3);
  //              ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
  //                   ^
  // [cfe] A redirecting constructor can't have other initializers.

  // Redirection constructors must not call super constructor.
  A.illegalSuper() : this(3), super(3);
  //                          ^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.SUPER_IN_REDIRECTING_CONSTRUCTOR
  // [cfe] A redirecting constructor can't have other initializers.
  //                                ^
  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
  //                               ^^^
  // [cfe] Too many positional arguments: 0 allowed, but 1 found.
}

main() {
  new A(3);
  new A.illegalBody(10);
  new A.illegalInit();
  new A.illegalFormal(10);
  new A.illegalSuper();
}
