Skip to content

Commit 918e5c8

Browse files
committed
Improve @objc name diagnostics with no SourceLocs
1 parent 380c641 commit 918e5c8

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

lib/Sema/TypeCheckAttr.cpp

+17-5
Original file line numberDiff line numberDiff line change
@@ -1030,9 +1030,15 @@ void AttributeChecker::visitObjCAttr(ObjCAttr *attr) {
10301030
// names. Complain and recover by chopping off everything
10311031
// after the first name.
10321032
if (objcName->getNumArgs() > 0) {
1033-
SourceLoc firstNameLoc = attr->getNameLocs().front();
1034-
SourceLoc afterFirstNameLoc =
1035-
Lexer::getLocForEndOfToken(Ctx.SourceMgr, firstNameLoc);
1033+
SourceLoc firstNameLoc, afterFirstNameLoc;
1034+
if (!attr->getNameLocs().empty()) {
1035+
firstNameLoc = attr->getNameLocs().front();
1036+
afterFirstNameLoc =
1037+
Lexer::getLocForEndOfToken(Ctx.SourceMgr, firstNameLoc);
1038+
}
1039+
else {
1040+
firstNameLoc = D->getLoc();
1041+
}
10361042
diagnose(firstNameLoc, diag::objc_name_req_nullary,
10371043
D->getDescriptiveKind())
10381044
.fixItRemoveChars(afterFirstNameLoc, attr->getRParenLoc())
@@ -1042,7 +1048,10 @@ void AttributeChecker::visitObjCAttr(ObjCAttr *attr) {
10421048
/*implicit=*/false);
10431049
}
10441050
} else if (isa<SubscriptDecl>(D) || isa<DestructorDecl>(D)) {
1045-
diagnose(attr->getLParenLoc(),
1051+
SourceLoc diagLoc = attr->getLParenLoc();
1052+
if (diagLoc.isInvalid())
1053+
diagLoc = D->getLoc();
1054+
diagnose(diagLoc,
10461055
isa<SubscriptDecl>(D)
10471056
? diag::objc_name_subscript
10481057
: diag::objc_name_deinit)
@@ -1074,7 +1083,10 @@ void AttributeChecker::visitObjCAttr(ObjCAttr *attr) {
10741083

10751084
unsigned numArgumentNames = objcName->getNumArgs();
10761085
if (numArgumentNames != numParameters) {
1077-
diagnose(attr->getNameLocs().front(),
1086+
SourceLoc firstNameLoc = func->getLoc();
1087+
if (!attr->getNameLocs().empty())
1088+
firstNameLoc = attr->getNameLocs().front();
1089+
diagnose(firstNameLoc,
10781090
diag::objc_name_func_mismatch,
10791091
isa<FuncDecl>(func),
10801092
numArgumentNames,

lib/Sema/TypeCheckDeclObjC.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -1663,11 +1663,16 @@ static ObjCSelector inferObjCName(ValueDecl *decl) {
16631663
*attr->getName() != overriddenNameAsSel) {
16641664
// If the user explicitly wrote the wrong name, complain.
16651665
if (!attr->isNameImplicit()) {
1666-
ctx.Diags.diagnose(attr->AtLoc,
1666+
SourceLoc diagLoc = attr->AtLoc, firstNameLoc;
1667+
if (diagLoc.isInvalid())
1668+
diagLoc = decl->getLoc();
1669+
if (!attr->getNameLocs().empty())
1670+
firstNameLoc = attr->getNameLocs().front();
1671+
ctx.Diags.diagnose(diagLoc,
16671672
diag::objc_override_property_name_mismatch,
16681673
attr->getName()->getSelectorPieces()[0],
16691674
overriddenName)
1670-
.fixItReplaceChars(attr->getNameLocs().front(),
1675+
.fixItReplaceChars(firstNameLoc,
16711676
attr->getRParenLoc(),
16721677
overriddenName.str());
16731678
overridden->diagnose(diag::overridden_here);

0 commit comments

Comments
 (0)