Skip to content

Commit 4737212

Browse files
committedMar 18, 2024
[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 4737212

File tree

7 files changed

+39
-35
lines changed

7 files changed

+39
-35
lines changed
 

‎include/swift/AST/DiagnosticsParse.def

+1-1
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,7 @@ ERROR(platform_condition_expected_argument,none,
19451945
"expected argument to platform condition",
19461946
())
19471947
ERROR(platform_condition_expected_one_argument,none,
1948-
"expected only one argument to platform condition",
1948+
"expected only one unlabeled argument to platform condition",
19491949
())
19501950
ERROR(unsupported_platform_runtime_condition_argument,none,
19511951
"unexpected argument for the '_runtime' condition; "

‎lib/Parse/ParseIfConfig.cpp

+19-18
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,13 @@ 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+
SourceLoc DiagLoc = E->getArgs()->front().getStartLoc();
303+
assert(DiagLoc.isValid() && "parsed Argument should have a location");
304+
D.diagnose(DiagLoc, diag::platform_condition_expected_one_argument);
303305
}
304306
return nullptr;
305307
}
308+
SourceLoc ArgLoc = Arg->getStartLoc();
306309
// '_compiler_version' '(' string-literal ')'
307310
if (*KindName == "_compiler_version") {
308311
if (auto SLE = dyn_cast<StringLiteralExpr>(Arg)) {
@@ -331,7 +334,7 @@ class ValidateIfConfigCondition :
331334
: std::nullopt;
332335
if (!isValidPrefixUnaryOperator(PrefixName)) {
333336
D.diagnose(
334-
Arg->getLoc(), diag::unsupported_platform_condition_argument,
337+
ArgLoc, diag::unsupported_platform_condition_argument,
335338
"a unary comparison '>=' or '<'; for example, '>=2.2' or '<2.2'");
336339
return nullptr;
337340
}
@@ -352,7 +355,7 @@ class ValidateIfConfigCondition :
352355
}
353356

354357
if (!isModulePath(Arg)) {
355-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
358+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
356359
"module name");
357360
return nullptr;
358361
}
@@ -361,7 +364,7 @@ class ValidateIfConfigCondition :
361364

362365
if (*KindName == "hasFeature") {
363366
if (!getDeclRefStr(Arg, DeclRefKind::Ordinary)) {
364-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
367+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
365368
"feature name");
366369
return nullptr;
367370
}
@@ -371,7 +374,7 @@ class ValidateIfConfigCondition :
371374

372375
if (*KindName == "hasAttribute") {
373376
if (!getDeclRefStr(Arg, DeclRefKind::Ordinary)) {
374-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
377+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
375378
"attribute name");
376379
return nullptr;
377380
}
@@ -388,7 +391,7 @@ class ValidateIfConfigCondition :
388391

389392
auto ArgStr = getDeclRefStr(Arg, DeclRefKind::Ordinary);
390393
if (!ArgStr.has_value()) {
391-
D.diagnose(E->getLoc(), diag::unsupported_platform_condition_argument,
394+
D.diagnose(ArgLoc, diag::unsupported_platform_condition_argument,
392395
"identifier");
393396
return nullptr;
394397
}
@@ -399,7 +402,7 @@ class ValidateIfConfigCondition :
399402
suggestedKind, suggestedValues)) {
400403
if (Kind == PlatformConditionKind::Runtime) {
401404
// Error for _runtime()
402-
D.diagnose(Arg->getLoc(),
405+
D.diagnose(ArgLoc,
403406
diag::unsupported_platform_runtime_condition_argument);
404407
return nullptr;
405408
}
@@ -426,27 +429,25 @@ class ValidateIfConfigCondition :
426429
case PlatformConditionKind::Runtime:
427430
llvm_unreachable("handled above");
428431
}
429-
auto Loc = Arg->getLoc();
430-
D.diagnose(Loc, diag::unknown_platform_condition_argument,
431-
DiagName, *KindName);
432+
D.diagnose(ArgLoc, diag::unknown_platform_condition_argument, DiagName,
433+
*KindName);
432434
if (suggestedKind != *Kind) {
433435
auto suggestedKindName = getPlatformConditionName(suggestedKind);
434-
D.diagnose(Loc, diag::note_typo_candidate, suggestedKindName)
435-
.fixItReplace(E->getFn()->getSourceRange(), suggestedKindName);
436+
D.diagnose(ArgLoc, diag::note_typo_candidate, suggestedKindName)
437+
.fixItReplace(E->getFn()->getSourceRange(), suggestedKindName);
436438
}
437439
for (auto suggestion : suggestedValues)
438-
D.diagnose(Loc, diag::note_typo_candidate, suggestion)
439-
.fixItReplace(Arg->getSourceRange(), suggestion);
440+
D.diagnose(ArgLoc, diag::note_typo_candidate, suggestion)
441+
.fixItReplace(Arg->getSourceRange(), suggestion);
440442
}
441443
else if (!suggestedValues.empty()) {
442444
// The value the user gave has been replaced by something newer.
443445
assert(suggestedValues.size() == 1 && "only support one replacement");
444446
auto replacement = suggestedValues.front();
445447

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

452453
return E;

‎test/Parse/ConditionalCompilation/can_import_submodule.swift

+5-5
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
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

+9-6
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,13 @@ 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@:11 {{expected only one unlabeled 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@:11 {{expected only one unlabeled argument to platform condition}}
82+
#endif
83+
84+
#if swift(version: >=2.0) // expected-error@:11 {{expected only one unlabeled argument to platform condition}}
8285
#endif
8386

8487
protocol P {

‎test/Parse/upcoming_feature.swift

+1-1
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

+1-1
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)