Skip to content

Commit 9976eff

Browse files
committed
Merge pull request #2055 from jckarter/lazy-interface-type
2 parents 89686e1 + 88847f1 commit 9976eff

File tree

5 files changed

+26
-2
lines changed

5 files changed

+26
-2
lines changed

lib/AST/Type.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,8 +1942,7 @@ static ForeignRepresentableKind getObjCObjectRepresentable(Type type) {
19421942
type = dynSelf->getSelfType();
19431943

19441944
// @objc classes.
1945-
if (auto classType = type->getAs<ClassType>()) {
1946-
auto classDecl = classType->getDecl();
1945+
if (auto classDecl = type->getClassOrBoundGenericClass()) {
19471946
auto &ctx = classDecl->getASTContext();
19481947
if (auto resolver = ctx.getLazyResolver())
19491948
resolver->resolveDeclSignature(classDecl);

lib/Sema/CodeSynthesis.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,10 +1581,12 @@ void TypeChecker::completeLazyVarImplementation(VarDecl *VD) {
15811581
NameBuf += ".storage";
15821582
auto StorageName = Context.getIdentifier(NameBuf);
15831583
auto StorageTy = OptionalType::get(VD->getType());
1584+
auto StorageInterfaceTy = OptionalType::get(VD->getInterfaceType());
15841585

15851586
auto *Storage = new (Context) VarDecl(/*isStatic*/false, /*isLet*/false,
15861587
VD->getLoc(), StorageName, StorageTy,
15871588
VD->getDeclContext());
1589+
Storage->setInterfaceType(StorageInterfaceTy);
15881590
Storage->setUserAccessible(false);
15891591
addMemberToContextIfNeeded(Storage, VD->getDeclContext(), VD);
15901592

test/ClangModules/objc_bridging_generics.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ func testImportedTypeParamRequirements() {
7676

7777
extension GenericClass {
7878
func doesntUseGenericParam() {}
79+
@objc func doesntUseGenericParam2() -> Self {}
80+
// Doesn't technically use 'T', since it's type-erased at runtime
81+
func doesntUseGenericParam3() -> GenericClass<T> {}
7982

8083
// expected-error@+1{{Extension of a generic Objective-C class cannot access the class's generic parameters}}
8184
func usesGenericParamA(_ x: T) {}
@@ -97,6 +100,9 @@ extension GenericClass {
97100
}
98101

99102
static func doesntUseGenericParam() {}
103+
static func doesntUseGenericParam2() -> Self {}
104+
// Doesn't technically use 'T', since it's type-erased at runtime
105+
static func doesntUseGenericParam3() -> GenericClass<T> {}
100106

101107
// expected-error@+1{{Extension of a generic Objective-C class cannot access the class's generic parameters}}
102108
static func usesGenericParamA(_ x: T) {}
@@ -116,4 +122,10 @@ extension GenericClass {
116122
static func usesGenericParamF(_ x: Int) {
117123
_ = x is T
118124
}
125+
126+
func checkThatMethodsAreObjC() {
127+
_ = #selector(GenericClass.doesntUseGenericParam)
128+
_ = #selector(GenericClass.doesntUseGenericParam2)
129+
_ = #selector(GenericClass.doesntUseGenericParam3)
130+
}
119131
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
struct MyGenericStruct<T> {
2+
lazy var prop2 = [AnotherGenericStruct<T>]()
3+
}
4+
struct AnotherGenericStruct<T> { }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: rm -rf %t
2+
// RUN: mkdir -p %t
3+
// RUN: %target-swift-frontend %s -verify -O -primary-file %s %S/Inputs/lazy_properties_multi_file_2.swift -c -o %t/lazy_properties_multi_file.o
4+
5+
class MyClass {
6+
var myProperty = MyGenericStruct<Int>()
7+
}

0 commit comments

Comments
 (0)