library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "value_class_support_lib.dart" as val;

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

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  operator /*isLegacy*/ ==(core::Object other) → core::bool
    return other is self::A;
  get /*isLegacy*/ hashCode() → core::int
    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
  method /*isLegacy*/ toString() → core::String
    return "A()";
  method /*isLegacy*/ copyWith() → dynamic
    return new self::A::•();
}
class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
}
abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_C&B&A
    : super self::B::•()
    ;
}
class C extends self::_C&B&A {
  synthetic constructor •() → self::C
    : super self::_C&B&A::•()
    ;
}
abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_D&A&B
    : super self::A::•()
    ;
}
class D extends self::_D&A&B {
  synthetic constructor •() → self::D
    : super self::_D&A&B::•()
    ;
}
static method main() → dynamic {}

library /*isNonNullableByDefault*/;
import self as val;
import "dart:core" as core;

class JenkinsSmiHash extends core::Object {
  synthetic constructor •() → val::JenkinsSmiHash
    : super core::Object::•()
    ;
  static method combine(core::int hash, core::int value) → core::int {
    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
  }
  static method finish(core::int hash) → core::int {
    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
  }
}
static const field core::String valueClass = #C1;

constants  {
  #C1 = "valueClass"
}
