Skip to content

ExprMap produces expressions that are equals but have different hashCode #15227

Closed
@rmgk

Description

@rmgk

Compiler version

3.1.2, 3.1.3-RC3, 3.2.0-RC1-bin-20220517-e5abec0-NIGHTLY

Minimized code

The gist of the code is, that it uses an ExprMap to collect all subexpressions. It does that twice, and the compares the found expressions.

import scala.quoted.*

inline def mac[T](inline expr: T): T =
  ${ impl('expr) }

class MyMap() extends ExprMap {
  var expressions: List[Expr[Any]] = Nil

  override def transform[T](e: Expr[T])(using Type[T])(using q: Quotes): Expr[T] =
    expressions ::= e
    transformChildren(e)

}

def impl[T: Type](expr: Expr[T])(using quotes: Quotes): Expr[T] = {

  val List(es1, es2) = List(MyMap(), MyMap()).map { m =>
    m.transform(expr)
    m.expressions
  }

  assert(es1 == es2)
  assert(es1.map(_.hashCode()) == es2.map(_.hashCode()), s"hash codes not equal:\n${es1.map(_.hashCode())}\n${es2.map(_.hashCode())}")

  expr

}

then call the macro in another file with any expression, say mac(1)

Output

[error] java.lang.AssertionError: assertion failed: hash codes not equal:
[error] List(290429894, 1544224853)
[error] List(1268450819, 1544224853)

Expectation

the expressions of the two runs are are equal, so the hashcodes should also be equal

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions