From 7be702b27a26e0bbcd0efdc1694491e0220a5f0b Mon Sep 17 00:00:00 2001 From: Eugene Flesselle Date: Sat, 25 Nov 2023 18:21:51 +0100 Subject: [PATCH 1/2] Consider all parents when checking access to the children of a sum --- .../src/dotty/tools/dotc/core/SymUtils.scala | 5 ++--- tests/pos/i18918.scala | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 tests/pos/i18918.scala diff --git a/compiler/src/dotty/tools/dotc/core/SymUtils.scala b/compiler/src/dotty/tools/dotc/core/SymUtils.scala index e0e5c7a7cb87..9d36b6a3c308 100644 --- a/compiler/src/dotty/tools/dotc/core/SymUtils.scala +++ b/compiler/src/dotty/tools/dotc/core/SymUtils.scala @@ -181,7 +181,7 @@ class SymUtils: else { val children = self.children val companionMirror = self.useCompanionAsSumMirror - val ownerScope = if pre.isInstanceOf[SingletonType] then pre.classSymbol else NoSymbol + val ownerScope = if pre.isInstanceOf[SingletonType] then pre.parentSymbols(_.isClass) else Nil def problem(child: Symbol) = { def accessibleMessage(sym: Symbol): String = @@ -191,8 +191,7 @@ class SymUtils: self.isContainedIn(sym) || sym.is(Module) && isVisibleToParent(sym.owner) def isVisibleToScope(sym: Symbol): Boolean = def isReachable: Boolean = ctx.owner.isContainedIn(sym) - def isMemberOfPrefix: Boolean = - ownerScope.exists && inherits(sym, ownerScope) + def isMemberOfPrefix: Boolean = ownerScope.exists(inherits(sym, _)) isReachable || isMemberOfPrefix || sym.is(Module) && isVisibleToScope(sym.owner) if !isVisibleToParent(sym) then i"to its parent $self" else if !companionMirror && !isVisibleToScope(sym) then i"to call site ${ctx.owner}" diff --git a/tests/pos/i18918.scala b/tests/pos/i18918.scala new file mode 100644 index 000000000000..0ec6f29b2b89 --- /dev/null +++ b/tests/pos/i18918.scala @@ -0,0 +1,17 @@ + +trait SuperTrait { + sealed trait InnerTrait + case class Foo() extends InnerTrait +} + +trait OtherTrait + +trait TraitWithSelfType extends SuperTrait { this: OtherTrait => + summon[deriving.Mirror.Of[Foo]] + summon[deriving.Mirror.Of[InnerTrait]] +} + +object Implementation extends TraitWithSelfType, OtherTrait { + summon[deriving.Mirror.Of[Foo]] + summon[deriving.Mirror.Of[InnerTrait]] +} From 5b2ec61938c4e6c5b29b0c883a463acd88eab6dd Mon Sep 17 00:00:00 2001 From: Eugene Flesselle <43113539+EugeneFlesselle@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:45:21 +0100 Subject: [PATCH 2/2] Use classSymbols method Co-authored-by: Jamie Thompson --- compiler/src/dotty/tools/dotc/core/SymUtils.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/core/SymUtils.scala b/compiler/src/dotty/tools/dotc/core/SymUtils.scala index 9d36b6a3c308..65634241b790 100644 --- a/compiler/src/dotty/tools/dotc/core/SymUtils.scala +++ b/compiler/src/dotty/tools/dotc/core/SymUtils.scala @@ -181,7 +181,7 @@ class SymUtils: else { val children = self.children val companionMirror = self.useCompanionAsSumMirror - val ownerScope = if pre.isInstanceOf[SingletonType] then pre.parentSymbols(_.isClass) else Nil + val ownerScope = if pre.isInstanceOf[SingletonType] then pre.classSymbols else Nil def problem(child: Symbol) = { def accessibleMessage(sym: Symbol): String =