Home | History | Annotate | Download | only in test
      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