Skip to content

Compile failure with right associative op and conversion #15939

Closed
@som-snytt

Description

@som-snytt

Compiler version

Scala compiler version 3.1.3 -- Copyright 2002-2022, LAMP/EPFL
Scala compiler version 3.2.1-RC1-bin-SNAPSHOT-git-456444b -- Copyright 2002-2022, LAMP/EPFL

Minimized code

import scala.language.implicitConversions

object Test extends App {
  class Foo {
    class Bar {
      override def toString() = "bar"
    }
    object Bar {
      implicit def fromString(a: String): Bar = { println("convert bar") ; new Bar }
    }

    def andThen_:(b: Bar) = { println("pre") ; println(s"use $b") ; println("post") }
    def andThenByName_:(b: => Bar) = { println("pre") ; println(s"use $b") ; println(s"use $b") ; println("post") }
  }

  def mkFoo: Foo = { println("foo") ; new Foo }
  def mkBarString: String = { println("bar"); "Bar" }

  mkBarString andThen_: mkFoo

  println()

  mkFoo.andThen_:(mkBarString)

  println()

  mkBarString andThenByName_: mkFoo

  println()

  mkFoo.andThenByName_:(mkBarString)
}

Output

-- [E007] Type Mismatch Error: test/files/run/t4225e.scala:20:2 --------------------------------------------------------------------------
20 |  mkBarString andThen_: mkFoo
   |  ^^^^^^^^^^^
   |  Found:    String
   |  Required: Nothing
   |
   | longer explanation available when compiling with `-explain`
-- [E007] Type Mismatch Error: test/files/run/t4225e.scala:24:18 -------------------------------------------------------------------------
24 |  mkFoo.andThen_:(mkBarString)
   |                  ^^^^^^^^^^^
   |                  Found:    String
   |                  Required: Nothing
   |
   | longer explanation available when compiling with `-explain`
-- [E007] Type Mismatch Error: test/files/run/t4225e.scala:28:2 --------------------------------------------------------------------------
28 |  mkBarString andThenByName_: mkFoo
   |  ^^^^^^^^^^^
   |  Found:    String
   |  Required: Nothing
   |
   | longer explanation available when compiling with `-explain`
-- [E007] Type Mismatch Error: test/files/run/t4225e.scala:32:24 -------------------------------------------------------------------------
32 |  mkFoo.andThenByName_:(mkBarString)
   |                        ^^^^^^^^^^^
   |                        Found:    String
   |                        Required: Nothing
   |
   | longer explanation available when compiling with `-explain`

From -Vprint:typer

    def mkBarString: String =
      {
        println("bar")
        "Bar"
      }
    {
      val b$1: <error Found:    String
Required: Nothing> = mkBarString
      Test.mkFoo.andThen_:(b$1)
    }
    println()
    Test.mkFoo.andThen_:(mkBarString)
    println()
    Test.mkFoo.andThenByName_:(mkBarString)
    println()
    Test.mkFoo.andThenByName_:(mkBarString)

Expectation

Successful compilation of Scala 2 test test/files/run/t4225e.scala

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:reportingError reporting including formatting, implicit suggestions, etcitype:enhancement

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions