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

// @dart = 2.9

// Regression test extracted from a large DartFuzz-generated test.
// https://github.com/dart-lang/sdk/issues/36587

import "package:expect/expect.dart";

import 'dart:async';
import 'dart:cli';
import 'dart:collection';
import 'dart:convert';
import 'dart:core';
import 'dart:io';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

Set<int> var0 = {-62, -13, 2147483648, -10, -9223372028264841217, -54, 47};
Set<int> var1 = {-59};
bool var2 = false;
bool var3 = true;
int var4 = 58;
double var5 = 0.004032426761438224;
String var6 = 'u6X2';
List<int> var7 = [56, -95, 6442450944, -31, 82];
Set<int> var8 = {9223372036854775807, 4294967297};
Map<int, String> var9 = {
  6: 'Ei(ZR',
  75: 'O0A-',
  99: 't',
  49: 'Qu',
  20: 'FujA\u2665',
  47: ''
};

String foo2() {
  var8 ??= Set.identity();
  switch ((--var4)) {
    case 3826530052:
      {
        {
          int loc0 = 0;
          do {
            try {
              throw {64: var6};
            } catch (e) {
              if ((!(var3))) {
                break;
              } else {
                try {
                  var8 = ((false ? FileSystemEntity.isWatchSupported : var3)
                      ? {Int32x4.wxxx, var4, -43, Float32x4.wzxz}
                      : {
                          (var4++),
                          (var7[(false ? -87 : (++loc0))] %
                              (var7[((++loc0) * var4)] ~/ 73))
                        });
                  var0 = ((((-((((true ? var2 : false) ? (!(var3)) : true)
                                  ? var5
                                  : (0.38834735336907733 ??
                                      0.8105736840461367)))) +
                              (0.3752597438445757).abs()))
                          .isFinite
                      ? {
                          (true ? 65 : (var3 ? (loc0--) : var4)),
                          var7[Float32x4.xxxx]
                        }
                      : Set.identity());
                  var1 = ((true
                          ? ({var7[var7[-9223372032559808513]]}).toSet()
                          : (Set.identity()).difference(var8)) ??
                      var8);
                  var9[Float32x4.zxyz] = '';
                } catch (e) {
                  loc0 ~/= ((var3 != var3)
                      ? (~((false ? (-(loc0)) : Int32x4.wzwx)))
                      : var4);
                } finally {
                  var1 = var8;
                  var5 ??= 0.6273822429057158;
                  throw [
                    (loc0++),
                    2147483647,
                    (var4--),
                    (-(ZLibOption.defaultWindowBits)),
                    (~((loc0--))),
                    (var4++)
                  ];
                }
              }
              break;
            }
          } while (++loc0 < 74);
        }
      }
  }
}

main() {
  Expect.equals(58, var4);
  foo2();
  Expect.equals(57, var4);
}
