Skip to content

Commit 63be84a

Browse files
committed
Inherit override in @abi
ABI-only decls will now inherit `override` from their API counterpart; the keyword is unnecessary and `getOverriddenDecls()` will get the ABI counterparts of the decls the API counterpart overrides. No tests because we don’t have the enforcement mechanism in yet.
1 parent e88b99a commit 63be84a

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2098,7 +2098,8 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
20982098
if (!override->getAttrs().hasAttribute<OverrideAttr>() &&
20992099
overrideRequiresKeyword(base) != OverrideRequiresKeyword::Never &&
21002100
!override->isImplicit() &&
2101-
override->getDeclContext()->getParentSourceFile()) {
2101+
override->getDeclContext()->getParentSourceFile() &&
2102+
ABIRoleInfo(override).providesAPI()) {
21022103
auto theDiag =
21032104
overrideRequiresKeyword(base) == OverrideRequiresKeyword::Always
21042105
? diag::missing_override
@@ -2513,6 +2514,19 @@ computeOverriddenDecls(ValueDecl *decl, bool ignoreMissingImports) {
25132514

25142515
llvm::TinyPtrVector<ValueDecl *>
25152516
OverriddenDeclsRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
2517+
auto abiRole = ABIRoleInfo(decl);
2518+
if (!abiRole.providesAPI() && abiRole.getCounterpart()) {
2519+
auto apiOverriddenDecls = abiRole.getCounterpart()->getOverriddenDecls();
2520+
2521+
TinyPtrVector<ValueDecl *> abiOverriddenDecls;
2522+
for (auto apiOverriddenDecl : apiOverriddenDecls) {
2523+
auto abiOverriddenDecl = ABIRoleInfo(apiOverriddenDecl).getCounterpart();
2524+
abiOverriddenDecls.push_back(abiOverriddenDecl);
2525+
}
2526+
2527+
return abiOverriddenDecls;
2528+
}
2529+
25162530
auto &ctx = decl->getASTContext();
25172531
auto overridden = computeOverriddenDecls(decl, false);
25182532

0 commit comments

Comments
 (0)