library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/await_complex.dart:120:12: Error: A value of type 'FutureOr<bool>' can't be assigned to a variable of type 'bool'.
//     assert(id(true), await func("message"));
//            ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

class C extends core::Object {
  static field core::int staticField = 1;
  field core::int field = 1;
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static get staticGetter() → core::int
    return self::C::staticField;
  static set staticSetter(dynamic val) → void {
    self::C::staticField = val as{TypeError,ForDynamic} core::int;
  }
  static method staticFoo(core::int param) → core::int
    return param;
  get getter() → core::int
    return this.{self::C::field}{core::int};
  set setter(dynamic val) → void {
    this.{self::C::field} = val as{TypeError,ForDynamic} core::int;
  }
  method foo(core::int param) → core::int
    return param;
}
static field core::int globalVariable = 1;
static final field core::bool assertStatementsEnabled = (() → core::bool {
  try {
    assert(false);
    return false;
  }
  on core::Object catch(final wildcard core::Object _#wc0#formal) {
    return true;
  }
})(){() → core::bool};
static method topLevelFoo(core::int param) → core::int
  return 1;
static get topLevelGetter() → core::int
  return self::globalVariable;
static set topLevelSetter(dynamic val) → void {
  self::globalVariable = val as{TypeError,ForDynamic} core::int;
}
static method dummy() → dynamic
  return 1;
