mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When calling a C++ function that takes a reference to a pointer to a foreign reference type, Swift would previously pass a pointer to the foreign reference type as an argument (instead of a reference to a pointer), which resulted in invalid memory accesses. This was observed when using `std::vector<ImmortalRef*>::push_back`. rdar://150791778
215 lines
5.6 KiB
Swift
215 lines
5.6 KiB
Swift
// RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -enable-experimental-cxx-interop)
|
|
// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=swift-6)
|
|
// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=upcoming-swift)
|
|
|
|
// Also test this with a bridging header instead of the StdVector module.
|
|
// RUN: %empty-directory(%t2)
|
|
// RUN: cp %S/Inputs/std-vector.h %t2/std-vector-bridging-header.h
|
|
// RUN: %target-run-simple-swift(-D BRIDGING_HEADER -import-objc-header %t2/std-vector-bridging-header.h -Xfrontend -enable-experimental-cxx-interop)
|
|
// RUN: %target-run-simple-swift(-D BRIDGING_HEADER -import-objc-header %t2/std-vector-bridging-header.h -cxx-interoperability-mode=swift-6)
|
|
// RUN: %target-run-simple-swift(-D BRIDGING_HEADER -import-objc-header %t2/std-vector-bridging-header.h -cxx-interoperability-mode=upcoming-swift)
|
|
|
|
// FIXME: also run in C++20 mode when conformance works properly on UBI platform (rdar://109366764):
|
|
// %target-run-simple-swift(-I %S/Inputs -Xfrontend -enable-experimental-cxx-interop -Xcc -std=gnu++20)
|
|
//
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
#if !BRIDGING_HEADER
|
|
import StdVector
|
|
#endif
|
|
import CxxStdlib
|
|
|
|
var StdVectorTestSuite = TestSuite("StdVector")
|
|
|
|
StdVectorTestSuite.test("VectorOfInt.init") {
|
|
let v = Vector()
|
|
expectEqual(v.size(), 0)
|
|
expectTrue(v.empty())
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt.init(sequence)") {
|
|
let v = Vector([])
|
|
expectEqual(v.size(), 0)
|
|
expectTrue(v.empty())
|
|
|
|
let v2 = Vector([1, 2, 3])
|
|
expectEqual(v2.size(), 3)
|
|
expectFalse(v2.empty())
|
|
expectEqual(v2[0], 1)
|
|
expectEqual(v2[1], 2)
|
|
expectEqual(v2[2], 3)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfString.init(sequence)") {
|
|
let v = VectorOfString([])
|
|
expectEqual(v.size(), 0)
|
|
expectTrue(v.empty())
|
|
|
|
let v2 = VectorOfString(["", "ab", "abc"])
|
|
expectEqual(v2.size(), 3)
|
|
expectFalse(v2.empty())
|
|
expectEqual(v2[0], "")
|
|
expectEqual(v2[1], "ab")
|
|
expectEqual(v2[2], "abc")
|
|
|
|
let first = takesVectorOfString(["abc", "qwe"])
|
|
expectEqual(first, "abc")
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt as ExpressibleByArrayLiteral") {
|
|
let v: Vector = []
|
|
expectEqual(v.size(), 0)
|
|
expectTrue(v.empty())
|
|
|
|
let v2: Vector = [1, 2, 3]
|
|
expectEqual(v2.size(), 3)
|
|
expectFalse(v2.empty())
|
|
expectEqual(v2[0], 1)
|
|
expectEqual(v2[1], 2)
|
|
expectEqual(v2[2], 3)
|
|
}
|
|
|
|
#if !os(Windows) // FIXME: rdar://113704853
|
|
StdVectorTestSuite.test("VectorOfInt as MutableCollection") {
|
|
var v = Vector([2, 3, 1])
|
|
v.sort() // Swift function
|
|
expectEqual(v[0], 1)
|
|
expectEqual(v[1], 2)
|
|
expectEqual(v[2], 3)
|
|
|
|
v.reverse() // Swift function
|
|
expectEqual(v[0], 3)
|
|
expectEqual(v[1], 2)
|
|
expectEqual(v[2], 1)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfString as MutableCollection") {
|
|
var v = VectorOfString([std.string("xyz"),
|
|
std.string("abc"),
|
|
std.string("ijk")])
|
|
v.swapAt(0, 2) // Swift function
|
|
expectEqual(v[0], std.string("ijk"))
|
|
expectEqual(v[1], std.string("abc"))
|
|
expectEqual(v[2], std.string("xyz"))
|
|
|
|
v.reverse() // Swift function
|
|
expectEqual(v[0], std.string("xyz"))
|
|
expectEqual(v[1], std.string("abc"))
|
|
expectEqual(v[2], std.string("ijk"))
|
|
|
|
v.sort() // Swift function
|
|
expectEqual(v[0], std.string("abc"))
|
|
expectEqual(v[1], std.string("ijk"))
|
|
expectEqual(v[2], std.string("xyz"))
|
|
}
|
|
#endif
|
|
|
|
StdVectorTestSuite.test("VectorOfInt.push_back") {
|
|
var v = Vector()
|
|
let _42: CInt = 42
|
|
v.push_back(_42)
|
|
expectEqual(v.size(), 1)
|
|
expectFalse(v.empty())
|
|
expectEqual(v[0], 42)
|
|
}
|
|
|
|
func fill(vector v: inout Vector) {
|
|
v.push_back(1)
|
|
v.push_back(2)
|
|
v.push_back(CInt(3))
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt for loop") {
|
|
var v = Vector()
|
|
fill(vector: &v)
|
|
|
|
var count: CInt = 1
|
|
for e in v {
|
|
expectEqual(e, count)
|
|
count += 1
|
|
}
|
|
expectEqual(count, 4)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfString for loop") {
|
|
var v = VectorOfString()
|
|
var count = 0
|
|
for _ in v {
|
|
count += 1
|
|
}
|
|
expectEqual(count, 0)
|
|
|
|
v.push_back(std.string("abc"))
|
|
v.push_back(std.string("ab"))
|
|
for it in v {
|
|
count += it.length()
|
|
}
|
|
expectEqual(count, 5)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt.map") {
|
|
var v = Vector()
|
|
fill(vector: &v)
|
|
|
|
let a = v.map { $0 + 5 }
|
|
expectEqual(a, [6, 7, 8])
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfString.map") {
|
|
var v = VectorOfString()
|
|
v.push_back(std.string("abc"))
|
|
v.push_back(std.string("a"))
|
|
v.push_back(std.string("ab"))
|
|
|
|
let a = v.map { $0.length() }
|
|
expectEqual(a, [3, 1, 2])
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt subclass for loop") {
|
|
var v = VectorSubclass()
|
|
v.push_back(1)
|
|
|
|
var count: CInt = 1
|
|
for e in v {
|
|
expectEqual(e, count)
|
|
count += 1
|
|
}
|
|
expectEqual(count, 2)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfString subclass for loop") {
|
|
var v = VectorOfStringSubclass()
|
|
v.push_back(std.string("abc"))
|
|
|
|
var count: CInt = 0
|
|
for e in v {
|
|
expectEqual(std.string("abc"), e)
|
|
count += 1
|
|
}
|
|
expectEqual(count, 1)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfInt to span").require(.stdlib_6_2).code {
|
|
guard #available(SwiftStdlib 6.2, *) else { return }
|
|
|
|
let v = Vector([1, 2, 3])
|
|
let s = v.span
|
|
expectEqual(s.count, 3)
|
|
expectFalse(s.isEmpty)
|
|
expectEqual(s[0], 1)
|
|
expectEqual(s[1], 2)
|
|
expectEqual(s[2], 3)
|
|
}
|
|
|
|
StdVectorTestSuite.test("VectorOfImmortalRefPtr").require(.stdlib_5_8).code {
|
|
guard #available(SwiftStdlib 5.8, *) else { return }
|
|
|
|
var v = VectorOfImmortalRefPtr()
|
|
let i = ImmortalRef.create(123)
|
|
v.push_back(i)
|
|
expectEqual(v[0]?.value, 123)
|
|
}
|
|
|
|
runAllTests()
|