Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {

/* ---------------- helper utils for generating classes and fields ---------------- */

def genPlainClass(cd0: TypeDef) = (cd0: @unchecked) match {
def genPlainClass(cd0: TypeDef) = cd0 match {
case TypeDef(_, impl: Template) =>
assert(cnode == null, "GenBCode detected nested methods.")

Expand Down
13 changes: 9 additions & 4 deletions compiler/src/dotty/tools/dotc/core/Comments.scala
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,15 @@ object Comments {
val Trim = "(?s)^[\\s&&[^\n\r]]*(.*?)\\s*$".r

val raw = ctx.docCtx.flatMap(_.docstring(sym).map(_.raw)).getOrElse("")
defs(sym) ++= defines(raw).map { str =>
val start = skipWhitespace(str, "@define".length)
val (key, Trim(value)) = str.splitAt(skipVariable(str, start)): @unchecked
variableName(key.drop(start)) -> value.replaceAll("\\s+\\*+$", "")
defs(sym) ++= defines(raw).map {
str => {
val start = skipWhitespace(str, "@define".length)
val (key, value) = str.splitAt(skipVariable(str, start))
key.drop(start) -> value
}
} map {
case (key, Trim(value)) =>
variableName(key) -> value.replaceAll("\\s+\\*+$", "")
}
}

Expand Down
6 changes: 5 additions & 1 deletion compiler/src/dotty/tools/dotc/transform/patmat/Space.scala
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,7 @@ object SpaceEngine {
}

private def exhaustivityCheckable(sel: Tree)(using Context): Boolean = {
val seen = collection.mutable.Set.empty[Symbol]

// Possible to check everything, but be compatible with scalac by default
def isCheckable(tp: Type): Boolean =
Expand All @@ -815,7 +816,10 @@ object SpaceEngine {
}) ||
tpw.isRef(defn.BooleanClass) ||
classSym.isAllOf(JavaEnumTrait) ||
classSym.is(Case)
classSym.is(Case) && {
if seen.add(classSym) then productSelectorTypes(tpw, sel.srcPos).exists(isCheckable(_))
else true // recursive case class: return true and other members can still fail the check
}

!sel.tpe.hasAnnotation(defn.UncheckedAnnot)
&& {
Expand Down
47 changes: 23 additions & 24 deletions compiler/src/dotty/tools/dotc/typer/Implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1294,30 +1294,29 @@ trait Implicits:
if alt1.isExtension then
// Fall back: if both results are extension method applications,
// compare the extension methods instead of their wrappers.
def stripExtension(alt: SearchSuccess) =
methPart(stripApply(alt.tree)).tpe: @unchecked match { case ref: TermRef => ref }
val ref1 = stripExtension(alt1)
val ref2 = stripExtension(alt2)
// ref1 and ref2 might refer to type variables owned by
// alt1.tstate and alt2.tstate respectively, to compare the
// alternatives correctly we need a TyperState that includes
// constraints from both sides, see
// tests/*/extension-specificity2.scala for test cases.
val constraintsIn1 = alt1.tstate.constraint ne ctx.typerState.constraint
val constraintsIn2 = alt2.tstate.constraint ne ctx.typerState.constraint
def exploreState(alt: SearchSuccess): TyperState =
alt.tstate.fresh(committable = false)
val comparisonState =
if constraintsIn1 && constraintsIn2 then
exploreState(alt1).mergeConstraintWith(alt2.tstate)
else if constraintsIn1 then
exploreState(alt1)
else if constraintsIn2 then
exploreState(alt2)
else
ctx.typerState

diff = inContext(ctx.withTyperState(comparisonState)):
def stripExtension(alt: SearchSuccess) = methPart(stripApply(alt.tree)).tpe
(stripExtension(alt1), stripExtension(alt2)) match
case (ref1: TermRef, ref2: TermRef) =>
// ref1 and ref2 might refer to type variables owned by
// alt1.tstate and alt2.tstate respectively, to compare the
// alternatives correctly we need a TyperState that includes
// constraints from both sides, see
// tests/*/extension-specificity2.scala for test cases.
val constraintsIn1 = alt1.tstate.constraint ne ctx.typerState.constraint
val constraintsIn2 = alt2.tstate.constraint ne ctx.typerState.constraint
def exploreState(alt: SearchSuccess): TyperState =
alt.tstate.fresh(committable = false)
val comparisonState =
if constraintsIn1 && constraintsIn2 then
exploreState(alt1).mergeConstraintWith(alt2.tstate)
else if constraintsIn1 then
exploreState(alt1)
else if constraintsIn2 then
exploreState(alt2)
else
ctx.typerState

diff = inContext(ctx.withTyperState(comparisonState)):
compare(ref1, ref2)
else // alt1 is a conversion, prefer extension alt2 over it
diff = -1
Expand Down
3 changes: 0 additions & 3 deletions compiler/test/dotty/tools/scripting/BashExitCodeTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,6 @@ class BashExitCodeTests:
@Test def xPluginList = scala("-Xplugin-list")(0)
@Test def vPhases = scala("-Vphases")(0)

@Test def replEval =
scala("--repl-quit-after-init", "--repl-init-script", "'val i = 2 * 2; val j = i + 2'")(0)

/** A utility for running two commands in a row, like you do in bash. */
extension (inline u1: Unit) inline def & (inline u2: Unit): Unit = { u1; u2 }
end BashExitCodeTests
1 change: 0 additions & 1 deletion library/src/scala/annotation/newMain.scala
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,6 @@ final class newMain extends MainAnnotation[FromString, Any]:
case (arg +: t, "") => recurse(t, arg, acc)
case (arg +: t, l) if l.length + 1 + arg.length <= maxLength => recurse(t, s"$l $arg", acc)
case (arg +: t, l) => recurse(t, arg, acc :+ l)
case (_, _) => acc
}

recurse(argsUsage, "", Vector()).toList
Expand Down
8 changes: 5 additions & 3 deletions scaladoc/src/dotty/tools/scaladoc/site/templates.scala
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,11 @@ case class TemplateFile(
ctx.layouts.getOrElse(name, throw new RuntimeException(s"No layouts named $name in ${ctx.layouts}"))
)

def asJavaElement(o: Any): Any = o match
case m: Map[?, ?] => m.transform { (k, v) => asJavaElement(v) }.asJava
case l: List[?] => l.map(asJavaElement).asJava
def asJavaElement(o: Object): Object = o match
case m: Map[_, _] => m.transform {
case (k: String, v: Object) => asJavaElement(v)
}.asJava
case l: List[_] => l.map(x => asJavaElement(x.asInstanceOf[Object])).asJava
case other => other

// Library requires mutable maps..
Expand Down
1 change: 0 additions & 1 deletion tests/pos/switches.scala
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ class Test {
case IntAnyVal(100) => 2
case IntAnyVal(1000) => 3
case IntAnyVal(10000) => 4
case _ => -1
}
}

Expand Down
4 changes: 2 additions & 2 deletions tests/warn/t10373.scala → tests/pos/t10373.scala
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//> using options -deprecation -feature
//> using options -Xfatal-warnings -deprecation -feature

abstract class Foo {
def bar(): Unit = this match {
Expand All @@ -7,7 +7,7 @@ abstract class Foo {
// Works fine
}

def baz(that: Foo): Unit = (this, that) match { // warn: match may not be exhaustive.
def baz(that: Foo): Unit = (this, that) match {
case (Foo_1(), _) => //do something
case (Foo_2(), _) => //do something
// match may not be exhaustive
Expand Down
1 change: 0 additions & 1 deletion tests/warn/i15662.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ case class Composite[T](v: T)
def m(composite: Composite[?]): Unit =
composite match {
case Composite[Int](v) => println(v) // warn: cannot be checked at runtime
case _ => println("OTHER")
}

def m2(composite: Composite[?]): Unit =
Expand Down
1 change: 0 additions & 1 deletion tests/warn/i21218.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,5 @@ def Test[U, A](thisElem: A, thatElem: U) = {
case (`passedEnd`, r: U @unchecked) => (thisElem, r)
case (l: A @unchecked, `passedEnd`) => (l, thatElem)
case t: (A, U) @unchecked => t // false-positive warning
case (t1, t2) => (t1, t2)
}
}
15 changes: 0 additions & 15 deletions tests/warn/i22590.arity2.scala

This file was deleted.

9 changes: 0 additions & 9 deletions tests/warn/i22590.scala

This file was deleted.

2 changes: 0 additions & 2 deletions tests/warn/opaque-match.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ def Test[T] =
case _: C => ??? // ok
C() match
case _: O.T => ??? // warn
case _ => ???
C() match
case _: T => ??? // warn
case _ => ???

(??? : Any) match
case _: List[O.T] => ??? // warn
Expand Down
Loading