//
// Problems in component:
//
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib3.dart:9:19: Error: Constant evaluation error:
// const fooField2 = fooField;
//                   ^
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib1.dart:8:31: Context: This assertion failed.
//   const Foo(int i) : assert(i > 0);
//                               ^
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib3.dart:9:7: Context: While analyzing:
// const fooField2 = fooField;
//       ^
//
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib2.dart:9:24: Error: Constant evaluation error:
// const fooField = const Foo(0);
//                        ^
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib1.dart:8:31: Context: This assertion failed.
//   const Foo(int i) : assert(i > 0);
//                               ^
// pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_02_lib2.dart:9:7: Context: While analyzing:
// const fooField = const Foo(0);
//       ^
//
library;
import self as self;
import "error_location_02_lib1.dart" as err;
import "dart:core" as core;

import "org-dartlang-testcase:///error_location_02_lib1.dart";
import "org-dartlang-testcase:///error_location_02_lib2.dart";
import "org-dartlang-testcase:///error_location_02_lib3.dart";

static method main() → dynamic {
  err::foo();
  core::print(invalid-expression "This assertion failed.");
}

library;
import self as err;
import "dart:core" as core;

class Foo extends core::Object /*hasConstConstructor*/  {
  const constructor •(core::int* i) → err::Foo*
    : assert(i.{core::num::>}(0)), super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method foo() → dynamic {
  new err::Foo::•(0);
}

library;
import self as self2;
import "error_location_02_lib1.dart" as err;

import "org-dartlang-testcase:///error_location_02_lib1.dart";

static const field err::Foo* fooField = invalid-expression "This assertion failed.";

library;
import self as self3;
import "error_location_02_lib1.dart" as err;

import "org-dartlang-testcase:///error_location_02_lib2.dart";

static const field err::Foo* fooField2 = invalid-expression "This assertion failed.";
