Better error recovery from missing select or group clause. Fixes #3907.
authorMarek Safar <marek.safar@gmail.com>
Mon, 19 Mar 2012 18:33:08 +0000 (18:33 +0000)
committerMarek Safar <marek.safar@gmail.com>
Mon, 19 Mar 2012 18:33:08 +0000 (18:33 +0000)
mcs/errors/cs0742.cs [new file with mode: 0644]
mcs/mcs/cs-parser.jay
mcs/tests/test-debug-19-ref.xml

diff --git a/mcs/errors/cs0742.cs b/mcs/errors/cs0742.cs
new file mode 100644 (file)
index 0000000..9e38929
--- /dev/null
@@ -0,0 +1,12 @@
+// CS0742: Unexpected symbol `;'. A query body must end with select or group clause
+// Line: 10
+
+using System.Linq;
+
+class C
+{
+       public static void Main ()
+    {
+        var q = from i in "abcd" where i;
+    }
+}
index 6e8c82c6afd3cc5e17177c88c33a60e887215f13..b17c4ca0563dcf3704059afeed18b77fb22de142 100644 (file)
@@ -5751,7 +5751,7 @@ from_clause
        ;       
 
 query_body
-       : opt_query_body_clauses select_or_group_clause opt_query_continuation 
+       : query_body_clauses select_or_group_clause opt_query_continuation 
          {
                Linq.AQueryClause head = (Linq.AQueryClause)$2;
                
@@ -5766,7 +5766,24 @@ query_body
                
                $$ = head;
          }
-       | opt_query_body_clauses COMPLETE_COMPLETION
+       | select_or_group_clause opt_query_continuation
+         {
+               Linq.AQueryClause head = (Linq.AQueryClause)$2;
+
+               if ($1 != null) {
+                       Linq.AQueryClause clause = (Linq.AQueryClause)$1;
+                       clause.Tail.Next = head;
+                       head = clause;
+               }
+               
+               $$ = head;
+         }
+       | query_body_clauses COMPLETE_COMPLETION
+       | query_body_clauses error
+         {
+               report.Error (742, GetLocation ($2), "Unexpected symbol `{0}'. A query body must end with select or group clause", GetSymbolName (yyToken));
+               $$ = $1;
+         }
        | error
          {
                Error_SyntaxError (yyToken);
@@ -5811,11 +5828,6 @@ select_or_group_clause
          }
        ;
        
-opt_query_body_clauses
-       : /* empty */
-       | query_body_clauses
-       ;
-       
 query_body_clauses
        : query_body_clause
        | query_body_clauses query_body_clause
index 497d21ee5acd50eb2461470dab38d4dcd45446e9..a54299513b23de12663332b641113edac1442ba2 100644 (file)
         <entry il="0x22" row="35" file_ref="1" hidden="false" />
         <entry il="0x2d" row="36" file_ref="1" hidden="false" />
         <entry il="0x8b" row="37" file_ref="1" hidden="false" />
-        <entry il="0x380" row="38" file_ref="1" hidden="false" />
-        <entry il="0x490" row="39" file_ref="1" hidden="false" />
+        <entry il="0x3b1" row="38" file_ref="1" hidden="false" />
+        <entry il="0x4c1" row="39" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes>
-        <entry index="0" start="0x22" end="0x470" />
+        <entry index="0" start="0x22" end="0x4a1" />
       </scopes>
     </method>
     <method token="0x6000011">