static method staticMembers() → dynamic async /* emittedValueType= dynamic */ {
  core::num a = self::C::staticField.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, a);
  core::num f = (self::C::staticField = 1).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, f);
  core::num b = self::C::staticGetter.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, b);
  core::num c = (self::C::staticSetter = 1).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, c);
  core::num d = self::C::staticFoo(2).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(3, d);
  core::num e = self::C::staticField.{core::num::+}(self::C::staticGetter){(core::num) → core::int}.{core::num::+}(self::C::staticSetter = 1){(core::num) → core::int}.{core::num::+}(self::C::staticFoo(1)){(core::num) → core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(5, e);
}
static method topLevelMembers() → dynamic async /* emittedValueType= dynamic */ {
  core::num a = self::globalVariable.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, a);
  core::num b = self::topLevelGetter.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, b);
  core::num c = (self::topLevelSetter = 1).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, c);
  core::num d = self::topLevelFoo(1).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, d);
  core::num e = self::globalVariable.{core::num::+}(self::topLevelGetter){(core::num) → core::int}.{core::num::+}(self::topLevelSetter = 1){(core::num) → core::int}.{core::num::+}(self::topLevelFoo(1)){(core::num) → core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(5, e);
}
static method instanceMembers() → dynamic async /* emittedValueType= dynamic */ {
  self::C inst = new self::C::•();
  core::num a = inst.{self::C::field}{core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, a);
  core::num b = inst.{self::C::getter}{core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, b);
  core::num c = (inst.{self::C::setter} = 1).{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, c);
  core::num d = inst.{self::C::foo}(1){(core::int) → core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, d);
  core::num e = inst.{self::C::field}{core::int}.{core::num::+}(inst.{self::C::getter}{core::int}){(core::num) → core::int}.{core::num::+}(inst.{self::C::setter} = 1){(core::num) → core::int}.{core::num::+}(inst.{self::C::foo}(1){(core::int) → core::int}){(core::num) → core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(5, e);
}
static method others() → dynamic async /* emittedValueType= dynamic */ {
  core::String a = "${self::globalVariable} ${await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ } ".{core::String::+}(await "someString" /* runtimeCheckType= asy::Future<core::String> */ ){(core::String) → core::String};
  self::expect("1 1 someString", a);
  self::C c = new self::C::•();
  core::num d = c.{self::C::field}{core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  core::int cnt = 2;
  core::List<core::int> b = <core::int>[1, 2, 3];
  b.{core::List::[]=}(cnt, await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::int){(core::int, core::int) → void};
  self::expect(1, b.{core::List::[]}(cnt){(core::int) → core::int});
  core::num e = b.{core::List::[]}(0){(core::int) → core::int}.{core::num::+}(await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::num){(core::num) → core::num};
  self::expect(2, e);
}
static method conditionals() → dynamic async /* emittedValueType= dynamic */ {
  core::bool a = false;
  core::bool b = true;
  core::bool c = a || b || await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ as{TypeError,ForDynamic} core::bool;
  self::expect(true, c);
  dynamic d = a || b ?{dynamic} a : await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ ;
  self::expect(false, d);
  dynamic e = a is core::int ?{dynamic} await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ : 2;
  self::expect(2, e);
  try {
    dynamic f = a is core::int ?{dynamic} await self::dummy() /* runtimeCheckType= asy::Future<dynamic> */ : 2;
  }
  on core::Object catch(final core::Object e) {
  }
}
static method asserts() → dynamic async /* emittedValueType= dynamic */ {
  for (final <T extends core::Object? = dynamic>(T%) → FutureOr<T%>func in <<T extends core::Object? = dynamic>(T%) → FutureOr<T%>>[#C1, #C2]) {
    assert(await func<core::bool>(true){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ );
    assert(invalid-expression "pkg/front_end/testcases/general/await_complex.dart:120:12: Error: A value of type 'FutureOr<bool>' can't be assigned to a variable of type 'bool'.
    assert(id(true), await func(\"message\"));
           ^" in self::id<core::bool>(true) as{TypeError} core::bool, await func<core::String>("message"){(core::String) → FutureOr<core::String>} /* runtimeCheckType= asy::Future<core::String> */ );
    assert(await func<core::bool>(true){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ , await func<core::String>("message"){(core::String) → FutureOr<core::String>} /* runtimeCheckType= asy::Future<core::String> */ );
    try {
      assert(await func<core::bool>(false){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ , await func<core::String>("message"){(core::String) → FutureOr<core::String>} /* runtimeCheckType= asy::Future<core::String> */ );
      if(self::assertStatementsEnabled)
        throw "Didn't throw";
    }
    on core::AssertionError catch(final core::AssertionError e) {
      self::expect("message", e.{core::AssertionError::message}{core::Object?});
    }
  }
}
static method controlFlow() → dynamic async /* emittedValueType= dynamic */ {
  for (final <T extends core::Object? = dynamic>(T%) → FutureOr<T%>func in <<T extends core::Object? = dynamic>(T%) → FutureOr<T%>>[#C1, #C2]) {
    core::int c = 0;
    for (core::int i = await func<core::int>(0){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ ; await func<core::bool>(i.{core::num::<}(5){(core::num) → core::bool}){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ ; await func<core::int>(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1){(core::num) → core::int} in #t1){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ ) {
      c = c.{core::num::+}(1){(core::num) → core::int};
    }
    self::expect(5, c);
    c = 0;
    while (await func<core::bool>(c.{core::num::<}(5){(core::num) → core::bool}){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ )
      c = c.{core::num::+}(1){(core::num) → core::int};
    self::expect(5, c);
    c = 0;
    do {
      c = c.{core::num::+}(1){(core::num) → core::int};
    }
    while (await func<core::bool>(c.{core::num::<}(5){(core::num) → core::bool}){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ )
    self::expect(5, c);
    if(await func<core::bool>(c =={core::num::==}{(core::Object) → core::bool} 5){(core::bool) → FutureOr<core::bool>} /* runtimeCheckType= asy::Future<core::bool> */ ) {
      self::expect(5, c);
    }
    else {
      throw "unreachable";
    }
    try {
      throw await func<core::Object>("string"){(core::Object) → FutureOr<core::Object>} /* runtimeCheckType= asy::Future<core::Object> */ ;
    }
    on core::String catch(no-exception-var) {
    }
    try {
      await throw "string";
    }
    on core::String catch(no-exception-var) {
    }
    try
      try {
        try
          try {
            throw "string";
          }
          on core::Object catch(final core::Object e) {
            self::expect("string", e);
            self::expect(0, await func<core::int>(0){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ );
            rethrow;
          }
        finally {
          self::expect(0, await func<core::int>(0){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ );
        }
      }
      on core::Object catch(final core::Object e) {
        self::expect(0, await func<core::int>(0){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ );
        self::expect("string", e);
      }
    finally {
      self::expect(0, await func<core::int>(0){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ );
    }
    #L1:
    switch(await func<core::int>(2){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ ) /* core::int */ {
      #L2:
      case #C3:
        {
          break #L1;
        }
      #L3:
      default:
        {
          throw "unreachable";
        }
    }
    self::expect(42, await(() → asy::Future<core::int> async /* emittedValueType= core::int */ {
      return await func<core::int>(42){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ ;
    })(){() → asy::Future<core::int>});
    self::expect(42, await(() → asy::Future<core::int> async /* emittedValueType= core::int */ {
      return func<core::int>(42){(core::int) → FutureOr<core::int>};
    })(){() → asy::Future<core::int>});
    function testStream1() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
      yield await func<core::int>(42){(core::int) → FutureOr<core::int>} /* runtimeCheckType= asy::Future<core::int> */ ;
    }
    self::expectList(<dynamic>[42], await testStream1(){() → asy::Stream<core::int>}.{asy::Stream::toList}(){() → asy::Future<core::List<core::int>>});
    function testStream2() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
      yield* await func<asy::Stream<core::int>>(self::intStream()){(asy::Stream<core::int>) → FutureOr<asy::Stream<core::int>>} /* runtimeCheckType= asy::Future<asy::Stream<core::int>> */ ;
    }
    self::expectList(<dynamic>[42], await testStream2(){() → asy::Stream<core::int>}.{asy::Stream::toList}(){() → asy::Future<core::List<core::int>>});
  }
}
static method future<T extends core::Object? = dynamic>(self::future::T% value) → FutureOr<self::future::T%> async /* emittedValueType= self::future::T% */ 
  return value;
static method id<T extends core::Object? = dynamic>(self::id::T% value) → FutureOr<self::id::T%>
  return value;
static method intStream() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
  yield 42;
}
static method main() → dynamic async /* emittedValueType= dynamic */ {
  for (core::int i = 0; i.{core::num::<}(11){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
    await self::staticMembers() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::topLevelMembers() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::instanceMembers() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::conditionals() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::others() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::asserts() /* runtimeCheckType= asy::Future<dynamic> */ ;
    await self::controlFlow() /* runtimeCheckType= asy::Future<dynamic> */ ;
  }
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method expectList(core::List<dynamic> expected, core::List<dynamic> actual) → dynamic {
  if(!(expected.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} actual.{core::List::length}{core::int})) {
    throw "Expected ${expected}, actual ${actual}";
  }
  for (core::int i = 0; i.{core::num::<}(expected.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
    self::expect(expected.{core::List::[]}(i){(core::int) → dynamic}, actual.{core::List::[]}(i){(core::int) → dynamic});
  }
}

constants  {
  #C1 = static-tearoff self::id
  #C2 = static-tearoff self::future
  #C3 = 2
}
