library;
//
// Problems in library:
//
// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
// Try adding {}.
// a b(c) = d;
//        ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
// Try making this a factory constructor, or remove the redirection.
//   C.missingFactoryKeyword() = C.constant;
//                             ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
// Try making this a factory constructor, or remove the redirection.
//   C notEvenAConstructor(a) = h;
//                            ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
// a b(c) = d;
// ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
//   C notEvenAConstructor(a) = h;
//                              ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Undefined name 'd'.
// a b(c) = d;
//          ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Expected a function body or '=>'.
// Try adding {}.
//   C.missingFactoryKeyword() = C.constant;
//                             ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:14:33: Error: Member not found: 'constant'.
//   C.missingFactoryKeyword() = C.constant;
//                                 ^^^^^^^^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
// Try removing the return type.
//   C.missingFactoryKeyword() = C.constant;
//                               ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Expected a function body or '=>'.
// Try adding {}.
//   C notEvenAConstructor(a) = h;
//                            ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
//  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
//   C notEvenAConstructor(a) = h;
//                              ^
//
// pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   print(const C.missingFactoryKeyword());
//               ^
//
import self as self;
import "dart:core" as core;

class C extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self::C::good];
  const constructor constant() → self::C*
    : super core::Object::•()
    ;
  constructor missingFactoryKeyword() → self::C*
    : super core::Object::•()
    invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
Try removing the return type.
  C.missingFactoryKeyword() = C.constant;
                              ^";
  static factory good() → self::C*
    return new self::C::constant();
  method notEvenAConstructor(dynamic a) → self::C*
    return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
 - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
  C notEvenAConstructor(a) = h;
                             ^" in this{<unresolved>}.h as{TypeError,ForDynamic} self::C*;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method b(dynamic c) → invalid-type
  return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Undefined name 'd'.
a b(c) = d;
         ^";
static method main() → dynamic {
  self::C* c = null;
  core::print(#C1);
  core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
Try using a constructor or factory that is 'const'.
  print(const C.missingFactoryKeyword());
              ^");
  core::print(#C1);
  core::print(new self::C::constant().{self::C::notEvenAConstructor}(null){(dynamic) →* self::C*});
}

constants  {
  #C1 = self::C {}
}


Constructor coverage from constants:
org-dartlang-testcase:///issue_000044.dart:
- C.constant (from org-dartlang-testcase:///issue_000044.dart:11:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
