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 extends self::B implements self::A /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_C&B&A
    : super self::B::•()
    ;
  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 C extends self::_C&B&A {
  synthetic constructor •() → self::C
    : super self::_C&B&A::•()
    ;
}
abstract class _D&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
  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"
}

Extra constant evaluation status:
Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
Extra constant evaluation: evaluated: 46, effectively constant: 2
