Skip to content

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

Merged

Conversation

aschwaighofer
Copy link
Contributor

No description provided.

@aschwaighofer
Copy link
Contributor Author

@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>()) {
Copy link
Contributor

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

Copy link
Contributor Author

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
}

Copy link
Contributor Author

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

Copy link
Contributor

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.

Copy link
Contributor Author

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.

#24478

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants