Skip to content

Commit 717c59c

Browse files
committed
AST: Diagnose references to non-public declarations from default arguments of inlinable local functions
Part of <https://bugs.swift.org/browse/SR-12404>.
1 parent ec57300 commit 717c59c

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

lib/AST/DeclContext.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,13 @@ swift::FragileFunctionKindRequest::evaluate(Evaluator &evaluator,
348348
auto *VD = cast<ValueDecl>(dc->getAsDecl());
349349
assert(VD->hasParameterList());
350350

351+
if (VD->getDeclContext()->isLocalContext()) {
352+
auto kind = VD->getDeclContext()->getFragileFunctionKind();
353+
if (kind.kind != FragileFunctionKind::None)
354+
return {FragileFunctionKind::DefaultArgument,
355+
kind.allowUsableFromInline};
356+
}
357+
351358
auto effectiveAccess =
352359
VD->getFormalAccessScope(/*useDC=*/nullptr,
353360
/*treatUsableFromInlineAsPublic=*/true);

test/attr/attr_inlinable.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
// expected-warning@-1 {{'@inlinable' declaration is already '@usableFromInline'}}
1010

1111
private func privateFunction() {}
12-
// expected-note@-1{{global function 'privateFunction()' is not '@usableFromInline' or public}}
12+
// expected-note@-1 2{{global function 'privateFunction()' is not '@usableFromInline' or public}}
1313
fileprivate func fileprivateFunction() {}
1414
// expected-note@-1{{global function 'fileprivateFunction()' is not '@usableFromInline' or public}}
1515
func internalFunction() {}
16-
// expected-note@-1{{global function 'internalFunction()' is not '@usableFromInline' or public}}
16+
// expected-note@-1 2{{global function 'internalFunction()' is not '@usableFromInline' or public}}
1717
@usableFromInline func versionedFunction() {}
1818
public func publicFunction() {}
1919

@@ -306,3 +306,16 @@ public struct PrivateInlinableCrash {
306306
value ? "YES" : "NO"
307307
}
308308
}
309+
310+
// https://bugs.swift.org/browse/SR-12404
311+
@inlinable public func inlinableOuterFunction() {
312+
func innerFunction1(x: () = privateFunction()) {}
313+
// expected-error@-1 {{global function 'privateFunction()' is private and cannot be referenced from a default argument value}}
314+
315+
func innerFunction2(x: () = internalFunction()) {}
316+
// expected-error@-1 {{global function 'internalFunction()' is internal and cannot be referenced from a default argument value}}
317+
318+
func innerFunction3(x: () = versionedFunction()) {}
319+
320+
func innerFunction4(x: () = publicFunction()) {}
321+
}

0 commit comments

Comments
 (0)