bug icon indicating copy to clipboard operation
bug copied to clipboard

Compiler behavior when importing from Predef is not specified

Open noresttherein opened this issue 1 year ago • 4 comments

Hi! It's been a while.

Reproduction steps

Scala version: 2.13.14

import Predef.implicitly

object PredefBug {
	class P
	def test[X](x :X)(implicit p :X => P) :P = p(x)
	test { new P }

	???
}

Problem

implicit error;
!I p: PredefBug.P => PredefBug.P
  No implicit view available from PredefBug.P => PredefBug.P.
  
	test { new P }

/home/turin/porn/sugar/src/test/scala/PredefBug.scala:9
not found: value ???
	???

noresttherein avatar Sep 04 '24 17:09 noresttherein

It's a long-standing behavior that explicitly importing from a "root context module" turns off the "default root import" from that module.

That behavior is honored under -Yimports where the module is arbitrary and not only scala.Predef.

I'm surprised to see that it's not in the spec, apparently. Root contexts are described in chapter 2, so "excluding import" should also be specified there. The exclusion applies to objects but not to packages.

som-snytt avatar Sep 04 '24 19:09 som-snytt

Oh, I'm sorry then. I kind of get an idea why, although in the era of IDEs being smart, but not enough, occasionally IntelliJ decides to import something moronic even though I wasn't even using implicitly. Not Scala's fault, of course, just that it wasn't me being dliberately stupid or malicious.

noresttherein avatar Sep 05 '24 15:09 noresttherein

Another reason to update the spec is that scalac tries to "detect" the import, but in general the import may be nested; not sure if dotty requires the import to be top-level and at the top of the file.

som-snytt avatar Sep 05 '24 20:09 som-snytt

Yes, importing it locally in the object doesn't produce the behaviour even in 2.13.

noresttherein avatar Sep 09 '24 14:09 noresttherein