File: discard_trivially_destroyed.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (112 lines) | stat: -rw-r--r-- 3,512 bytes parent folder | download | duplicates (2)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// RUN: %target-swift-emit-silgen -verify %s

// Yes, you read that right. This is being checked in SILGen! So we have to
// separate these tests from ones emitting errors during Sema.

class ClassyGal {}

@propertyWrapper
struct Appending<Val> {
  let terminator: Val
  var store: [Val] = []

  var wrappedValue: [Val] {
    get {
      return store + [terminator]
    }
    set {
      fatalError("mutation is the root of all bugs")
    }
  }
}

struct StructuredGuy: ~Copyable {
  let x = ClassyGal()
  // expected-note@-1 {{type 'ClassyGal' cannot be trivially destroyed}}

  @Appending(terminator: ClassyGal())
  var bestC: [ClassyGal]

  consuming func doDiscard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'StructuredGuy' if it contains trivially-destroyed stored properties at this time}}
  deinit {}
}

struct AppendyEnby: ~Copyable {
  @Appending(terminator: 0)
  var string: [Int]
  // expected-note@-1 {{type 'Appending<Int>' cannot be trivially destroyed}}


  consuming func doDiscard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'AppendyEnby' if it contains trivially-destroyed stored properties at this time}}
  deinit {}
}

struct HasGeneric: ~Copyable {
  var thing: Any // expected-note {{type 'Any' cannot be trivially destroyed}}

  consuming func discard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'HasGeneric' if it contains trivially-destroyed stored properties at this time}}

  deinit{}
}

struct WrappingNoncopyable: ~Copyable {
  var computed: String { "mine" }

  var x: AppendyEnby // expected-note{{type 'AppendyEnby' cannot be trivially destroyed}}
  consuming func doDiscard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'WrappingNoncopyable' if it contains trivially-destroyed stored properties at this time}}
  deinit {}
}

struct LazyGuy: ~Copyable {
  lazy var thing: String = "asdf"
  // expected-note@-1 {{type 'String?' cannot be trivially destroyed}}

  consuming func doDiscard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'LazyGuy' if it contains trivially-destroyed stored properties at this time}}
  deinit {}
}

struct BoringNoncopyable: ~Copyable {
  let x = 0
  let y = 0
}

struct Boring {
  var x = 0
  var y = 1.9
}

// FIXME: Despite not having a deinit, the noncopyable struct isn't considered trivial?
struct ContainsBoring: ~Copyable {
  let z: BoringNoncopyable // expected-note {{type 'BoringNoncopyable' cannot be trivially destroyed}}
  consuming func discard() { discard self }
  // expected-error@-1 {{can only 'discard' type 'ContainsBoring' if it contains trivially-destroyed stored properties at this time}}
  deinit {}
}

struct AllOK: ~Copyable {
  var maybeDigits: Int?
  var maybeFloat: Float?
  let dbl: Double
  var location: Boring = Boring()
  var unsafePtr: UnsafePointer<Int>

  consuming func doDiscard() { discard self }
  deinit {}
}

struct HasGenericStored<T>: ~Copyable {
  let t: T // expected-note {{type 'T' cannot be trivially destroyed}}
  consuming func discard() { discard self } // expected-error {{can only 'discard' type 'HasGenericStored<T>' if it contains trivially-destroyed stored properties at this time}}
  deinit{}
}

struct HasAny: ~Copyable {
  var t: Any // expected-note {{type 'Any' cannot be trivially destroyed}}
  consuming func discard() { discard self } // expected-error {{can only 'discard' type 'HasAny' if it contains trivially-destroyed stored properties at this time}}
  deinit{}
}