library test /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
// Specify the type explicitly.
// var a = /*@returnType=num*/ () => intValue /*@target=num.+*/ + b;
//     ^
//
// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:21:5: Error: Can't infer the type of 'c': circularity found during type inference.
// Specify the type explicitly.
// var c = /*@returnType=num*/ () => numValue /*@target=num.+*/ + d;
//     ^
//
// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:26:5: Error: Can't infer the type of 'e': circularity found during type inference.
// Specify the type explicitly.
// var e = /*@returnType=double*/ () => doubleValue /*@target=double.+*/ + f;
//     ^
//
import self as self;
import "dart:core" as core;

static field core::int intValue = 0;
static field core::num numValue = 0;
static field core::double doubleValue = 0.0;
static field invalid-type a = () → core::num => self::intValue.{core::num::+}(self::b as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::num};
static field dynamic b = self::a{dynamic}.call();
static field invalid-type c = () → core::num => self::numValue.{core::num::+}(self::d as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::num};
static field dynamic d = self::c{dynamic}.call();
static field invalid-type e = () → core::double => self::doubleValue.{core::double::+}(self::f as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::double};
static field dynamic f = self::e{dynamic}.call();
static method main() → dynamic {}
