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 /*isNullableByDefault*/ ==(core::Object other) → core::bool
    return other is self::A;
  get /*isNullableByDefault*/ hashCode() → core::int
    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
  method /*isNullableByDefault*/ toString() → core::String
    return "A()";
  method /*isNullableByDefault*/ 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));
    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash).{core::int::<<}(10)));
    return hash.{core::int::^}(hash.{core::int::>>}(6));
  }
  static method finish(core::int hash) → core::int {
    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash).{core::int::<<}(3)));
    hash = hash.{core::int::^}(hash.{core::int::>>}(11));
    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash).{core::int::<<}(15)));
  }
}
static const field core::String valueClass = #C1;

constants  {
  #C1 = "valueClass"
}
