library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue41498.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
//     f.toString(); // error
//     ^
//
// pkg/front_end/testcases/nnbd/issue41498.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
//     f.toString(); // error
//     ^
//
// pkg/front_end/testcases/nnbd/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
//   f.toString(); // error
//   ^
//
// pkg/front_end/testcases/nnbd/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
//     f.toString(); // error
//     ^
//
import self as self;
import "dart:core" as core;

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

class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static method test() → void {
    () → void f;
    (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41498.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
    f.toString(); // error
    ^" in f).{core::Object::toString}();
  }
  method test2() → void {
    () → void f;
    (let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41498.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
    f.toString(); // error
    ^" in f).{core::Object::toString}();
  }
}
static method test() → dynamic {
  () → void f;
  (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
  f.toString(); // error
  ^" in f).{core::Object::toString}();
  core::Function foo = () → core::Null? {
    () → void f;
    (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
    f.toString(); // error
    ^" in f).{core::Object::toString}();
  };
  self::C::test();
  new self::C::•().{self::C::test2}();
}
static method main() → dynamic {}

library opted_out_lib;
import self as self2;
import "dart:core" as core;

typedef LegacyFoo = () →* void;
class C extends core::Object {
  synthetic constructor •() → self2::C*
    : super core::Object::•()
    ;
  static method test() → void {
    () →* void f;
    f.{core::Object::toString}();
  }
  method test2() → void {
    () →* void f;
    f.{core::Object::toString}();
  }
  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 test() → dynamic {
  () →* void f;
  f.{core::Object::toString}();
  core::Function* foo = () → core::Null? {
    () →* void f;
    f.{core::Object::toString}();
  };
  self2::C::test();
  new self2::C::•().{self2::C::test2}();
}
