Skip to content

Commit ee34fc0

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 598a1cd commit ee34fc0

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
@@ -2097,7 +2097,8 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
20972097
if (!override->getAttrs().hasAttribute<OverrideAttr>() &&
20982098
overrideRequiresKeyword(base) != OverrideRequiresKeyword::Never &&
20992099
!override->isImplicit() &&
2100-
override->getDeclContext()->getParentSourceFile()) {
2100+
override->getDeclContext()->getParentSourceFile() &&
2101+
ABIRoleInfo(override).providesAPI()) {
21012102
auto theDiag =
21022103
overrideRequiresKeyword(base) == OverrideRequiresKeyword::Always
21032104
? diag::missing_override
@@ -2512,6 +2513,19 @@ computeOverriddenDecls(ValueDecl *decl, bool ignoreMissingImports) {
25122513

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

0 commit comments

Comments
 (0)