blob: 60c7d9fd3868e8fb215ea467e765d18120e86630 [file] [log] [blame]
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001"""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):
Nick Coghlan650f0d02007-04-15 12:05:43 +00008SyntaxError: name 'x' is parameter and global
Jeremy Hyltonc960f262006-01-27 15:18:39 +00009
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
Jeremy Hyltonc960f262006-01-27 15:18:39 +000030>>> obj.None = 1
31Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000032SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000033
34>>> None = 1
35Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020036SyntaxError: cannot assign to None
37
38>>> obj.True = 1
39Traceback (most recent call last):
40SyntaxError: invalid syntax
41
42>>> True = 1
43Traceback (most recent call last):
44SyntaxError: cannot assign to True
45
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020046>>> (True := 1)
47Traceback (most recent call last):
Ned Batchelder37143a82019-12-31 21:40:58 -050048SyntaxError: cannot use assignment expressions with True
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020049
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020050>>> obj.__debug__ = 1
51Traceback (most recent call last):
52SyntaxError: cannot assign to __debug__
53
54>>> __debug__ = 1
55Traceback (most recent call last):
56SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +000057
Stéphane Wirtel3ad91672019-02-21 11:11:53 +010058>>> (__debug__ := 1)
59Traceback (most recent call last):
60SyntaxError: cannot assign to __debug__
61
Jeremy Hyltonc960f262006-01-27 15:18:39 +000062>>> f() = 1
63Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020064SyntaxError: cannot assign to function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000065
Shantanu27c0d9b2020-05-11 14:53:58 -070066>>> del f()
67Traceback (most recent call last):
68SyntaxError: cannot delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000069
70>>> a + 1 = 2
71Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020072SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000073
74>>> (x for x in x) = 1
75Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020076SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78>>> 1 = 1
79Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020080SyntaxError: cannot assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000081
82>>> "abc" = 1
83Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020084SyntaxError: cannot assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000085
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050086>>> b"" = 1
87Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020088SyntaxError: cannot assign to literal
89
90>>> ... = 1
91Traceback (most recent call last):
92SyntaxError: cannot assign to Ellipsis
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050093
Jeremy Hyltonc960f262006-01-27 15:18:39 +000094>>> `1` = 1
95Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +000096SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000097
98If the left-hand side of an assignment is a list or tuple, an illegal
99expression inside that contain should still cause a syntax error.
100This test just checks a couple of cases rather than enumerating all of
101them.
102
Pablo Galindo16ab0702020-05-15 02:04:52 +0100103>>> (a, "b", c) = (1, 2, 3)
104Traceback (most recent call last):
105SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200106
Pablo Galindo16ab0702020-05-15 02:04:52 +0100107>>> (a, True, c) = (1, 2, 3)
108Traceback (most recent call last):
109SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200110
111>>> (a, __debug__, c) = (1, 2, 3)
112Traceback (most recent call last):
113SyntaxError: cannot assign to __debug__
114
Pablo Galindo16ab0702020-05-15 02:04:52 +0100115>>> (a, *True, c) = (1, 2, 3)
116Traceback (most recent call last):
117SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200118
119>>> (a, *__debug__, c) = (1, 2, 3)
120Traceback (most recent call last):
121SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000122
Pablo Galindo16ab0702020-05-15 02:04:52 +0100123>>> [a, b, c + 1] = [1, 2, 3]
124Traceback (most recent call last):
125SyntaxError: cannot assign to operator
126
127>>> [a, b[1], c + 1] = [1, 2, 3]
128Traceback (most recent call last):
129SyntaxError: cannot assign to operator
130
131>>> [a, b.c.d, c + 1] = [1, 2, 3]
132Traceback (most recent call last):
133SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000134
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135>>> a if 1 else b = 1
136Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200137SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000138
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300139>>> a, b += 1, 2
140Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100141SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300142
143>>> (a, b) += 1, 2
144Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100145SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300146
147>>> [a, b] += 1, 2
148Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100149SyntaxError: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300150
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000151From compiler_complex_args():
152
153>>> def f(None=1):
154... pass
155Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000156SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000157
158
159From ast_for_arguments():
160
161>>> def f(x, y=1, z):
162... pass
163Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000164SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000165
166>>> def f(x, None):
167... pass
168Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000169SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000170
171>>> def f(*None):
172... pass
173Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000174SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000175
176>>> def f(**None):
177... pass
178Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000179SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000180
181
182From ast_for_funcdef():
183
184>>> def None(x):
185... pass
186Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000187SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000188
189
190From ast_for_call():
191
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200192>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000193... return list(it)
194>>> L = range(10)
195>>> f(x for x in L)
196[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
197>>> f(x for x in L, 1)
198Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200199SyntaxError: Generator expression must be parenthesized
200>>> f(x for x in L, y=1)
201Traceback (most recent call last):
202SyntaxError: Generator expression must be parenthesized
203>>> f(x for x in L, *[])
204Traceback (most recent call last):
205SyntaxError: Generator expression must be parenthesized
206>>> f(x for x in L, **{})
207Traceback (most recent call last):
208SyntaxError: Generator expression must be parenthesized
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100209
210# >>> f(L, x for x in L)
211# Traceback (most recent call last):
212# SyntaxError: Generator expression must be parenthesized
213
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400214>>> f(x for x in L, y for y in L)
215Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200216SyntaxError: Generator expression must be parenthesized
217>>> f(x for x in L,)
218Traceback (most recent call last):
219SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000220>>> f((x for x in L), 1)
221[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200222>>> class C(x for x in L):
223... pass
224Traceback (most recent call last):
225SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000226
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200227>>> def g(*args, **kwargs):
228... print(args, sorted(kwargs.items()))
229>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
230... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
231... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
232... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
233... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
234... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
235... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
236... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
237... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
238... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
239... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
240... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
241... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
242... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
243... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
244... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
245... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
246... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
247... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
248... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
249(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000250
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200251>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
252... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
253... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
254... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
255... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
256... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
257... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
258... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
259... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
260... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
261... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
262... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
263... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
264... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
265... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
266... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
267... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
268... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
269... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
270... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
271... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
272... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
273... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
274... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
275... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
276... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
277... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
278... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
279... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
280... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
281... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
282... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
283... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
284... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
285... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
286... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
287... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
288... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
289... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
290... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
291... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
292... # doctest: +ELLIPSIS
293() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000294
Yury Selivanovf2392132016-12-13 19:03:51 -0500295>>> class C:
296... def meth(self, *args):
297... return args
298>>> obj = C()
299>>> obj.meth(
300... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
301... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
302... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
303... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
304... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
305... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
306... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
307... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
308... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
309... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
310... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
311... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
312... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
313... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
314... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
315... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
316... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
317... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
318... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
319... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
320(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
321
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100322# >>> f(lambda x: x[0] = 3)
323# Traceback (most recent call last):
324# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000325
326The grammar accepts any test (basically, any expression) in the
327keyword slot of a call site. Test a few different options.
328
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100329# >>> f(x()=2)
330# Traceback (most recent call last):
331# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
332# >>> f(a or b=1)
333# Traceback (most recent call last):
334# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
335# >>> f(x.y=1)
336# Traceback (most recent call last):
337# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
338# >>> f((x)=2)
339# Traceback (most recent call last):
340# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
341# >>> f(True=2)
342# Traceback (most recent call last):
343# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200344>>> f(__debug__=1)
345Traceback (most recent call last):
346SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100347>>> __debug__: int
348Traceback (most recent call last):
349SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000350
351
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000352More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000353
354>>> (x for x in x) += 1
355Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100356SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000357>>> None += 1
358Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100359SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200360>>> __debug__ += 1
361Traceback (most recent call last):
362SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000363>>> f() += 1
364Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100365SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000366
367
368Test continue in finally in weird combinations.
369
Ezio Melotti13925002011-03-16 11:05:33 +0200370continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000371
372 >>> def test():
373 ... try:
374 ... pass
375 ... finally:
376 ... for abc in range(10):
377 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000378 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 >>> test()
380 9
381
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200382continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000383
384 >>> def test():
385 ... for abc in range(10):
386 ... try:
387 ... pass
388 ... finally:
389 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200390 ... print(abc)
391 >>> test()
392 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000393
394 >>> def test():
395 ... for abc in range(10):
396 ... try:
397 ... pass
398 ... finally:
399 ... try:
400 ... continue
401 ... except:
402 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200403 ... print(abc)
404 >>> test()
405 9
406
407 >>> def test():
408 ... for abc in range(10):
409 ... try:
410 ... pass
411 ... finally:
412 ... try:
413 ... pass
414 ... except:
415 ... continue
416 ... print(abc)
417 >>> test()
418 9
419
420A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000421
422 >>> def foo():
423 ... try:
424 ... pass
425 ... finally:
426 ... continue
427 Traceback (most recent call last):
428 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200429 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430
431There is one test for a break that is not in a loop. The compiler
432uses a single data structure to keep track of try-finally and loops,
433so we need to be sure that a break is actually inside a loop. If it
434isn't, there should be a syntax error.
435
436 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000437 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000438 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000439 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000441 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442 Traceback (most recent call last):
443 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000444 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000445
Benjamin Petersone09ed542016-07-14 22:00:03 -0700446This raises a SyntaxError, it used to raise a SystemError.
447Context for this change can be found on issue #27514
448
Thomas Wouters89f507f2006-12-13 04:49:30 +0000449In 2.5 there was a missing exception and an assert was triggered in a debug
450build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
451
452 >>> while 1:
453 ... while 2:
454 ... while 3:
455 ... while 4:
456 ... while 5:
457 ... while 6:
458 ... while 8:
459 ... while 9:
460 ... while 10:
461 ... while 11:
462 ... while 12:
463 ... while 13:
464 ... while 14:
465 ... while 15:
466 ... while 16:
467 ... while 17:
468 ... while 18:
469 ... while 19:
470 ... while 20:
471 ... while 21:
472 ... while 22:
473 ... break
474 Traceback (most recent call last):
475 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700476 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000477
Guido van Rossum6cff8742016-09-09 09:36:26 -0700478Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
479
480 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200481 ... print(x)
482 ... global x
483 Traceback (most recent call last):
484 ...
485 SyntaxError: name 'x' is used prior to global declaration
486
487 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700488 ... x = 1
489 ... global x
490 Traceback (most recent call last):
491 ...
492 SyntaxError: name 'x' is assigned to before global declaration
493
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200494 >>> def f(x):
495 ... global x
496 Traceback (most recent call last):
497 ...
498 SyntaxError: name 'x' is parameter and global
499
Guido van Rossum6cff8742016-09-09 09:36:26 -0700500 >>> def f():
501 ... x = 1
502 ... def g():
503 ... print(x)
504 ... nonlocal x
505 Traceback (most recent call last):
506 ...
507 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000508
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300509 >>> def f():
510 ... x = 1
511 ... def g():
512 ... x = 2
513 ... nonlocal x
514 Traceback (most recent call last):
515 ...
516 SyntaxError: name 'x' is assigned to before nonlocal declaration
517
Jeremy Hylton81e95022007-02-27 06:50:52 +0000518 >>> def f(x):
519 ... nonlocal x
520 Traceback (most recent call last):
521 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000522 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000523
Jeremy Hylton81e95022007-02-27 06:50:52 +0000524 >>> def f():
525 ... global x
526 ... nonlocal x
527 Traceback (most recent call last):
528 ...
529 SyntaxError: name 'x' is nonlocal and global
530
531 >>> def f():
532 ... nonlocal x
533 Traceback (most recent call last):
534 ...
535 SyntaxError: no binding for nonlocal 'x' found
536
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000537From SF bug #1705365
538 >>> nonlocal x
539 Traceback (most recent call last):
540 ...
541 SyntaxError: nonlocal declaration not allowed at module level
542
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300543From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600544 >>> class A:
545 ... def f(self):
546 ... nonlocal __x
547 Traceback (most recent call last):
548 ...
549 SyntaxError: no binding for nonlocal '_A__x' found
550
Guido van Rossumd8faa362007-04-27 19:54:29 +0000551
552This tests assignment-context; there was a bug in Python 2.5 where compiling
553a complex 'if' (one with 'elif') would fail to notice an invalid suite,
554leading to spurious errors.
555
556 >>> if 1:
557 ... x() = 1
558 ... elif 1:
559 ... pass
560 Traceback (most recent call last):
561 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200562 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000563
564 >>> if 1:
565 ... pass
566 ... elif 1:
567 ... x() = 1
568 Traceback (most recent call last):
569 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200570 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000571
572 >>> if 1:
573 ... x() = 1
574 ... elif 1:
575 ... pass
576 ... else:
577 ... pass
578 Traceback (most recent call last):
579 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200580 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000581
582 >>> if 1:
583 ... pass
584 ... elif 1:
585 ... x() = 1
586 ... else:
587 ... pass
588 Traceback (most recent call last):
589 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200590 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000591
592 >>> if 1:
593 ... pass
594 ... elif 1:
595 ... pass
596 ... else:
597 ... x() = 1
598 Traceback (most recent call last):
599 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200600 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000601
Collin Winter828f04a2007-08-31 00:04:24 +0000602Make sure that the old "raise X, Y[, Z]" form is gone:
603 >>> raise X, Y
604 Traceback (most recent call last):
605 ...
606 SyntaxError: invalid syntax
607 >>> raise X, Y, Z
608 Traceback (most recent call last):
609 ...
610 SyntaxError: invalid syntax
611
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000612
613>>> f(a=23, a=234)
614Traceback (most recent call last):
615 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100616SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000617
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000618>>> {1, 2, 3} = 42
619Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200620SyntaxError: cannot assign to set display
621
622>>> {1: 2, 3: 4} = 42
623Traceback (most recent call last):
624SyntaxError: cannot assign to dict display
625
626>>> f'{x}' = 42
627Traceback (most recent call last):
628SyntaxError: cannot assign to f-string expression
629
630>>> f'{x}-{y}' = 42
631Traceback (most recent call last):
632SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000633
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000634Corner-cases that used to fail to raise the correct error:
635
636 >>> def f(*, x=lambda __debug__:0): pass
637 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200638 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000639
640 >>> def f(*args:(lambda __debug__:0)): pass
641 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200642 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000643
644 >>> def f(**kwargs:(lambda __debug__:0)): pass
645 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200646 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000647
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300648 >>> with (lambda *:0): pass
649 Traceback (most recent call last):
650 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000651
652Corner-cases that used to crash:
653
654 >>> def f(**__debug__): pass
655 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200656 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000657
658 >>> def f(*xx, __debug__): pass
659 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200660 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000661
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000662"""
663
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000664import re
665import unittest
666
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000667from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000668
669class SyntaxTestCase(unittest.TestCase):
670
671 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200672 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000673 """Check that compiling code raises SyntaxError with errtext.
674
675 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000676 test of the exception raised. If subclass is specified it
677 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000678 """
679 try:
680 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000681 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000682 if subclass and not isinstance(err, subclass):
683 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000684 mo = re.search(errtext, str(err))
685 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700686 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200687 self.assertEqual(err.filename, filename)
688 if lineno is not None:
689 self.assertEqual(err.lineno, lineno)
690 if offset is not None:
691 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000692 else:
693 self.fail("compile() did not raise SyntaxError")
694
695 def test_assign_call(self):
696 self._check_error("f() = 1", "assign")
697
Pablo Galindo16ab0702020-05-15 02:04:52 +0100698 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000699 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700700 self._check_error("del (,)", "invalid syntax")
701 self._check_error("del 1", "delete literal")
702 self._check_error("del (1, 2)", "delete literal")
703 self._check_error("del None", "delete None")
704 self._check_error("del *x", "delete starred")
705 self._check_error("del (*x)", "delete starred")
706 self._check_error("del (*x,)", "delete starred")
707 self._check_error("del [*x,]", "delete starred")
708 self._check_error("del f()", "delete function call")
709 self._check_error("del f(a, b)", "delete function call")
710 self._check_error("del o.f()", "delete function call")
711 self._check_error("del a[0]()", "delete function call")
712 self._check_error("del x, f()", "delete function call")
713 self._check_error("del f(), x", "delete function call")
714 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
715 self._check_error("del (a if True else b)", "delete conditional")
716 self._check_error("del +a", "delete operator")
717 self._check_error("del a, +b", "delete operator")
718 self._check_error("del a + b", "delete operator")
719 self._check_error("del (a + b, c)", "delete operator")
720 self._check_error("del (c[0], a + b)", "delete operator")
721 self._check_error("del a.b.c + 2", "delete operator")
722 self._check_error("del a.b.c[0] + 2", "delete operator")
723 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
724 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
725 self._check_error("del (a := 5)", "delete named expression")
726 # We don't have a special message for this, but make sure we don't
727 # report "cannot delete name"
728 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000729
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200730 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000731 source = """if 1:
732 def error(a):
733 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200734 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000735 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200736 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000737 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200738 self._check_error(source, "parameter and global", lineno=3)
739
740 def test_nonlocal_param_err_first(self):
741 source = """if 1:
742 def error(a):
743 nonlocal a # SyntaxError
744 def error2():
745 b = 1
746 global b # SyntaxError
747 """
748 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000749
Neal Norwitzfcf44352005-11-27 20:37:43 +0000750 def test_break_outside_loop(self):
751 self._check_error("break", "outside loop")
752
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100753 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100754 self._check_error("if 0: yield", "outside function")
755 self._check_error("if 0: yield\nelse: x=1", "outside function")
756 self._check_error("if 1: pass\nelse: yield", "outside function")
757 self._check_error("while 0: yield", "outside function")
758 self._check_error("while 0: yield\nelse: x=1", "outside function")
759 self._check_error("class C:\n if 0: yield", "outside function")
760 self._check_error("class C:\n if 1: pass\n else: yield",
761 "outside function")
762 self._check_error("class C:\n while 0: yield", "outside function")
763 self._check_error("class C:\n while 0: yield\n else: x = 1",
764 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100765
766 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100767 self._check_error("if 0: return", "outside function")
768 self._check_error("if 0: return\nelse: x=1", "outside function")
769 self._check_error("if 1: pass\nelse: return", "outside function")
770 self._check_error("while 0: return", "outside function")
771 self._check_error("class C:\n if 0: return", "outside function")
772 self._check_error("class C:\n while 0: return", "outside function")
773 self._check_error("class C:\n while 0: return\n else: x=1",
774 "outside function")
775 self._check_error("class C:\n if 0: return\n else: x= 1",
776 "outside function")
777 self._check_error("class C:\n if 1: pass\n else: return",
778 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100779
780 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100781 self._check_error("if 0: break", "outside loop")
782 self._check_error("if 0: break\nelse: x=1", "outside loop")
783 self._check_error("if 1: pass\nelse: break", "outside loop")
784 self._check_error("class C:\n if 0: break", "outside loop")
785 self._check_error("class C:\n if 1: pass\n else: break",
786 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100787
788 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100789 self._check_error("if 0: continue", "not properly in loop")
790 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
791 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
792 self._check_error("class C:\n if 0: continue", "not properly in loop")
793 self._check_error("class C:\n if 1: pass\n else: continue",
794 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100795
Thomas Wouters477c8d52006-05-27 19:21:47 +0000796 def test_unexpected_indent(self):
797 self._check_error("foo()\n bar()\n", "unexpected indent",
798 subclass=IndentationError)
799
800 def test_no_indent(self):
801 self._check_error("if 1:\nfoo()", "expected an indented block",
802 subclass=IndentationError)
803
804 def test_bad_outdent(self):
805 self._check_error("if 1:\n foo()\n bar()",
806 "unindent does not match .* level",
807 subclass=IndentationError)
808
809 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400810 self._check_error("int(base=10, '2')",
811 "positional argument follows keyword argument")
812
813 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200814 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400815 "positional argument follows "
816 "keyword argument unpacking")
817
818 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200819 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400820 "iterable argument unpacking follows "
821 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000822
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000823def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000824 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000825 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000826 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000827
828if __name__ == "__main__":
829 test_main()