library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/mix_in_num.dart:7:7: Error: 'num' is restricted and can't be extended or implemented.
// class C = A with num;
//       ^
//
// pkg/front_end/testcases/general/mix_in_num.dart:7:7: Error: The non-abstract class 'C' is missing implementations for these members:
//  - num.%
//  - num.*
//  - num.+
//  - num.-
//  - num./
//  - num.<
//  - num.<=
//  - num.>
//  - num.>=
//  - num.abs
//  - num.ceil
//  - num.ceilToDouble
//  - num.clamp
//  - num.compareTo
//  - num.floor
//  - num.floorToDouble
//  - num.isFinite
//  - num.isInfinite
//  - num.isNaN
//  - num.isNegative
//  - num.remainder
//  - num.round
//  - num.roundToDouble
//  - num.sign
//  - num.toDouble
//  - num.toInt
//  - num.toStringAsExponential
//  - num.toStringAsFixed
//  - num.toStringAsPrecision
//  - num.truncate
//  - num.truncateToDouble
//  - num.unary-
//  - 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 num;
//       ^
// 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:196:7: Context: 'num.abs' is defined here.
//   num abs();
//       ^^^
// sdk/lib/core/num.dart:241:7: Context: 'num.ceil' is defined here.
//   int ceil();
//       ^^^^
// sdk/lib/core/num.dart:299:10: Context: 'num.ceilToDouble' is defined here.
//   double ceilToDouble();
//          ^^^^^^^^^^^^
// 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:234:7: Context: 'num.floor' is defined here.
//   int floor();
//       ^^^^^
// sdk/lib/core/num.dart:284:10: Context: 'num.floorToDouble' is defined here.
//   double floorToDouble();
//          ^^^^^^^^^^^^^
// 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:227:7: Context: 'num.round' is defined here.
//   int round();
//       ^^^^^
// sdk/lib/core/num.dart:269:10: Context: 'num.roundToDouble' is defined here.
//   double roundToDouble();
//          ^^^^^^^^^^^^^
// sdk/lib/core/num.dart:217:11: Context: 'num.sign' is defined here.
//   num get sign;
//           ^^^^
// 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:249:7: Context: 'num.truncate' is defined here.
//   int truncate();
//       ^^^^^^^^
// sdk/lib/core/num.dart:316:10: Context: 'num.truncateToDouble' is defined here.
//   double truncateToDouble();
//          ^^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:148:16: Context: 'num.unary-' is defined here.
//   num operator -();
//                ^^^^^...
// 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*
    ;
  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 */ 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 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::num {
  synthetic constructor •() → self::C*
    : super self::A::•()
    ;
  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(#_equalToInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::bool*;
  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(#_mulFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::num*;
  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(#_moduloFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) 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(#_subFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::num*;
  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(#_addFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) 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(#_truncDivFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::int*;
  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(#_greaterThanFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::bool*;
  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(#_remainderFromInteger, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::num*;
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:99:8 -> SymbolConstant(#_equalToInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:99:8 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:99:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:94:7 -> SymbolConstant(#_mulFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:94:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:94:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:96:7 -> SymbolConstant(#_moduloFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:96:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:96:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:93:7 -> SymbolConstant(#_subFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:93:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:93:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:92:7 -> SymbolConstant(#_addFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:92:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:92:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:95:7 -> SymbolConstant(#_truncDivFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:95:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:95:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:98:8 -> SymbolConstant(#_greaterThanFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:98:8 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:98:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:97:7 -> SymbolConstant(#_remainderFromInteger)
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:97:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart:97:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
Extra constant evaluation: evaluated: 88, effectively constant: 24
