Skip to content

Commit 9acad62

Browse files
authored
Merge pull request swiftlang#26629 from xedin/rdar-54184846-5.1
[5.1][Diagnostics] Don't crash when gathering info about property wrapper …
2 parents 3adad62 + b483549 commit 9acad62

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

lib/AST/Type.cpp

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

35653565
Type TypeBase::getTypeOfMember(ModuleDecl *module, const ValueDecl *member,
35663566
Type memberType) {
3567+
if (is<ErrorType>())
3568+
return ErrorType::get(getASTContext());
3569+
3570+
if (auto *lvalue = getAs<LValueType>()) {
3571+
auto objectTy = lvalue->getObjectType();
3572+
return objectTy->getTypeOfMember(module, member, memberType);
3573+
}
3574+
35673575
// If no member type was provided, use the member's type.
35683576
if (!memberType)
35693577
memberType = member->getInterfaceType();

test/decl/var/property_wrappers.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,3 +1164,19 @@ struct SR_11381_W<T> {
11641164
struct SR_11381_S {
11651165
@SR_11381_W var foo: Int = nil // expected-error {{'nil' requires a contextual type}}
11661166
}
1167+
1168+
// rdar://problem/54184846 - crash while trying to retrieve wrapper info on l-value base type
1169+
func test_missing_method_with_lvalue_base() {
1170+
@propertyWrapper
1171+
struct Ref<T> {
1172+
var wrappedValue: T
1173+
}
1174+
1175+
struct S<T> where T: RandomAccessCollection, T.Element: Equatable {
1176+
@Ref var v: T.Element
1177+
1178+
init(items: T, v: Ref<T.Element>) {
1179+
self.v.binding = v // expected-error {{value of type 'T.Element' has no member 'binding'}}
1180+
}
1181+
}
1182+
}

0 commit comments

Comments
 (0)