Skip to content

Commit 7e1ba87

Browse files
committed
ClangImporter: Import clang::DomainAvailabilityAttr.
Import `__attribute__((availability(domain:MyDomain, ...)))` as `@available(SomeDomain, ...)`. Resolves rdar://138441266.
1 parent 540c026 commit 7e1ba87

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

lib/ClangImporter/ImportDecl.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -9186,6 +9186,34 @@ void ClangImporter::Implementation::importAttributes(
91869186
MappedDecl->getAttrs().add(AvAttr);
91879187
}
91889188

9189+
// __attribute__((availability(domain:)))
9190+
//
9191+
if (auto avail = dyn_cast<clang::DomainAvailabilityAttr>(*AI)) {
9192+
auto *declContext = MappedDecl->getInnermostDeclContext();
9193+
9194+
// FIXME: [availability] Don't look up the availability domain. Clang
9195+
// should be serializing the resolved VarDecl for the availability domain
9196+
// it found when type checking the attribute.
9197+
auto domainIdentifier = SwiftContext.getIdentifier(avail->getDomain());
9198+
llvm::SmallVector<AvailabilityDomain, 4> results;
9199+
declContext->lookupAvailabilityDomains(domainIdentifier, results);
9200+
9201+
if (results.size() > 0) {
9202+
// FIXME: [availability] Diagnose ambiguous availabilty domain name?
9203+
auto AttrKind = avail->getUnavailable()
9204+
? AvailableAttr::Kind::Unavailable
9205+
: AvailableAttr::Kind::Default;
9206+
9207+
auto avAttr = new (C) AvailableAttr(
9208+
SourceLoc(), SourceRange(), results.front(), SourceLoc(), AttrKind,
9209+
/*Message=*/"", /*Rename=*/"", /*Introduced=*/{}, SourceRange(),
9210+
/*Deprecated=*/{}, SourceRange(), /*Obsoleted=*/{}, SourceRange(),
9211+
/*Implicit=*/false, /*IsSPI=*/false);
9212+
9213+
MappedDecl->getAttrs().add(avAttr);
9214+
}
9215+
}
9216+
91899217
// __attribute__((swift_attr("attribute"))) are handled by
91909218
// importSwiftAttrAttributes(). Other attributes are ignored.
91919219
}

test/ClangImporter/Inputs/availability_custom_domains_other.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ func availableInArctic() { }
77
func availableInMediterranean() { }
88

99
func testOtherClangDecls() {
10-
available_in_baltic()
10+
available_in_baltic() // expected-error {{'available_in_baltic()' is only available in Baltic}}
1111
}

test/ClangImporter/availability_custom_domains.swift

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
import Oceans // re-exports Rivers
1010

1111
func testClangDecls() {
12-
// FIXME: [availability] These references should be diagnosed as unavailable
13-
available_in_arctic()
14-
unavailable_in_pacific()
15-
available_in_colorado_river_delta()
16-
available_in_colorado()
12+
available_in_arctic() // expected-error {{'available_in_arctic()' is only available in Arctic}}
13+
unavailable_in_pacific() // expected-error {{'unavailable_in_pacific()' is unavailable}}
14+
available_in_colorado_river_delta() // expected-error {{'available_in_colorado_river_delta()' is only available in Pacific}}
15+
available_in_colorado() // expected-error {{'available_in_colorado()' is only available in Colorado}}
1716
available_in_baltic() // expected-error {{cannot find 'available_in_baltic' in scope}}
1817
}
1918

0 commit comments

Comments
 (0)