Skip to content
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

Restore pre-3.3.2 behavior of inline implicit def #19877

Merged
merged 1 commit into from
Mar 5, 2024

Conversation

smarter
Copy link
Member

@smarter smarter commented Mar 5, 2024

inline implicit def is not really a supported feature since it combines Scala 3's inline with Scala 2's implicit where the latter should eventually be deprecated. This however didn't prevent at least one project from using this combination in a way that was broken by #18249, see #19862 for the details.

The issue is that when definining:

implicit def foo(x: A): B = ...

Then foo is a valid implicit search candidate when looking up an implicit Function1[A, B]. However, before #18249 if instead we wrote:

inline implicit def foo(x: A): B = ...

Then foo would be considered as an implicit search candidate but discarded because eta-expansion was disabled.

There is no particular reason for inline implicit def to behave differently from implicit def here, but since implicit def is a legacy feature and since Scala 3.3 is an LTS release, we choose to restore the pre-#18249 behavior for compatibility reasons.

Fixes #19862.

`inline implicit def` is not really a supported feature since it combines Scala
3's `inline` with Scala 2's `implicit` where the latter should eventually be
deprecated. This however didn't prevent at least one project from using this
combination in a way that was broken by scala#18249, see scala#19862 for the details.

The issue is that when definining:

    implicit def foo(x: A): B = ...

Then `foo` is a valid implicit search candidate when looking up an implicit
`Function1[A, B]`. However, before scala#18249 if instead we wrote:

    inline implicit def foo(x: A): B = ...

Then `foo` would be considered as an implicit search candidate but discarded
because eta-expansion was disabled.

There is no particular reason for `inline implicit def` to behave differently
from `implicit def` here, but since `implicit def` is a legacy feature and since
Scala 3.3 is an LTS release, we choose to restore the pre-scala#18249 behavior for
compatibility reasons.

Fixes scala#19862.
@smarter smarter added the backport:nominated If we agree to backport this PR, replace this tag with "backport:accepted", otherwise delete it. label Mar 5, 2024
@nicolasstucki nicolasstucki merged commit abdd36f into scala:main Mar 5, 2024
19 checks passed
@nicolasstucki nicolasstucki deleted the inline-implicit branch March 5, 2024 08:32
@Kordyjan Kordyjan added this to the 3.4.2 milestone Mar 28, 2024
WojciechMazur added a commit that referenced this pull request Jul 3, 2024
…#20975)

Backports #19877 to the LTS branch.

PR submitted by the release tooling.
[skip ci]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:nominated If we agree to backport this PR, replace this tag with "backport:accepted", otherwise delete it.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Regression: inline implicit conversion get called when unnecessary
3 participants