Skip to content

Commit 16a509e

Browse files
committed
[Parse] Adjust diagnostic location for platform condition arguments
Previously, diagnostics for arguments of platform conditions (e.g. 'os(macOS)') used to point the condition name position instead of the argument position. Adjust the position to the start of the argument. rdar://124160048
1 parent 5806e7a commit 16a509e

File tree

6 files changed

+34
-34
lines changed

6 files changed

+34
-34
lines changed

lib/Parse/ParseIfConfig.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,12 @@ class ValidateIfConfigCondition :
299299
if (E->getArgs()->empty()) {
300300
D.diagnose(E->getLoc(), diag::platform_condition_expected_argument);
301301
} else {
302-
D.diagnose(E->getLoc(), diag::platform_condition_expected_one_argument);
302+
D.diagnose(E->getArgs()->get(1).getStartLoc(),
303+
diag::platform_condition_expected_one_argument);
303304
}
304305
return nullptr;
305306
}
307+
SourceLoc ArgLoc = Arg->getStartLoc();
306308
// '_compiler_version' '(' string-literal ')'
307309
if (*KindName == "_compiler_version") {
308310
if (auto SLE = dyn_cast<StringLiteralExpr>(Arg)) {
@@ -331,7 +333,7 @@ class ValidateIfConfigCondition :
331333
: std::nullopt;
332334
if (!isValidPrefixUnaryOperator(PrefixName)) {
333335
D.diagnose(
334-
Arg->getLoc(), diag::unsupported_platform_condition_argument,
336+
ArgLoc, diag::unsupported_platform_condition_argument,
335337
"a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'");
336338
return nullptr;
337339
}
@@ -352,7 +354,7 @@ class ValidateIfConfigCondition :
352354
}
353355

354356
if (!isModulePath(Arg)) {
355-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
357+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
356358
"module name");
357359
return nullptr;
358360
}
@@ -361,7 +363,7 @@ class ValidateIfConfigCondition :
361363

362364
if (*KindName == "hasFeature") {
363365
if (!getDeclRefStr(Arg, DeclRefKind::Ordinary)) {
364-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
366+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
365367
"feature name");
366368
return nullptr;
367369
}
@@ -371,7 +373,7 @@ class ValidateIfConfigCondition :
371373

372374
if (*KindName == "hasAttribute") {
373375
if (!getDeclRefStr(Arg, DeclRefKind::Ordinary)) {
374-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
376+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
375377
"attribute name");
376378
return nullptr;
377379
}
@@ -388,7 +390,7 @@ class ValidateIfConfigCondition :
388390

389391
auto ArgStr = getDeclRefStr(Arg, DeclRefKind::Ordinary);
390392
if (!ArgStr.has_value()) {
391-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
393+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
392394
"identifier");
393395
return nullptr;
394396
}
@@ -399,7 +401,7 @@ class ValidateIfConfigCondition :
399401
suggestedKind, suggestedValues)) {
400402
if (Kind == PlatformConditionKind::Runtime) {
401403
// Error for _runtime()
402-
D.diagnose(Arg->getLoc(),
404+
D.diagnose(ArgLoc,
403405
diag::unsupported_platform_runtime_condition_argument);
404406
return nullptr;
405407
}
@@ -426,27 +428,25 @@ class ValidateIfConfigCondition :
426428
case PlatformConditionKind::Runtime:
427429
llvm_unreachable("handled above");
428430
}
429-
auto Loc = Arg->getLoc();
430-
D.diagnose(Loc, diag::unknown_platform_condition_argument,
431-
DiagName, *KindName);
431+
D.diagnose(ArgLoc, diag::unknown_platform_condition_argument, DiagName,
432+
*KindName);
432433
if (suggestedKind != *Kind) {
433434
auto suggestedKindName = getPlatformConditionName(suggestedKind);
434-
D.diagnose(Loc, diag::note_typo_candidate, suggestedKindName)
435-
.fixItReplace(E->getFn()->getSourceRange(), suggestedKindName);
435+
D.diagnose(ArgLoc, diag::note_typo_candidate, suggestedKindName)
436+
.fixItReplace(E->getFn()->getSourceRange(), suggestedKindName);
436437
}
437438
for (auto suggestion : suggestedValues)
438-
D.diagnose(Loc, diag::note_typo_candidate, suggestion)
439-
.fixItReplace(Arg->getSourceRange(), suggestion);
439+
D.diagnose(ArgLoc, diag::note_typo_candidate, suggestion)
440+
.fixItReplace(Arg->getSourceRange(), suggestion);
440441
}
441442
else if (!suggestedValues.empty()) {
442443
// The value the user gave has been replaced by something newer.
443444
assert(suggestedValues.size() == 1 && "only support one replacement");
444445
auto replacement = suggestedValues.front();
445446

446-
auto Loc = Arg->getLoc();
447-
D.diagnose(Loc, diag::renamed_platform_condition_argument,
448-
*ArgStr, replacement)
449-
.fixItReplace(Arg->getSourceRange(), replacement);
447+
D.diagnose(ArgLoc, diag::renamed_platform_condition_argument, *ArgStr,
448+
replacement)
449+
.fixItReplace(Arg->getSourceRange(), replacement);
450450
}
451451

452452
return E;

test/Parse/ConditionalCompilation/can_import_submodule.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,17 @@ import A.B.C
4848
#endif
4949

5050

51-
#if canImport(A(_:).B) // expected-error {{unexpected platform condition argument: expected module name}}
51+
#if canImport(A(_:).B) // expected-error@:15 {{unexpected platform condition argument: expected module name}}
5252
#endif
5353

54-
#if canImport(A.B(c: "arg")) // expected-error {{unexpected platform condition argument: expected module name}}
54+
#if canImport(A.B(c: "arg")) // expected-error@:15 {{unexpected platform condition argument: expected module name}}
5555
#endif
5656

57-
#if canImport(A(b: 1, c: 2).B.C) // expected-error {{unexpected platform condition argument: expected module name}}
57+
#if canImport(A(b: 1, c: 2).B.C) // expected-error@:15 {{unexpected platform condition argument: expected module name}}
5858
#endif
5959

60-
#if canImport(A.B("arg")(3).C) // expected-error {{unexpected platform condition argument: expected module name}}
60+
#if canImport(A.B("arg")(3).C) // expected-error@:15 {{unexpected platform condition argument: expected module name}}
6161
#endif
6262

63-
#if canImport(A.B.C()) // expected-error {{unexpected platform condition argument: expected module name}}
63+
#if canImport(A.B.C()) // expected-error@:15 {{unexpected platform condition argument: expected module name}}
6464
#endif
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// RUN: %target-typecheck-verify-swift -swift-version 4
22

33
/// Reject compound names.
4-
#if BAR(_:) // expected-error {{invalid conditional compilation expression}}
5-
#elseif os(x:)(macOS) // expected-error {{unexpected platform condition (expected 'os', 'arch', or 'swift')}}
6-
#elseif os(Linux(foo:bar:)) // expected-error {{unexpected platform condition argument: expected identifier}}
4+
#if BAR(_:) // expected-error@:5 {{invalid conditional compilation expression}}
5+
#elseif os(x:)(macOS) // expected-error@:9 {{unexpected platform condition (expected 'os', 'arch', or 'swift')}}
6+
#elseif os(Linux(foo:bar:)) // expected-error@:12 {{unexpected platform condition argument: expected identifier}}
77
#endif

test/Parse/ConditionalCompilation/language_version.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,16 @@
5353
%#^*&
5454
#endif
5555

56-
#if swift(">=7.1") // expected-error {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
56+
#if swift(">=7.1") // expected-error@:11 {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
5757
#endif
5858

59-
#if swift("<7.1") // expected-error {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
59+
#if swift("<7.1") // expected-error@:11 {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
6060
#endif
6161

62-
#if swift(">=2n.2") // expected-error {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
62+
#if swift(">=2n.2") // expected-error@:11 {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
6363
#endif
6464

65-
#if swift("") // expected-error {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
65+
#if swift("") // expected-error@:11 {{unexpected platform condition argument: expected a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'}}
6666
#endif
6767

6868
#if swift(>=2.2.1)
@@ -75,10 +75,10 @@ class C {
7575
#endif
7676
}
7777

78-
#if swift(>=2.0, *) // expected-error {{expected only one argument to platform condition}}
78+
#if swift(>=2.0, *) // expected-error@:18 {{expected only one argument to platform condition}}
7979
#endif
8080

81-
#if swift(>=, 2.0) // expected-error {{expected only one argument to platform condition}}
81+
#if swift(>=, 2.0) // expected-error@:15 {{expected only one argument to platform condition}}
8282
#endif
8383

8484
protocol P {

test/Parse/upcoming_feature.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %target-typecheck-verify-swift
22

3-
// expected-error@+1{{unexpected platform condition argument: expected feature name}}
3+
// expected-error@+1:16{{unexpected platform condition argument: expected feature name}}
44
#if hasFeature(17)
55
#endif

test/attr/has_attribute.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ UserInaccessibleAreNotAttributes
2121
#endif
2222

2323
#if hasAttribute(17)
24-
// expected-error@-1{{unexpected platform condition argument: expected attribute name}}
24+
// expected-error@-1:18 {{unexpected platform condition argument: expected attribute name}}
2525
#endif

0 commit comments

Comments
 (0)