library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:10:3: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//   augment int local; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:11:3: Error: Undefined name 'augment'.
//   augment; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:21:17: Error: Can't assign to this.
//   augment super = value;
//                 ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:25:3: Error: 'augment super' is only allowed in member augmentations.
//   augment super(); // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:26:3: Error: 'augment super' is only allowed in member augmentations.
//   augment super; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:27:3: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//   augment int local; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:28:3: Error: Undefined name 'augment'.
//   augment; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:37:5: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//     augment int local; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:38:5: Error: The getter 'augment' isn't defined for the class 'Class'.
//  - 'Class' is from 'pkg/front_end/testcases/macros/augment_super.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'augment'.
//     augment; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:42:5: Error: Can't assign to this.
//     augment super++;
//     ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:43:7: Error: Can't assign to this.
//     --augment super;
//       ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:48:19: Error: Can't assign to this.
//     augment super = value;
//                   ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:52:5: Error: 'augment super' is only allowed in member augmentations.
//     augment super(); // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:53:5: Error: 'augment super' is only allowed in member augmentations.
//     augment super; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:54:5: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//     augment int local; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:55:5: Error: The getter 'augment' isn't defined for the class 'Class'.
//  - 'Class' is from 'pkg/front_end/testcases/macros/augment_super.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'augment'.
//     augment; // Error
//     ^^^^^^^
//
import self as self;
import "dart:core" as core;

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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  method /* from org-dartlang-testcase:///augment_super_lib.dart */ instanceMethod() → void {
    (null as{ForNonNullableByDefault} dynamic){dynamic}.call();
  }
  method /* from org-dartlang-testcase:///augment_super_lib.dart */ instanceMethodErrors() → void {
    core::int local;
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:38:5: Error: The getter 'augment' isn't defined for the class 'Class'.
 - 'Class' is from 'pkg/front_end/testcases/macros/augment_super.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'augment'.
    augment; // Error
    ^^^^^^^" in this{<unresolved>}.augment;
  }
  get /* from org-dartlang-testcase:///augment_super_lib.dart */ instanceProperty() → core::int {
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:42:5: Error: Can't assign to this.
    augment super++;
    ^" in null as{ForNonNullableByDefault} dynamic;
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:43:7: Error: Can't assign to this.
    --augment super;
      ^" in null as{ForNonNullableByDefault} dynamic;
    return (null as{ForNonNullableByDefault} dynamic){dynamic}.unary-() as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
  }
  set /* from org-dartlang-testcase:///augment_super_lib.dart */ instanceProperty(core::int value) → void {
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:48:19: Error: Can't assign to this.
    augment super = value;
                  ^";
  }
  method /* from org-dartlang-testcase:///augment_super_lib.dart */ injectedInstanceMethod() → void {
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:52:5: Error: 'augment super' is only allowed in member augmentations.
    augment super(); // Error
    ^^^^^^^";
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:53:5: Error: 'augment super' is only allowed in member augmentations.
    augment super; // Error
    ^^^^^^^";
    core::int local;
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:55:5: Error: The getter 'augment' isn't defined for the class 'Class'.
 - 'Class' is from 'pkg/front_end/testcases/macros/augment_super.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'augment'.
    augment; // Error
    ^^^^^^^" in this{<unresolved>}.augment;
  }
}
static method /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelMethod() → void {
  (null as{ForNonNullableByDefault} dynamic){dynamic}.call();
}
static method topLevelMethodErrors() → void {}
static get /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelProperty() → core::List<core::int> {
  return block {
    final core::List<core::int> #t1 = <core::int>[];
    for (final has-declared-initializer dynamic #t2 in (null as{ForNonNullableByDefault} dynamic) as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
      final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
      #t1.{core::List::add}{Invariant}(#t3){(core::int) → void};
    }
    #t1.{core::List::add}{Invariant}((null as{ForNonNullableByDefault} dynamic){dynamic}.[](0) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int){(core::int) → void};
  } =>#t1;
}
static set /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelProperty(core::List<core::int> value) → void {
  (null as{ForNonNullableByDefault} dynamic){dynamic}.[]=(0, value.{core::List::[]}(1){(core::int) → core::int});
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:21:17: Error: Can't assign to this.
  augment super = value;
                ^";
}
static method main() → dynamic {}
static method /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelMethodError() → void {
  core::int local;
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:11:3: Error: Undefined name 'augment'.
  augment; // Error
  ^^^^^^^";
}
static method /* from org-dartlang-testcase:///augment_super_lib.dart */ injectedTopLevelMethod() → void {
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:25:3: Error: 'augment super' is only allowed in member augmentations.
  augment super(); // Error
  ^^^^^^^";
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:26:3: Error: 'augment super' is only allowed in member augmentations.
  augment super; // Error
  ^^^^^^^";
  core::int local;
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:28:3: Error: Undefined name 'augment'.
  augment; // Error
  ^^^^^^^";
}
