library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:11:3: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//   augment int local; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:12:3: Error: Undefined name 'augment'.
//   augment; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:25:3: Error: Cannot read from 'augment super'.
//   augment super; // Error
//   ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:26:3: Error: Cannot call 'augment super'.
//   augment super(); // Error
//   ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:40:3: Error: Cannot read from 'augment super'.
//   augment super ??= value;
//   ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:44:3: Error: 'augment super' is only allowed in member augmentations.
//   augment super(); // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:45:3: Error: 'augment super' is only allowed in member augmentations.
//   augment super; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:46:3: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//   augment int local; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:47:3: Error: Undefined name 'augment'.
//   augment; // Error
//   ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:57:5: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//     augment int local; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:58: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:62:5: Error: Cannot write to 'augment super'.
//     augment super++; // Error
//     ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:63:7: Error: Cannot write to 'augment super'.
//     --augment super; // Error
//       ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:64:5: Error: Cannot write to 'augment super'.
//     augment super += 1; // Error
//     ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:70:5: Error: Cannot read from 'augment super'.
//     augment super; // Error
//     ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:71:5: Error: Cannot call 'augment super'.
//     augment super(); // Error
//     ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:75:19: Error: Cannot write to 'augment super'.
//     augment super ??= 1; // Error
//                   ^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:84:5: Error: 'augment super' is only allowed in member augmentations.
//     augment super(); // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:85:5: Error: 'augment super' is only allowed in member augmentations.
//     augment super; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:86:5: Error: Can't have modifier 'augment' here.
// Try removing 'augment'.
//     augment int local; // Error
//     ^^^^^^^
//
// pkg/front_end/testcases/macros/augment_super_lib.dart:87: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 {
    this.{self::Class::_#instanceMethod#augment0}(){() → void};
    this.{self::Class::_#instanceMethod#augment0}{() → void};
  }
  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:58: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:62:5: Error: Cannot write to 'augment super'.
    augment super++; // Error
    ^";
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:63:7: Error: Cannot write to 'augment super'.
    --augment super; // Error
      ^";
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:64:5: Error: Cannot write to 'augment super'.
    augment super += 1; // Error
    ^";
    return this.{self::Class::_#instanceProperty#augment0}{core::int}.{core::int::unary-}(){() → core::int};
  }
  set /* from org-dartlang-testcase:///augment_super_lib.dart */ instanceProperty(core::int value) → void {
    this.{self::Class::_#instanceProperty#augment0} = value;
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:70:5: Error: Cannot read from 'augment super'.
    augment super; // Error
    ^";
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:71:5: Error: Cannot call 'augment super'.
    augment super(); // Error
    ^";
  }
  get /* from org-dartlang-testcase:///augment_super_lib.dart */ nullableInstanceProperty() → core::int? {
    this.{self::Class::_#nullableInstanceProperty#augment0}{core::int?} == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:75:19: Error: Cannot write to 'augment super'.
    augment super ??= 1; // Error
                  ^" : null;
    return this.{self::Class::_#nullableInstanceProperty#augment0}{core::int?};
  }
  set /* from org-dartlang-testcase:///augment_super_lib.dart */ nullableInstanceProperty(core::int? value) → void {
    this.{self::Class::_#nullableInstanceProperty#augment0} = value;
  }
  method /* from org-dartlang-testcase:///augment_super_lib.dart */ injectedInstanceMethod() → void {
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:84:5: Error: 'augment super' is only allowed in member augmentations.
    augment super(); // Error
    ^^^^^^^";
    invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:85: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:87: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;
  }
  method _#instanceMethod#augment0() → void {}
  get _#instanceProperty#augment0() → core::int
    return 42;
  get _#nullableInstanceProperty#augment0() → core::int?
    return 42;
  set _#instanceProperty#augment0(core::int value) → void {}
  set _#nullableInstanceProperty#augment0(core::int? value) → void {}
}
static method /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelMethod() → void {
  self::_#topLevelMethod#augment0();
  #C1;
}
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::List::of<core::int>(self::_#topLevelProperty#augment0);
  } =>#t1;
}
static set /* from org-dartlang-testcase:///augment_super_lib.dart */ topLevelProperty(core::List<core::int> value) → void {
  self::_#topLevelProperty#augment0 = value;
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:25:3: Error: Cannot read from 'augment super'.
  augment super; // Error
  ^";
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:26:3: Error: Cannot call 'augment super'.
  augment super(); // Error
  ^";
}
static get /* from org-dartlang-testcase:///augment_super_lib.dart */ nullableTopLevelProperty() → core::List<core::int>? {
  return <core::int>[];
}
static set /* from org-dartlang-testcase:///augment_super_lib.dart */ nullableTopLevelProperty(core::List<core::int>? value) → void {
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:40:3: Error: Cannot read from 'augment super'.
  augment super ??= value;
  ^" == null ?{invalid-type} self::_#nullableTopLevelProperty#augment0 = value : null;
}
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:12: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:44:3: Error: 'augment super' is only allowed in member augmentations.
  augment super(); // Error
  ^^^^^^^";
  invalid-expression "pkg/front_end/testcases/macros/augment_super_lib.dart:45: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:47:3: Error: Undefined name 'augment'.
  augment; // Error
  ^^^^^^^";
}
static method _#topLevelMethod#augment0() → void {}
static get _#topLevelProperty#augment0() → core::List<core::int>
  return <core::int>[42];
static set _#topLevelProperty#augment0(core::List<core::int> value) → void {}
static set _#nullableTopLevelProperty#augment0(core::List<core::int>? value) → void {}

constants  {
  #C1 = static-tearoff self::_#topLevelMethod#augment0
}
