library;
//
// Problems in library:
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable '#local2' definitely assigned.
//   local2 = value; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable '#local4' definitely assigned.
//   local4 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable '#local6' definitely assigned.
//   local6 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable '#local2' definitely assigned.
//   local2 = value; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable '#local4' definitely assigned.
//   local4 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable '#local6' definitely assigned.
//   local6 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable '#local4' definitely assigned.
//   local4 += 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable '#local2' definitely assigned.
//   local2 = value; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable '#local4' definitely assigned.
//   local4 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable '#local6' definitely assigned.
//   local6 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable '#local2' definitely assigned.
//   local2 = value; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable '#local4' definitely assigned.
//   local4 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable '#local6' definitely assigned.
//   local6 = 0; // error
//   ^^^^^^^
//
// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable '#local4' definitely assigned.
//   local4 += 0; // error
//   ^^^^^^^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

import "dart:async";

static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
  lowered final T? #local2;
  lowered core::bool #local2#isSet = false;
  function #local2#get() → T%
    return #local2#isSet ?{T%} #local2{T%} : throw{for-error-handling} new _in::LateError::localNI("local2");
  function #local2#set(T% local2#param) → dynamic
    if(#local2#isSet)
      throw{for-error-handling} new _in::LateError::localAI("local2");
    else {
      #local2#isSet = true;
      return #local2 = local2#param;
    }
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t1 = #local4 in #t1 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t1{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  lowered final FutureOr<core::int>? #local6;
  function #local6#get() → FutureOr<core::int>
    return let final FutureOr<core::int>? #t2 = #local6 in #t2 == null ?{FutureOr<core::int>} throw{for-error-handling} new _in::LateError::localNI("local6") : #t2{FutureOr<core::int>};
  function #local6#set(FutureOr<core::int>local6#param) → dynamic
    if(#local6 == null)
      return #local6 = local6#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local6");
  #local2#set(value){(T%) → dynamic};
  #local4#set(0){(core::int) → dynamic};
  #local6#set(0){(FutureOr<core::int>) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable '#local2' definitely assigned.
  local2 = value; // error
  ^^^^^^^" in #local2#set(value){(T%) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable '#local4' definitely assigned.
  local4 = 0; // error
  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable '#local6' definitely assigned.
  local6 = 0; // error
  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
};
static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
  lowered final T? #local2;
  lowered core::bool #local2#isSet = false;
  function #local2#get() → T%
    return #local2#isSet ?{T%} #local2{T%} : throw{for-error-handling} new _in::LateError::localNI("local2");
  function #local2#set(T% local2#param) → dynamic
    if(#local2#isSet)
      throw{for-error-handling} new _in::LateError::localAI("local2");
    else {
      #local2#isSet = true;
      return #local2 = local2#param;
    }
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t3 = #local4 in #t3 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t3{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  lowered final FutureOr<core::int>? #local6;
  function #local6#get() → FutureOr<core::int>
    return let final FutureOr<core::int>? #t4 = #local6 in #t4 == null ?{FutureOr<core::int>} throw{for-error-handling} new _in::LateError::localNI("local6") : #t4{FutureOr<core::int>};
  function #local6#set(FutureOr<core::int>local6#param) → dynamic
    if(#local6 == null)
      return #local6 = local6#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local6");
  if(b) {
    #local2#set(value){(T%) → dynamic};
    #local4#set(0){(core::int) → dynamic};
    #local6#set(0){(FutureOr<core::int>) → dynamic};
  }
  #local2#set(value){(T%) → dynamic};
  #local4#set(0){(core::int) → dynamic};
  #local6#set(0){(FutureOr<core::int>) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable '#local2' definitely assigned.
  local2 = value; // error
  ^^^^^^^" in #local2#set(value){(T%) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable '#local4' definitely assigned.
  local4 = 0; // error
  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable '#local6' definitely assigned.
  local6 = 0; // error
  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
};
static field () → Null fieldCompound = () → Null {
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t5 = #local4 in #t5 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t5{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable '#local4' definitely assigned.
  local4 += 0; // error
  ^^^^^^^" in #local4#set(#local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
};
static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
  lowered final self::methodDirect::T? #local2;
  lowered core::bool #local2#isSet = false;
  function #local2#get() → self::methodDirect::T%
    return #local2#isSet ?{self::methodDirect::T%} #local2{self::methodDirect::T%} : throw{for-error-handling} new _in::LateError::localNI("local2");
  function #local2#set(self::methodDirect::T% local2#param) → dynamic
    if(#local2#isSet)
      throw{for-error-handling} new _in::LateError::localAI("local2");
    else {
      #local2#isSet = true;
      return #local2 = local2#param;
    }
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t6 = #local4 in #t6 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t6{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  lowered final FutureOr<core::int>? #local6;
  function #local6#get() → FutureOr<core::int>
    return let final FutureOr<core::int>? #t7 = #local6 in #t7 == null ?{FutureOr<core::int>} throw{for-error-handling} new _in::LateError::localNI("local6") : #t7{FutureOr<core::int>};
  function #local6#set(FutureOr<core::int>local6#param) → dynamic
    if(#local6 == null)
      return #local6 = local6#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local6");
  #local2#set(value){(self::methodDirect::T%) → dynamic};
  #local4#set(0){(core::int) → dynamic};
  #local6#set(0){(FutureOr<core::int>) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable '#local2' definitely assigned.
  local2 = value; // error
  ^^^^^^^" in #local2#set(value){(self::methodDirect::T%) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable '#local4' definitely assigned.
  local4 = 0; // error
  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable '#local6' definitely assigned.
  local6 = 0; // error
  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
}
static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
  lowered final self::methodConditional::T? #local2;
  lowered core::bool #local2#isSet = false;
  function #local2#get() → self::methodConditional::T%
    return #local2#isSet ?{self::methodConditional::T%} #local2{self::methodConditional::T%} : throw{for-error-handling} new _in::LateError::localNI("local2");
  function #local2#set(self::methodConditional::T% local2#param) → dynamic
    if(#local2#isSet)
      throw{for-error-handling} new _in::LateError::localAI("local2");
    else {
      #local2#isSet = true;
      return #local2 = local2#param;
    }
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t8 = #local4 in #t8 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t8{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  lowered final FutureOr<core::int>? #local6;
  function #local6#get() → FutureOr<core::int>
    return let final FutureOr<core::int>? #t9 = #local6 in #t9 == null ?{FutureOr<core::int>} throw{for-error-handling} new _in::LateError::localNI("local6") : #t9{FutureOr<core::int>};
  function #local6#set(FutureOr<core::int>local6#param) → dynamic
    if(#local6 == null)
      return #local6 = local6#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local6");
  if(b) {
    #local2#set(value){(self::methodConditional::T%) → dynamic};
    #local4#set(0){(core::int) → dynamic};
    #local6#set(0){(FutureOr<core::int>) → dynamic};
  }
  #local2#set(value){(self::methodConditional::T%) → dynamic};
  #local4#set(0){(core::int) → dynamic};
  #local6#set(0){(FutureOr<core::int>) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable '#local2' definitely assigned.
  local2 = value; // error
  ^^^^^^^" in #local2#set(value){(self::methodConditional::T%) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable '#local4' definitely assigned.
  local4 = 0; // error
  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable '#local6' definitely assigned.
  local6 = 0; // error
  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
}
static method methodCompound() → dynamic {
  lowered final core::int? #local4;
  function #local4#get() → core::int
    return let final core::int? #t10 = #local4 in #t10 == null ?{core::int} throw{for-error-handling} new _in::LateError::localNI("local4") : #t10{core::int};
  function #local4#set(core::int local4#param) → dynamic
    if(#local4 == null)
      return #local4 = local4#param;
    else
      throw{for-error-handling} new _in::LateError::localAI("local4");
  #local4#set(0){(core::int) → dynamic};
  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable '#local4' definitely assigned.
  local4 += 0; // error
  ^^^^^^^" in #local4#set(#local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
}
static method main() → dynamic {}
