// Copyright (c) 2020, 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. // Requirements=nnbd-weak // ddcOptions=--weak-null-safety-errors import 'package:expect/expect.dart'; /// Code that runs without error when running with unsound null safety but /// should throw in sound mode or when running DDC with /// `--weak-null-safety-errors`. void fn(StringBuffer arg) {} void testArg(T t) => throw 'do not call'; T testReturn() => throw 'do not call'; const c = C(); class C { covariantCheck(List t) {} const C(); } void main() { Expect.throwsTypeError(() => null as int); dynamic dynamicNull = null; Expect.throwsTypeError(() => fn(dynamicNull)); Expect.throwsTypeError(() => [Duration(days: 1), null] as List); // Constants get legacy types introduced in their type arguments. C c2 = c; Expect.throwsTypeError(() => c2.covariantCheck([Duration(days: 1), null])); // Tearoff instantiations are "potentially constant" and are treated as a // constant by the CFE. // When compiling for unsound null safety the resulting type signature // attached to the tearoff is `void Function(Duration*)` which is a valid // subtype of `void Function(Duration?)`. In sound null safety the signature // is `void Function(Duration)` which should fail in the cast. Expect.throwsTypeError(() => (testArg) as void Function(Duration?)); Expect.throwsTypeError(() => (testReturn) as Duration Function()); }