Skip to content

Commit 5cef3fe

Browse files
authored
Merge pull request #7886 from DougGregor/sr-3917
2 parents f0300be + 3246b72 commit 5cef3fe

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

lib/AST/ASTVerifier.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,8 @@ struct ASTNodeBase {};
19971997

19981998
if (auto req = dyn_cast<ValueDecl>(member)) {
19991999
if (!normal->hasWitness(req)) {
2000-
if (req->getAttrs().isUnavailable(Ctx) &&
2000+
if ((req->getAttrs().isUnavailable(Ctx) ||
2001+
req->getAttrs().hasAttribute<OptionalAttr>()) &&
20012002
proto->isObjC()) {
20022003
continue;
20032004
}

lib/AST/ProtocolConformance.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,11 @@ void NormalProtocolConformance::setWitness(ValueDecl *requirement,
463463
assert(getProtocol() == cast<ProtocolDecl>(requirement->getDeclContext()) &&
464464
"requirement in wrong protocol");
465465
assert(Mapping.count(requirement) == 0 && "Witness already known");
466-
assert((!isComplete() || isInvalid()) && "Conformance already complete?");
466+
assert((!isComplete() || isInvalid()
467+
|| requirement->getAttrs().hasAttribute<OptionalAttr>()
468+
|| requirement->getAttrs().isUnavailable(
469+
requirement->getASTContext())) &&
470+
"Conformance already complete?");
467471
Mapping[requirement] = witness;
468472
}
469473

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import Foundation
2+
3+
@objc public protocol Proto {
4+
@objc optional func badness()
5+
}
6+
7+
public class Foo: Proto {
8+
public var badness: Int = 0 // unrelated
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: rm -rf %t
2+
// RUN: mkdir -p %t
3+
4+
// FIXME: BEGIN -enable-source-import hackaround
5+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-module -o %t %clang-importer-sdk-path/swift-modules/Foundation.swift
6+
// FIXME: END -enable-source-import hackaround
7+
8+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-module -o %t %S/Inputs/def_objc_conforming.swift
9+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -typecheck %s -verify
10+
11+
// REQUIRES: objc_interop
12+
13+
// SR-3917
14+
import def_objc_conforming
15+
16+
func test(x: Foo) { _ = x.badness }

0 commit comments

Comments
 (0)