blob: 734af42518f898f29c7dc1e336febd5f47b6433a [file] [log] [blame]
// Copyright (c) 2018, 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.
/// @assertion For set literals with element type T, the static type is always
/// Set<T>, but static analysis will reject an assignment of a non-constant set
/// literal to a type that is not a super-type of LinkedHashSet<T> (an implicit
/// down-cast below the type LinkedHashSet<T>), and of a constant set literal to
/// a type that is not a super-type of Set<T> (that is, any implicit down-cast).
///
/// @description Check that static analysis will reject an assignment of a
/// constant set literal to a type that is not a super-type of Set<T>
/// @author sgrekhov@unipro.ru
import "dart:collection";
class C<T> with SetMixin<T> implements Set<T> {
factory C({bool equals(T e1, T e2)?,
int hashCode(T e)?,
bool isValidKey(potentialKey)?}) => throw "Should not reach here";
@override
bool add(T value) => throw "Should not reach here";
@override
T lookup(Object? element) => throw "Should not reach here";
@override
bool remove(Object? value) => throw "Should not reach here";
@override
bool contains(Object? element) => throw "Should not reach here";
@override
Set<T> toSet() => throw "Should not reach here";
@override
Iterator<T> get iterator => throw "Should not reach here";
@override
int get length => throw "Should not reach here";
}
main() {
C<int> c1 = const <int> {};
// ^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'C<int>'.
C<int> c2 = const {3, 1, 4,};
// ^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'C<int>'.
C c3 = const {3, 1, 4,};
// ^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'C<dynamic>'.
C c4 = const {3, 1, 4,null, };
// ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int?>' can't be assigned to a variable of type 'C<dynamic>'.
LinkedHashSet<int> c5 = const <int> {};
// ^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'LinkedHashSet<int>'.
LinkedHashSet<int> c6 = const {3, 1, 4,};
// ^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'LinkedHashSet<int>'.
LinkedHashSet c7 = const {3, 1, 4,};
// ^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<int>' can't be assigned to a variable of type 'LinkedHashSet<dynamic>'.
LinkedHashSet c8 = const {3, 1, 4, null, bool};
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Set<Object?>' can't be assigned to a variable of type 'LinkedHashSet<dynamic>'.
}