Skip to content

False positive "unused implicit parameter" warning in Scala 3.7.0 #23175

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

Closed
CJSmith-0141 opened this issue May 16, 2025 · 1 comment
Closed

Comments

@CJSmith-0141
Copy link

Compiler version

3.7.0

Minimized code

//> using scala 3.7.0

//> using scalacOption -Werror
//> using scalacOption -Wunused:explicits
//> using scalacOption -Wunused:imports
//> using scalacOption -Wunused:locals
//> using scalacOption -Wunused:params
//> using scalacOption -Wunused:privates
//> using scalacOption -Wvalue-discard

trait HaveThis[F[_]]
trait AndThat[F[_]]

trait SomeTrait[F[_]]:
  def withUsingParams(using HaveThis[F], AndThat[F]): F[Unit]

class MyImpl() extends SomeTrait[Option]:
  override def withUsingParams(using HaveThis[Option], AndThat[Option]): Option[Unit] = Some(())

Output

❯ scala-cli compile Myscript.scala
Compiling project (Scala 3.7.0, JVM (21))
[error] ./Myscript.scala:18:38
[error] unused implicit parameter
[error]   override def withUsingParams(using HaveThis[Option], AndThat[Option]): Option[Unit] = Some(())
[error]                                      ^
[error] ./Myscript.scala:18:56
[error] unused implicit parameter
[error]   override def withUsingParams(using HaveThis[Option], AndThat[Option]): Option[Unit] = Some(())
[error]                                                        ^
Error compiling project (Scala 3.7.0, JVM (21))

Expectation

It is obvious from looking at this code that these implicit parameters are not getting used, but if you remove them you are no longer implementing the trait. I can get around this by naming the param and adding unused, but this feels like it shouldn't be needed.

//> using scala 3.7.0

//> using scalacOption -Werror
//> using scalacOption -Wunused:explicits
//> using scalacOption -Wunused:imports
//> using scalacOption -Wunused:locals
//> using scalacOption -Wunused:params
//> using scalacOption -Wunused:privates
//> using scalacOption -Wvalue-discard
import scala.annotation.unused

trait HaveThis[F[_]]
trait AndThat[F[_]]

trait SomeTrait[F[_]]:
  def withUsingParams(using HaveThis[F], AndThat[F]): F[Unit]

class MyStubImpl() extends SomeTrait[Option]:
  override def withUsingParams(using
      @unused a: HaveThis[Option],
      @unused b: AndThat[Option]
  ): Option[Unit] = Some(())
@CJSmith-0141 CJSmith-0141 added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels May 16, 2025
@som-snytt
Copy link
Contributor

The heuristic for overrides was restored. Also marker traits are excluded, so I verified this does not warn:

//> using scala 3.7.1-RC1
//> using options -Wall

trait HaveThis[F[_]]:
  def thing1: Nothing
trait AndThat[F[_]]:
  def thing2: Nothing

trait SomeTrait[F[_]]:
  def withUsingParams(using HaveThis[F], AndThat[F]): F[Unit]

class MyImpl() extends SomeTrait[Option]:
  override def withUsingParams(using HaveThis[Option], AndThat[Option]): Option[Unit] = Some(())

trait Another:
  this: SomeTrait[Option] =>
  override def withUsingParams(using HaveThis[Option], AndThat[Option]): Option[Unit] = None

@som-snytt som-snytt added stat:duplicate and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels May 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants