library;
//
// 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;

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;
  {
    final synthesized dynamic #0#0 = x;
    synthesized core::int? #0#2;
    synthesized core::bool #0#2#isSet = false;
    synthesized core::int? #0#5;
    synthesized core::bool #0#5#isSet = false;
    synthesized core::num #0#7;
    synthesized core::bool #0#7#isSet = false;
    {
      hoisted core::int foo;
      hoisted core::int bar;
      hoisted core::int baz;
      hoisted core::double boz;
      hoisted core::int foobar;
      if(#0#0 is self::A && (let final core::int? #t1 = (#0#2#isSet ?{core::int?} #0#2{core::int?} : let final core::bool #t2 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::foo}{core::int?})! in let final core::int? #t3 = foo = (#0#2#isSet ?{core::int?} #0#2{core::int?} : let final core::bool #t4 = #0#2#isSet = true in #0#2 = #0#0{self::A}.{self::A::foo}{core::int?})! in true) && (let final core::int #t5 = bar = #0#0{self::A}.{self::A::bar}{core::int} in true) && !((#0#5#isSet ?{core::int?} #0#5{core::int?} : let final core::bool #t6 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::baz}{core::int?}) == null)) {
        baz = let core::int? #t7 = #0#5#isSet ?{core::int?} #0#5{core::int?} : let final core::bool #t8 = #0#5#isSet = true in #0#5 = #0#0{self::A}.{self::A::baz}{core::int?} in #t7 == null ?{core::int} #t7 as{Unchecked} core::int : #t7{core::int};
        (#0#7#isSet ?{core::num} #0#7{core::num} : let final core::bool #t9 = #0#7#isSet = true in #0#7 = #0#0{self::A}.{self::A::boz}{core::num}) as core::double;
        boz = (#0#7#isSet ?{core::num} #0#7{core::num} : let final core::bool #t10 = #0#7#isSet = true in #0#7 = #0#0{self::A}.{self::A::boz}{core::num}) as core::double;
        foobar = #0#0{self::A}.{self::A::foobar}{core::int};
        {
          return 0;
        }
      }
      else {
        final synthesized dynamic #1#0 = x;
        synthesized core::Object? #1#2;
        synthesized core::bool #1#2#isSet = false;
        synthesized core::Object? #1#5;
        synthesized core::bool #1#5#isSet = false;
        synthesized core::Object? #1#7;
        synthesized core::bool #1#7#isSet = false;
        {
          hoisted dynamic foo;
          hoisted dynamic bar;
          hoisted dynamic baz;
          hoisted core::double boz;
          hoisted dynamic foobar;
          if(#1#0 is (core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?}) && (let final core::Object? #t11 = (#1#2#isSet ?{core::Object?} #1#2{core::Object?} : let final core::bool #t12 = #1#2#isSet = true in #1#2 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.foo{core::Object?})! in let final core::Object? #t13 = foo = (#1#2#isSet ?{core::Object?} #1#2{core::Object?} : let final core::bool #t14 = #1#2#isSet = true in #1#2 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.foo{core::Object?})! in true) && (let final core::Object? #t15 = bar = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.bar{core::Object?} in true) && !((#1#5#isSet ?{core::Object?} #1#5{core::Object?} : let final core::bool #t16 = #1#5#isSet = true in #1#5 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.baz{core::Object?}) == null)) {
            baz = #1#5#isSet ?{core::Object?} #1#5{core::Object?} : let final core::bool #t17 = #1#5#isSet = true in #1#5 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.baz{core::Object?};
            (#1#7#isSet ?{core::Object?} #1#7{core::Object?} : let final core::bool #t18 = #1#7#isSet = true in #1#7 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.$1{core::Object?}) as core::double;
            boz = (#1#7#isSet ?{core::Object?} #1#7{core::Object?} : let final core::bool #t19 = #1#7#isSet = true in #1#7 = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.$1{core::Object?}) as core::double;
            foobar = #1#0{(core::Object?, {bar: core::Object?, baz: core::Object?, foo: core::Object?, foobar: core::Object?})}.foobar{core::Object?};
            {
              return 1;
            }
          }
          else {
            final synthesized dynamic #2#0 = x;
            if(#2#0 is self::A) {
              return 2;
            }
            else {
              final synthesized dynamic #3#0 = x;
              if(#3#0 is (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;
              }
            }
          }
        }
      }
    }
  }
  {
    final synthesized dynamic #4#0 = y as{TypeError,ForDynamic} self::A;
    if(!(#4#0 is self::A && (let final core::bool #t20 = qux = #4#0{self::A}.{self::A::qux}{core::bool} in true) && (let final core::String #t21 = quux = #4#0{self::A}.{self::A::quux}{core::String} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  {
    final synthesized dynamic #5#0 = z as{TypeError,ForDynamic} (dynamic, {quux: dynamic});
    if(!(#5#0 is (core::Object?, {quux: core::Object?}) && (let final core::Object? #t22 = qux = #5#0{(core::Object?, {quux: core::Object?})}.$1{core::Object?} in true) && (let final core::Object? #t23 = quux = #5#0{(core::Object?, {quux: core::Object?})}.quux{core::Object?} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}
