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

/**
 * @assertion An if element:
 * ...
 * It is a compile-time error if the then and else branches are not potentially
 * const expressions. The "potentially const" is to allow a the unchosen branch
 * to throw an exception. In other words, if elements short-circuit.
 *
 * @description Checks that it is a compile-time error if the then and else
 * branches are not potentially const expressions.
 * @author sgrekhov@unipro.ru
 */
main() {
  const t = true;
  var x = 1;
  List<int> list1 = const [if (t) x else 1 ];
  //                              ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_LIST_ELEMENT
  // [cfe] Not a constant expression.
  const List<int> list2 = [if (!t) 1 else x ];
// [error line 24, column 0]
// [analyzer] unspecified
// [cfe] unspecified
  var list3 = const [if (t) x else 1, ];
  //                        ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_LIST_ELEMENT
  // [cfe] Not a constant expression.
  var list4 = const <int>[if (!t) 1 else x, ];
  //                                     ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_LIST_ELEMENT
  // [cfe] Not a constant expression.
  const list5 = [if (t) 1 else x ];
  //                           ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_LIST_ELEMENT
  // [cfe] Not a constant expression.

  Set<int> set1 = const {if (t) x else 1, -1 };
  //                            ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_SET_ELEMENT
  // [cfe] Not a constant expression.
  const Set<int> set2 = {if (!t) 1 else x, -1 };
// [error line 45, column 0]
// [analyzer] unspecified
// [cfe] unspecified
  var set3 = const {if (t) x else 1, -1, };
  //                       ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_SET_ELEMENT
  // [cfe] Not a constant expression.
  var set4 = const <int>{if (!t) 1 else x, -1, };
  //                                    ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_SET_ELEMENT
  // [cfe] Not a constant expression.
  const set5 = {if (!t) 1 else x, -1 };
// [error line 57, column 0]
// [analyzer] unspecified
// [cfe] unspecified

  Map<int, String> map1 = const {if (!t) 1: "1" else x: "1"};
  //                                                 ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_MAP_KEY
  // [cfe] Not a constant expression.
  const Map<int, String> map2 = {if (t) x: "x" else 1: "x"};
// [error line 66, column 0]
// [analyzer] unspecified
// [cfe] unspecified
  var map3 = const {if (!t) 1: "x" else x: "x"};
  //                                    ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_MAP_KEY
  // [cfe] Not a constant expression.
  var map4 = const <int, String>{if (!t) 1: "x" else x: "x"};
  //                                                 ^
  // [analyzer] COMPILE_TIME_ERROR.NON_CONSTANT_MAP_KEY
  // [cfe] Not a constant expression.
  const map5 = {if (!t) 1: "x" else x: "x"};
// [error line 78, column 0]
// [analyzer] unspecified
// [cfe] unspecified
}
