|  | // Copyright (c) 2019, 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. | 
|  |  | 
|  | // VMOptions=--deterministic | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | // Found by "value-guided" DartFuzzing: incorrect clamping. | 
|  | // https://github.com/dart-lang/sdk/issues/37868 | 
|  | @pragma("vm:never-inline") | 
|  | foo(List<int> x) => Uint8ClampedList.fromList(x); | 
|  |  | 
|  | @pragma("vm:never-inline") | 
|  | bar(List<int> x) => Uint8List.fromList(x); | 
|  |  | 
|  | @pragma("vm:never-inline") | 
|  | baz(List<int> x) => Int8List.fromList(x); | 
|  |  | 
|  | main() { | 
|  | // Proper values. | 
|  | final List<int> x = [ | 
|  | 9223372036854775807, | 
|  | -9223372036854775808, | 
|  | 9223372032559808513, | 
|  | -9223372032559808513, | 
|  | 5000000000, | 
|  | -5000000000, | 
|  | 2147483647, | 
|  | -2147483648, | 
|  | 255, | 
|  | -255, | 
|  | 11, | 
|  | -11, | 
|  | 0, | 
|  | -1, | 
|  | ]; | 
|  | Expect.listEquals( | 
|  | [255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 11, 0, 0, 0], foo(x)); | 
|  | Expect.listEquals( | 
|  | [255, 0, 1, 255, 0, 0, 255, 0, 255, 1, 11, 245, 0, 255], bar(x)); | 
|  | Expect.listEquals([-1, 0, 1, -1, 0, 0, -1, 0, -1, 1, 11, -11, 0, -1], baz(x)); | 
|  |  | 
|  | // Hidden null. | 
|  | final List<int> a = [1, null, 2].cast<int>(); | 
|  | int num_exceptions = 0; | 
|  | try { | 
|  | foo(a); | 
|  | } catch (e) { | 
|  | // In strong mode, .cast() throws a TypeError when casting to int. In weak | 
|  | // mode, that cast succeeds and then NoSuchMethod is thrown later when the | 
|  | // null is used. | 
|  | Expect.isTrue(e is TypeError || e is NoSuchMethodError); | 
|  | num_exceptions++; | 
|  | } | 
|  | try { | 
|  | bar(a); | 
|  | } catch (e) { | 
|  | Expect.isTrue(e is TypeError || e is NoSuchMethodError); | 
|  | num_exceptions++; | 
|  | } | 
|  | try { | 
|  | baz(a); | 
|  | } catch (e) { | 
|  | Expect.isTrue(e is TypeError || e is NoSuchMethodError); | 
|  | num_exceptions++; | 
|  | } | 
|  | Expect.equals(3, num_exceptions); | 
|  | } |