diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-11-02 00:14:43 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-11-02 00:14:43 +0000 |
commit | f4e000f7f08086727cec4c810873379de8ab2624 (patch) | |
tree | 13b34595dc6162b91a19754446b201577866326e | |
parent | 278ec47fb14f58b82e78f4c77b49d35eec122b92 (diff) | |
download | scala-f4e000f7f08086727cec4c810873379de8ab2624.tar.gz scala-f4e000f7f08086727cec4c810873379de8ab2624.tar.bz2 scala-f4e000f7f08086727cec4c810873379de8ab2624.zip |
Closes #3816. Review by moors.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 5 | ||||
-rw-r--r-- | test/files/neg/t3816.check | 7 | ||||
-rw-r--r-- | test/files/neg/t3816.scala | 42 |
3 files changed, 52 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 58f0532e39..e0e8efb007 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3623,10 +3623,11 @@ trait Typers { self: Analyzer => // are made to disappear here. In addition, // if we are in a constructor of a pattern, we ignore all definitions // which are methods (note: if we don't do that - // case x :: xs in class List would return the :: method). + // case x :: xs in class List would return the :: method) + // unless they are stable or are accessors (the latter exception is for better error messages). def qualifies(sym: Symbol): Boolean = { reallyExists(sym) && - ((mode & PATTERNmode | FUNmode) != (PATTERNmode | FUNmode) || !sym.isSourceMethod) + ((mode & PATTERNmode | FUNmode) != (PATTERNmode | FUNmode) || !sym.isSourceMethod || sym.hasFlag(ACCESSOR)) } if (defSym == NoSymbol) { diff --git a/test/files/neg/t3816.check b/test/files/neg/t3816.check new file mode 100644 index 0000000000..3658e76b64 --- /dev/null +++ b/test/files/neg/t3816.check @@ -0,0 +1,7 @@ +t3816.scala:30: error: stable identifier required, but syncID found. + case Some( `syncID` ) => + ^ +t3816.scala:38: error: stable identifier required, but Test.this.foo found. + case Some( `foo` ) => + ^ +two errors found diff --git a/test/files/neg/t3816.scala b/test/files/neg/t3816.scala new file mode 100644 index 0000000000..31b0825f1d --- /dev/null +++ b/test/files/neg/t3816.scala @@ -0,0 +1,42 @@ +class B { + def ::(a: List[Int]) { + a match { + case x::xs => + case _ => + } + } +} + +object Test { + def testSuccess1( x: Any ) = { + val stable = 2 + x match { + case Some( `stable` ) => + case _ => + } + } + + val bar = 3 + def testSuccess2( x: Any ) = { + x match { + case Some( `bar` ) => + case _ => + } + } + + def testFail1( x: Any ) = { + var syncID = 0 + x match { + case Some( `syncID` ) => + case _ => + } + } + + var foo = 0 + def testFail2( x: Any ) = { + x match { + case Some( `foo` ) => + case _ => + } + } +} |