
// The tester will only work when asserts file
// REQUIRES: asserts

// We put in a bunch of checks since we are making platform specific assumptions
// about putchar, so we are being paranoid.

// REQUIRES: OS=macosx
// REQUIRES: CPU=x86_64
// REQUIRES: PTRSIZE=64

// Clear the temporary directory
// RUN: rm -rfv %t && mkdir -p %t

// We use a driver file to ensure that we are not dependent on how main/start
// are setup on our platform. The c function interface that we use is very
// standard, so we should be ok to rely on it. Lets compile it.
// RUN: %target-swift-frontend -c %S/Inputs/bug-reducer-tester-miscompile-driver.swift -o %t/main.o

// Now test the base case. We emit a sib file/etc to make sure all of the
// components of our test work, even though we could just use a sil file
// directly.
// RUN: %target-sil-opt %s -emit-sib -o %t/good.sib -module-name main
// RUN: %target-swift-frontend -c %t/good.sib -o %t/good.o -module-name main
// RUN: %target-swiftc_driver -o %t/good %t/good.o %t/main.o -module-name main
// RUN: %t/good | %FileCheck %s

// Now try to insert a runtime crash and make sure that we hit the crash.
// RUN: %target-sil-opt -bug-reducer-tester %s -bug-reducer-tester-failure-kind=runtime-crasher -bug-reducer-tester-target-func='target_func' -emit-sib -o %t/runtime_crasher.sib -module-name main
// RUN: %target-swift-frontend -c %t/runtime_crasher.sib -o %t/runtime_crasher.o -module-name main
// RUN: %target-swiftc_driver -o %t/runtime_crasher %t/runtime_crasher.o %t/main.o -module-name main
// RUN: not --crash  %t/runtime_crasher

// CHECK: swift
// CHECK: swift
// CHECK: swift

sil_stage canonical

import Builtin

sil @putchar : $@convention(c) (Builtin.Int64) -> ()

sil [serialized] @target_func : $@convention(thin) () -> () {
bb0:
  %0 = function_ref @putchar : $@convention(c) (Builtin.Int64) -> ()
  // "swift\n" in ASCII
  %1 = integer_literal $Builtin.Int64, 115
  %2 = integer_literal $Builtin.Int64, 119
  %3 = integer_literal $Builtin.Int64, 105
  %4 = integer_literal $Builtin.Int64, 102
  %5 = integer_literal $Builtin.Int64, 116
  %6 = integer_literal $Builtin.Int64, 10
  apply %0(%1) : $@convention(c) (Builtin.Int64) -> ()
  apply %0(%2) : $@convention(c) (Builtin.Int64) -> ()
  apply %0(%3) : $@convention(c) (Builtin.Int64) -> ()
  apply %0(%4) : $@convention(c) (Builtin.Int64) -> ()
  apply %0(%5) : $@convention(c) (Builtin.Int64) -> ()
  apply %0(%6) : $@convention(c) (Builtin.Int64) -> ()
  %9999 = tuple()
  return %9999 : $()
}

sil [serialized] @function_2 : $@convention(thin) () -> () {
bb0:
  %0 = function_ref @target_func : $@convention(thin) () -> ()
  apply %0() : $@convention(thin) () -> ()
  // Make sure we only eliminate one.
  apply %0() : $@convention(thin) () -> ()
  %1 = function_ref @function_3 : $@convention(thin) () -> ()
  apply %1() : $@convention(thin) () -> ()
  %9999 = tuple()
  return %9999 : $()
}

sil [serialized] @function_3 : $@convention(thin) () -> () {
bb0:
  // Make sure we only eliminate one.
  %0 = function_ref @target_func : $@convention(thin) () -> ()
  apply %0() : $@convention(thin) () -> ()
  %9999 = tuple()
  return %9999 : $()
}
