[#307] | project: compiler | priority: low | category: bug | |
---|---|---|---|---|
submitter | assigned to | status | date submitted | |
Michel | Martin | fixed | 2004-03-15 16:12:37.0 | |
subject | Constant folder turns incorrect programs into correct ones | |||
code |
object Test { def main(args: Array[String]): Unit = { val x = y; val y = 10; System.out.println("x=" + x + " y=" + y); } } |
|||
what happened | No error |
|||
what expected | An error saying that there's a forward reference to y. If one simply adds an explicit type to the declaration of y to prevent the constant folder to do its jobs, one gets:
bug_constantfolder_3.scala:3: forward reference extends over definition of value x val x = y; ^ one error found |
|||
[back to overview] |
Michel edited on 2004-03-15 16:28:10.0 |
I have an even nastier example where the constant folder enables type incorrect code to be accepted! Here is the code:
object Test { class S; class C[T <: S]; def f[T <: S](x: C[T]) = false; def main(args: Array[String]): Unit = { val x = 1; (x == 0) && f[String](new C[String]) } }The problem here is that C[String] should not be legal as |
Erik edited on 2004-03-15 16:52:44.0 |
I do not know what is said about object creation
in the spec, but the constant folder can circumvent the
constructor code for the object.
object Test with Application { object o { Console.println("Foo"); val a = '*'; } Console.println(o.a); }Prints only *But object Test with Application { object o { Console.println("Foo"); val a:char = '*'; } Console.println(o.a); }Prints Foo * |
Martin edited on 2006-03-30 18:51:30.0 |
Fixed in version 2 |