1 """This module tests SyntaxErrors. 2 3 Here's an example of the sort of thing that is tested. 4 5 >>> def f(x): 6 ... global x 7 Traceback (most recent call last): 8 SyntaxError: name 'x' is parameter and global 9 10 The tests are all raise SyntaxErrors. They were created by checking 11 each C call that raises SyntaxError. There are several modules that 12 raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and 13 symtable.c. 14 15 The parser itself outlaws a lot of invalid syntax. None of these 16 errors are tested here at the moment. We should add some tests; since 17 there are infinitely many programs with invalid syntax, we would need 18 to be judicious in selecting some. 19 20 The compiler generates a synthetic module name for code executed by 21 doctest. 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 23 order of tests in this module means renumbering all the errors after 24 it. (Maybe we should enable the ellipsis option for these tests.) 25 26 In ast.c, syntax errors are raised by calling ast_error(). 27 28 Errors from set_context(): 29 30 >>> obj.None = 1 31 Traceback (most recent call last): 32 SyntaxError: invalid syntax 33 34 >>> None = 1 35 Traceback (most recent call last): 36 SyntaxError: can't assign to keyword 37 38 >>> f() = 1 39 Traceback (most recent call last): 40 SyntaxError: can't assign to function call 41 42 >>> del f() 43 Traceback (most recent call last): 44 SyntaxError: can't delete function call 45 46 >>> a + 1 = 2 47 Traceback (most recent call last): 48 SyntaxError: can't assign to operator 49 50 >>> (x for x in x) = 1 51 Traceback (most recent call last): 52 SyntaxError: can't assign to generator expression 53 54 >>> 1 = 1 55 Traceback (most recent call last): 56 SyntaxError: can't assign to literal 57 58 >>> "abc" = 1 59 Traceback (most recent call last): 60 SyntaxError: can't assign to literal 61 62 >>> b"" = 1 63 Traceback (most recent call last): 64 SyntaxError: can't assign to literal 65 66 >>> `1` = 1 67 Traceback (most recent call last): 68 SyntaxError: invalid syntax 69 70 If the left-hand side of an assignment is a list or tuple, an illegal 71 expression inside that contain should still cause a syntax error. 72 This test just checks a couple of cases rather than enumerating all of 73 them. 74 75 >>> (a, "b", c) = (1, 2, 3) 76 Traceback (most recent call last): 77 SyntaxError: can't assign to literal 78 79 >>> [a, b, c + 1] = [1, 2, 3] 80 Traceback (most recent call last): 81 SyntaxError: can't assign to operator 82 83 >>> a if 1 else b = 1 84 Traceback (most recent call last): 85 SyntaxError: can't assign to conditional expression 86 87 From compiler_complex_args(): 88 89 >>> def f(None=1): 90 ... pass 91 Traceback (most recent call last): 92 SyntaxError: invalid syntax 93 94 95 From ast_for_arguments(): 96 97 >>> def f(x, y=1, z): 98 ... pass 99 Traceback (most recent call last): 100 SyntaxError: non-default argument follows default argument 101 102 >>> def f(x, None): 103 ... pass 104 Traceback (most recent call last): 105 SyntaxError: invalid syntax 106 107 >>> def f(*None): 108 ... pass 109 Traceback (most recent call last): 110 SyntaxError: invalid syntax 111 112 >>> def f(**None): 113 ... pass 114 Traceback (most recent call last): 115 SyntaxError: invalid syntax 116 117 118 From ast_for_funcdef(): 119 120 >>> def None(x): 121 ... pass 122 Traceback (most recent call last): 123 SyntaxError: invalid syntax 124 125 126 From ast_for_call(): 127 128 >>> def f(it, *varargs, **kwargs): 129 ... return list(it) 130 >>> L = range(10) 131 >>> f(x for x in L) 132 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 133 >>> f(x for x in L, 1) 134 Traceback (most recent call last): 135 SyntaxError: Generator expression must be parenthesized 136 >>> f(x for x in L, y=1) 137 Traceback (most recent call last): 138 SyntaxError: Generator expression must be parenthesized 139 >>> f(x for x in L, *[]) 140 Traceback (most recent call last): 141 SyntaxError: Generator expression must be parenthesized 142 >>> f(x for x in L, **{}) 143 Traceback (most recent call last): 144 SyntaxError: Generator expression must be parenthesized 145 >>> f(L, x for x in L) 146 Traceback (most recent call last): 147 SyntaxError: Generator expression must be parenthesized 148 >>> f(x for x in L, y for y in L) 149 Traceback (most recent call last): 150 SyntaxError: Generator expression must be parenthesized 151 >>> f(x for x in L,) 152 Traceback (most recent call last): 153 SyntaxError: Generator expression must be parenthesized 154 >>> f((x for x in L), 1) 155 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 156 >>> class C(x for x in L): 157 ... pass 158 Traceback (most recent call last): 159 SyntaxError: invalid syntax 160 161 >>> def g(*args, **kwargs): 162 ... print(args, sorted(kwargs.items())) 163 >>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 164 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 165 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 166 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 167 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 168 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 169 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 170 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 171 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 172 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 173 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 174 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 175 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 176 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 177 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 178 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 179 ... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 180 ... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 181 ... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 182 ... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 183 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) [] 184 185 >>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8, 186 ... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16, 187 ... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24, 188 ... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32, 189 ... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40, 190 ... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48, 191 ... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56, 192 ... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64, 193 ... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72, 194 ... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80, 195 ... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88, 196 ... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96, 197 ... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103, 198 ... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110, 199 ... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117, 200 ... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124, 201 ... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131, 202 ... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138, 203 ... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145, 204 ... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152, 205 ... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159, 206 ... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166, 207 ... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173, 208 ... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180, 209 ... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187, 210 ... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194, 211 ... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201, 212 ... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208, 213 ... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215, 214 ... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222, 215 ... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229, 216 ... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236, 217 ... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243, 218 ... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250, 219 ... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257, 220 ... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264, 221 ... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271, 222 ... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278, 223 ... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285, 224 ... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292, 225 ... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299) 226 ... # doctest: +ELLIPSIS 227 () [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)] 228 229 >>> class C: 230 ... def meth(self, *args): 231 ... return args 232 >>> obj = C() 233 >>> obj.meth( 234 ... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 235 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 236 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 237 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 238 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 239 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 240 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 241 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 242 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 243 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 244 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 245 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 246 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 247 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 248 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 249 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 250 ... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 251 ... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 252 ... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 253 ... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 254 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) 255 256 >>> f(lambda x: x[0] = 3) 257 Traceback (most recent call last): 258 SyntaxError: lambda cannot contain assignment 259 260 The grammar accepts any test (basically, any expression) in the 261 keyword slot of a call site. Test a few different options. 262 263 >>> f(x()=2) 264 Traceback (most recent call last): 265 SyntaxError: keyword can't be an expression 266 >>> f(a or b=1) 267 Traceback (most recent call last): 268 SyntaxError: keyword can't be an expression 269 >>> f(x.y=1) 270 Traceback (most recent call last): 271 SyntaxError: keyword can't be an expression 272 273 274 More set_context(): 275 276 >>> (x for x in x) += 1 277 Traceback (most recent call last): 278 SyntaxError: can't assign to generator expression 279 >>> None += 1 280 Traceback (most recent call last): 281 SyntaxError: can't assign to keyword 282 >>> f() += 1 283 Traceback (most recent call last): 284 SyntaxError: can't assign to function call 285 286 287 Test continue in finally in weird combinations. 288 289 continue in for loop under finally should be ok. 290 291 >>> def test(): 292 ... try: 293 ... pass 294 ... finally: 295 ... for abc in range(10): 296 ... continue 297 ... print(abc) 298 >>> test() 299 9 300 301 Start simple, a continue in a finally should not be allowed. 302 303 >>> def test(): 304 ... for abc in range(10): 305 ... try: 306 ... pass 307 ... finally: 308 ... continue 309 Traceback (most recent call last): 310 ... 311 SyntaxError: 'continue' not supported inside 'finally' clause 312 313 This is essentially a continue in a finally which should not be allowed. 314 315 >>> def test(): 316 ... for abc in range(10): 317 ... try: 318 ... pass 319 ... finally: 320 ... try: 321 ... continue 322 ... except: 323 ... pass 324 Traceback (most recent call last): 325 ... 326 SyntaxError: 'continue' not supported inside 'finally' clause 327 328 >>> def foo(): 329 ... try: 330 ... pass 331 ... finally: 332 ... continue 333 Traceback (most recent call last): 334 ... 335 SyntaxError: 'continue' not supported inside 'finally' clause 336 337 >>> def foo(): 338 ... for a in (): 339 ... try: 340 ... pass 341 ... finally: 342 ... continue 343 Traceback (most recent call last): 344 ... 345 SyntaxError: 'continue' not supported inside 'finally' clause 346 347 >>> def foo(): 348 ... for a in (): 349 ... try: 350 ... pass 351 ... finally: 352 ... try: 353 ... continue 354 ... finally: 355 ... pass 356 Traceback (most recent call last): 357 ... 358 SyntaxError: 'continue' not supported inside 'finally' clause 359 360 >>> def foo(): 361 ... for a in (): 362 ... try: pass 363 ... finally: 364 ... try: 365 ... pass 366 ... except: 367 ... continue 368 Traceback (most recent call last): 369 ... 370 SyntaxError: 'continue' not supported inside 'finally' clause 371 372 There is one test for a break that is not in a loop. The compiler 373 uses a single data structure to keep track of try-finally and loops, 374 so we need to be sure that a break is actually inside a loop. If it 375 isn't, there should be a syntax error. 376 377 >>> try: 378 ... print(1) 379 ... break 380 ... print(2) 381 ... finally: 382 ... print(3) 383 Traceback (most recent call last): 384 ... 385 SyntaxError: 'break' outside loop 386 387 This raises a SyntaxError, it used to raise a SystemError. 388 Context for this change can be found on issue #27514 389 390 In 2.5 there was a missing exception and an assert was triggered in a debug 391 build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514 392 393 >>> while 1: 394 ... while 2: 395 ... while 3: 396 ... while 4: 397 ... while 5: 398 ... while 6: 399 ... while 8: 400 ... while 9: 401 ... while 10: 402 ... while 11: 403 ... while 12: 404 ... while 13: 405 ... while 14: 406 ... while 15: 407 ... while 16: 408 ... while 17: 409 ... while 18: 410 ... while 19: 411 ... while 20: 412 ... while 21: 413 ... while 22: 414 ... break 415 Traceback (most recent call last): 416 ... 417 SyntaxError: too many statically nested blocks 418 419 Misuse of the nonlocal and global statement can lead to a few unique syntax errors. 420 421 >>> def f(): 422 ... print(x) 423 ... global x 424 Traceback (most recent call last): 425 ... 426 SyntaxError: name 'x' is used prior to global declaration 427 428 >>> def f(): 429 ... x = 1 430 ... global x 431 Traceback (most recent call last): 432 ... 433 SyntaxError: name 'x' is assigned to before global declaration 434 435 >>> def f(x): 436 ... global x 437 Traceback (most recent call last): 438 ... 439 SyntaxError: name 'x' is parameter and global 440 441 >>> def f(): 442 ... x = 1 443 ... def g(): 444 ... print(x) 445 ... nonlocal x 446 Traceback (most recent call last): 447 ... 448 SyntaxError: name 'x' is used prior to nonlocal declaration 449 450 >>> def f(): 451 ... x = 1 452 ... def g(): 453 ... x = 2 454 ... nonlocal x 455 Traceback (most recent call last): 456 ... 457 SyntaxError: name 'x' is assigned to before nonlocal declaration 458 459 >>> def f(x): 460 ... nonlocal x 461 Traceback (most recent call last): 462 ... 463 SyntaxError: name 'x' is parameter and nonlocal 464 465 >>> def f(): 466 ... global x 467 ... nonlocal x 468 Traceback (most recent call last): 469 ... 470 SyntaxError: name 'x' is nonlocal and global 471 472 >>> def f(): 473 ... nonlocal x 474 Traceback (most recent call last): 475 ... 476 SyntaxError: no binding for nonlocal 'x' found 477 478 From SF bug #1705365 479 >>> nonlocal x 480 Traceback (most recent call last): 481 ... 482 SyntaxError: nonlocal declaration not allowed at module level 483 484 From https://bugs.python.org/issue25973 485 >>> class A: 486 ... def f(self): 487 ... nonlocal __x 488 Traceback (most recent call last): 489 ... 490 SyntaxError: no binding for nonlocal '_A__x' found 491 492 493 This tests assignment-context; there was a bug in Python 2.5 where compiling 494 a complex 'if' (one with 'elif') would fail to notice an invalid suite, 495 leading to spurious errors. 496 497 >>> if 1: 498 ... x() = 1 499 ... elif 1: 500 ... pass 501 Traceback (most recent call last): 502 ... 503 SyntaxError: can't assign to function call 504 505 >>> if 1: 506 ... pass 507 ... elif 1: 508 ... x() = 1 509 Traceback (most recent call last): 510 ... 511 SyntaxError: can't assign to function call 512 513 >>> if 1: 514 ... x() = 1 515 ... elif 1: 516 ... pass 517 ... else: 518 ... pass 519 Traceback (most recent call last): 520 ... 521 SyntaxError: can't assign to function call 522 523 >>> if 1: 524 ... pass 525 ... elif 1: 526 ... x() = 1 527 ... else: 528 ... pass 529 Traceback (most recent call last): 530 ... 531 SyntaxError: can't assign to function call 532 533 >>> if 1: 534 ... pass 535 ... elif 1: 536 ... pass 537 ... else: 538 ... x() = 1 539 Traceback (most recent call last): 540 ... 541 SyntaxError: can't assign to function call 542 543 Make sure that the old "raise X, Y[, Z]" form is gone: 544 >>> raise X, Y 545 Traceback (most recent call last): 546 ... 547 SyntaxError: invalid syntax 548 >>> raise X, Y, Z 549 Traceback (most recent call last): 550 ... 551 SyntaxError: invalid syntax 552 553 554 >>> f(a=23, a=234) 555 Traceback (most recent call last): 556 ... 557 SyntaxError: keyword argument repeated 558 559 >>> {1, 2, 3} = 42 560 Traceback (most recent call last): 561 SyntaxError: can't assign to literal 562 563 Corner-cases that used to fail to raise the correct error: 564 565 >>> def f(*, x=lambda __debug__:0): pass 566 Traceback (most recent call last): 567 SyntaxError: assignment to keyword 568 569 >>> def f(*args:(lambda __debug__:0)): pass 570 Traceback (most recent call last): 571 SyntaxError: assignment to keyword 572 573 >>> def f(**kwargs:(lambda __debug__:0)): pass 574 Traceback (most recent call last): 575 SyntaxError: assignment to keyword 576 577 >>> with (lambda *:0): pass 578 Traceback (most recent call last): 579 SyntaxError: named arguments must follow bare * 580 581 Corner-cases that used to crash: 582 583 >>> def f(**__debug__): pass 584 Traceback (most recent call last): 585 SyntaxError: assignment to keyword 586 587 >>> def f(*xx, __debug__): pass 588 Traceback (most recent call last): 589 SyntaxError: assignment to keyword 590 591 """ 592 593 import re 594 import unittest 595 596 from test import support 597 598 class SyntaxTestCase(unittest.TestCase): 599 600 def _check_error(self, code, errtext, 601 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None): 602 """Check that compiling code raises SyntaxError with errtext. 603 604 errtest is a regular expression that must be present in the 605 test of the exception raised. If subclass is specified it 606 is the expected subclass of SyntaxError (e.g. IndentationError). 607 """ 608 try: 609 compile(code, filename, mode) 610 except SyntaxError as err: 611 if subclass and not isinstance(err, subclass): 612 self.fail("SyntaxError is not a %s" % subclass.__name__) 613 mo = re.search(errtext, str(err)) 614 if mo is None: 615 self.fail("SyntaxError did not contain '%r'" % (errtext,)) 616 self.assertEqual(err.filename, filename) 617 if lineno is not None: 618 self.assertEqual(err.lineno, lineno) 619 if offset is not None: 620 self.assertEqual(err.offset, offset) 621 else: 622 self.fail("compile() did not raise SyntaxError") 623 624 def test_assign_call(self): 625 self._check_error("f() = 1", "assign") 626 627 def test_assign_del(self): 628 self._check_error("del f()", "delete") 629 630 def test_global_param_err_first(self): 631 source = """if 1: 632 def error(a): 633 global a # SyntaxError 634 def error2(): 635 b = 1 636 global b # SyntaxError 637 """ 638 self._check_error(source, "parameter and global", lineno=3) 639 640 def test_nonlocal_param_err_first(self): 641 source = """if 1: 642 def error(a): 643 nonlocal a # SyntaxError 644 def error2(): 645 b = 1 646 global b # SyntaxError 647 """ 648 self._check_error(source, "parameter and nonlocal", lineno=3) 649 650 def test_break_outside_loop(self): 651 self._check_error("break", "outside loop") 652 653 def test_unexpected_indent(self): 654 self._check_error("foo()\n bar()\n", "unexpected indent", 655 subclass=IndentationError) 656 657 def test_no_indent(self): 658 self._check_error("if 1:\nfoo()", "expected an indented block", 659 subclass=IndentationError) 660 661 def test_bad_outdent(self): 662 self._check_error("if 1:\n foo()\n bar()", 663 "unindent does not match .* level", 664 subclass=IndentationError) 665 666 def test_kwargs_last(self): 667 self._check_error("int(base=10, '2')", 668 "positional argument follows keyword argument") 669 670 def test_kwargs_last2(self): 671 self._check_error("int(**{'base': 10}, '2')", 672 "positional argument follows " 673 "keyword argument unpacking") 674 675 def test_kwargs_last3(self): 676 self._check_error("int(**{'base': 10}, *['2'])", 677 "iterable argument unpacking follows " 678 "keyword argument unpacking") 679 680 def test_main(): 681 support.run_unittest(SyntaxTestCase) 682 from test import test_syntax 683 support.run_doctest(test_syntax, verbosity=True) 684 685 if __name__ == "__main__": 686 test_main() 687