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