Skip to content

Re-establish missing symbol from previous phase (in one specific case) #15295

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
merged 1 commit into from
May 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion compiler/src/dotty/tools/dotc/transform/Erasure.scala
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,19 @@ object Erasure {
return tree.asInstanceOf[Tree] // we are re-typing a primitive array op

val owner = mapOwner(origSym)
val sym = if (owner eq origSym.maybeOwner) origSym else owner.info.decl(tree.name).symbol
var sym = if (owner eq origSym.maybeOwner) origSym else owner.info.decl(tree.name).symbol
if !sym.exists then
// We fail the sym.exists test for pos/i15158.scala, where we pass an infinitely
// recurring match type to an overloaded constructor. An equivalent test
// with regular apply methods succeeds. It's at present unclear whether
// - the program should be rejected, or
// - there is another fix.
// Therefore, we apply the fix to use the pre-erasure symbol, but only
// for constructors, in order not to mask other possible bugs that would
// trigger the assert(sym.exists, ...) below.
val prevSym = tree.symbol(using preErasureCtx)
if prevSym.isConstructor then sym = prevSym

assert(sym.exists, i"no owner from $owner/${origSym.showLocated} in $tree")

if owner == defn.ObjectClass then checkValue(qual1)
Expand Down
1 change: 1 addition & 0 deletions compiler/test/dotc/pos-test-pickling.blacklist
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ i9999.scala
13491.scala
7512.scala
i6505.scala
i15158.scala

# Opaque type
i5720.scala
Expand Down
43 changes: 43 additions & 0 deletions tests/pos/i15158.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
class Opt[T]

class Buf[A](elts: Any, sz: Int):
def this(n: Int) = this(???, n)

object Buf:
def apply[A](elts: Any, sz: Int): Buf[A] = new Buf[A](elts, sz)
def apply[A](n: Int): Buf[A] = apply[A](???, n)

inline def foo(testFun: Any): Unit = {}

val x = foo {
type Rec[A] = A match
case String => Opt[Rec[String]]

val arr = new Buf[Rec[String]](8)
val arr2 = Buf[Rec[String]](8)
val arr3 = Buf.apply[Rec[String]](8)
}

import scala.collection.mutable

// https://github.com/plokhotnyuk/jsoniter-scala/blob/74d6d557bf81e904d07d4b8fbead4e4cab700bea/jsoniter-scala-macros/shared/src/test/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros/JsonCodeMakerNewTypeSpec.scala#L40-L148
class Spec {
inline def in(testFun: => Any): Unit = {
val _ = testFun
}

in {
type JsonPrimitive = String | Int
type Rec[JA[_], A] = A match {
case JsonPrimitive => JsonPrimitive | JA[Rec[JA, JsonPrimitive]]
case _ => A | JA[Rec[JA, A]]
}

type Json = Rec[
[A] =>> Seq[A],
JsonPrimitive
]

val arr = new mutable.ArrayBuffer[Json](8)
}
}