Skip to content

Commit f036649

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
1 parent 773cd93 commit f036649

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>())
@@ -7525,18 +7525,23 @@ bool FailureDiagnosis::diagnoseMemberFailures(
75257525

75267526
// If this is a tuple, then the index needs to be valid.
75277527
if (auto tuple = baseObjTy->getAs<TupleType>()) {
7528-
StringRef nameStr = memberName.getBaseIdentifier().str();
7529-
int fieldIdx = -1;
7530-
// Resolve a number reference into the tuple type.
7531-
unsigned Value = 0;
7532-
if (!nameStr.getAsInteger(10, Value) && Value < tuple->getNumElements()) {
7533-
fieldIdx = Value;
7534-
} else {
7535-
fieldIdx = tuple->getNamedElementId(memberName.getBaseIdentifier());
7536-
}
7528+
auto baseName = memberName.getBaseName();
75377529

7538-
if (fieldIdx != -1)
7539-
return false; // Lookup is valid.
7530+
if (!baseName.isSpecial()) {
7531+
StringRef nameStr = baseName.userFacingName();
7532+
7533+
int fieldIdx = -1;
7534+
// Resolve a number reference into the tuple type.
7535+
unsigned Value = 0;
7536+
if (!nameStr.getAsInteger(10, Value) && Value < tuple->getNumElements()) {
7537+
fieldIdx = Value;
7538+
} else {
7539+
fieldIdx = tuple->getNamedElementId(memberName.getBaseIdentifier());
7540+
}
7541+
7542+
if (fieldIdx != -1)
7543+
return false; // Lookup is valid.
7544+
}
75407545

75417546
diagnose(BaseLoc, diag::could_not_find_tuple_member, baseObjTy, memberName)
75427547
.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)