// 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.

import "package:expect/expect.dart";

main() {
  // Variables in shared cases must agree on finality if used in the body.
  switch ((0, 1)) {
    case (0, int x):
    case (1, final int x):
      print(x);
      //    ^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] Variable pattern 'x' doesn't have the same type or finality in all cases.
  }

  switch ((0, 1)) {
    case (2, var x):
    case (3, final x):
      print(x);
      //    ^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] Variable pattern 'x' doesn't have the same type or finality in all cases.
  }

  // Variables in shared cases must agree on type if used in the body.
  switch ((0, 1)) {
    case (0, int x):
    case (1, num x):
      print(x);
      //    ^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] Variable pattern 'x' doesn't have the same type or finality in all cases.
  }

  switch ((0, 's')) {
    case (0, int x):
    case (2, var x): // Infer String.
      print(x);
      //    ^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] Variable pattern 'x' doesn't have the same type or finality in all cases.
  }

  // Variables must be defined in all cases if used in body.
  switch ((0, 1)) {
    case (0, var unique):
    case (1, var inTwo):
    case (2, var inTwo):
      print(unique);
      //    ^^^^^^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] The variable 'unique' is available in some, but not all cases that share this body.

      print(inTwo);
      //    ^^^^^
      // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
      // [cfe] The variable 'inTwo' is available in some, but not all cases that share this body.
  }

  // Mismatched variable types because of inference from a promoted type.
  Object value = 1;
  // Promote value to int.
  if (value is int) {
    switch ((0, value)) {
      case (0, var a):
      case (1, Object a):
        print(a);
        //    ^
        // [analyzer] COMPILE_TIME_ERROR.INVALID_PATTERN_VARIABLE_IN_SHARED_CASE_SCOPE
        // [cfe] Variable pattern 'a' doesn't have the same type or finality in all cases.
    }
  }
}
