Skip to content

Tuple#tail along with shapeless.labelled.FieldType encoding triggers type error #16481

Closed as not planned
@mrdziuban

Description

@mrdziuban

Compiler version

3.2.1

Minimized code

https://scastie.scala-lang.org/mrdziuban/kOxLqWh4S5iXYTAqxvY6gw/11

// Equivalent encoding to shapeless
// https://github.com/milessabin/shapeless/blob/main/core/shared/src/main/scala/shapeless/labelled.scala#L24-L32
type FieldType[K, +V] = V with KeyTag[K, V]
trait KeyTag[K, +V] extends Any
def field[K]: [v] => v => FieldType[K, v] = [v] => (v: v) => v.asInstanceOf[FieldType[K, v]]

type SB = FieldType["str", String] *: FieldType["bool", Boolean] *: EmptyTuple
type ISB = FieldType["int", Int] *: SB

val isb: ISB = field["int"](1) *: field["str"]("foo") *: field["bool"](true) *: EmptyTuple
val sb: SB = isb.tail

Output

-- [E007] Type Mismatch Error: /Users/matt/scala-3-playground/src/main/scala/example/Test.scala:14:15
14 |  val sb: SB = isb.tail
   |               ^^^^^^^^
   |Found:    Tuple.Tail[(example.Test.FieldType[("int" : String), Int],
   |  example.Test.FieldType[("str" : String), String]
   |, example.Test.FieldType[("bool" : String), Boolean])]
   |Required: example.Test.SB
   |
   |Note: a match type could not be fully reduced:
   |
   |  trying to reduce  Tuple.Tail[
   |  (example.Test.FieldType[("int" : String), Int],
   |    example.Test.FieldType[("str" : String), String]
   |  , example.Test.FieldType[("bool" : String), Boolean])
   |]
   |  failed since selector  (example.Test.FieldType[("int" : String), Int],
   |  example.Test.FieldType[("str" : String), String]
   |, example.Test.FieldType[("bool" : String), Boolean])
   |  is uninhabited (there are no values of that type).
   |----------------------------------------------------------------------------
   | Explanation (enabled by `-explain`)
   |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   |
   | Tree: example.Test.isb.tail[
   |
   |     (example.Test.FieldType[("int" : String), Int],
   |       example.Test.FieldType[("str" : String), String]
   |     , example.Test.FieldType[("bool" : String), Boolean])
   |
   | ]
   | I tried to show that
   |   Tuple.Tail[
   |   (example.Test.FieldType[("int" : String), Int],
   |     example.Test.FieldType[("str" : String), String]
   |   , example.Test.FieldType[("bool" : String), Boolean])
   | ]
   | conforms to
   |   example.Test.SB
   | but the comparison trace ended with `false`:
   |
   |   ==> AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)
   |     ==> AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple)))))
   |       ==> MatchType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple),TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)))),List(HKTypeLambda(List(_$15, xs), List(TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Any)), TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple))), AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class runtime)),class MatchCase),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),*:),List(TypeParamRef(_$15), TypeParamRef(xs))), TypeParamRef(xs))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple)))))
   |         ==> TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple)  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple)))))
   |         <== TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple)  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
   |       <== MatchType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple),TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)))),List(HKTypeLambda(List(_$15, xs), List(TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Any)), TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple))), AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class runtime)),class MatchCase),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),*:),List(TypeParamRef(_$15), TypeParamRef(xs))), TypeParamRef(xs))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
   |     <== AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
   |   <== AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB) = false
   |
   | The tests were made under a constraint with:
   |  uninstantiated variables: This
   |  constrained types:
   |   [This >: (example.Test.isb : example.Test.ISB) <: NonEmptyTuple]:
   |     Tuple.Tail[This]
   |  bounds:
   |      This >: (example.Test.isb : example.Test.ISB) <: NonEmptyTuple
   |  ordering:
    ----------------------------------------------------------------------------
Explanation
===========
[error]
Tree: example.Test.isb.tail[
[error]
    (example.Test.FieldType[("int" : String), Int],
      example.Test.FieldType[("str" : String), String]
    , example.Test.FieldType[("bool" : String), Boolean])
[error]
]
I tried to show that
  Tuple.Tail[
  (example.Test.FieldType[("int" : String), Int],
    example.Test.FieldType[("str" : String), String]
  , example.Test.FieldType[("bool" : String), Boolean])
]
conforms to
  example.Test.SB
but the comparison trace ended with `false`:
[error]
  ==> AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)
    ==> AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple)))))
      ==> MatchType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple),TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)))),List(HKTypeLambda(List(_$15, xs), List(TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Any)), TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple))), AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class runtime)),class MatchCase),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),*:),List(TypeParamRef(_$15), TypeParamRef(xs))), TypeParamRef(xs))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple)))))
        ==> TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple)  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))
        <== TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple)  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
      <== MatchType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple),TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB)))),List(HKTypeLambda(List(_$15, xs), List(TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Any)), TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Nothing),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),trait Tuple))), AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class runtime)),class MatchCase),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),*:),List(TypeParamRef(_$15), TypeParamRef(xs))), TypeParamRef(xs))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
    <== AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(str)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Predef),type String))), AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(bool)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean))), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class scala)),object Tuple$package),type EmptyTuple))))) = false
  <== AppliedType(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple),Tail),List(TypeVar(TypeParamRef(This) -> AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class *:),List(AppliedType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type FieldType),List(ConstantType(Constant(int)), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int))), TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB))))))  <:  TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),module class Test$)),type SB) = false
[error]
The tests were made under a constraint with:
 uninstantiated variables: This
 constrained types:
  [This >: (example.Test.isb : example.Test.ISB) <: NonEmptyTuple]:
    Tuple.Tail[This]
 bounds:
     This >: (example.Test.isb : example.Test.ISB) <: NonEmptyTuple
 ordering:

Expectation

The compiler can prove that Tuple.Tail[ISB] =:= SB

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions