library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/mix_in_int.dart:7:7: Error: 'int' is restricted and can't be extended or implemented.
// class C = A with int;
//       ^
//
// pkg/front_end/testcases/general/mix_in_int.dart:7:7: Error: The non-abstract class 'C' is missing implementations for these members:
//  - int.&
//  - int.<<
//  - int.>>
//  - int.^
//  - int.abs
//  - int.bitLength
//  - int.ceil
//  - int.ceilToDouble
//  - int.floor
//  - int.floorToDouble
//  - int.gcd
//  - int.isEven
//  - int.isOdd
//  - int.modInverse
//  - int.modPow
//  - int.round
//  - int.roundToDouble
//  - int.sign
//  - int.toRadixString
//  - int.toSigned
//  - int.toUnsigned
//  - int.truncate
//  - int.truncateToDouble
//  - int.unary-
//  - int.|
//  - int.~
//  - num.%
//  - num.*
//  - num.+
//  - num.-
//  - num./
//  - num.<
//  - num.<=
//  - num.>
//  - num.>=
//  - num.clamp
//  - num.compareTo
//  - num.isFinite
//  - num.isInfinite
//  - num.isNaN
//  - num.isNegative
//  - num.remainder
//  - num.toDouble
//  - num.toInt
//  - num.toStringAsExponential
//  - num.toStringAsFixed
//  - num.toStringAsPrecision
//  - num.~/
// Try to either
//  - provide an implementation,
//  - inherit an implementation from a superclass or mixin,
//  - mark the class as abstract, or
//  - provide a 'noSuchMethod' implementation.
//
// class C = A with int;
//       ^
// sdk/lib/core/int.dart:58:16: Context: '' is defined here.
//   int operator &(int other);
//                ^
// sdk/lib/core/int.dart:106:16: Context: 'int.<<' is defined here.
//   int operator <<(int shiftAmount);
//                ^^
// sdk/lib/core/int.dart:117:16: Context: 'int.>>' is defined here.
//   int operator >>(int shiftAmount);
//                ^^
// sdk/lib/core/int.dart:82:16: Context: 'int.^' is defined here.
//   int operator ^(int other);
//                ^
// sdk/lib/core/int.dart:247:7: Context: 'int.abs' is defined here.
//   int abs();
//       ^^^
// sdk/lib/core/int.dart:180:11: Context: 'int.bitLength' is defined here.
//   int get bitLength;
//           ^^^^^^^^^
// sdk/lib/core/int.dart:264:7: Context: 'int.ceil' is defined here.
//   int ceil();
//       ^^^^
// sdk/lib/core/int.dart:276:10: Context: 'int.ceilToDouble' is defined here.
//   double ceilToDouble();
//          ^^^^^^^^^^^^
// sdk/lib/core/int.dart:261:7: Context: 'int.floor' is defined here.
//   int floor();
//       ^^^^^
// sdk/lib/core/int.dart:273:10: Context: 'int.floorToDouble' is defined here.
//   double floorToDouble();
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:150:7: Context: 'int.gcd' is defined here.
//   int gcd(int other);
//       ^^^
// sdk/lib/core/int.dart:153:12: Context: 'int.isEven' is defined here.
//   bool get isEven;
//            ^^^^^^
// sdk/lib/core/int.dart:156:12: Context: 'int.isOdd' is defined here.
//   bool get isOdd;
//            ^^^^^
// sdk/lib/core/int.dart:135:7: Context: 'int.modInverse' is defined here.
//   int modInverse(int modulus);
//       ^^^^^^^^^^
// sdk/lib/core/int.dart:125:7: Context: 'int.modPow' is defined here.
//   int modPow(int exponent, int modulus);
//       ^^^^^^
// sdk/lib/core/int.dart:258:7: Context: 'int.round' is defined here.
//   int round();
//       ^^^^^
// sdk/lib/core/int.dart:270:10: Context: 'int.roundToDouble' is defined here.
//   double roundToDouble();
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:255:11: Context: 'int.sign' is defined here.
//   int get sign;
//           ^^^^
// sdk/lib/core/int.dart:298:10: Context: 'int.toRadixString' is defined here.
//   String toRadixString(int radix);
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:232:7: Context: 'int.toSigned' is defined here.
//   int toSigned(int width);
//       ^^^^^^^^
// sdk/lib/core/int.dart:203:7: Context: 'int.toUnsigned' is defined here.
//   int toUnsigned(int width);
//       ^^^^^^^^^^
// sdk/lib/core/int.dart:267:7: Context: 'int.truncate' is defined here.
//   int truncate();
//       ^^^^^^^^
// sdk/lib/core/int.dart:279:10: Context: 'int.truncateToDouble' is defined here.
//   double truncateToDouble();
//          ^^^^^^^^^^^^^^^^
// sdk/lib/core/int.dart:240:16: Context: 'int.unary-' is defined here.
//   int operator -();
//                ^^^^^...
// sdk/lib/core/int.dart:70:16: Context: 'int.|' is defined here.
//   int operator |(int other);
//                ^
// sdk/lib/core/int.dart:92:16: Context: 'int.~' is defined here.
//   int operator ~();
//                ^
// sdk/lib/core/num.dart:131:16: Context: 'num.%' is defined here.
//   num operator %(num other);
//                ^
// sdk/lib/core/num.dart:114:16: Context: 'num.*' is defined here.
//   num operator *(num other);
//                ^
// sdk/lib/core/num.dart:108:16: Context: 'num.+' is defined here.
//   num operator +(num other);
//                ^
// sdk/lib/core/num.dart:111:16: Context: 'num.-' is defined here.
//   num operator -(num other);
//                ^
// sdk/lib/core/num.dart:134:19: Context: 'num./' is defined here.
//   double operator /(num other);
//                   ^
// sdk/lib/core/num.dart:160:17: Context: 'num.<' is defined here.
//   bool operator <(num other);
//                 ^
// sdk/lib/core/num.dart:163:17: Context: 'num.<=' is defined here.
//   bool operator <=(num other);
//                 ^^
// sdk/lib/core/num.dart:166:17: Context: 'num.>' is defined here.
//   bool operator >(num other);
//                 ^
// sdk/lib/core/num.dart:169:17: Context: 'num.>=' is defined here.
//   bool operator >=(num other);
//                 ^^
// sdk/lib/core/num.dart:328:7: Context: 'num.clamp' is defined here.
//   num clamp(num lowerLimit, num upperLimit);
//       ^^^^^
// sdk/lib/core/num.dart:105:7: Context: 'num.compareTo' is defined here.
//   int compareTo(num other);
//       ^^^^^^^^^
// sdk/lib/core/num.dart:193:12: Context: 'num.isFinite' is defined here.
//   bool get isFinite;
//            ^^^^^^^^
// sdk/lib/core/num.dart:185:12: Context: 'num.isInfinite' is defined here.
//   bool get isInfinite;
//            ^^^^^^^^^^
// sdk/lib/core/num.dart:172:12: Context: 'num.isNaN' is defined here.
//   bool get isNaN;
//            ^^^^^
// sdk/lib/core/num.dart:179:12: Context: 'num.isNegative' is defined here.
//   bool get isNegative;
//            ^^^^^^^^^^
// sdk/lib/core/num.dart:157:7: Context: 'num.remainder' is defined here.
//   num remainder(num other);
//       ^^^^^^^^^
// sdk/lib/core/num.dart:340:10: Context: 'num.toDouble' is defined here.
//   double toDouble();
//          ^^^^^^^^
// sdk/lib/core/num.dart:331:7: Context: 'num.toInt' is defined here.
//   int toInt();
//       ^^^^^
// sdk/lib/core/num.dart:388:10: Context: 'num.toStringAsExponential' is defined here.
//   String toStringAsExponential([int? fractionDigits]);
//          ^^^^^^^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:366:10: Context: 'num.toStringAsFixed' is defined here.
//   String toStringAsFixed(int fractionDigits);
//          ^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:408:10: Context: 'num.toStringAsPrecision' is defined here.
//   String toStringAsPrecision(int precision);
//          ^^^^^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:145:16: Context: 'num.~/' is defined here.
//   int operator ~/(num other);
//                ^^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class C = self::A with core::int {
  synthetic constructor •() → self::C*
    : super self::A::•()
    ;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _addFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _subFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _mulFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _truncDivFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _moduloFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _remainderFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _greaterThanFromInteger(core::int* other) → core::bool*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _equalToInteger(core::int* other) → core::bool*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ compareTo(generic-covariant-impl core::num* other) → core::int*; -> core::num::compareTo
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ +(core::num* other) → core::num*; -> core::num::+
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ -(core::num* other) → core::num*; -> core::num::-
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ *(core::num* other) → core::num*; -> core::num::*
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ %(core::num* other) → core::num*; -> core::num::%
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ /(core::num* other) → core::double*; -> core::num::/
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ ~/(core::num* other) → core::int*; -> core::num::~/
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ remainder(core::num* other) → core::num*; -> core::num::remainder
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ <(core::num* other) → core::bool*; -> core::num::<
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ <=(core::num* other) → core::bool*; -> core::num::<=
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ >(core::num* other) → core::bool*; -> core::num::>
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ >=(core::num* other) → core::bool*; -> core::num::>=
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isNaN() → core::bool*; -> core::num::isNaN
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isNegative() → core::bool*; -> core::num::isNegative
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isInfinite() → core::bool*; -> core::num::isInfinite
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isFinite() → core::bool*; -> core::num::isFinite
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ clamp(core::num* lowerLimit, core::num* upperLimit) → core::num*; -> core::num::clamp
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toInt() → core::int*; -> core::num::toInt
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toDouble() → core::double*; -> core::num::toDouble
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsFixed(core::int* fractionDigits) → core::String*; -> core::num::toStringAsFixed
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsExponential([core::int* fractionDigits = #C12]) → core::String*; -> core::num::toStringAsExponential
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsPrecision(core::int* precision) → core::String*; -> core::num::toStringAsPrecision
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _shrFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitAndFromSmi(core::_Smi* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _shlFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitAndFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitOrFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitXorFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C18, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
}
static method main() → dynamic {}

constants  {
  #C1 = #org-dartlang-testcase:///mix_in_int.dart::_addFromInteger
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
  #C5 = #org-dartlang-testcase:///mix_in_int.dart::_subFromInteger
  #C6 = #org-dartlang-testcase:///mix_in_int.dart::_mulFromInteger
  #C7 = #org-dartlang-testcase:///mix_in_int.dart::_truncDivFromInteger
  #C8 = #org-dartlang-testcase:///mix_in_int.dart::_moduloFromInteger
  #C9 = #org-dartlang-testcase:///mix_in_int.dart::_remainderFromInteger
  #C10 = #org-dartlang-testcase:///mix_in_int.dart::_greaterThanFromInteger
  #C11 = #org-dartlang-testcase:///mix_in_int.dart::_equalToInteger
  #C12 = null
  #C13 = #org-dartlang-testcase:///mix_in_int.dart::_shrFromInteger
  #C14 = #org-dartlang-testcase:///mix_in_int.dart::_bitAndFromSmi
  #C15 = #org-dartlang-testcase:///mix_in_int.dart::_shlFromInteger
  #C16 = #org-dartlang-testcase:///mix_in_int.dart::_bitAndFromInteger
  #C17 = #org-dartlang-testcase:///mix_in_int.dart::_bitOrFromInteger
  #C18 = #org-dartlang-testcase:///mix_in_int.dart::_bitXorFromInteger
}
