// RUN: rm -rf %t  &&  mkdir -p %t
// RUN: %target-build-swift -parse-stdlib %s -o %t/a.out
// RUN: %target-run %t/a.out | FileCheck %s
// REQUIRES: executable_test

import Swift
import SwiftShims

typealias _HeapObject = SwiftShims.HeapObject

class C {
  var value: AnyObject? = nil
  deinit { print("deallocated") }
}


print("starting")
var ptr = Builtin.castToNativeObject(C())

//CHECK:  1. true
print(" 1. \(_getBool(Builtin.isUnique(&ptr))))")
//CHECK:  2. true
print(" 2. \(_getBool(Builtin.isUniqueOrPinned(&ptr))))")

var ptr2 : Builtin.NativeObject? = ptr

//CHECK:  3. false
print(" 3. \(_getBool(Builtin.isUnique(&ptr))))")
//CHECK:  4. false
print(" 4. \(_getBool(Builtin.isUniqueOrPinned(&ptr))))")

ptr2 = nil

//CHECK:  5. true
print(" 5. \(_getBool(Builtin.isUnique(&ptr)))")
//CHECK:  6. true
print(" 6. \(_getBool(Builtin.isUniqueOrPinned(&ptr)))")

ptr2 = ptr

//CHECK:  7. false
print(" 7. \(_getBool(Builtin.isUnique(&ptr)))")
//CHECK:  8. false
print(" 8. \(_getBool(Builtin.isUniqueOrPinned(&ptr)))")

let token : Builtin.NativeObject? = Builtin.tryPin(ptr)

//CHECK:  9. false
print(" 9. \(_getBool(Builtin.isUnique(&ptr)))")
//CHECK: 10. true
print("10. \(_getBool(Builtin.isUniqueOrPinned(&ptr)))")

Builtin.unpin(token)

//CHECK: 11. false
print("11. \(_getBool(Builtin.isUnique(&ptr)))")
//CHECK: 12. false
print("12. \(_getBool(Builtin.isUniqueOrPinned(&ptr)))")

ptr2 = ptr

//CHECK: 13. false
print("13. \(_getBool(Builtin.isUnique(&ptr)))")
//CHECK: 14. false
print("14. \(_getBool(Builtin.isUniqueOrPinned(&ptr)))")

