mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Explanation: Fixes a runtime crash in the generated binary due to mismatched calling convention when calling a function taking an rvalue reference. Scope: Affects C++ APIs taking rvalue references to directly passed types (e.g., trivially destructible types). Issue: rdar://148585343 Risk: Low, targeted to rvalue references which is a newly supported feature. Testing: Added tests to test suite Reviewer: John Hui
112 lines
2.8 KiB
Swift
112 lines
2.8 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-clangxx -c %S/Inputs/reference.cpp -I %S/Inputs -o %t/reference.o
|
|
// RUN: %target-build-swift %s -I %S/Inputs -o %t/reference %t/reference.o -Xfrontend -enable-experimental-cxx-interop
|
|
// RUN: %target-codesign %t/reference
|
|
// RUN: %target-run %t/reference
|
|
//
|
|
// REQUIRES: executable_test
|
|
|
|
import Reference
|
|
import StdlibUnittest
|
|
|
|
var ReferenceTestSuite = TestSuite("Reference")
|
|
|
|
ReferenceTestSuite.test("read-lvalue-reference") {
|
|
expectNotEqual(13, getStaticInt())
|
|
setStaticInt(13)
|
|
expectEqual(13, getStaticIntRef().pointee)
|
|
expectEqual(13, getConstStaticIntRef().pointee)
|
|
}
|
|
|
|
ReferenceTestSuite.test("read-rvalue-reference") {
|
|
expectNotEqual(32, getStaticInt())
|
|
setStaticInt(32)
|
|
expectEqual(32, getStaticIntRvalueRef().pointee)
|
|
expectEqual(32, getConstStaticIntRvalueRef().pointee)
|
|
}
|
|
|
|
ReferenceTestSuite.test("write-lvalue-reference") {
|
|
expectNotEqual(14, getStaticInt())
|
|
getStaticIntRef().pointee = 14
|
|
expectEqual(14, getStaticInt())
|
|
}
|
|
|
|
ReferenceTestSuite.test("write-rvalue-reference") {
|
|
expectNotEqual(41, getStaticInt())
|
|
getStaticIntRvalueRef().pointee = 41
|
|
expectEqual(41, getStaticInt())
|
|
}
|
|
|
|
ReferenceTestSuite.test("pass-lvalue-reference") {
|
|
expectNotEqual(21, getStaticInt())
|
|
var val: CInt = 21
|
|
setStaticIntRef(&val)
|
|
expectEqual(21, getStaticInt())
|
|
val = 111
|
|
setStaticIntRefTypealias(&val)
|
|
expectEqual(getStaticInt(), 111)
|
|
}
|
|
|
|
ReferenceTestSuite.test("pass-const-lvalue-reference") {
|
|
expectNotEqual(22, getStaticInt())
|
|
let val: CInt = 22
|
|
setConstStaticIntRef(val)
|
|
expectEqual(22, getStaticInt())
|
|
setConstStaticIntRefTypealias(112)
|
|
expectEqual(getStaticInt(), 112)
|
|
}
|
|
|
|
ReferenceTestSuite.test("func-reference") {
|
|
let cxxF: @convention(c) () -> Int32 = getFuncRef()
|
|
|
|
expectNotEqual(15, getStaticInt())
|
|
setStaticInt(15)
|
|
expectEqual(15, cxxF())
|
|
}
|
|
|
|
ReferenceTestSuite.test("func-rvalue-reference") {
|
|
let cxxF: @convention(c) () -> Int32 = getFuncRvalueRef()
|
|
|
|
expectNotEqual(61, getStaticInt())
|
|
setStaticInt(61)
|
|
expectEqual(61, cxxF())
|
|
}
|
|
|
|
ReferenceTestSuite.test("pod-struct-const-lvalue-reference") {
|
|
expectNotEqual(getStaticInt(), 78)
|
|
takeConstRef(78)
|
|
expectEqual(getStaticInt(), 78)
|
|
}
|
|
|
|
ReferenceTestSuite.test("const reference to bool") {
|
|
expectTrue(takeConstRefBool(true))
|
|
expectFalse(takeConstRefBool(false))
|
|
}
|
|
|
|
ReferenceTestSuite.test("reference to bool") {
|
|
var b = false
|
|
takeRefBool(&b)
|
|
expectTrue(b)
|
|
}
|
|
|
|
ReferenceTestSuite.test("reference to template") {
|
|
var val: CInt = 53
|
|
let ref = refToTemplate(&val)
|
|
expectEqual(53, ref.pointee)
|
|
ref.pointee = 42
|
|
expectEqual(42, val)
|
|
}
|
|
|
|
ReferenceTestSuite.test("const reference to template") {
|
|
let val: CInt = 53
|
|
let ref = constRefToTemplate(val)
|
|
expectEqual(53, ref.pointee)
|
|
}
|
|
|
|
ReferenceTestSuite.test("rvalue reference of trivial type") {
|
|
setStaticIntRvalueRef(consuming: 2)
|
|
expectEqual(2, getStaticInt())
|
|
}
|
|
|
|
runAllTests()
|