From 2437276452fe41dbcd4099a258b31376f833fa5f Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 15 Dec 2019 19:07:26 +0100 Subject: [PATCH 1/4] Fix #7741: Allow deferred + private for native or erased members --- compiler/src/dotty/tools/dotc/transform/TreeChecker.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/TreeChecker.scala b/compiler/src/dotty/tools/dotc/transform/TreeChecker.scala index 73af47c275bb..3bd6c91b4068 100644 --- a/compiler/src/dotty/tools/dotc/transform/TreeChecker.scala +++ b/compiler/src/dotty/tools/dotc/transform/TreeChecker.scala @@ -77,8 +77,11 @@ class TreeChecker extends Phase with SymTransformer { testDuplicate(sym, seenClasses, "class") } - val isDeferredAndPrivate = sym.is(Method) && sym.is(Deferred) && sym.is(Private) - assert(!isDeferredAndPrivate, i"$sym is both Deferred and Private") + val badDeferredAndPrivate = + sym.is(Method) && sym.is(Deferred) && sym.is(Private) + && !sym.hasAnnotation(defn.NativeAnnot) + && !sym.is(Erased) + assert(!badDeferredAndPrivate, i"$sym is both Deferred and Private") checkCompanion(symd) From 6643de1dc1db37857a75cb6ec34bc5eebeb2ba1a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 15 Dec 2019 19:31:02 +0100 Subject: [PATCH 2/4] Fix #7742: Ensure the indentWidth is never null --- compiler/src/dotty/tools/dotc/parsing/Scanners.scala | 3 ++- tests/neg/i7742.scala | 3 +++ tests/pos/i7741.scala | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/neg/i7742.scala create mode 100644 tests/pos/i7741.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala index b7001bbdc5b2..312e3efddcdd 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala @@ -1359,7 +1359,8 @@ object Scanners { case class InBraces(var width: IndentWidth | Null, outer: Region) extends IndentSignificantRegion { - override def indentWidth = width + override def indentWidth = + if width == null then IndentWidth.Zero else width } /** A class describing an indentation region. diff --git a/tests/neg/i7742.scala b/tests/neg/i7742.scala new file mode 100644 index 000000000000..9294decf531d --- /dev/null +++ b/tests/neg/i7742.scala @@ -0,0 +1,3 @@ +object A { + for // error // error +} \ No newline at end of file diff --git a/tests/pos/i7741.scala b/tests/pos/i7741.scala new file mode 100644 index 000000000000..72b83b172552 --- /dev/null +++ b/tests/pos/i7741.scala @@ -0,0 +1,9 @@ +class A1 { + @native private def a: Unit +} +trait A2 { + erased def i(a: Int): Int +} +trait A3 { + erased val a: Int +} \ No newline at end of file From 53187ea621713c6be7944ada314e6f250d9e382d Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 15 Dec 2019 22:33:25 +0100 Subject: [PATCH 3/4] Test for #7753 --- tests/neg/i7753.scala | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tests/neg/i7753.scala diff --git a/tests/neg/i7753.scala b/tests/neg/i7753.scala new file mode 100644 index 000000000000..2423c6516745 --- /dev/null +++ b/tests/neg/i7753.scala @@ -0,0 +1,2 @@ +class A { if 0 // error +} // error From c0d9db1e1471331f54ddecedc5ee1aeccbdb65e1 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 16 Dec 2019 18:34:24 +0100 Subject: [PATCH 4/4] Add comment --- compiler/src/dotty/tools/dotc/parsing/Scanners.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala index 312e3efddcdd..54e1765a7df5 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala @@ -1359,7 +1359,9 @@ object Scanners { case class InBraces(var width: IndentWidth | Null, outer: Region) extends IndentSignificantRegion { - override def indentWidth = + // The indent width starts out as `null` when the opening brace is encountered + // It is then adjusted when the next token on a new line is encountered. + override def indentWidth: IndentWidth = if width == null then IndentWidth.Zero else width }