File: copy-constructors-execution.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (51 lines) | stat: -rw-r--r-- 2,083 bytes parent folder | download
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
// 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)
}

runAllTests()