Skip to content

Commit b6ef72c

Browse files
committed
[Diagnostics] Check member name kind before trying to get its identifier
Declarations with special names (e.g. (de-)init and subscript) don't have identifiers so while trying to diagnose specific problems related to members check if they have a kind appropriate to the situation. Resolves: rdar://problem/39514009 (cherry picked from commit f036649)
1 parent 641e9e9 commit b6ef72c

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

lib/Sema/CSDiag.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,7 +1333,7 @@ diagnoseTypeMemberOnInstanceLookup(Type baseObjTy,
13331333
static DeclName
13341334
findCorrectEnumCaseName(Type Ty, TypoCorrectionResults &corrections,
13351335
DeclName memberName) {
1336-
if (!memberName.isSimpleName())
1336+
if (memberName.isSpecial() || !memberName.isSimpleName())
13371337
return DeclName();
13381338
if (!Ty->is<EnumType>() &&
13391339
!Ty->is<BoundGenericEnumType>())
@@ -7562,18 +7562,23 @@ bool FailureDiagnosis::diagnoseMemberFailures(
75627562

75637563
// If this is a tuple, then the index needs to be valid.
75647564
if (auto tuple = baseObjTy->getAs<TupleType>()) {
7565-
StringRef nameStr = memberName.getBaseIdentifier().str();
7566-
int fieldIdx = -1;
7567-
// Resolve a number reference into the tuple type.
7568-
unsigned Value = 0;
7569-
if (!nameStr.getAsInteger(10, Value) && Value < tuple->getNumElements()) {
7570-
fieldIdx = Value;
7571-
} else {
7572-
fieldIdx = tuple->getNamedElementId(memberName.getBaseIdentifier());
7573-
}
7565+
auto baseName = memberName.getBaseName();
75747566

7575-
if (fieldIdx != -1)
7576-
return false; // Lookup is valid.
7567+
if (!baseName.isSpecial()) {
7568+
StringRef nameStr = baseName.userFacingName();
7569+
7570+
int fieldIdx = -1;
7571+
// Resolve a number reference into the tuple type.
7572+
unsigned Value = 0;
7573+
if (!nameStr.getAsInteger(10, Value) && Value < tuple->getNumElements()) {
7574+
fieldIdx = Value;
7575+
} else {
7576+
fieldIdx = tuple->getNamedElementId(memberName.getBaseIdentifier());
7577+
}
7578+
7579+
if (fieldIdx != -1)
7580+
return false; // Lookup is valid.
7581+
}
75777582

75787583
diagnose(BaseLoc, diag::could_not_find_tuple_member, baseObjTy, memberName)
75797584
.highlight(memberRange);

test/Constraints/members.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,6 @@ struct Outer {
463463
}
464464
}
465465
}
466+
467+
// rdar://problem/39514009 - don't crash when trying to diagnose members with special names
468+
print("hello")[0] // expected-error {{value of tuple type '()' has no member 'subscript'}}

0 commit comments

Comments
 (0)