Skip to content

Commit 025c699

Browse files
authored
Merge pull request #72419 from rintaro/6.0-parse-ifconfig-argdiag-rdar124160048
[6.0][Parse] Adjust diagnostic location for platform condition arguments
2 parents c4e726a + 73c0560 commit 025c699

File tree

7 files changed

+39
-35
lines changed

7 files changed

+39
-35
lines changed

include/swift/AST/DiagnosticsParse.def

Lines changed: 1 addition & 1 deletion
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

Lines changed: 19 additions & 18 deletions
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

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: 9 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,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

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)