blob: 87ceced6c62a0a00b4bf9234b7e95018c1b55bfc [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
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300662 >>> import ä £
663 Traceback (most recent call last):
664 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000665"""
666
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000667import re
668import unittest
669
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000670from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000671
672class SyntaxTestCase(unittest.TestCase):
673
674 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200675 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000676 """Check that compiling code raises SyntaxError with errtext.
677
678 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000679 test of the exception raised. If subclass is specified it
680 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000681 """
682 try:
683 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000684 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000685 if subclass and not isinstance(err, subclass):
686 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000687 mo = re.search(errtext, str(err))
688 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700689 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200690 self.assertEqual(err.filename, filename)
691 if lineno is not None:
692 self.assertEqual(err.lineno, lineno)
693 if offset is not None:
694 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000695 else:
696 self.fail("compile() did not raise SyntaxError")
697
698 def test_assign_call(self):
699 self._check_error("f() = 1", "assign")
700
Pablo Galindo16ab0702020-05-15 02:04:52 +0100701 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000702 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700703 self._check_error("del (,)", "invalid syntax")
704 self._check_error("del 1", "delete literal")
705 self._check_error("del (1, 2)", "delete literal")
706 self._check_error("del None", "delete None")
707 self._check_error("del *x", "delete starred")
708 self._check_error("del (*x)", "delete starred")
709 self._check_error("del (*x,)", "delete starred")
710 self._check_error("del [*x,]", "delete starred")
711 self._check_error("del f()", "delete function call")
712 self._check_error("del f(a, b)", "delete function call")
713 self._check_error("del o.f()", "delete function call")
714 self._check_error("del a[0]()", "delete function call")
715 self._check_error("del x, f()", "delete function call")
716 self._check_error("del f(), x", "delete function call")
717 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
718 self._check_error("del (a if True else b)", "delete conditional")
719 self._check_error("del +a", "delete operator")
720 self._check_error("del a, +b", "delete operator")
721 self._check_error("del a + b", "delete operator")
722 self._check_error("del (a + b, c)", "delete operator")
723 self._check_error("del (c[0], a + b)", "delete operator")
724 self._check_error("del a.b.c + 2", "delete operator")
725 self._check_error("del a.b.c[0] + 2", "delete operator")
726 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
727 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
728 self._check_error("del (a := 5)", "delete named expression")
729 # We don't have a special message for this, but make sure we don't
730 # report "cannot delete name"
731 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000732
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200733 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000734 source = """if 1:
735 def error(a):
736 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200737 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000738 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200739 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000740 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200741 self._check_error(source, "parameter and global", lineno=3)
742
743 def test_nonlocal_param_err_first(self):
744 source = """if 1:
745 def error(a):
746 nonlocal a # SyntaxError
747 def error2():
748 b = 1
749 global b # SyntaxError
750 """
751 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000752
Neal Norwitzfcf44352005-11-27 20:37:43 +0000753 def test_break_outside_loop(self):
754 self._check_error("break", "outside loop")
755
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100756 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100757 self._check_error("if 0: yield", "outside function")
758 self._check_error("if 0: yield\nelse: x=1", "outside function")
759 self._check_error("if 1: pass\nelse: yield", "outside function")
760 self._check_error("while 0: yield", "outside function")
761 self._check_error("while 0: yield\nelse: x=1", "outside function")
762 self._check_error("class C:\n if 0: yield", "outside function")
763 self._check_error("class C:\n if 1: pass\n else: yield",
764 "outside function")
765 self._check_error("class C:\n while 0: yield", "outside function")
766 self._check_error("class C:\n while 0: yield\n else: x = 1",
767 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100768
769 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100770 self._check_error("if 0: return", "outside function")
771 self._check_error("if 0: return\nelse: x=1", "outside function")
772 self._check_error("if 1: pass\nelse: return", "outside function")
773 self._check_error("while 0: return", "outside function")
774 self._check_error("class C:\n if 0: return", "outside function")
775 self._check_error("class C:\n while 0: return", "outside function")
776 self._check_error("class C:\n while 0: return\n else: x=1",
777 "outside function")
778 self._check_error("class C:\n if 0: return\n else: x= 1",
779 "outside function")
780 self._check_error("class C:\n if 1: pass\n else: return",
781 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100782
783 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100784 self._check_error("if 0: break", "outside loop")
785 self._check_error("if 0: break\nelse: x=1", "outside loop")
786 self._check_error("if 1: pass\nelse: break", "outside loop")
787 self._check_error("class C:\n if 0: break", "outside loop")
788 self._check_error("class C:\n if 1: pass\n else: break",
789 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100790
791 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100792 self._check_error("if 0: continue", "not properly in loop")
793 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
794 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
795 self._check_error("class C:\n if 0: continue", "not properly in loop")
796 self._check_error("class C:\n if 1: pass\n else: continue",
797 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100798
Thomas Wouters477c8d52006-05-27 19:21:47 +0000799 def test_unexpected_indent(self):
800 self._check_error("foo()\n bar()\n", "unexpected indent",
801 subclass=IndentationError)
802
803 def test_no_indent(self):
804 self._check_error("if 1:\nfoo()", "expected an indented block",
805 subclass=IndentationError)
806
807 def test_bad_outdent(self):
808 self._check_error("if 1:\n foo()\n bar()",
809 "unindent does not match .* level",
810 subclass=IndentationError)
811
812 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400813 self._check_error("int(base=10, '2')",
814 "positional argument follows keyword argument")
815
816 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200817 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400818 "positional argument follows "
819 "keyword argument unpacking")
820
821 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200822 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400823 "iterable argument unpacking follows "
824 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000825
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000826def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000827 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000828 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000829 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000830
831if __name__ == "__main__":
832 test_main()