// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Verify that the use of a constant expression denoting an object that does
// not have primitive equality in a constant set or as a key of a constant map
// gives rise to a compile-time error.
//
// An enum cannot override `==` or `hashCode`, hence there are no cases with
// enums. Similarly, implicitly induced noSuchMethod forwarders cannot
// eliminate primitive equality from a given class: Such forwarders cannot
// override an explicitly declared inherited method implementation, in this
// case `Object.hashCode` and `Object.[]`.

class A {
  const A();
  int get hashCode => super.hashCode + 1;
}

class B {
  const B();
  bool operator ==(Object other) => super == other;
}

class C {
  const C();
  int get hashCode => super.hashCode + 1;
  bool operator ==(Object other) => super == other;
}

const aSet1 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  0.5,
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aSet2 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  Duration(days: 2),
  // [error column 3, length 17]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aSet3 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  A(),
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aSet4 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  B(),
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aSet5 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  C(),
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aSet6 = <Object?>{
  //                   ^
  // [cfe] Constant evaluation error:
  (A(), false, 1),
  // [error column 3, length 15]
  // [analyzer] COMPILE_TIME_ERROR.CONST_SET_ELEMENT_NOT_PRIMITIVE_EQUALITY
};

const aMap1 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  0.5: null,
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

const aMap2 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  Duration(days: 2): null,
  // [error column 3, length 17]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

const aMap3 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  A(): null,
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

const aMap4 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  B(): null,
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

const aMap5 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  C(): null,
  // [error column 3, length 3]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

const aMap6 = <Object?, Null>{
  //                         ^
  // [cfe] Constant evaluation error:
  (A(), false, 1): null,
  // [error column 3, length 15]
  // [analyzer] COMPILE_TIME_ERROR.CONST_MAP_KEY_NOT_PRIMITIVE_EQUALITY
};

void main() {}
