Skip to content

Commit 55fb2e3

Browse files
authored
Merge pull request #17083 from naru-jpn/fixit-dosent-confirm-to-public-protocol
[SR-7629] Fix wrong fixit when the type doesn't conform to a public protocol
2 parents 084698d + cfbdab1 commit 55fb2e3

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2778,6 +2778,14 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
27782778
requiredAccess,
27792779
protoAccessScope.accessLevelForDiagnostics(),
27802780
proto->getName());
2781+
if (auto *decl = dyn_cast<AbstractFunctionDecl>(witness)) {
2782+
auto isMemberwiseInitializer =
2783+
decl->getBodyKind() ==
2784+
AbstractFunctionDecl::BodyKind::MemberwiseInitializer;
2785+
if (isMemberwiseInitializer) {
2786+
return;
2787+
}
2788+
}
27812789
auto fixItDiag = diags.diagnose(witness, diag::witness_fix_access,
27822790
witness->getDescriptiveKind(),
27832791
requiredAccess);

test/attr/accessibility.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,20 @@ public struct AdoptViaCombinedProtocol : ProtoWithReqs, ReqProvider2 {
252252
// expected-error@-1 {{method 'foo()' must be declared public because it matches a requirement in public protocol 'ProtoWithReqs'}} {{none}}
253253
public typealias Assoc = Int
254254
}
255+
256+
public protocol PublicInitProto {
257+
var value: Int { get }
258+
init(value: Int)
259+
}
260+
public struct NonPublicInitStruct: PublicInitProto {
261+
public var value: Int
262+
init(value: Int) {
263+
// expected-error@-1 {{initializer 'init(value:)' must be declared public because it matches a requirement in public protocol 'PublicInitProto'}}
264+
// expected-note@-2 {{mark the initializer as 'public' to satisfy the requirement}}
265+
self.value = value
266+
}
267+
}
268+
public struct NonPublicMemberwiseInitStruct: PublicInitProto {
269+
// expected-error@-1 {{initializer 'init(value:)' must be declared public because it matches a requirement in public protocol 'PublicInitProto'}}
270+
public var value: Int
271+
}

0 commit comments

Comments
 (0)