Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Class symbols can't be contravariant.
During development of the fix for SI-6666, I encountered: % test/files/pos/t4842.scala test/files/pos/t4842.scala:10: error: contravariant class Bar occurs in covariant position in type ()this.Bar of constructor Bar this(new { class Bar { println(Bar.this); new { println(Bar.this) } }; new Bar } ) // okay I had incorrectly set the INCONSTRUCTOR flag on the class symbol `Bar`. (It isn't directly in the self constructor call, as it is nested an intervening anonymous class.) But, this flag shares a slot with CONTRAVARIANT, and the variance validation intepreted it as such. ClassSymbol already has this code to resolve the ambiguous flags for display purposes: override def resolveOverloadedFlag(flag: Long) = flag match { case INCONSTRUCTOR => "<inconstructor>" // INCONSTRUCTOR / CONTRAVARIANT / LABEL case EXISTENTIAL => "<existential>" // EXISTENTIAL / MIXEDIN case IMPLCLASS => "<implclass>" // IMPLCLASS / PRESUPER case _ => super.resolveOverloadedFlag(flag) } This commit overrides `isContravariant` to reflect the same logic.
- Loading branch information
Showing
4 changed files
with
55 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
Type in expressions to have them evaluated. | ||
Type :help for more information. | ||
|
||
scala> :power | ||
** Power User mode enabled - BEEP WHIR GYVE ** | ||
** :phase has been set to 'typer'. ** | ||
** scala.tools.nsc._ has been imported ** | ||
** global._, definitions._ also imported ** | ||
** Try :help, :vals, power.<tab> ** | ||
|
||
scala> val u = rootMirror.universe | ||
u: $r.intp.global.type = <global> | ||
|
||
scala> import u._, scala.reflect.internal.Flags | ||
import u._ | ||
import scala.reflect.internal.Flags | ||
|
||
scala> class C | ||
defined class C | ||
|
||
scala> val sym = u.typeOf[C].typeSymbol | ||
sym: u.Symbol = class C | ||
|
||
scala> sym.isContravariant | ||
res0: Boolean = false | ||
|
||
scala> sym setFlag Flags.INCONSTRUCTOR | ||
res1: sym.type = class C | ||
|
||
scala> sym.isClassLocalToConstructor | ||
res2: Boolean = true | ||
|
||
scala> sym.isContravariant // was true | ||
res3: Boolean = false | ||
|
||
scala> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import scala.tools.partest.ReplTest | ||
|
||
object Test extends ReplTest { | ||
override def code = """ | ||
|:power | ||
|val u = rootMirror.universe | ||
|import u._, scala.reflect.internal.Flags | ||
|class C | ||
|val sym = u.typeOf[C].typeSymbol | ||
|sym.isContravariant | ||
|sym setFlag Flags.INCONSTRUCTOR | ||
|sym.isClassLocalToConstructor | ||
|sym.isContravariant // was true | ||
|""".stripMargin.trim | ||
} |