-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathcopy-constructors-execution.swift
69 lines (55 loc) · 2.78 KB
/
copy-constructors-execution.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -enable-experimental-cxx-interop)
//
// REQUIRES: executable_test
import CopyConstructors
import StdlibUnittest
var CXXCopyConstructorTestSuite = TestSuite("CXX Copy Constructor")
// It doesn't really matter how many copies were made (as long as it's at least
// one). What we really want to be checking is that the correct copy constructor
// was eventually called.
CXXCopyConstructorTestSuite.test("Basic object with custom copy constructor") {
// Make sure we don't inline this function. We should copy "userCC" into the
// two tuple elements (in the return address). If we inline this function, it
// would allow Swift to put "userCC" directly into "expectTrue" which would
// eliminate the copy.
@inline(never)
func createHasUserProvidedCopyConstructor() -> (HasUserProvidedCopyConstructor, HasUserProvidedCopyConstructor) {
let userCC = HasUserProvidedCopyConstructor(0)
return (userCC, userCC)
}
let result = createHasUserProvidedCopyConstructor()
expectTrue(result.0.numCopies + result.1.numCopies > 0)
}
CXXCopyConstructorTestSuite.test("Implicit copy constructor, member with user-defined copy constructor") {
@inline(never)
func createTypeWithNonTrivialImplicitCopyConstructor() -> (HasNonTrivialImplicitCopyConstructor, HasNonTrivialImplicitCopyConstructor) {
let implicit = HasNonTrivialImplicitCopyConstructor()
return (implicit, implicit)
}
let result = createTypeWithNonTrivialImplicitCopyConstructor()
expectTrue(result.0.box.numCopies + result.1.box.numCopies > 0)
}
CXXCopyConstructorTestSuite.test("Default copy constructor, member with user-defined copy constructor") {
@inline(never)
func createTypeWithNonTrivialDefaultCopyConstructor() -> (HasNonTrivialDefaultCopyConstructor, HasNonTrivialDefaultCopyConstructor) {
let def = HasNonTrivialDefaultCopyConstructor()
return (def, def)
}
let result = createTypeWithNonTrivialDefaultCopyConstructor()
expectTrue(result.0.box.numCopies + result.1.box.numCopies > 0)
}
CXXCopyConstructorTestSuite.test("Copy constructor with default arguments") {
// When in the presence of a C++ copy constructor with default args, we make the type non-copyable
let originalObj = HasCopyConstructorWithDefaultArgs(5)
expectEqual(originalObj.value, 5)
// move originalObj
let newObj = originalObj
expectEqual(newObj.value, 5)
}
CXXCopyConstructorTestSuite.test("Copy constructor with one parameter that has a default argument") {
// If the C++ copy constructor has exactly one param and it has a default argument, ignore the default argument and import the type as copyable to Swift
let original = HasCopyConstructorWithOneParameterWithDefaultArg(1)
let copy = original
expectTrue(original.numCopies + copy.numCopies > 1)
}
runAllTests()