[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