| [#214] | project: compiler | priority: high | category: bug | |
|---|---|---|---|---|
| submitter | assigned to | status | date submitted | |
| Philippe | Burak | fixed | 2003-11-04 09:40:01.0 | |
| subject | ill typed code generated by transmatch | |||
| code |
class Foo {
def foo: Int = 42;
def bar(x: Any): Int = x match {
case foo: Foo => foo.foo;
}
} |
|||
| what happened | |
|||
| what expected | The line |
|||
| [back to overview] | ||||
| Matthias edited on 2003-11-04 10:01:41.0 |
This is related to Buraks last changes in the parser, I guess. Here, the pattern foo: Foo is translated to (foo@_):Foo. At least my pattern matcher cannot handle this ill-formed pattern. In our spec we clearly say that a typed pattern has the form x : T and there is no possibility to have something more complex in front of the colon. Therefore I suggest that we remove this translation from x to x@_, since this identity obviously leads to patterns that are not well-formed anymore.
|
| Burak edited on 2003-11-04 10:45:09.0 |
|
Well, a typed pattern foo:Foo clearly corresponds to foo @ (_:Foo). I though I ensured that the translation takes care of this, it seems that I forgot something. In any case we should make this work, because there should be only one abstract syntax representation for things meaning the same like x and x@_ do. |
| Burak edited on 2003-11-04 12:43:07.0 |
Just to underline my previous comment, here is what comes out of analyze. Hence types are correct, it is the pattern matcher which does not handle x@(_:Type) correctly
[[Trees after phase analyze]]
// Scala source: bugf.scala
class Foo extends scala{scala}.Object{()scala#Object}(){scala#Object} {
def foo: scala{scala.type}.Int{scala.Int} = 42{scala.Int(42)};
def bar(x: scala{scala.type}.Any{scala.Any}): scala{scala.type}.Int{scala.Int} = x{x.type}.match{[T0,T1]((T0) => T1)T1}({
case (foo @ (_{scala.All}) : Foo{Foo}{Foo}){Foo} => foo{foo.type}.foo{scala.Int}
}){scala.Int}
};
|
| Burak edited on 2003-11-04 13:49:16.0 |
|
As suspected, it was a (tiny) error in PatternMatcher. It generated the correct type test if necessary(what is expected from the context is not a subtype of the T in exp:T), but forgot to use the casted symbol after that! I also put in slight optimizations, no temporary variables are generated for _ nodes anymore. |