Skip to content

Commit 1d6d7f7

Browse files
committed
Filter bad attrs out of module interface @abis
When printing an `@abi` attribute’s decl, we now filter out any attrs that are not valid in that position. Fixes a broken test.
1 parent 54d891a commit 1d6d7f7

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

include/swift/AST/AttrKind.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ enum class DeclAttrKind : unsigned {
145145
#include "swift/AST/DeclAttr.def"
146146
};
147147

148+
StringRef getDeclAttrKindID(DeclAttrKind kind);
149+
148150
enum : unsigned {
149151
NumDeclAttrKinds = static_cast<unsigned>(DeclAttrKind::Last_DeclAttr) + 1,
150152
NumDeclAttrKindBits = countBitsUsed(NumDeclAttrKinds - 1),

lib/AST/Attr.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ static_assert(IsTriviallyDestructible<DeclAttributes>::value,
6868
static_assert(TypeAttrKind::Id <= TypeAttrKind::Last_TypeAttr);
6969
#include "swift/AST/TypeAttr.def"
7070

71+
LLVM_ATTRIBUTE_USED StringRef swift::getDeclAttrKindID(DeclAttrKind kind) {
72+
switch (kind) {
73+
#define DECL_ATTR(_, CLASS, ...) \
74+
case DeclAttrKind::CLASS: \
75+
return #CLASS;
76+
#include "swift/AST/DeclAttr.def"
77+
}
78+
}
79+
7180
StringRef swift::getAccessLevelSpelling(AccessLevel value) {
7281
switch (value) {
7382
case AccessLevel::Private: return "private";
@@ -1676,8 +1685,24 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
16761685
abiDecl = cast<PatternBindingDecl>(abiDecl)
16771686
->getVarAtSimilarStructuralPosition(
16781687
const_cast<VarDecl *>(cast<VarDecl>(D)));
1679-
if (abiDecl)
1680-
abiDecl->print(Printer, Options);
1688+
if (abiDecl) {
1689+
auto optionsCopy = Options;
1690+
1691+
// Don't print any attributes marked with `ForbiddenInABIAttr`.
1692+
for (auto rawAttrKind : range(0, unsigned(DeclAttrKind::Last_DeclAttr))) {
1693+
DeclAttrKind attrKind{rawAttrKind};
1694+
if (!(DeclAttribute::getBehaviors(attrKind)
1695+
& DeclAttribute::ForbiddenInABIAttr))
1696+
continue;
1697+
1698+
if (attrKind == DeclAttrKind::AccessControl)
1699+
optionsCopy.PrintAccess = false;
1700+
else
1701+
optionsCopy.ExcludeAttrList.push_back(attrKind);
1702+
}
1703+
1704+
abiDecl->print(Printer, optionsCopy);
1705+
}
16811706
Printer << ")";
16821707

16831708
break;
@@ -1742,7 +1767,7 @@ uint64_t DeclAttribute::getBehaviors(DeclAttrKind DK) {
17421767
return BEHAVIORS;
17431768
#include "swift/AST/DeclAttr.def"
17441769
}
1745-
llvm_unreachable("bad DeclAttrKind");
1770+
return 0;
17461771
}
17471772

17481773
std::optional<Feature> DeclAttribute::getRequiredFeature(DeclAttrKind DK) {

test/ModuleInterface/attrs.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@ internal func __specialize_someGenericFunction<T>(_ t: T) -> Int {
3535
fatalError("don't call")
3636
}
3737

38-
@abi(public func __abi__abiAttrOnFunction(param: Int))
38+
@abi(func __abi__abiAttrOnFunction(param: Int))
3939
public func abiAttrOnFunction(param: Int) {}
4040
// CHECK: #if {{.*}} $ABIAttribute
41-
// CHECK: @abi(public func __abi__abiAttrOnFunction(param: Swift.Int))
41+
// CHECK: @abi(func __abi__abiAttrOnFunction(param: Swift.Int))
4242
// CHECK: public func abiAttrOnFunction(param: Swift.Int)
4343
// CHECK: #else
4444
// CHECK: @_silgen_name("$s5attrs07__abi__B14AttrOnFunction5paramySi_tF")
4545
// CHECK: public func abiAttrOnFunction(param: Swift.Int)
4646
// CHECK: #endif
4747

48-
@abi(public let __abi__abiAttrOnVar: Int)
48+
@abi(let __abi__abiAttrOnVar: Int)
4949
public var abiAttrOnVar: Int = 42
5050
// CHECK: #if {{.*}} $ABIAttribute
51-
// CHECK: @abi(public var __abi__abiAttrOnVar: Swift.Int)
51+
// CHECK: @abi(var __abi__abiAttrOnVar: Swift.Int)
5252
// CHECK: public var abiAttrOnVar: Swift.Int
5353
// CHECK: #else
5454
// CHECK: @available(*, unavailable, message: "this compiler cannot match the ABI specified by the @abi attribute")

0 commit comments

Comments
 (0)