Skip to content

Change private local inference to allow inferring private local for private vals constructor parameters #23378

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

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
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
4 changes: 1 addition & 3 deletions compiler/src/dotty/tools/dotc/core/SymDenotations.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2658,11 +2658,9 @@ object SymDenotations {
* This holds for all symbols except
* - constructors, since they can never be referred to as members of their
* own, fully elaborated `this`.
* - parameters and parameter accessors, since their Local status is already
* determined by whether they have a `val` or `var` or not.
*/
def canBeLocal(name: Name, flags: FlagSet)(using Context) =
!name.isConstructorName && !flags.is(Param) && !flags.is(ParamAccessor)
!name.isConstructorName

/** Factory method for SymDenotion creation. All creations
* should be done via this method.
Expand Down
16 changes: 8 additions & 8 deletions tests/init/crash/rbtree.scala
Original file line number Diff line number Diff line change
Expand Up @@ -439,18 +439,18 @@ object RedBlackTree {
def black: Tree[A, B]
def red: Tree[A, B]
}
final class RedTree[A, +B](key: A,
value: B,
left: Tree[A, B],
right: Tree[A, B]) extends Tree[A, B](key, value, left, right) {
final class RedTree[A, +B](_key: A,
_value: B,
_left: Tree[A, B],
_right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) {
override def black: Tree[A, B] = BlackTree(key, value, left, right)
override def red: Tree[A, B] = this
override def toString: String = "RedTree(" + key + ", " + value + ", " + left + ", " + right + ")"
}
final class BlackTree[A, +B](key: A,
value: B,
left: Tree[A, B],
right: Tree[A, B]) extends Tree[A, B](key, value, left, right) {
final class BlackTree[A, +B](_key: A,
_value: B,
_left: Tree[A, B],
_right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) {
override def black: Tree[A, B] = this
override def red: Tree[A, B] = RedTree(key, value, left, right)
override def toString: String = "BlackTree(" + key + ", " + value + ", " + left + ", " + right + ")"
Expand Down
4 changes: 0 additions & 4 deletions tests/neg/i22620.scala

This file was deleted.

4 changes: 2 additions & 2 deletions tests/pos/extend-java-enum.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import java.{lang as jl}

final class ConfigSyntax private (name: String, ordinal: Int)
extends jl.Enum[ConfigSyntax](name, ordinal)
final class ConfigSyntax private (_name: String, ordinal: Int)
extends jl.Enum[ConfigSyntax](_name, ordinal)

object ConfigSyntax {

Expand Down
5 changes: 5 additions & 0 deletions tests/pos/i22620.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import scala.collection.mutable.ArrayBuffer

class PrivateTest[-M](private val v: ArrayBuffer[M])

class PrivateTest1[-M](v: ArrayBuffer[M])
11 changes: 11 additions & 0 deletions tests/pos/private-local-override-1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
sealed abstract class Tree[+A](
final val key: A
)
final class RedTree[+A](private val _key: A) extends Tree[A](_key)
final class BlackTree[+A](private val _key: A) extends Tree[A](_key)
object RedTree {
def unapply[A](t: RedTree[A]) = Some((t.key))
}
object BlackTree {
def unapply[A](t: BlackTree[A]) = Some((t.key))
}
11 changes: 11 additions & 0 deletions tests/pos/private-local-override.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
sealed abstract class Tree[+A](
final val key: A
)
final class RedTree[+A](_key: A) extends Tree[A](_key)
final class BlackTree[+A](_key: A) extends Tree[A](_key)
object RedTree {
def unapply[A](t: RedTree[A]) = Some((t.key))
}
object BlackTree {
def unapply[A](t: BlackTree[A]) = Some((t.key))
}
16 changes: 8 additions & 8 deletions tests/pos/rbtree.scala
Original file line number Diff line number Diff line change
Expand Up @@ -439,18 +439,18 @@ object RedBlackTree {
def black: Tree[A, B]
def red: Tree[A, B]
}
final class RedTree[A, +B](key: A,
value: B,
left: Tree[A, B],
right: Tree[A, B]) extends Tree[A, B](key, value, left, right) {
final class RedTree[A, +B](_key: A,
_value: B,
_left: Tree[A, B],
_right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) {
override def black: Tree[A, B] = BlackTree(key, value, left, right)
override def red: Tree[A, B] = this
override def toString: String = "RedTree(" + key + ", " + value + ", " + left + ", " + right + ")"
}
final class BlackTree[A, +B](key: A,
value: B,
left: Tree[A, B],
right: Tree[A, B]) extends Tree[A, B](key, value, left, right) {
final class BlackTree[A, +B](_key: A,
_value: B,
_left: Tree[A, B],
_right: Tree[A, B]) extends Tree[A, B](_key, _value, _left, _right) {
override def black: Tree[A, B] = this
override def red: Tree[A, B] = RedTree(key, value, left, right)
override def toString: String = "BlackTree(" + key + ", " + value + ", " + left + ", " + right + ")"
Expand Down
2 changes: 1 addition & 1 deletion tests/warn/i15503c.scala
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ package foo.test.constructors:
case class A private (x: Int) // OK
class B private (val x: Int) // OK
object B { def default = B(42) }
class C private (private val xy: Int) // warn
class C private (private val xy: Int)
object C { def default = C(42) }
class D private (private val x: Int): // OK
def y = x
Expand Down
Loading