blob: 6d9c4e4b55e1cc0451cf8d83beba37dd5e8e3270 [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
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300181>>> import ast; ast.parse('''
182... def f(
183... *, # type: int
184... a, # type: int
185... ):
186... pass
187... ''', type_comments=True)
188Traceback (most recent call last):
189SyntaxError: bare * has associated type comment
190
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000191
192From ast_for_funcdef():
193
194>>> def None(x):
195... pass
196Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000197SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000198
199
200From ast_for_call():
201
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200202>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000203... return list(it)
204>>> L = range(10)
205>>> f(x for x in L)
206[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
207>>> f(x for x in L, 1)
208Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200209SyntaxError: Generator expression must be parenthesized
210>>> f(x for x in L, y=1)
211Traceback (most recent call last):
212SyntaxError: Generator expression must be parenthesized
213>>> f(x for x in L, *[])
214Traceback (most recent call last):
215SyntaxError: Generator expression must be parenthesized
216>>> f(x for x in L, **{})
217Traceback (most recent call last):
218SyntaxError: Generator expression must be parenthesized
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100219
220# >>> f(L, x for x in L)
221# Traceback (most recent call last):
222# SyntaxError: Generator expression must be parenthesized
223
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400224>>> f(x for x in L, y for y in L)
225Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200226SyntaxError: Generator expression must be parenthesized
227>>> f(x for x in L,)
228Traceback (most recent call last):
229SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000230>>> f((x for x in L), 1)
231[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200232>>> class C(x for x in L):
233... pass
234Traceback (most recent call last):
235SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000236
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200237>>> def g(*args, **kwargs):
238... print(args, sorted(kwargs.items()))
239>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
240... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
241... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
242... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
243... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
244... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
245... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
246... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
247... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
248... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
249... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
250... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
251... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
252... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
253... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
254... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
255... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
256... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
257... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
258... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
259(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000260
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200261>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
262... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
263... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
264... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
265... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
266... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
267... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
268... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
269... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
270... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
271... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
272... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
273... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
274... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
275... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
276... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
277... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
278... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
279... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
280... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
281... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
282... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
283... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
284... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
285... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
286... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
287... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
288... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
289... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
290... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
291... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
292... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
293... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
294... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
295... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
296... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
297... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
298... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
299... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
300... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
301... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
302... # doctest: +ELLIPSIS
303() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000304
Yury Selivanovf2392132016-12-13 19:03:51 -0500305>>> class C:
306... def meth(self, *args):
307... return args
308>>> obj = C()
309>>> obj.meth(
310... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
311... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
312... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
313... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
314... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
315... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
316... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
317... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
318... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
319... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
320... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
321... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
322... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
323... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
324... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
325... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
326... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
327... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
328... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
329... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
330(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
331
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100332# >>> f(lambda x: x[0] = 3)
333# Traceback (most recent call last):
334# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000335
336The grammar accepts any test (basically, any expression) in the
337keyword slot of a call site. Test a few different options.
338
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100339# >>> f(x()=2)
340# Traceback (most recent call last):
341# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
342# >>> f(a or b=1)
343# Traceback (most recent call last):
344# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
345# >>> f(x.y=1)
346# Traceback (most recent call last):
347# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
348# >>> f((x)=2)
349# Traceback (most recent call last):
350# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
351# >>> f(True=2)
352# Traceback (most recent call last):
353# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200354>>> f(__debug__=1)
355Traceback (most recent call last):
356SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100357>>> __debug__: int
358Traceback (most recent call last):
359SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000360
361
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000362More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000363
364>>> (x for x in x) += 1
365Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100366SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000367>>> None += 1
368Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100369SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200370>>> __debug__ += 1
371Traceback (most recent call last):
372SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000373>>> f() += 1
374Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100375SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000376
377
378Test continue in finally in weird combinations.
379
Ezio Melotti13925002011-03-16 11:05:33 +0200380continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000381
382 >>> def test():
383 ... try:
384 ... pass
385 ... finally:
386 ... for abc in range(10):
387 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000388 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000389 >>> test()
390 9
391
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200392continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000393
394 >>> def test():
395 ... for abc in range(10):
396 ... try:
397 ... pass
398 ... finally:
399 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200400 ... print(abc)
401 >>> test()
402 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000403
404 >>> def test():
405 ... for abc in range(10):
406 ... try:
407 ... pass
408 ... finally:
409 ... try:
410 ... continue
411 ... except:
412 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200413 ... print(abc)
414 >>> test()
415 9
416
417 >>> def test():
418 ... for abc in range(10):
419 ... try:
420 ... pass
421 ... finally:
422 ... try:
423 ... pass
424 ... except:
425 ... continue
426 ... print(abc)
427 >>> test()
428 9
429
430A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431
432 >>> def foo():
433 ... try:
434 ... pass
435 ... finally:
436 ... continue
437 Traceback (most recent call last):
438 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200439 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440
441There is one test for a break that is not in a loop. The compiler
442uses a single data structure to keep track of try-finally and loops,
443so we need to be sure that a break is actually inside a loop. If it
444isn't, there should be a syntax error.
445
446 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000447 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000448 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000449 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000450 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000451 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452 Traceback (most recent call last):
453 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000454 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000455
Benjamin Petersone09ed542016-07-14 22:00:03 -0700456This raises a SyntaxError, it used to raise a SystemError.
457Context for this change can be found on issue #27514
458
Thomas Wouters89f507f2006-12-13 04:49:30 +0000459In 2.5 there was a missing exception and an assert was triggered in a debug
460build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
461
462 >>> while 1:
463 ... while 2:
464 ... while 3:
465 ... while 4:
466 ... while 5:
467 ... while 6:
468 ... while 8:
469 ... while 9:
470 ... while 10:
471 ... while 11:
472 ... while 12:
473 ... while 13:
474 ... while 14:
475 ... while 15:
476 ... while 16:
477 ... while 17:
478 ... while 18:
479 ... while 19:
480 ... while 20:
481 ... while 21:
482 ... while 22:
483 ... break
484 Traceback (most recent call last):
485 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700486 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487
Guido van Rossum6cff8742016-09-09 09:36:26 -0700488Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
489
490 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200491 ... print(x)
492 ... global x
493 Traceback (most recent call last):
494 ...
495 SyntaxError: name 'x' is used prior to global declaration
496
497 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700498 ... x = 1
499 ... global x
500 Traceback (most recent call last):
501 ...
502 SyntaxError: name 'x' is assigned to before global declaration
503
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200504 >>> def f(x):
505 ... global x
506 Traceback (most recent call last):
507 ...
508 SyntaxError: name 'x' is parameter and global
509
Guido van Rossum6cff8742016-09-09 09:36:26 -0700510 >>> def f():
511 ... x = 1
512 ... def g():
513 ... print(x)
514 ... nonlocal x
515 Traceback (most recent call last):
516 ...
517 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000518
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300519 >>> def f():
520 ... x = 1
521 ... def g():
522 ... x = 2
523 ... nonlocal x
524 Traceback (most recent call last):
525 ...
526 SyntaxError: name 'x' is assigned to before nonlocal declaration
527
Jeremy Hylton81e95022007-02-27 06:50:52 +0000528 >>> def f(x):
529 ... nonlocal x
530 Traceback (most recent call last):
531 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000532 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000533
Jeremy Hylton81e95022007-02-27 06:50:52 +0000534 >>> def f():
535 ... global x
536 ... nonlocal x
537 Traceback (most recent call last):
538 ...
539 SyntaxError: name 'x' is nonlocal and global
540
541 >>> def f():
542 ... nonlocal x
543 Traceback (most recent call last):
544 ...
545 SyntaxError: no binding for nonlocal 'x' found
546
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000547From SF bug #1705365
548 >>> nonlocal x
549 Traceback (most recent call last):
550 ...
551 SyntaxError: nonlocal declaration not allowed at module level
552
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300553From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600554 >>> class A:
555 ... def f(self):
556 ... nonlocal __x
557 Traceback (most recent call last):
558 ...
559 SyntaxError: no binding for nonlocal '_A__x' found
560
Guido van Rossumd8faa362007-04-27 19:54:29 +0000561
562This tests assignment-context; there was a bug in Python 2.5 where compiling
563a complex 'if' (one with 'elif') would fail to notice an invalid suite,
564leading to spurious errors.
565
566 >>> if 1:
567 ... x() = 1
568 ... elif 1:
569 ... pass
570 Traceback (most recent call last):
571 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200572 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000573
574 >>> if 1:
575 ... pass
576 ... elif 1:
577 ... x() = 1
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 ... x() = 1
584 ... elif 1:
585 ... pass
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 ... x() = 1
596 ... else:
597 ... pass
598 Traceback (most recent call last):
599 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200600 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000601
602 >>> if 1:
603 ... pass
604 ... elif 1:
605 ... pass
606 ... else:
607 ... x() = 1
608 Traceback (most recent call last):
609 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200610 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000611
Collin Winter828f04a2007-08-31 00:04:24 +0000612Make sure that the old "raise X, Y[, Z]" form is gone:
613 >>> raise X, Y
614 Traceback (most recent call last):
615 ...
616 SyntaxError: invalid syntax
617 >>> raise X, Y, Z
618 Traceback (most recent call last):
619 ...
620 SyntaxError: invalid syntax
621
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000622
623>>> f(a=23, a=234)
624Traceback (most recent call last):
625 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100626SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000627
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000628>>> {1, 2, 3} = 42
629Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200630SyntaxError: cannot assign to set display
631
632>>> {1: 2, 3: 4} = 42
633Traceback (most recent call last):
634SyntaxError: cannot assign to dict display
635
636>>> f'{x}' = 42
637Traceback (most recent call last):
638SyntaxError: cannot assign to f-string expression
639
640>>> f'{x}-{y}' = 42
641Traceback (most recent call last):
642SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000643
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +0300644>>> from t import x,
645Traceback (most recent call last):
646SyntaxError: trailing comma not allowed without surrounding parentheses
647
648>>> from t import x,y,
649Traceback (most recent call last):
650SyntaxError: trailing comma not allowed without surrounding parentheses
651
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000652Corner-cases that used to fail to raise the correct error:
653
654 >>> def f(*, x=lambda __debug__:0): 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(*args:(lambda __debug__:0)): 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
662 >>> def f(**kwargs:(lambda __debug__:0)): pass
663 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200664 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000665
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300666 >>> with (lambda *:0): pass
667 Traceback (most recent call last):
668 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000669
670Corner-cases that used to crash:
671
672 >>> def f(**__debug__): pass
673 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200674 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000675
676 >>> def f(*xx, __debug__): pass
677 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200678 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000679
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300680 >>> import ä £
681 Traceback (most recent call last):
682 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000683"""
684
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000685import re
686import unittest
687
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000688from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000689
690class SyntaxTestCase(unittest.TestCase):
691
692 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200693 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000694 """Check that compiling code raises SyntaxError with errtext.
695
696 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000697 test of the exception raised. If subclass is specified it
698 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000699 """
700 try:
701 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000702 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000703 if subclass and not isinstance(err, subclass):
704 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000705 mo = re.search(errtext, str(err))
706 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700707 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200708 self.assertEqual(err.filename, filename)
709 if lineno is not None:
710 self.assertEqual(err.lineno, lineno)
711 if offset is not None:
712 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000713 else:
714 self.fail("compile() did not raise SyntaxError")
715
716 def test_assign_call(self):
717 self._check_error("f() = 1", "assign")
718
Pablo Galindo16ab0702020-05-15 02:04:52 +0100719 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000720 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700721 self._check_error("del (,)", "invalid syntax")
722 self._check_error("del 1", "delete literal")
723 self._check_error("del (1, 2)", "delete literal")
724 self._check_error("del None", "delete None")
725 self._check_error("del *x", "delete starred")
726 self._check_error("del (*x)", "delete starred")
727 self._check_error("del (*x,)", "delete starred")
728 self._check_error("del [*x,]", "delete starred")
729 self._check_error("del f()", "delete function call")
730 self._check_error("del f(a, b)", "delete function call")
731 self._check_error("del o.f()", "delete function call")
732 self._check_error("del a[0]()", "delete function call")
733 self._check_error("del x, f()", "delete function call")
734 self._check_error("del f(), x", "delete function call")
735 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
736 self._check_error("del (a if True else b)", "delete conditional")
737 self._check_error("del +a", "delete operator")
738 self._check_error("del a, +b", "delete operator")
739 self._check_error("del a + b", "delete operator")
740 self._check_error("del (a + b, c)", "delete operator")
741 self._check_error("del (c[0], a + b)", "delete operator")
742 self._check_error("del a.b.c + 2", "delete operator")
743 self._check_error("del a.b.c[0] + 2", "delete operator")
744 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
745 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
746 self._check_error("del (a := 5)", "delete named expression")
747 # We don't have a special message for this, but make sure we don't
748 # report "cannot delete name"
749 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000750
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200751 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000752 source = """if 1:
753 def error(a):
754 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200755 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000756 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200757 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000758 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200759 self._check_error(source, "parameter and global", lineno=3)
760
761 def test_nonlocal_param_err_first(self):
762 source = """if 1:
763 def error(a):
764 nonlocal a # SyntaxError
765 def error2():
766 b = 1
767 global b # SyntaxError
768 """
769 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000770
Neal Norwitzfcf44352005-11-27 20:37:43 +0000771 def test_break_outside_loop(self):
772 self._check_error("break", "outside loop")
773
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100774 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100775 self._check_error("if 0: yield", "outside function")
776 self._check_error("if 0: yield\nelse: x=1", "outside function")
777 self._check_error("if 1: pass\nelse: yield", "outside function")
778 self._check_error("while 0: yield", "outside function")
779 self._check_error("while 0: yield\nelse: x=1", "outside function")
780 self._check_error("class C:\n if 0: yield", "outside function")
781 self._check_error("class C:\n if 1: pass\n else: yield",
782 "outside function")
783 self._check_error("class C:\n while 0: yield", "outside function")
784 self._check_error("class C:\n while 0: yield\n else: x = 1",
785 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100786
787 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100788 self._check_error("if 0: return", "outside function")
789 self._check_error("if 0: return\nelse: x=1", "outside function")
790 self._check_error("if 1: pass\nelse: return", "outside function")
791 self._check_error("while 0: return", "outside function")
792 self._check_error("class C:\n if 0: return", "outside function")
793 self._check_error("class C:\n while 0: return", "outside function")
794 self._check_error("class C:\n while 0: return\n else: x=1",
795 "outside function")
796 self._check_error("class C:\n if 0: return\n else: x= 1",
797 "outside function")
798 self._check_error("class C:\n if 1: pass\n else: return",
799 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100800
801 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100802 self._check_error("if 0: break", "outside loop")
803 self._check_error("if 0: break\nelse: x=1", "outside loop")
804 self._check_error("if 1: pass\nelse: break", "outside loop")
805 self._check_error("class C:\n if 0: break", "outside loop")
806 self._check_error("class C:\n if 1: pass\n else: break",
807 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100808
809 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100810 self._check_error("if 0: continue", "not properly in loop")
811 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
812 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
813 self._check_error("class C:\n if 0: continue", "not properly in loop")
814 self._check_error("class C:\n if 1: pass\n else: continue",
815 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100816
Thomas Wouters477c8d52006-05-27 19:21:47 +0000817 def test_unexpected_indent(self):
818 self._check_error("foo()\n bar()\n", "unexpected indent",
819 subclass=IndentationError)
820
821 def test_no_indent(self):
822 self._check_error("if 1:\nfoo()", "expected an indented block",
823 subclass=IndentationError)
824
825 def test_bad_outdent(self):
826 self._check_error("if 1:\n foo()\n bar()",
827 "unindent does not match .* level",
828 subclass=IndentationError)
829
830 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400831 self._check_error("int(base=10, '2')",
832 "positional argument follows keyword argument")
833
834 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200835 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400836 "positional argument follows "
837 "keyword argument unpacking")
838
839 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200840 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400841 "iterable argument unpacking follows "
842 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000843
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000844def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000845 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000846 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000847 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000848
849if __name__ == "__main__":
850 test_main()