Skip to content

Commit c67cf88

Browse files
committed
[Diagnostics] Don't crash when gathering info about property wrapper in l-value base
Make `TypeBase::getTypeOfMember` more resilient to base type being either an l-value (which we can look through), or an error type - in such can it would return immediately. Resolves: rdar://problem/54184846
1 parent 4ecab47 commit c67cf88

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

lib/AST/Type.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3583,6 +3583,14 @@ SubstitutionMap TypeBase::getMemberSubstitutionMap(
35833583

35843584
Type TypeBase::getTypeOfMember(ModuleDecl *module, const ValueDecl *member,
35853585
Type memberType) {
3586+
if (is<ErrorType>())
3587+
return ErrorType::get(getASTContext());
3588+
3589+
if (auto *lvalue = getAs<LValueType>()) {
3590+
auto objectTy = lvalue->getObjectType();
3591+
return objectTy->getTypeOfMember(module, member, memberType);
3592+
}
3593+
35863594
// If no member type was provided, use the member's type.
35873595
if (!memberType)
35883596
memberType = member->getInterfaceType();

test/decl/var/property_wrappers.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,3 +1504,18 @@ struct AllCompositionsStruct {
15041504
}
15051505
}
15061506

1507+
// rdar://problem/54184846 - crash while trying to retrieve wrapper info on l-value base type
1508+
func test_missing_method_with_lvalue_base() {
1509+
@propertyWrapper
1510+
struct Ref<T> {
1511+
var wrappedValue: T
1512+
}
1513+
1514+
struct S<T> where T: RandomAccessCollection, T.Element: Equatable {
1515+
@Ref var v: T.Element
1516+
1517+
init(items: T, v: Ref<T.Element>) {
1518+
self.v.binding = v // expected-error {{value of type 'T.Element' has no member 'binding'}}
1519+
}
1520+
}
1521+
}

0 commit comments

Comments
 (0)