From f6e02380e3eb6a01142de38fa0dcf48d4271de60 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 16 Apr 2019 13:48:17 +0200 Subject: [PATCH] Make inline non final This change is to support macro overrides --- .../src/dotty/tools/dotc/core/Flags.scala | 4 +-- tests/neg-macros/quote-MacroOverride.scala | 4 +-- tests/run/quote-MacroOverride.scala | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/run/quote-MacroOverride.scala diff --git a/compiler/src/dotty/tools/dotc/core/Flags.scala b/compiler/src/dotty/tools/dotc/core/Flags.scala index 4aafd2e74fb7..b0341eb597ea 100644 --- a/compiler/src/dotty/tools/dotc/core/Flags.scala +++ b/compiler/src/dotty/tools/dotc/core/Flags.scala @@ -592,8 +592,8 @@ object Flags { /** Assumed to be pure */ final val StableOrErased: FlagSet = StableRealizable | Erased - /** Labeled `private`, `final`, or `inline` */ - final val EffectivelyFinal: FlagSet = Private | Final | Inline + /** Labeled `private`, or `final` */ + final val EffectivelyFinal: FlagSet = Private | Final /** A private method */ final val PrivateMethod: FlagConjunction = allOf(Private, Method) diff --git a/tests/neg-macros/quote-MacroOverride.scala b/tests/neg-macros/quote-MacroOverride.scala index 55e03eee5381..e6d19fcf8cc8 100644 --- a/tests/neg-macros/quote-MacroOverride.scala +++ b/tests/neg-macros/quote-MacroOverride.scala @@ -6,8 +6,8 @@ object Test { } object B extends A { - inline def f() = ${'{}} // error: may not override - override def g() = () // error: may not override + override inline def f() = () // error: method f of type (): Unit is an inline method, must override at least one concrete method + override def g() = () } } diff --git a/tests/run/quote-MacroOverride.scala b/tests/run/quote-MacroOverride.scala new file mode 100644 index 000000000000..b2d7b732069b --- /dev/null +++ b/tests/run/quote-MacroOverride.scala @@ -0,0 +1,27 @@ +object Test { + + abstract class A { + inline def f1(): String = "A.f1" + inline def f2(): String = "A.f2" + def f3(): String = "A.f3" + } + + object B extends A { + override def f1(): String = "B.f1" + override inline def f2(): String = "B.f2" + override inline def f3(): String = "B.f3" + } + + def main(args: Array[String]): Unit = { + val a: A = B + assert(a.f1() == "A.f1") + assert(a.f2() == "A.f2") + assert(a.f3() == "A.f3") + + val b: B.type = B + assert(b.f1() == "B.f1") + assert(b.f2() == "B.f2") + assert(b.f3() == "B.f3") + } + +}