-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Fix circular dependency between SIL and AST libraries #24443
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix circular dependency between SIL and AST libraries #24443
Conversation
@swift-ci Please smoke test |
|
||
// Allow replacement of opaque result types of inlineable function regardless | ||
// of resilience and in which context. | ||
if (namingDecl->getAttrs().hasAttribute<InlinableAttr>()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be namingDecl->getResilienceExpansion() == ResilienceExpansion::Minimal to correctly handle functions nested inside inlinable functions, accessors of inlinable properties ,etc
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am confused.
I thought I have to look at the resilience expansion of the context (the function in which I perform the substitution). This happens on the next lines.
The namingDecl is the decl that has the opaque result type. If the namingDecl function is inlinable and from a different resilient module it should still be okay to replace the result type.
ResilientModule.swift
struct ResilientStruct {
@inlineable
func namingDecl() -> some P {
return Int64(1)
}
}
ContextModule.swift
func context() {
let r = ResilientStruct()
let opaque = r.namingDecl() // Okay to specialize to Int64 here
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here are the rules I have currently implemented (or believe to have implemented ;-) :
- if the function with the opaque result type is inline-able allow substitution
(see example above) - if the context function in which we perform substitution has maximal resilience expansion and the context function and the opaque type's function are in the same module allow substitution
- if the opaque types's module is not resilient allow substitution
- otherwise disallow substitution
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry about the confusion. The right way to check if namingDecl is inlineable is "namingDecl->getResilienceExpansion() == ResilienceExpansion::Minimal ". You should never check for the presence of InlineableAttr directly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah. Okay. Now I got it. Makes sense.
No description provided.