File: conditional_conformances_literals.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 (138 lines) | stat: -rw-r--r-- 5,885 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
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// RUN: %target-typecheck-verify-swift

// rdar://problem/38461036
// https://github.com/apple/swift/issues/49740 and highlights the real problem
// in https://github.com/apple/swift/issues/49489

protocol SameType {}
protocol Conforms {}

struct Works: Hashable, Conforms {}
struct Fails: Hashable {}

extension Array: SameType where Element == Works {}
// expected-note@-1 3 {{requirement from conditional conformance of '[Fails]' to 'SameType'}}
extension Dictionary: SameType where Value == Works {}
// expected-note@-1 3 {{requirement from conditional conformance of '[Int : Fails]' to 'SameType'}}
extension Array: Conforms where Element: Conforms {}
// expected-note@-1 7 {{requirement from conditional conformance of '[Fails]' to 'Conforms'}}
extension Dictionary: Conforms where Value: Conforms {}
// expected-note@-1 5 {{requirement from conditional conformance of '[Int : Fails]' to 'Conforms'}}
// expected-note@-2 2 {{requirement from conditional conformance of '[Int : any Conforms]' to 'Conforms'}}

let works = Works()
let fails = Fails()

func arraySameType() {
    let arrayWorks = [works]
    let arrayFails = [fails]

    let _: SameType = [works]
    let _: SameType = [fails]
    // expected-error@-1 {{cannot convert value of type 'Fails' to expected element type 'Works'}}

    let _: SameType = arrayWorks
    let _: SameType = arrayFails
    // expected-error@-1 {{protocol 'SameType' requires the types 'Fails' and 'Works' be equivalent}}

    let _: SameType = [works] as [Works]
    let _: SameType = [fails] as [Fails]
    // expected-error@-1 {{protocol 'SameType' requires the types 'Fails' and 'Works' be equivalent}}

    let _: SameType = [works] as SameType
    let _: SameType = [fails] as SameType
    // expected-error@-1 {{cannot convert value of type 'Fails' to expected element type 'Works'}}

    let _: SameType = arrayWorks as SameType
    let _: SameType = arrayFails as SameType
    // expected-error@-1 {{generic struct 'Array' requires the types 'Fails' and 'Works' be equivalent}}
}

func dictionarySameType() {
    let dictWorks: [Int : Works] = [0 : works]
    let dictFails: [Int : Fails] = [0 : fails]

    let _: SameType = [0 : works]
    let _: SameType = [0 : fails]
    // expected-error@-1 {{cannot convert value of type 'Fails' to expected dictionary value type 'Works'}}

    let _: SameType = dictWorks
    let _: SameType = dictFails
    // expected-error@-1 {{protocol 'SameType' requires the types 'Fails' and 'Works' be equivalent}}

    let _: SameType = [0 : works] as [Int : Works]
    let _: SameType = [0 : fails] as [Int : Fails]
    // expected-error@-1 {{protocol 'SameType' requires the types 'Fails' and 'Works' be equivalent}}

    let _: SameType = [0 : works] as SameType
    let _: SameType = [0 : fails] as SameType
    // expected-error@-1 {{cannot convert value of type 'Fails' to expected dictionary value type 'Works'}}

    let _: SameType = dictWorks as SameType
    let _: SameType = dictFails as SameType
    // expected-error@-1 {{generic struct 'Dictionary' requires the types 'Fails' and 'Works' be equivalent}}
}

func arrayConforms() {
    let arrayWorks = [works]
    let arrayFails = [fails]

    let _: Conforms = [works]
    let _: Conforms = [fails]
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = arrayWorks
    let _: Conforms = arrayFails
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = [works] as [Works]
    let _: Conforms = [fails] as [Fails]
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = [works] as Conforms
    let _: Conforms = [fails] as Conforms
    // expected-error@-1 {{generic struct 'Array' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = arrayWorks as Conforms
    let _: Conforms = arrayFails as Conforms
    // expected-error@-1 {{generic struct 'Array' requires that 'Fails' conform to 'Conforms'}}
}

func dictionaryConforms() {
    let dictWorks: [Int : Works] = [0 : works]
    let dictFails: [Int : Fails] = [0 : fails]

    let _: Conforms = [0 : works]
    let _: Conforms = [0 : fails]
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = dictWorks
    let _: Conforms = dictFails
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = [0 : works] as [Int : Works]
    let _: Conforms = [0 : fails] as [Int : Fails]
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = [0 : works] as Conforms
    let _: Conforms = [0 : fails] as Conforms
    // expected-error@-1 {{generic struct 'Dictionary' requires that 'Fails' conform to 'Conforms'}}

    let _: Conforms = dictWorks as Conforms
    let _: Conforms = dictFails as Conforms
    // expected-error@-1 {{generic struct 'Dictionary' requires that 'Fails' conform to 'Conforms'}}
}

func combined() {
    let _: Conforms = [[0: [1 : [works]]]]
    let _: Conforms = [[0: [1 : [fails]]]]
    // expected-error@-1 {{protocol 'Conforms' requires that 'Fails' conform to 'Conforms'}}

    // Needs self conforming protocols:
    let _: Conforms = [[0: [1 : [works]] as Conforms]]
    // expected-error@-1 {{type 'any Conforms' cannot conform to 'Conforms'}} expected-note@-1 {{only concrete types such as structs, enums and classes can conform to protocols}}

    let _: Conforms = [[0: [1 : [fails]] as Conforms]]
    // expected-error@-1 {{generic struct 'Dictionary' requires that 'Fails' conform to 'Conforms'}}
    // expected-error@-2 {{type 'any Conforms' cannot conform to 'Conforms'}} expected-note@-2 {{only concrete types such as structs, enums and classes can conform to protocols}}
}