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

inferMethodAlternative (and friends) can produce lots of silent errors that call expensive string ops #6149

Open
scabug opened this issue Jul 27, 2012 · 4 comments

Comments

@scabug
Copy link

scabug commented Jul 27, 2012

Revealed by Tiark for Scala virtualized but the mechanism for filtering-out alternatives has been doing that for some time now in standard scala (also 2.9.x).
They have to deal with lots of overloaded methods that contain non-trivial types. In order to emit error, which only purpose is basically to say that an alternative is invalid, we call applyErrorMsg that can be expensive for those types.

We need to make error message generation lazy but this is not trivial because the context could be different and hence the message might be inconsistent later.

@scabug
Copy link
Author

scabug commented Jul 27, 2012

Imported From: https://issues.scala-lang.org/browse/SI-6149?orig=1
Reporter: @hubertp

@scabug
Copy link
Author

scabug commented Aug 6, 2012

@hubertp said (edited on Aug 6, 2012 3:32:35 PM UTC):
This is actually worse than I thought:

object ImplicitAmbiguity {

  class N[T]
  class NC[T] extends N[T]
  class ND[T] extends N[T]
  class NE[T] extends N[T]
  class NF[T] extends N[T]

  class AA[A]
  class BB[A]

  class Foo

  implicit def conv1(i: Float) = new NC[Float]
  implicit def conv2(i: Float) = new NF[Float]
  implicit def conv3(op: AA[String]) = new N[String]
  implicit def conv4(op: AA[Float]) = new N[Float]
  implicit def conv5(op: AA[Foo]) = new N[Foo]

  implicit def conv6(e: BB[String]) = new N[String]

  def aFunc[A](a: NC[A]) = new AA[A]

  def aFunc[A](a: NF[A]) = new AA[Float]

  def aFunc[A](a: ND[A]) = new BB[A]

  def aFunc[A](a: NE[A]) = new BB[A]

  def bFunc[T](e1: N[T]) = {}
  
  // OK
  def bar02 {
    bFunc(aFunc(4F))
  }
}

-Ydebug will reveal that we do that all the time, even when the code compiles.

[running phase namer on longerrormsg.scala]
[running phase packageobjects on longerrormsg.scala]
[running phase typer on longerrormsg.scala]
warning: issue error: type mismatch;
 found   : ImplicitAmbiguity.this.AA[?A]
 required: ImplicitAmbiguity.this.N[?]
Note that implicit conversions are not applicable because they are ambiguous:
 both method conv3 in module class ImplicitAmbiguity of type (<param> op: ImplicitAmbiguity.this.AA[String])ImplicitAmbiguity.this.N[String]
 and method conv5 in module class ImplicitAmbiguity of type (<param> op: ImplicitAmbiguity.this.AA[ImplicitAmbiguity.this.Foo])ImplicitAmbiguity.this.N[ImplicitAmbiguity.this.Foo]
 are possible conversion functions from ImplicitAmbiguity.this.AA[?A] to ImplicitAmbiguity.this.N[?]
warning: issue error: type mismatch;
 found   : ImplicitAmbiguity.this.AA[?A]
 required: ImplicitAmbiguity.this.N[?]
Note that implicit conversions are not applicable because they are ambiguous:
 both method conv3 in module class ImplicitAmbiguity of type (<param> op: <empty>.this.ImplicitAmbiguity.AA[String])<empty>.this.ImplicitAmbiguity.N[String]
 and method conv4 in module class ImplicitAmbiguity of type (<param> op: <empty>.this.ImplicitAmbiguity.AA[scala.this.Float])<empty>.this.ImplicitAmbiguity.N[scala.this.Float]
 are possible conversion functions from ImplicitAmbiguity.this.AA[?A] to ImplicitAmbiguity.this.N[?]
warning: update buffer: Set(scala.tools.nsc.typechecker.ContextErrors$AmbiguousTypeError, scala.tools.nsc.typechecker.ContextErrors$AmbiguousTypeError)
warning: issue error: overloaded method value aFunc with alternatives:
  [A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)](<param> a: ImplicitAmbiguity.this.NE[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)])ImplicitAmbiguity.this.BB[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)] <and>
  [A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)](<param> a: ImplicitAmbiguity.this.ND[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)])ImplicitAmbiguity.this.BB[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)] <and>
  [A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)](<param> a: ImplicitAmbiguity.this.NF[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)])ImplicitAmbiguity.this.AA[scala.this.Float] <and>
  [A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)](<param> a: ImplicitAmbiguity.this.NC[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)])ImplicitAmbiguity.this.AA[A(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)(in method aFunc)]
 cannot be applied to (scala.this.Float)
warning: issue error: type mismatch;
 found   : ImplicitAmbiguity.this.AA[?A]
 required: ImplicitAmbiguity.this.N[?]
Note that implicit conversions are not applicable because they are ambiguous:
 both method conv3 in module class ImplicitAmbiguity of type (<param> op: ImplicitAmbiguity.this.AA[String])ImplicitAmbiguity.this.N[String]
 and method conv5 in module class ImplicitAmbiguity of type (<param> op: ImplicitAmbiguity.this.AA[ImplicitAmbiguity.this.Foo])ImplicitAmbiguity.this.N[ImplicitAmbiguity.this.Foo]
 are possible conversion functions from ImplicitAmbiguity.this.AA[?A] to ImplicitAmbiguity.this.N[?]
warning: issue error: type mismatch;
 found   : ImplicitAmbiguity.this.AA[?A]
 required: ImplicitAmbiguity.this.N[?]
Note that implicit conversions are not applicable because they are ambiguous:
 both method conv3 in module class ImplicitAmbiguity of type (<param> op: <empty>.this.ImplicitAmbiguity.AA[String])<empty>.this.ImplicitAmbiguity.N[String]
 and method conv4 in module class ImplicitAmbiguity of type (<param> op: <empty>.this.ImplicitAmbiguity.AA[scala.this.Float])<empty>.this.ImplicitAmbiguity.N[scala.this.Float]
 are possible conversion functions from ImplicitAmbiguity.this.AA[?A] to ImplicitAmbiguity.this.N[?]
warning: update buffer: Set(scala.tools.nsc.typechecker.ContextErrors$AmbiguousTypeError, scala.tools.nsc.typechecker.ContextErrors$AmbiguousTypeError)
[running phase patmat on longerrormsg.scala]
[running phase superaccessors on longerrormsg.scala]
[running phase extmethods on longerrormsg.scala]

This could be a performance killer with all those strings created along the way.

@scabug
Copy link
Author

scabug commented Aug 21, 2012

@TiarkRompf said:
Here's my temporary fix to Scala-Virtualized: namin/scala@32c2a70

@scabug
Copy link
Author

scabug commented Oct 21, 2016

@milessabin said:
From a discussion with @retronym here,

bq. One solution to this might be to make error string creation disabled by a Context flag, which would be set during typedImplicit1. If no successful implicit was actually found, we could then re-typecheck the failed candidate under normal mode to produce the error message.

@scabug scabug added this to the Backlog milestone Apr 7, 2017
@scala scala deleted a comment from scabug Mar 2, 2018
@scala scala deleted a comment from scabug Mar 2, 2018
@scala scala deleted a comment from scabug Mar 2, 2018
@scala scala deleted a comment from scabug Mar 2, 2018
@scala scala deleted a comment from scabug Mar 2, 2018
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

3 participants