mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Also remove the decl from the known decls and remove a bunch of code referencing that decl as well as a bunch of other random things including deserialization support. This includes removing some specialized diagnostics code that matched the identifier ImplicitlyUnwrappedOptional, and tweaking diagnostics for various modes and various issues. Fixes most of rdar://problem/37121121, among other things.
306 lines
7.3 KiB
Swift
306 lines
7.3 KiB
Swift
//===--- Builtins.swift - Tests for our Builtin wrappers ------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// RUN: %empty-directory(%t)
|
|
// note: building with -Onone to test debug-mode-only safety checks
|
|
// RUN: %target-build-swift %s -parse-stdlib -Xfrontend -disable-access-control -Onone -o %t/Builtins
|
|
// RUN: %target-run %t/Builtins
|
|
// REQUIRES: executable_test
|
|
|
|
import Swift
|
|
import SwiftShims
|
|
import StdlibUnittest
|
|
|
|
|
|
#if _runtime(_ObjC)
|
|
import Foundation
|
|
#endif
|
|
|
|
var tests = TestSuite("Builtins")
|
|
|
|
class X {}
|
|
|
|
tests.test("_isUnique/NativeObject") {
|
|
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
|
|
expectNotEqual(false, _isUnique_native(&a))
|
|
var b = a
|
|
expectFalse(_isUnique_native(&a))
|
|
expectFalse(_isUnique_native(&b))
|
|
}
|
|
|
|
tests.test("_isUnique/NativeObjectWithPreviousStrongRef") {
|
|
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
|
|
expectTrue(_isUnique_native(&a))
|
|
var b: Builtin.NativeObject? = a
|
|
expectFalse(_isUnique_native(&a))
|
|
b = nil
|
|
expectTrue(_isUnique_native(&a))
|
|
}
|
|
|
|
tests.test("_isUnique/NativeObjectWithWeakRef") {
|
|
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
|
|
expectTrue(_isUnique_native(&a))
|
|
weak var b = a
|
|
expectTrue(_isUnique_native(&a))
|
|
expectFalse(_isUnique_native(&b))
|
|
}
|
|
|
|
tests.test("_isUnique/NativeObjectWithUnownedRef") {
|
|
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
|
|
expectTrue(_isUnique_native(&a))
|
|
unowned var b = a
|
|
expectTrue(_isUnique_native(&a))
|
|
expectFalse(_isUnique_native(&b))
|
|
}
|
|
|
|
tests.test("_isUniquelyReferenced/OptionalNativeObject") {
|
|
var a: Builtin.NativeObject? = Builtin.castToNativeObject(X())
|
|
StdlibUnittest.expectTrue(_getBool(Builtin.isUnique(&a)))
|
|
var b = a
|
|
expectFalse(_getBool(Builtin.isUnique(&a)))
|
|
expectFalse(_getBool(Builtin.isUnique(&b)))
|
|
var x: Builtin.NativeObject? = nil
|
|
expectFalse(_getBool(Builtin.isUnique(&x)))
|
|
}
|
|
|
|
#if _runtime(_ObjC)
|
|
class XObjC : NSObject {}
|
|
|
|
tests.test("_isUnique_native/SpareBitTrap")
|
|
.skip(.custom(
|
|
{ !_isStdlibInternalChecksEnabled() },
|
|
reason: "sanity checks are disabled in this build of stdlib"))
|
|
.code {
|
|
// Fake an ObjC pointer.
|
|
var b = _makeObjCBridgeObject(X())
|
|
expectCrashLater()
|
|
_ = _isUnique_native(&b)
|
|
}
|
|
|
|
tests.test("_isUniqueOrPinned_native/SpareBitTrap")
|
|
.skip(.custom(
|
|
{ !_isStdlibInternalChecksEnabled() },
|
|
reason: "sanity checks are disabled in this build of stdlib"))
|
|
.code {
|
|
// Fake an ObjC pointer.
|
|
var b = _makeObjCBridgeObject(X())
|
|
expectCrashLater()
|
|
_ = _isUniqueOrPinned_native(&b)
|
|
}
|
|
|
|
tests.test("_isUnique_native/NonNativeTrap")
|
|
.skip(.custom(
|
|
{ !_isStdlibInternalChecksEnabled() },
|
|
reason: "sanity checks are disabled in this build of stdlib"))
|
|
.code {
|
|
var x = XObjC()
|
|
expectCrashLater()
|
|
_ = _isUnique_native(&x)
|
|
}
|
|
|
|
tests.test("_isUniqueOrPinned_native/NonNativeTrap")
|
|
.skip(.custom(
|
|
{ !_isStdlibInternalChecksEnabled() },
|
|
reason: "sanity checks are disabled in this build of stdlib"))
|
|
.code {
|
|
var x = XObjC()
|
|
expectCrashLater()
|
|
_ = _isUniqueOrPinned_native(&x)
|
|
}
|
|
#endif // _ObjC
|
|
|
|
var x = 27
|
|
|
|
@inline(never)
|
|
func genint() -> Int {
|
|
return x
|
|
}
|
|
|
|
tests.test("_assumeNonNegative") {
|
|
let r = _assumeNonNegative(genint())
|
|
expectEqual(r, 27)
|
|
}
|
|
|
|
var NoisyLifeCount = 0
|
|
var NoisyDeathCount = 0
|
|
|
|
protocol P {}
|
|
|
|
class Noisy : P {
|
|
init() { NoisyLifeCount += 1 }
|
|
deinit { NoisyDeathCount += 1}
|
|
}
|
|
|
|
struct Large : P {
|
|
var a, b, c, d: Noisy
|
|
|
|
init() {
|
|
self.a = Noisy()
|
|
self.b = Noisy()
|
|
self.c = Noisy()
|
|
self.d = Noisy()
|
|
}
|
|
}
|
|
|
|
struct ContainsP { var p: P }
|
|
|
|
func exerciseArrayValueWitnesses<T>(_ value: T) {
|
|
let buf = UnsafeMutablePointer<T>.allocate(capacity: 5)
|
|
|
|
(buf + 0).initialize(to: value)
|
|
(buf + 1).initialize(to: value)
|
|
|
|
Builtin.copyArray(T.self, (buf + 2)._rawValue, buf._rawValue, 2._builtinWordValue)
|
|
Builtin.takeArrayBackToFront(T.self, (buf + 1)._rawValue, buf._rawValue, 4._builtinWordValue)
|
|
Builtin.takeArrayFrontToBack(T.self, buf._rawValue, (buf + 1)._rawValue, 4._builtinWordValue)
|
|
Builtin.destroyArray(T.self, buf._rawValue, 4._builtinWordValue)
|
|
|
|
buf.deallocate()
|
|
}
|
|
|
|
tests.test("array value witnesses") {
|
|
NoisyLifeCount = 0
|
|
NoisyDeathCount = 0
|
|
do {
|
|
exerciseArrayValueWitnesses(44)
|
|
exerciseArrayValueWitnesses(Noisy())
|
|
exerciseArrayValueWitnesses(Noisy() as P)
|
|
exerciseArrayValueWitnesses(Large())
|
|
exerciseArrayValueWitnesses(Large() as P)
|
|
exerciseArrayValueWitnesses(ContainsP(p: Noisy()))
|
|
exerciseArrayValueWitnesses(ContainsP(p: Large()))
|
|
}
|
|
expectEqual(NoisyLifeCount, NoisyDeathCount)
|
|
}
|
|
|
|
protocol Classy : class {}
|
|
class A : Classy {}
|
|
class B : A {}
|
|
class C : B {}
|
|
|
|
tests.test("_getSuperclass") {
|
|
expectNil(_getSuperclass(A.self))
|
|
expectNil(_getSuperclass(Classy.self))
|
|
expectNotNil(_getSuperclass(B.self))
|
|
expectNotNil(_getSuperclass(C.self))
|
|
expectTrue(_getSuperclass(B.self)! == A.self)
|
|
expectTrue(_getSuperclass(C.self)! == B.self)
|
|
}
|
|
|
|
tests.test("type comparison") {
|
|
class B {}
|
|
class D : B {}
|
|
|
|
let t1 = B.self
|
|
let t1o = Optional(t1)
|
|
let t2 = D.self
|
|
let t2o = Optional(t2)
|
|
|
|
expectTrue(t1 == t1)
|
|
expectFalse(t1 != t1)
|
|
expectTrue(t2 == t2)
|
|
expectFalse(t2 != t2)
|
|
|
|
expectFalse(t1 == t2)
|
|
expectFalse(t2 == t1)
|
|
expectTrue(t1 != t2)
|
|
expectTrue(t2 != t1)
|
|
|
|
expectTrue(t1 == t1o)
|
|
expectFalse(t1 != t1o)
|
|
expectTrue(t2 == t2o)
|
|
expectFalse(t2 != t2o)
|
|
|
|
expectFalse(t1 == t2o)
|
|
expectFalse(t2 == t1o)
|
|
expectTrue(t1 != t2o)
|
|
expectTrue(t2 != t1o)
|
|
|
|
expectTrue(t1o == t1)
|
|
expectFalse(t1o != t1)
|
|
expectTrue(t2o == t2)
|
|
expectFalse(t2o != t2)
|
|
|
|
expectFalse(t1o == t2)
|
|
expectFalse(t2o == t1)
|
|
expectTrue(t1o != t2)
|
|
expectTrue(t2o != t1)
|
|
|
|
expectTrue(t1o == t1o)
|
|
expectFalse(t1o != t1o)
|
|
expectTrue(t2o == t2o)
|
|
expectFalse(t2o != t2o)
|
|
|
|
expectFalse(t1o == t2o)
|
|
expectFalse(t2o == t1o)
|
|
expectTrue(t1o != t2o)
|
|
expectTrue(t2o != t1o)
|
|
|
|
let nil1 : B.Type? = nil
|
|
let nil2 : D.Type? = nil
|
|
|
|
expectTrue(nil1 == nil2)
|
|
expectTrue(nil1 == nil1)
|
|
|
|
expectTrue(nil1 == nil)
|
|
expectTrue(nil == nil1)
|
|
|
|
expectTrue(nil2 == nil)
|
|
expectTrue(nil == nil2)
|
|
|
|
expectFalse(t1 == nil1)
|
|
expectFalse(nil1 == t1)
|
|
|
|
expectFalse(t2 == nil1)
|
|
expectFalse(nil1 == t2)
|
|
|
|
expectFalse(t1 == nil2)
|
|
expectFalse(nil2 == t1)
|
|
|
|
expectFalse(t2 == nil2)
|
|
expectFalse(nil2 == t2)
|
|
|
|
expectFalse(t1o == nil)
|
|
expectFalse(nil == t1o)
|
|
|
|
expectFalse(t2o == nil)
|
|
expectFalse(nil == t2o)
|
|
|
|
expectFalse(t1o == nil1)
|
|
expectFalse(nil1 == t1o)
|
|
|
|
expectFalse(t2o == nil1)
|
|
expectFalse(nil1 == t2o)
|
|
|
|
expectFalse(t1o == nil2)
|
|
expectFalse(nil2 == t1o)
|
|
|
|
expectFalse(t2o == nil2)
|
|
expectFalse(nil2 == t2o)
|
|
}
|
|
|
|
tests.test("_isPOD") {
|
|
expectTrue(_isPOD(Int.self))
|
|
expectFalse(_isPOD(X.self))
|
|
expectFalse(_isPOD(P.self))
|
|
}
|
|
|
|
tests.test("_isOptional") {
|
|
expectTrue(_isOptional(Optional<Int>.self))
|
|
expectTrue(_isOptional(Optional<X>.self))
|
|
expectTrue(_isOptional(Optional<P>.self))
|
|
expectFalse(_isOptional(Int.self))
|
|
expectFalse(_isOptional(X.self))
|
|
expectFalse(_isOptional(P.self))
|
|
}
|
|
|
|
runAllTests()
|