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

Loading coursier-interfaces crashes the compiler #20555

Closed
dos65 opened this issue Jun 11, 2024 · 4 comments · Fixed by #21262
Closed

Loading coursier-interfaces crashes the compiler #20555

dos65 opened this issue Jun 11, 2024 · 4 comments · Fixed by #21262
Assignees

Comments

@dos65
Copy link
Contributor

dos65 commented Jun 11, 2024

3.4.1

Minimized code

//> using scala 3
//> using dep "io.get-coursier:interface:1.0.19"
import coursierapi.shaded.coursier.internal.api.ApiHelper //<- this import leads to the issue

val foo = "asd"

Output (click arrow to expand)

exception caught when loading module class package$: java.lang.AssertionError: assertion failed: duplicate module class Dependency$#4218; previous was class Dependency$#4204
assertion failure for coursierapi.shaded.coursier.type <:< ?{ internal: ? }, frozen = false
java.lang.AssertionError: assertion failed: duplicate module class Dependency$#4218; previous was class Dependency$#4204 while typechecking /home/v.chelyshov/projects/oss/samples/scalabug-cs/bug.scala
exception occurred while typechecking /home/v.chelyshov/projects/oss/samples/scalabug-cs/bug.scala
exception occurred while compiling /home/v.chelyshov/projects/oss/samples/scalabug-cs/bug.scala
java.lang.AssertionError: assertion failed: duplicate module class Dependency$#4218; previous was class Dependency$#4204 while compiling /home/v.chelyshov/projects/oss/samples/scalabug-cs/bug.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: duplicate module class Dependency$#4218; previous was class Dependency$#4204
	at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
	at dotty.tools.dotc.core.Scopes$MutableScope.enter(Scopes.scala:271)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.enterNoReplace(SymDenotations.scala:2035)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.enter(SymDenotations.scala:2026)
	at dotty.tools.dotc.core.Symbols$Symbol.entered(Symbols.scala:207)
	at dotty.tools.dotc.core.NamerOps$.addConstructorProxies$$anonfun$1(NamerOps.scala:170)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.core.Scopes$Scope.foreach(Scopes.scala:93)
	at dotty.tools.dotc.core.NamerOps$.addConstructorProxies(NamerOps.scala:176)
	at dotty.tools.dotc.core.classfile.ClassfileParser.parseClass(ClassfileParser.scala:221)
	at dotty.tools.dotc.core.classfile.ClassfileParser.$anonfun$1(ClassfileParser.scala:87)
	at dotty.tools.dotc.core.classfile.ClassfileParser.run(ClassfileParser.scala:82)
	at dotty.tools.dotc.core.ClassfileLoader.load(SymbolLoaders.scala:412)
	at dotty.tools.dotc.core.ClassfileLoader.doComplete(SymbolLoaders.scala:407)
	at dotty.tools.dotc.core.SymbolLoader$$anon$1.doComplete(SymbolLoaders.scala:325)
	at dotty.tools.dotc.core.SymbolLoader.complete(SymbolLoaders.scala:341)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:174)
	at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:187)
	at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:189)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.computeMembersNamed(SymDenotations.scala:2113)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.membersNamed(SymDenotations.scala:2083)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.membersNamedNoShadowingBasedOnFlags(SymDenotations.scala:2106)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.nonPrivateMembersNamed(SymDenotations.scala:2096)
	at dotty.tools.dotc.core.SymDenotations$PackageClassDenotation.recur$5(SymDenotations.scala:2466)
	at dotty.tools.dotc.core.SymDenotations$PackageClassDenotation.computeMembersNamed(SymDenotations.scala:2533)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.membersNamed(SymDenotations.scala:2083)
	at dotty.tools.dotc.core.SymDenotations$ClassDenotation.findMember(SymDenotations.scala:2134)
	at dotty.tools.dotc.core.Types$Type.go$1(Types.scala:689)
	at dotty.tools.dotc.core.Types$Type.findMember(Types.scala:872)
	at dotty.tools.dotc.core.Types$Type.memberBasedOnFlags(Types.scala:672)
	at dotty.tools.dotc.core.Types$Type.member(Types.scala:656)
	at dotty.tools.dotc.typer.ProtoTypes$SelectionProto.liftedTree1$1(ProtoTypes.scala:204)
	at dotty.tools.dotc.typer.ProtoTypes$SelectionProto.isMatchedBy(ProtoTypes.scala:226)
	at dotty.tools.dotc.core.TypeComparer.isMatchedByProto(TypeComparer.scala:2041)
	at dotty.tools.dotc.core.TypeComparer.firstTry$1(TypeComparer.scala:328)
	at dotty.tools.dotc.core.TypeComparer.recur(TypeComparer.scala:1455)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:208)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:218)
	at dotty.tools.dotc.core.TypeComparer.topLevelSubType(TypeComparer.scala:128)
	at dotty.tools.dotc.core.TypeComparer.testSubType(TypeComparer.scala:144)
	at dotty.tools.dotc.core.TypeComparer$.testSubType(TypeComparer.scala:2938)
	at dotty.tools.dotc.typer.Typer.adaptNoArgsOther$1(Typer.scala:3828)
	at dotty.tools.dotc.typer.Typer.adaptNoArgs$1(Typer.scala:3907)
	at dotty.tools.dotc.typer.Typer.adapt1(Typer.scala:4120)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:3435)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3058)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3062)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3174)
	at dotty.tools.dotc.typer.Typer.typeSelectOnTerm$1(Typer.scala:686)
	at dotty.tools.dotc.typer.Typer.typedSelect(Typer.scala:724)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2897)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2990)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3058)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3062)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3174)
	at dotty.tools.dotc.typer.Typer.typeSelectOnTerm$1(Typer.scala:686)
	at dotty.tools.dotc.typer.Typer.typedSelect(Typer.scala:724)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2897)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2990)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3058)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3062)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3174)
	at dotty.tools.dotc.typer.Namer.typedAheadExpr$$anonfun$1(Namer.scala:1619)
	at dotty.tools.dotc.typer.Namer.typedAhead(Namer.scala:1609)
	at dotty.tools.dotc.typer.Namer.typedAheadExpr(Namer.scala:1619)
	at dotty.tools.dotc.typer.Namer$Completer.$anonfun$14(Namer.scala:790)
	at dotty.tools.dotc.typer.Typer.typedImportQualifier(Typer.scala:2664)
	at dotty.tools.dotc.typer.Namer$Completer.typeSig(Namer.scala:790)
	at dotty.tools.dotc.typer.Namer$Completer.completeInCreationContext(Namer.scala:922)
	at dotty.tools.dotc.typer.Namer$Completer.complete(Namer.scala:810)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:174)
	at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:187)
	at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:189)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.ensureCompleted(SymDenotations.scala:390)
	at dotty.tools.dotc.typer.Typer.retrieveSym(Typer.scala:2869)
	at dotty.tools.dotc.typer.Typer.typedImport(Typer.scala:2667)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2940)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2991)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3058)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3062)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:3074)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:3130)
	at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2692)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2961)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2991)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3058)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:3062)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3174)
	at dotty.tools.dotc.typer.TyperPhase.typeCheck$$anonfun$1(TyperPhase.scala:44)
	at dotty.tools.dotc.typer.TyperPhase.typeCheck$$anonfun$adapted$1(TyperPhase.scala:54)
	at scala.Function0.apply$mcV$sp(Function0.scala:42)
	at dotty.tools.dotc.core.Phases$Phase.monitor(Phases.scala:437)
	at dotty.tools.dotc.typer.TyperPhase.typeCheck(TyperPhase.scala:54)
	at dotty.tools.dotc.typer.TyperPhase.runOn$$anonfun$3(TyperPhase.scala:88)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.typer.TyperPhase.runOn(TyperPhase.scala:88)
	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:247)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1321)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:263)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:271)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:280)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:280)
	at dotty.tools.dotc.Run.compileSources(Run.scala:195)
	at dotty.tools.dotc.Run.compile(Run.scala:179)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
	at dotty.tools.dotc.Driver.process(Driver.scala:195)
	at dotty.tools.dotc.Driver.process(Driver.scala:163)
	at dotty.tools.dotc.Driver.process(Driver.scala:175)
	at dotty.tools.dotc.Driver.main(Driver.scala:205)
	at dotty.tools.dotc.Main.main(Main.scala)
Compilation failed

@dos65 dos65 added itype:bug itype:crash stat:needs triage Every issue needs to have an "area" and "itype" label labels Jun 11, 2024
@Gedochao Gedochao added area:typer stat:needs minimization Needs a self contained minimization and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Jun 11, 2024
@Gedochao
Copy link
Contributor

We'll still need to minimise it to a snippet without the dependency.

@som-snytt
Copy link
Contributor

likely duplicates #20405

@mbovel
Copy link
Member

mbovel commented Jul 21, 2024

This issue was picked for the Scala Issue Spree of Tuesday, July 23rd. @dwijnand and @bracevac will be working on it. If you have any insight into the issue or guidance on how to fix it, please leave it here.

@bracevac
Copy link
Contributor

Conclusions after the issue spree:

  • The example should indeed fail. The underlying problem is that a Scala 2 classfile is loaded with its metadata stripped + it is not recommended to work directly with shaded packages and classes.
  • We're going implement a more descriptive error message in the class loader for Java/Scala2 classes (same message that the Scala 2 compiler gives).
  • Issue Compiler crash when importing coursierapi StringUtil #20405 has exactly the same problem.
  • Since this is at the level of classfiles/class loading, it's tricky to add test cases (& we don't want tests that include external dependencies),

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants