Skip to content

Commit 4972351

Browse files
committed
Fix implementation-only checking for members of frozen structs/classes
...which I had exactly backwards.
1 parent a9b0a66 commit 4972351

File tree

3 files changed

+112
-2
lines changed

3 files changed

+112
-2
lines changed

lib/Sema/TypeCheckAccess.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,10 +1517,10 @@ class ImplementationOnlyImportChecker
15171517

15181518
// Is this a stored property in a non-resilient struct or class?
15191519
auto *property = dyn_cast<VarDecl>(VD);
1520-
if (!property || !property->hasStorage())
1520+
if (!property || !property->hasStorage() || property->isStatic())
15211521
return true;
15221522
auto *parentNominal = dyn_cast<NominalTypeDecl>(property->getDeclContext());
1523-
if (!parentNominal || !parentNominal->isResilient())
1523+
if (!parentNominal || parentNominal->isResilient())
15241524
return true;
15251525

15261526
// Is that struct or class part of the module's API or ABI?

test/Sema/implementation-only-import-in-decls.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,36 @@ precedencegroup TestLowerThan {
115115
precedencegroup TestHigherThan {
116116
higherThan: BadPrecedence // expected-error {{cannot use 'BadPrecedence' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
117117
}
118+
119+
public struct PublicStructStoredProperties {
120+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
121+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
122+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
123+
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
124+
125+
private var computedIsOkay: BadStruct? { return nil } // okay
126+
private static var staticIsOkay: BadStruct? // okay
127+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
128+
}
129+
130+
@usableFromInline internal struct UFIStructStoredProperties {
131+
@usableFromInline var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
132+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
133+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
134+
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
135+
136+
private var computedIsOkay: BadStruct? { return nil } // okay
137+
private static var staticIsOkay: BadStruct? // okay
138+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
139+
}
140+
141+
public class PublicClassStoredProperties {
142+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
143+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
144+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
145+
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
146+
147+
private var computedIsOkay: BadStruct? { return nil } // okay
148+
private static var staticIsOkay: BadStruct? // okay
149+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
150+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module -o %t/BADLibrary.swiftmodule %S/Inputs/implementation-only-import-in-decls-helper.swift
3+
4+
// RUN: %target-typecheck-verify-swift -I %t -enable-library-evolution
5+
6+
@_implementationOnly import BADLibrary
7+
8+
public struct PublicStructStoredProperties {
9+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
10+
internal var internallyBad: BadStruct? // okay
11+
private var privatelyBad: BadStruct? // okay
12+
private let letIsLikeVar = [BadStruct]() // okay
13+
14+
private var computedIsOkay: BadStruct? { return nil } // okay
15+
private static var staticIsOkay: BadStruct? // okay
16+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
17+
}
18+
19+
@usableFromInline internal struct UFIStructStoredProperties {
20+
@usableFromInline var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
21+
internal var internallyBad: BadStruct? // okay
22+
private var privatelyBad: BadStruct? // okay
23+
private let letIsLikeVar = [BadStruct]() // okay
24+
25+
private var computedIsOkay: BadStruct? { return nil } // okay
26+
private static var staticIsOkay: BadStruct? // okay
27+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
28+
}
29+
30+
public class PublicClassStoredProperties {
31+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
32+
internal var internallyBad: BadStruct? // okay
33+
private var privatelyBad: BadStruct? // okay
34+
private let letIsLikeVar = [BadStruct]() // okay
35+
36+
private var computedIsOkay: BadStruct? { return nil } // okay
37+
private static var staticIsOkay: BadStruct? // okay
38+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
39+
}
40+
41+
// MARK: Frozen types
42+
43+
@_fixed_layout
44+
public struct FrozenPublicStructStoredProperties {
45+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
46+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
47+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
48+
private let letIsLikeVar: [BadStruct] = [] // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
49+
50+
private var computedIsOkay: BadStruct? { return nil } // okay
51+
private static var staticIsOkay: BadStruct? // okay
52+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
53+
}
54+
55+
@_fixed_layout
56+
@usableFromInline internal struct FrozenUFIStructStoredProperties {
57+
@usableFromInline var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
58+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
59+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
60+
private let letIsLikeVar: [BadStruct] = [] // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
61+
62+
private var computedIsOkay: BadStruct? { return nil } // okay
63+
private static var staticIsOkay: BadStruct? // okay
64+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
65+
}
66+
67+
@_fixed_layout
68+
public class FrozenPublicClassStoredProperties {
69+
public var publiclyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
70+
internal var internallyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
71+
private var privatelyBad: BadStruct? // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
72+
private let letIsLikeVar: [BadStruct] = [] // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
73+
74+
private var computedIsOkay: BadStruct? { return nil } // okay
75+
private static var staticIsOkay: BadStruct? // okay
76+
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use 'BadStruct' here; 'BADLibrary' has been imported as '@_implementationOnly'}}
77+
}

0 commit comments

Comments
 (0)