library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/variable_names.dart:24:23: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
//   } else if (x case A(: [1, 2])) { // Error
//                       ^
//
// pkg/front_end/testcases/patterns/variable_names.dart:26:22: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
//   } else if (x case (: [1, 2])) { // Error
//                      ^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  abstract get foo() → core::int?;
  abstract get bar() → core::int;
  abstract get baz() → core::int?;
  abstract get boz() → core::num;
  abstract get qux() → core::bool;
  abstract get quux() → core::String;
  abstract get foobar() → core::int;
}
static method test(dynamic x, dynamic y, dynamic z) → dynamic {
  dynamic qux;
  dynamic quux;
  {
    core::int foo;
    core::int bar;
    core::int baz;
    core::double boz;
    core::int foobar;
    final synthesized dynamic #3#0 = x;
    function ##3#2#initializer() → core::int?
      return #3#0{self::A}.{self::A::foo}{core::int?};
    late final synthesized core::int? #3#2 = ##3#2#initializer(){() → core::int?};
    function ##3#5#initializer() → core::int?
      return #3#0{self::A}.{self::A::baz}{core::int?};
    late final synthesized core::int? #3#5 = ##3#5#initializer(){() → core::int?};
    function ##3#7#initializer() → core::num
      return #3#0{self::A}.{self::A::boz}{core::num};
    late final synthesized core::num #3#7 = ##3#7#initializer(){() → core::num};
    if(#3#0 is{ForNonNullableByDefault} self::A && (let final core::int? #t1 = #3#2! in let final core::int? #t2 = foo = #3#2! in true) && (let final core::int #t3 = bar = #3#0{self::A}.{self::A::bar}{core::int} in true) && (!(#3#5 == null) ?{core::bool} let final core::int #t4 = baz = #3#5{core::int} in true : false) && (let final core::double #t5 = #3#7 as{ForNonNullableByDefault} core::double in let final core::double #t6 = boz = #3#7 as{ForNonNullableByDefault} core::double in true) && (let final core::int #t7 = foobar = #3#0{self::A}.{self::A::foobar}{core::int} in true)) {
      return 0;
    }
    else {
      dynamic foo;
      dynamic bar;
      dynamic baz;
      core::double boz;
      dynamic foobar;
      final synthesized dynamic #2#0 = x;
      function ##2#2#initializer() → core::Object?
        return #2#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.foo{core::Object?};
      late final synthesized core::Object? #2#2 = ##2#2#initializer(){() → core::Object?};
      function ##2#5#initializer() → core::Object?
        return #2#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.baz{core::Object?};
      late final synthesized core::Object? #2#5 = ##2#5#initializer(){() → core::Object?};
      function ##2#7#initializer() → core::Object?
        return #2#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.$1{core::Object?};
      late final synthesized core::Object? #2#7 = ##2#7#initializer(){() → core::Object?};
      if(#2#0 is{ForNonNullableByDefault} (core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?}) && (let final core::Object? #t8 = #2#2! in let final core::Object? #t9 = foo = #2#2! in true) && (let final core::Object? #t10 = bar = #2#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.bar{core::Object?} in true) && (!(#2#5 == null) ?{core::bool} let final core::Object? #t11 = baz = #2#5 in true : false) && (let final core::double #t12 = #2#7 as{ForNonNullableByDefault} core::double in let final core::double #t13 = boz = #2#7 as{ForNonNullableByDefault} core::double in true) && (let final core::Object? #t14 = foobar = #2#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.foobar{core::Object?} in true)) {
        return 1;
      }
      else {
        final synthesized dynamic #1#0 = x;
        if(#1#0 is{ForNonNullableByDefault} self::A) {
          return 2;
        }
        else {
          final synthesized dynamic #0#0 = x;
          if(#0#0 is{ForNonNullableByDefault} (core::Object?) && invalid-expression "pkg/front_end/testcases/patterns/variable_names.dart:26:22: Error: The getter name is not specified explicitly, and the pattern is not a variable. Try specifying the getter name explicitly, or using a variable pattern.
  } else if (x case (: [1, 2])) { // Error
                     ^") {
            return 3;
          }
        }
      }
    }
  }
  block {
    final synthesized dynamic #4#0 = y;
    if(!(#4#0 is{ForNonNullableByDefault} self::A && (let final core::bool #t15 = qux = #4#0{self::A}.{self::A::qux}{core::bool} in true) && (let final core::String #t16 = quux = #4#0{self::A}.{self::A::quux}{core::String} in true)))
      throw new _in::ReachabilityError::•();
  } =>#4#0;
  block {
    final synthesized dynamic #5#0 = z;
    if(!(#5#0 is{ForNonNullableByDefault} (core::Object?, {quux: core::Object?}) && (let final core::Object? #t17 = qux = #5#0{(core::Object?, {quux: core::Object?})}.$1{core::Object?} in true) && (let final core::Object? #t18 = quux = #5#0{(core::Object?, {quux: core::Object?})}.quux{core::Object?} in true)))
      throw new _in::ReachabilityError::•();
  } =>#5#0;
}
