| // Copyright (c) 2022, 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. | 
 |  | 
 | class Const<T> { | 
 |   final T value; | 
 |  | 
 |   const Const(this.value); | 
 | } | 
 |  | 
 | main() { | 
 |   test(42, false); | 
 |  | 
 |   test([42], false); | 
 |   test(<num>[42], false); | 
 |   test({42: 'foo'}, false); | 
 |   test(<num, Object>{42: 'foo'}, false); | 
 |   test(Const(42), false); | 
 |   test(Const<num>(42), false); | 
 |  | 
 |   test(const [42], true); | 
 |   test(const <num>[42], true); | 
 |   test(const {42}, true); | 
 |   test(const <num>{42}, true); | 
 |   test(const {42: 'foo'}, true); | 
 |   test(const <num, Object>{42: 'foo'}, true); | 
 |   test(const Const(42), true); | 
 |   test(const Const<num>(42), true); | 
 | } | 
 |  | 
 | void test(dynamic value, bool expected) { | 
 |   bool matched; | 
 |   switch (value) { | 
 |     case const [42]: | 
 |       matched = true; | 
 |       break; | 
 |     case const <num>[42]: | 
 |       matched = true; | 
 |       break; | 
 |     case const {42}: | 
 |       matched = true; | 
 |       break; | 
 |     case const <num>{42}: | 
 |       matched = true; | 
 |       break; | 
 |     case const {42: 'foo'}: | 
 |       matched = true; | 
 |       break; | 
 |     case const <num, Object>{42: 'foo'}: | 
 |       matched = true; | 
 |       break; | 
 |     case const Const(42): | 
 |       matched = true; | 
 |       break; | 
 |     case const Const<num>(42): | 
 |       matched = true; | 
 |       break; | 
 |     default: | 
 |       matched = false; | 
 |       break; | 
 |   } | 
 |   if (matched != expected) { | 
 |     print('FAIL: $value ${matched ? "matched" : "didn't match"}'); | 
 |   } | 
 | } |