[svn] r7806: nemerle/trunk/ncc: testsuite/negative/bug1047.n
typing/Typer-PatternTyper.n
divan
svnadmin at nemerle.org
Mon Oct 15 18:59:32 CEST 2007
Log:
Fix bug 1047.
Author: divan
Date: Mon Oct 15 18:59:30 2007
New Revision: 7806
Added:
nemerle/trunk/ncc/testsuite/negative/bug1047.n
Modified:
nemerle/trunk/ncc/typing/Typer-PatternTyper.n
Added: nemerle/trunk/ncc/testsuite/negative/bug1047.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/negative/bug1047.n Mon Oct 15 18:59:30 2007
@@ -0,0 +1,12 @@
+module Bug1047 {
+ class A {
+ public x : int;
+ }
+ Run1 (_ : A) : int {
+ | d where d = 0 => 1 // E: expression ``d where d'' cannot be used as fieldname in
+ }
+ Run2 (_ : A) : int {
+ | a where x = "" => 2 // E: expression ``a where x'' cannot be used as fieldname in
+ }
+}
+
Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n (original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n Mon Oct 15 18:59:30 2007
@@ -267,11 +267,16 @@
pats : list [PT.PExpr]) : Pattern
{
def is_assignment (expr) {
- expr is PT.PExpr.Assign (PT.PExpr.Ref, _)
+ expr is PT.PExpr.Assign
}
if (List.Exists (pats, is_assignment)) {
if (List.ForAll (pats, is_assignment)) {
+ def is_invalid_assignment (expr) {
+ ! (expr is PT.PExpr.Assign (PT.PExpr.Ref, _))
+ }
+ match (List.Filter (pats, is_invalid_assignment)) {
+ | [] =>
match (matched_value_type.Hint) {
| Some (MType.Class (ti, _)) when matched_value_type.IsFixed =>
def is_instance_field (_ : IMember) {
@@ -314,6 +319,20 @@
"here, try prefixing it with the class name");
Pattern.Error ()
}
+ | bad_pats =>
+ def explain (expr) {
+ | PT.PExpr.Assign (t, _) =>
+ Util.locate (expr.Location, {
+ ReportError (messenger,
+ $ "expression ``$t'' cannot be used as fieldname "
+ "in (fieldname = ...) pattern")
+ })
+ | _ => assert (false)
+ }
+ bad_pats.Iter (explain);
+ Pattern.Error ()
+
+ }
} else {
ReportError (messenger,
"not all, but some patterns in tuple are named");
More information about the svn
mailing list