Skip to content

Commit 9d854d1

Browse files
authored
Merge pull request #42031 from tshortli/originally-defined-in-on-non-public-warn-once
Sema: Warn about `@_originallyDefinedIn` attributes on non-public decls at most once per attribute
2 parents 1601b20 + 5b7ae4c commit 9d854d1

File tree

4 files changed

+15
-12
lines changed

4 files changed

+15
-12
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,10 +1603,11 @@ NOTE(option_set_empty_set_init,none,
16031603
"use [] to silence this warning", ())
16041604

16051605
ERROR(originally_definedin_topleve_decl,none,
1606-
"@%0 is only applicable to top-level decl", (StringRef))
1606+
"'%0' is only applicable to top-level decl", (DeclAttribute))
16071607

16081608
ERROR(originally_definedin_must_not_before_available_version,none,
1609-
"symbols are moved to the current module before they were available in the OSs", (StringRef))
1609+
"symbols are moved to the current module before they were available in "
1610+
"the OSs", ())
16101611

16111612
// Alignment attribute
16121613
ERROR(alignment_not_power_of_two,none,

lib/Sema/TypeCheckAttr.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3483,13 +3483,12 @@ void AttributeChecker::checkOriginalDefinedInAttrs(
34833483
// Attrs are in the reverse order of the source order. We need to visit them
34843484
// in source order to diagnose the later attribute.
34853485
for (auto *Attr: Attrs) {
3486-
static StringRef AttrName = "_originallyDefinedIn";
3486+
if (!Attr->isActivePlatform(Ctx))
3487+
continue;
34873488

34883489
if (diagnoseAndRemoveAttrIfDeclIsNonPublic(Attr, /*isError=*/false))
34893490
continue;
34903491

3491-
if (!Attr->isActivePlatform(Ctx))
3492-
continue;
34933492
auto AtLoc = Attr->AtLoc;
34943493
auto Platform = Attr->Platform;
34953494
if (!seenPlatforms.insert({Platform, AtLoc}).second) {
@@ -3501,7 +3500,7 @@ void AttributeChecker::checkOriginalDefinedInAttrs(
35013500
return;
35023501
}
35033502
if (!D->getDeclContext()->isModuleScopeContext()) {
3504-
diagnose(AtLoc, diag::originally_definedin_topleve_decl, AttrName);
3503+
diagnose(AtLoc, diag::originally_definedin_topleve_decl, Attr);
35053504
return;
35063505
}
35073506

@@ -3511,8 +3510,7 @@ void AttributeChecker::checkOriginalDefinedInAttrs(
35113510
auto IntroVer = D->getIntroducedOSVersion(Platform);
35123511
if (IntroVer.getValue() > Attr->MovedVersion) {
35133512
diagnose(AtLoc,
3514-
diag::originally_definedin_must_not_before_available_version,
3515-
AttrName);
3513+
diag::originally_definedin_must_not_before_available_version);
35163514
return;
35173515
}
35183516
}

test/Parse/original_defined_in_attr.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,19 @@ public class ToplevelClass4 {
3434

3535
@available(OSX 13.10, *)
3636
@_originallyDefinedIn(module: "foo", OSX 13.13) // expected-warning {{'@_originallyDefinedIn' does not have any effect on internal declarations}}
37-
@_originallyDefinedIn(module: "foo", iOS 7.0) // expected-warning {{'@_originallyDefinedIn' does not have any effect on internal declarations}}
37+
@_originallyDefinedIn(module: "foo", iOS 7.0)
3838
internal class ToplevelClass5 {}
3939

4040
@available(OSX 13.10, *)
4141
@_originallyDefinedIn(module: "foo", OSX 13.13) // expected-warning {{'@_originallyDefinedIn' does not have any effect on private declarations}}
42-
@_originallyDefinedIn(module: "foo", iOS 7.0) // expected-warning {{'@_originallyDefinedIn' does not have any effect on private declarations}}
42+
@_originallyDefinedIn(module: "foo", iOS 7.0)
4343
private class ToplevelClass6 {}
4444

4545
@available(OSX 13.10, *)
4646
@_originallyDefinedIn(module: "foo", OSX 13.13) // expected-warning {{'@_originallyDefinedIn' does not have any effect on fileprivate declarations}}
47-
@_originallyDefinedIn(module: "foo", iOS 7.0) // expected-warning {{'@_originallyDefinedIn' does not have any effect on fileprivate declarations}}
47+
@_originallyDefinedIn(module: "foo", iOS 7.0)
4848
fileprivate class ToplevelClass7 {}
49+
50+
@available(OSX 13.10, *)
51+
@_originallyDefinedIn(module: "foo", OSX 13.13, iOS 7.0) // expected-warning {{'@_originallyDefinedIn' does not have any effect on internal declarations}}
52+
internal class ToplevelClass8 {}

test/Sema/diag_originally_definedin.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public func foo() {}
88
@available(macOS 10.13, *)
99
@_originallyDefinedIn(module: "original", OSX 10.12) // expected-error {{symbols are moved to the current module before they were available in the OSs}}
1010
public class C {
11-
@_originallyDefinedIn(module: "original", OSX 10.13) // expected-error {{@_originallyDefinedIn is only applicable to top-level decl}}
11+
@_originallyDefinedIn(module: "original", OSX 10.13) // expected-error {{'@_originallyDefinedIn' is only applicable to top-level decl}}
1212
public func foo() {}
1313
}
1414

0 commit comments

Comments
 (0)