1"""This module tests SyntaxErrors. 2 3Here's an example of the sort of thing that is tested. 4 5>>> def f(x): 6... global x 7Traceback (most recent call last): 8SyntaxError: name 'x' is local and global (<doctest test.test_syntax[0]>, line 1) 9 10The tests are all raise SyntaxErrors. They were created by checking 11each C call that raises SyntaxError. There are several modules that 12raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and 13symtable.c. 14 15The parser itself outlaws a lot of invalid syntax. None of these 16errors are tested here at the moment. We should add some tests; since 17there are infinitely many programs with invalid syntax, we would need 18to be judicious in selecting some. 19 20The compiler generates a synthetic module name for code executed by 21doctest. Since all the code comes from the same module, a suffix like 22[1] is appended to the module name, As a consequence, changing the 23order of tests in this module means renumbering all the errors after 24it. (Maybe we should enable the ellipsis option for these tests.) 25 26In ast.c, syntax errors are raised by calling ast_error(). 27 28Errors from set_context(): 29 30>>> obj.None = 1 31Traceback (most recent call last): 32 File "<doctest test.test_syntax[1]>", line 1 33SyntaxError: cannot assign to None 34 35>>> None = 1 36Traceback (most recent call last): 37 File "<doctest test.test_syntax[2]>", line 1 38SyntaxError: cannot assign to None 39 40It's a syntax error to assign to the empty tuple. Why isn't it an 41error to assign to the empty list? It will always raise some error at 42runtime. 43 44>>> () = 1 45Traceback (most recent call last): 46 File "<doctest test.test_syntax[3]>", line 1 47SyntaxError: can't assign to () 48 49>>> f() = 1 50Traceback (most recent call last): 51 File "<doctest test.test_syntax[4]>", line 1 52SyntaxError: can't assign to function call 53 54>>> del f() 55Traceback (most recent call last): 56 File "<doctest test.test_syntax[5]>", line 1 57SyntaxError: can't delete function call 58 59>>> a + 1 = 2 60Traceback (most recent call last): 61 File "<doctest test.test_syntax[6]>", line 1 62SyntaxError: can't assign to operator 63 64>>> (x for x in x) = 1 65Traceback (most recent call last): 66 File "<doctest test.test_syntax[7]>", line 1 67SyntaxError: can't assign to generator expression 68 69>>> 1 = 1 70Traceback (most recent call last): 71 File "<doctest test.test_syntax[8]>", line 1 72SyntaxError: can't assign to literal 73 74>>> "abc" = 1 75Traceback (most recent call last): 76 File "<doctest test.test_syntax[8]>", line 1 77SyntaxError: can't assign to literal 78 79>>> `1` = 1 80Traceback (most recent call last): 81 File "<doctest test.test_syntax[10]>", line 1 82SyntaxError: can't assign to repr 83 84If the left-hand side of an assignment is a list or tuple, an illegal 85expression inside that contain should still cause a syntax error. 86This test just checks a couple of cases rather than enumerating all of 87them. 88 89>>> (a, "b", c) = (1, 2, 3) 90Traceback (most recent call last): 91 File "<doctest test.test_syntax[11]>", line 1 92SyntaxError: can't assign to literal 93 94>>> [a, b, c + 1] = [1, 2, 3] 95Traceback (most recent call last): 96 File "<doctest test.test_syntax[12]>", line 1 97SyntaxError: can't assign to operator 98 99>>> a if 1 else b = 1 100Traceback (most recent call last): 101 File "<doctest test.test_syntax[13]>", line 1 102SyntaxError: can't assign to conditional expression 103 104From compiler_complex_args(): 105 106>>> def f(None=1): 107... pass 108Traceback (most recent call last): 109 File "<doctest test.test_syntax[14]>", line 1 110SyntaxError: cannot assign to None 111 112 113From ast_for_arguments(): 114 115>>> def f(x, y=1, z): 116... pass 117Traceback (most recent call last): 118 File "<doctest test.test_syntax[15]>", line 1 119SyntaxError: non-default argument follows default argument 120 121>>> def f(x, None): 122... pass 123Traceback (most recent call last): 124 File "<doctest test.test_syntax[16]>", line 1 125SyntaxError: cannot assign to None 126 127>>> def f(*None): 128... pass 129Traceback (most recent call last): 130 File "<doctest test.test_syntax[17]>", line 1 131SyntaxError: cannot assign to None 132 133>>> def f(**None): 134... pass 135Traceback (most recent call last): 136 File "<doctest test.test_syntax[18]>", line 1 137SyntaxError: cannot assign to None 138 139 140From ast_for_funcdef(): 141 142>>> def None(x): 143... pass 144Traceback (most recent call last): 145 File "<doctest test.test_syntax[19]>", line 1 146SyntaxError: cannot assign to None 147 148 149From ast_for_call(): 150 151>>> def f(it, *varargs): 152... return list(it) 153>>> L = range(10) 154>>> f(x for x in L) 155[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 156>>> f(x for x in L, 1) 157Traceback (most recent call last): 158 File "<doctest test.test_syntax[23]>", line 1 159SyntaxError: Generator expression must be parenthesized if not sole argument 160>>> f((x for x in L), 1) 161[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 162 163>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, 164... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, 165... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, 166... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, 167... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, 168... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66, 169... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, 170... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88, 171... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99, 172... i100, i101, i102, i103, i104, i105, i106, i107, i108, 173... i109, i110, i111, i112, i113, i114, i115, i116, i117, 174... i118, i119, i120, i121, i122, i123, i124, i125, i126, 175... i127, i128, i129, i130, i131, i132, i133, i134, i135, 176... i136, i137, i138, i139, i140, i141, i142, i143, i144, 177... i145, i146, i147, i148, i149, i150, i151, i152, i153, 178... i154, i155, i156, i157, i158, i159, i160, i161, i162, 179... i163, i164, i165, i166, i167, i168, i169, i170, i171, 180... i172, i173, i174, i175, i176, i177, i178, i179, i180, 181... i181, i182, i183, i184, i185, i186, i187, i188, i189, 182... i190, i191, i192, i193, i194, i195, i196, i197, i198, 183... i199, i200, i201, i202, i203, i204, i205, i206, i207, 184... i208, i209, i210, i211, i212, i213, i214, i215, i216, 185... i217, i218, i219, i220, i221, i222, i223, i224, i225, 186... i226, i227, i228, i229, i230, i231, i232, i233, i234, 187... i235, i236, i237, i238, i239, i240, i241, i242, i243, 188... i244, i245, i246, i247, i248, i249, i250, i251, i252, 189... i253, i254, i255) 190Traceback (most recent call last): 191 File "<doctest test.test_syntax[25]>", line 1 192SyntaxError: more than 255 arguments 193 194The actual error cases counts positional arguments, keyword arguments, 195and generator expression arguments separately. This test combines the 196three. 197 198>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, 199... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, 200... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, 201... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, 202... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, 203... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66, 204... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, 205... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88, 206... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99, 207... i100, i101, i102, i103, i104, i105, i106, i107, i108, 208... i109, i110, i111, i112, i113, i114, i115, i116, i117, 209... i118, i119, i120, i121, i122, i123, i124, i125, i126, 210... i127, i128, i129, i130, i131, i132, i133, i134, i135, 211... i136, i137, i138, i139, i140, i141, i142, i143, i144, 212... i145, i146, i147, i148, i149, i150, i151, i152, i153, 213... i154, i155, i156, i157, i158, i159, i160, i161, i162, 214... i163, i164, i165, i166, i167, i168, i169, i170, i171, 215... i172, i173, i174, i175, i176, i177, i178, i179, i180, 216... i181, i182, i183, i184, i185, i186, i187, i188, i189, 217... i190, i191, i192, i193, i194, i195, i196, i197, i198, 218... i199, i200, i201, i202, i203, i204, i205, i206, i207, 219... i208, i209, i210, i211, i212, i213, i214, i215, i216, 220... i217, i218, i219, i220, i221, i222, i223, i224, i225, 221... i226, i227, i228, i229, i230, i231, i232, i233, i234, 222... i235, i236, i237, i238, i239, i240, i241, i242, i243, 223... (x for x in i244), i245, i246, i247, i248, i249, i250, i251, 224... i252=1, i253=1, i254=1, i255=1) 225Traceback (most recent call last): 226 File "<doctest test.test_syntax[26]>", line 1 227SyntaxError: more than 255 arguments 228 229>>> f(lambda x: x[0] = 3) 230Traceback (most recent call last): 231 File "<doctest test.test_syntax[27]>", line 1 232SyntaxError: lambda cannot contain assignment 233 234The grammar accepts any test (basically, any expression) in the 235keyword slot of a call site. Test a few different options. 236 237>>> f(x()=2) 238Traceback (most recent call last): 239 File "<doctest test.test_syntax[28]>", line 1 240SyntaxError: keyword can't be an expression 241>>> f(a or b=1) 242Traceback (most recent call last): 243 File "<doctest test.test_syntax[29]>", line 1 244SyntaxError: keyword can't be an expression 245>>> f(x.y=1) 246Traceback (most recent call last): 247 File "<doctest test.test_syntax[30]>", line 1 248SyntaxError: keyword can't be an expression 249 250 251More set_context(): 252 253>>> (x for x in x) += 1 254Traceback (most recent call last): 255 File "<doctest test.test_syntax[31]>", line 1 256SyntaxError: can't assign to generator expression 257>>> None += 1 258Traceback (most recent call last): 259 File "<doctest test.test_syntax[32]>", line 1 260SyntaxError: cannot assign to None 261>>> f() += 1 262Traceback (most recent call last): 263 File "<doctest test.test_syntax[33]>", line 1 264SyntaxError: can't assign to function call 265 266 267Test continue in finally in weird combinations. 268 269continue in for loop under finally should be ok. 270 271 >>> def test(): 272 ... try: 273 ... pass 274 ... finally: 275 ... for abc in range(10): 276 ... continue 277 ... print abc 278 >>> test() 279 9 280 281Start simple, a continue in a finally should not be allowed. 282 283 >>> def test(): 284 ... for abc in range(10): 285 ... try: 286 ... pass 287 ... finally: 288 ... continue 289 Traceback (most recent call last): 290 ... 291 File "<doctest test.test_syntax[36]>", line 6 292 SyntaxError: 'continue' not supported inside 'finally' clause 293 294This is essentially a continue in a finally which should not be allowed. 295 296 >>> def test(): 297 ... for abc in range(10): 298 ... try: 299 ... pass 300 ... finally: 301 ... try: 302 ... continue 303 ... except: 304 ... pass 305 Traceback (most recent call last): 306 ... 307 File "<doctest test.test_syntax[37]>", line 6 308 SyntaxError: 'continue' not supported inside 'finally' clause 309 310 >>> def foo(): 311 ... try: 312 ... pass 313 ... finally: 314 ... continue 315 Traceback (most recent call last): 316 ... 317 File "<doctest test.test_syntax[38]>", line 5 318 SyntaxError: 'continue' not supported inside 'finally' clause 319 320 >>> def foo(): 321 ... for a in (): 322 ... try: 323 ... pass 324 ... finally: 325 ... continue 326 Traceback (most recent call last): 327 ... 328 File "<doctest test.test_syntax[39]>", line 6 329 SyntaxError: 'continue' not supported inside 'finally' clause 330 331 >>> def foo(): 332 ... for a in (): 333 ... try: 334 ... pass 335 ... finally: 336 ... try: 337 ... continue 338 ... finally: 339 ... pass 340 Traceback (most recent call last): 341 ... 342 File "<doctest test.test_syntax[40]>", line 7 343 SyntaxError: 'continue' not supported inside 'finally' clause 344 345 >>> def foo(): 346 ... for a in (): 347 ... try: pass 348 ... finally: 349 ... try: 350 ... pass 351 ... except: 352 ... continue 353 Traceback (most recent call last): 354 ... 355 File "<doctest test.test_syntax[41]>", line 8 356 SyntaxError: 'continue' not supported inside 'finally' clause 357 358There is one test for a break that is not in a loop. The compiler 359uses a single data structure to keep track of try-finally and loops, 360so we need to be sure that a break is actually inside a loop. If it 361isn't, there should be a syntax error. 362 363 >>> try: 364 ... print 1 365 ... break 366 ... print 2 367 ... finally: 368 ... print 3 369 Traceback (most recent call last): 370 ... 371 File "<doctest test.test_syntax[42]>", line 3 372 SyntaxError: 'break' outside loop 373 374This raises a SyntaxError, it used to raise a SystemError. 375Context for this change can be found on issue #27514 376 377In 2.5 there was a missing exception and an assert was triggered in a debug 378build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514 379 380 >>> while 1: 381 ... while 2: 382 ... while 3: 383 ... while 4: 384 ... while 5: 385 ... while 6: 386 ... while 8: 387 ... while 9: 388 ... while 10: 389 ... while 11: 390 ... while 12: 391 ... while 13: 392 ... while 14: 393 ... while 15: 394 ... while 16: 395 ... while 17: 396 ... while 18: 397 ... while 19: 398 ... while 20: 399 ... while 21: 400 ... while 22: 401 ... break 402 Traceback (most recent call last): 403 ... 404 SyntaxError: too many statically nested blocks 405 406This tests assignment-context; there was a bug in Python 2.5 where compiling 407a complex 'if' (one with 'elif') would fail to notice an invalid suite, 408leading to spurious errors. 409 410 >>> if 1: 411 ... x() = 1 412 ... elif 1: 413 ... pass 414 Traceback (most recent call last): 415 ... 416 File "<doctest test.test_syntax[44]>", line 2 417 SyntaxError: can't assign to function call 418 419 >>> if 1: 420 ... pass 421 ... elif 1: 422 ... x() = 1 423 Traceback (most recent call last): 424 ... 425 File "<doctest test.test_syntax[45]>", line 4 426 SyntaxError: can't assign to function call 427 428 >>> if 1: 429 ... x() = 1 430 ... elif 1: 431 ... pass 432 ... else: 433 ... pass 434 Traceback (most recent call last): 435 ... 436 File "<doctest test.test_syntax[46]>", line 2 437 SyntaxError: can't assign to function call 438 439 >>> if 1: 440 ... pass 441 ... elif 1: 442 ... x() = 1 443 ... else: 444 ... pass 445 Traceback (most recent call last): 446 ... 447 File "<doctest test.test_syntax[47]>", line 4 448 SyntaxError: can't assign to function call 449 450 >>> if 1: 451 ... pass 452 ... elif 1: 453 ... pass 454 ... else: 455 ... x() = 1 456 Traceback (most recent call last): 457 ... 458 File "<doctest test.test_syntax[48]>", line 6 459 SyntaxError: can't assign to function call 460 461>>> f(a=23, a=234) 462Traceback (most recent call last): 463 ... 464 File "<doctest test.test_syntax[49]>", line 1 465SyntaxError: keyword argument repeated 466 467>>> del () 468Traceback (most recent call last): 469 ... 470 File "<doctest test.test_syntax[50]>", line 1 471SyntaxError: can't delete () 472 473>>> {1, 2, 3} = 42 474Traceback (most recent call last): 475 ... 476 File "<doctest test.test_syntax[50]>", line 1 477SyntaxError: can't assign to literal 478 479Corner-case that used to crash: 480 481 >>> def f(*xx, **__debug__): pass 482 Traceback (most recent call last): 483 SyntaxError: cannot assign to __debug__ 484 485""" 486 487import re 488import unittest 489import warnings 490 491from test import test_support 492 493class SyntaxTestCase(unittest.TestCase): 494 495 def _check_error(self, code, errtext, 496 filename="<testcase>", mode="exec", subclass=None): 497 """Check that compiling code raises SyntaxError with errtext. 498 499 errtest is a regular expression that must be present in the 500 test of the exception raised. If subclass is specified it 501 is the expected subclass of SyntaxError (e.g. IndentationError). 502 """ 503 try: 504 compile(code, filename, mode) 505 except SyntaxError, err: 506 if subclass and not isinstance(err, subclass): 507 self.fail("SyntaxError is not a %s" % subclass.__name__) 508 mo = re.search(errtext, str(err)) 509 if mo is None: 510 self.fail("%s did not contain '%r'" % (err, errtext,)) 511 else: 512 self.fail("compile() did not raise SyntaxError") 513 514 def test_paren_arg_with_default(self): 515 self._check_error("def f((x)=23): pass", 516 "parenthesized arg with default") 517 518 def test_assign_call(self): 519 self._check_error("f() = 1", "assign") 520 521 def test_assign_del(self): 522 self._check_error("del f()", "delete") 523 524 def test_global_err_then_warn(self): 525 # Bug tickler: The SyntaxError raised for one global statement 526 # shouldn't be clobbered by a SyntaxWarning issued for a later one. 527 source = re.sub('(?m)^ *:', '', """\ 528 :def error(a): 529 : global a # SyntaxError 530 :def warning(): 531 : b = 1 532 : global b # SyntaxWarning 533 :""") 534 warnings.filterwarnings(action='ignore', category=SyntaxWarning) 535 self._check_error(source, "global") 536 warnings.filters.pop(0) 537 538 def test_break_outside_loop(self): 539 self._check_error("break", "outside loop") 540 541 def test_delete_deref(self): 542 source = re.sub('(?m)^ *:', '', """\ 543 :def foo(x): 544 : def bar(): 545 : print x 546 : del x 547 :""") 548 self._check_error(source, "nested scope") 549 550 def test_unexpected_indent(self): 551 self._check_error("foo()\n bar()\n", "unexpected indent", 552 subclass=IndentationError) 553 554 def test_no_indent(self): 555 self._check_error("if 1:\nfoo()", "expected an indented block", 556 subclass=IndentationError) 557 558 def test_bad_outdent(self): 559 self._check_error("if 1:\n foo()\n bar()", 560 "unindent does not match .* level", 561 subclass=IndentationError) 562 563 def test_kwargs_last(self): 564 self._check_error("int(base=10, '2')", "non-keyword arg") 565 566def test_main(): 567 test_support.run_unittest(SyntaxTestCase) 568 from test import test_syntax 569 with test_support.check_py3k_warnings(("backquote not supported", 570 SyntaxWarning)): 571 test_support.run_doctest(test_syntax, verbosity=True) 572 573if __name__ == "__main__": 574 test_main() 575