blob: a3a101534628a2d6970c689826755cd79aeee299 [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 Galindoc5fc1562020-04-22 23:29:27 +0100103# All of the following also produce different error messages with pegen
104# >>> (a, "b", c) = (1, 2, 3)
105# Traceback (most recent call last):
106# SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200107
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100108# >>> (a, True, c) = (1, 2, 3)
109# Traceback (most recent call last):
110# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200111
112>>> (a, __debug__, c) = (1, 2, 3)
113Traceback (most recent call last):
114SyntaxError: cannot assign to __debug__
115
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100116# >>> (a, *True, c) = (1, 2, 3)
117# Traceback (most recent call last):
118# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200119
120>>> (a, *__debug__, c) = (1, 2, 3)
121Traceback (most recent call last):
122SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000123
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100124# >>> [a, b, c + 1] = [1, 2, 3]
125# Traceback (most recent call last):
126# SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000127
Thomas Wouters477c8d52006-05-27 19:21:47 +0000128>>> a if 1 else b = 1
129Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200130SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000131
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300132>>> a, b += 1, 2
133Traceback (most recent call last):
134SyntaxError: invalid syntax
135
136>>> (a, b) += 1, 2
137Traceback (most recent call last):
138SyntaxError: cannot assign to tuple
139
140>>> [a, b] += 1, 2
141Traceback (most recent call last):
142SyntaxError: cannot assign to list
143
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000144From compiler_complex_args():
145
146>>> def f(None=1):
147... pass
148Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000149SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000150
151
152From ast_for_arguments():
153
154>>> def f(x, y=1, z):
155... pass
156Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000157SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000158
159>>> def f(x, None):
160... pass
161Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000162SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000163
164>>> def f(*None):
165... pass
166Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000167SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000168
169>>> def f(**None):
170... pass
171Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000172SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000173
174
175From ast_for_funcdef():
176
177>>> def None(x):
178... pass
179Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000180SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000181
182
183From ast_for_call():
184
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200185>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000186... return list(it)
187>>> L = range(10)
188>>> f(x for x in L)
189[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
190>>> f(x for x in L, 1)
191Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200192SyntaxError: Generator expression must be parenthesized
193>>> f(x for x in L, y=1)
194Traceback (most recent call last):
195SyntaxError: Generator expression must be parenthesized
196>>> f(x for x in L, *[])
197Traceback (most recent call last):
198SyntaxError: Generator expression must be parenthesized
199>>> f(x for x in L, **{})
200Traceback (most recent call last):
201SyntaxError: Generator expression must be parenthesized
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100202
203# >>> f(L, x for x in L)
204# Traceback (most recent call last):
205# SyntaxError: Generator expression must be parenthesized
206
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400207>>> f(x for x in L, y for y in L)
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,)
211Traceback (most recent call last):
212SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000213>>> f((x for x in L), 1)
214[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200215>>> class C(x for x in L):
216... pass
217Traceback (most recent call last):
218SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000219
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200220>>> def g(*args, **kwargs):
221... print(args, sorted(kwargs.items()))
222>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
223... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
224... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
225... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
226... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
227... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
228... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
229... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
230... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
231... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
232... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
233... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
234... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
235... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
236... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
237... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
238... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
239... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
240... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
241... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
242(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000243
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200244>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
245... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
246... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
247... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
248... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
249... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
250... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
251... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
252... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
253... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
254... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
255... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
256... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
257... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
258... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
259... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
260... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
261... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
262... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
263... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
264... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
265... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
266... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
267... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
268... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
269... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
270... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
271... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
272... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
273... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
274... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
275... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
276... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
277... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
278... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
279... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
280... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
281... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
282... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
283... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
284... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
285... # doctest: +ELLIPSIS
286() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000287
Yury Selivanovf2392132016-12-13 19:03:51 -0500288>>> class C:
289... def meth(self, *args):
290... return args
291>>> obj = C()
292>>> obj.meth(
293... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
294... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
295... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
296... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
297... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
298... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
299... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
300... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
301... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
302... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
303... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
304... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
305... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
306... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
307... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
308... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
309... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
310... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
311... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
312... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
313(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
314
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100315# >>> f(lambda x: x[0] = 3)
316# Traceback (most recent call last):
317# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000318
319The grammar accepts any test (basically, any expression) in the
320keyword slot of a call site. Test a few different options.
321
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100322# >>> f(x()=2)
323# Traceback (most recent call last):
324# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
325# >>> f(a or b=1)
326# Traceback (most recent call last):
327# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
328# >>> f(x.y=1)
329# Traceback (most recent call last):
330# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
331# >>> f((x)=2)
332# Traceback (most recent call last):
333# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
334# >>> f(True=2)
335# Traceback (most recent call last):
336# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200337>>> f(__debug__=1)
338Traceback (most recent call last):
339SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100340>>> __debug__: int
341Traceback (most recent call last):
342SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343
344
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000345More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000346
347>>> (x for x in x) += 1
348Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200349SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000350>>> None += 1
351Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200352SyntaxError: cannot assign to None
353>>> __debug__ += 1
354Traceback (most recent call last):
355SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000356>>> f() += 1
357Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200358SyntaxError: cannot assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000359
360
361Test continue in finally in weird combinations.
362
Ezio Melotti13925002011-03-16 11:05:33 +0200363continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000364
365 >>> def test():
366 ... try:
367 ... pass
368 ... finally:
369 ... for abc in range(10):
370 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000371 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000372 >>> test()
373 9
374
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200375continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000376
377 >>> def test():
378 ... for abc in range(10):
379 ... try:
380 ... pass
381 ... finally:
382 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200383 ... print(abc)
384 >>> test()
385 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000386
387 >>> def test():
388 ... for abc in range(10):
389 ... try:
390 ... pass
391 ... finally:
392 ... try:
393 ... continue
394 ... except:
395 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200396 ... print(abc)
397 >>> test()
398 9
399
400 >>> def test():
401 ... for abc in range(10):
402 ... try:
403 ... pass
404 ... finally:
405 ... try:
406 ... pass
407 ... except:
408 ... continue
409 ... print(abc)
410 >>> test()
411 9
412
413A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000414
415 >>> def foo():
416 ... try:
417 ... pass
418 ... finally:
419 ... continue
420 Traceback (most recent call last):
421 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200422 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423
424There is one test for a break that is not in a loop. The compiler
425uses a single data structure to keep track of try-finally and loops,
426so we need to be sure that a break is actually inside a loop. If it
427isn't, there should be a syntax error.
428
429 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000430 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000432 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000434 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000435 Traceback (most recent call last):
436 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000437 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000438
Benjamin Petersone09ed542016-07-14 22:00:03 -0700439This raises a SyntaxError, it used to raise a SystemError.
440Context for this change can be found on issue #27514
441
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442In 2.5 there was a missing exception and an assert was triggered in a debug
443build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
444
445 >>> while 1:
446 ... while 2:
447 ... while 3:
448 ... while 4:
449 ... while 5:
450 ... while 6:
451 ... while 8:
452 ... while 9:
453 ... while 10:
454 ... while 11:
455 ... while 12:
456 ... while 13:
457 ... while 14:
458 ... while 15:
459 ... while 16:
460 ... while 17:
461 ... while 18:
462 ... while 19:
463 ... while 20:
464 ... while 21:
465 ... while 22:
466 ... break
467 Traceback (most recent call last):
468 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700469 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000470
Guido van Rossum6cff8742016-09-09 09:36:26 -0700471Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
472
473 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200474 ... print(x)
475 ... global x
476 Traceback (most recent call last):
477 ...
478 SyntaxError: name 'x' is used prior to global declaration
479
480 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700481 ... x = 1
482 ... global x
483 Traceback (most recent call last):
484 ...
485 SyntaxError: name 'x' is assigned to before global declaration
486
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200487 >>> def f(x):
488 ... global x
489 Traceback (most recent call last):
490 ...
491 SyntaxError: name 'x' is parameter and global
492
Guido van Rossum6cff8742016-09-09 09:36:26 -0700493 >>> def f():
494 ... x = 1
495 ... def g():
496 ... print(x)
497 ... nonlocal x
498 Traceback (most recent call last):
499 ...
500 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000501
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300502 >>> def f():
503 ... x = 1
504 ... def g():
505 ... x = 2
506 ... nonlocal x
507 Traceback (most recent call last):
508 ...
509 SyntaxError: name 'x' is assigned to before nonlocal declaration
510
Jeremy Hylton81e95022007-02-27 06:50:52 +0000511 >>> def f(x):
512 ... nonlocal x
513 Traceback (most recent call last):
514 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000515 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000516
Jeremy Hylton81e95022007-02-27 06:50:52 +0000517 >>> def f():
518 ... global x
519 ... nonlocal x
520 Traceback (most recent call last):
521 ...
522 SyntaxError: name 'x' is nonlocal and global
523
524 >>> def f():
525 ... nonlocal x
526 Traceback (most recent call last):
527 ...
528 SyntaxError: no binding for nonlocal 'x' found
529
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000530From SF bug #1705365
531 >>> nonlocal x
532 Traceback (most recent call last):
533 ...
534 SyntaxError: nonlocal declaration not allowed at module level
535
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300536From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600537 >>> class A:
538 ... def f(self):
539 ... nonlocal __x
540 Traceback (most recent call last):
541 ...
542 SyntaxError: no binding for nonlocal '_A__x' found
543
Guido van Rossumd8faa362007-04-27 19:54:29 +0000544
545This tests assignment-context; there was a bug in Python 2.5 where compiling
546a complex 'if' (one with 'elif') would fail to notice an invalid suite,
547leading to spurious errors.
548
549 >>> if 1:
550 ... x() = 1
551 ... elif 1:
552 ... pass
553 Traceback (most recent call last):
554 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200555 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000556
557 >>> if 1:
558 ... pass
559 ... elif 1:
560 ... x() = 1
561 Traceback (most recent call last):
562 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200563 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000564
565 >>> if 1:
566 ... x() = 1
567 ... elif 1:
568 ... pass
569 ... else:
570 ... pass
571 Traceback (most recent call last):
572 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200573 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000574
575 >>> if 1:
576 ... pass
577 ... elif 1:
578 ... x() = 1
579 ... else:
580 ... pass
581 Traceback (most recent call last):
582 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200583 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000584
585 >>> if 1:
586 ... pass
587 ... elif 1:
588 ... pass
589 ... else:
590 ... x() = 1
591 Traceback (most recent call last):
592 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200593 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000594
Collin Winter828f04a2007-08-31 00:04:24 +0000595Make sure that the old "raise X, Y[, Z]" form is gone:
596 >>> raise X, Y
597 Traceback (most recent call last):
598 ...
599 SyntaxError: invalid syntax
600 >>> raise X, Y, Z
601 Traceback (most recent call last):
602 ...
603 SyntaxError: invalid syntax
604
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000605
606>>> f(a=23, a=234)
607Traceback (most recent call last):
608 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100609SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000610
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000611>>> {1, 2, 3} = 42
612Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200613SyntaxError: cannot assign to set display
614
615>>> {1: 2, 3: 4} = 42
616Traceback (most recent call last):
617SyntaxError: cannot assign to dict display
618
619>>> f'{x}' = 42
620Traceback (most recent call last):
621SyntaxError: cannot assign to f-string expression
622
623>>> f'{x}-{y}' = 42
624Traceback (most recent call last):
625SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000626
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000627Corner-cases that used to fail to raise the correct error:
628
629 >>> def f(*, x=lambda __debug__:0): pass
630 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200631 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000632
633 >>> def f(*args:(lambda __debug__:0)): pass
634 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200635 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000636
637 >>> def f(**kwargs:(lambda __debug__:0)): pass
638 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200639 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000640
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300641 >>> with (lambda *:0): pass
642 Traceback (most recent call last):
643 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000644
645Corner-cases that used to crash:
646
647 >>> def f(**__debug__): pass
648 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200649 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000650
651 >>> def f(*xx, __debug__): pass
652 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200653 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000654
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000655"""
656
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000657import re
658import unittest
659
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000660from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000661
662class SyntaxTestCase(unittest.TestCase):
663
664 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200665 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000666 """Check that compiling code raises SyntaxError with errtext.
667
668 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000669 test of the exception raised. If subclass is specified it
670 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000671 """
672 try:
673 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000674 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000675 if subclass and not isinstance(err, subclass):
676 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000677 mo = re.search(errtext, str(err))
678 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700679 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200680 self.assertEqual(err.filename, filename)
681 if lineno is not None:
682 self.assertEqual(err.lineno, lineno)
683 if offset is not None:
684 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000685 else:
686 self.fail("compile() did not raise SyntaxError")
687
688 def test_assign_call(self):
689 self._check_error("f() = 1", "assign")
690
691 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700692 self._check_error("del (,)", "invalid syntax")
693 self._check_error("del 1", "delete literal")
694 self._check_error("del (1, 2)", "delete literal")
695 self._check_error("del None", "delete None")
696 self._check_error("del *x", "delete starred")
697 self._check_error("del (*x)", "delete starred")
698 self._check_error("del (*x,)", "delete starred")
699 self._check_error("del [*x,]", "delete starred")
700 self._check_error("del f()", "delete function call")
701 self._check_error("del f(a, b)", "delete function call")
702 self._check_error("del o.f()", "delete function call")
703 self._check_error("del a[0]()", "delete function call")
704 self._check_error("del x, f()", "delete function call")
705 self._check_error("del f(), x", "delete function call")
706 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
707 self._check_error("del (a if True else b)", "delete conditional")
708 self._check_error("del +a", "delete operator")
709 self._check_error("del a, +b", "delete operator")
710 self._check_error("del a + b", "delete operator")
711 self._check_error("del (a + b, c)", "delete operator")
712 self._check_error("del (c[0], a + b)", "delete operator")
713 self._check_error("del a.b.c + 2", "delete operator")
714 self._check_error("del a.b.c[0] + 2", "delete operator")
715 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
716 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
717 self._check_error("del (a := 5)", "delete named expression")
718 # We don't have a special message for this, but make sure we don't
719 # report "cannot delete name"
720 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000721
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200722 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000723 source = """if 1:
724 def error(a):
725 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200726 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000727 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200728 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000729 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200730 self._check_error(source, "parameter and global", lineno=3)
731
732 def test_nonlocal_param_err_first(self):
733 source = """if 1:
734 def error(a):
735 nonlocal a # SyntaxError
736 def error2():
737 b = 1
738 global b # SyntaxError
739 """
740 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000741
Neal Norwitzfcf44352005-11-27 20:37:43 +0000742 def test_break_outside_loop(self):
743 self._check_error("break", "outside loop")
744
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100745 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100746 self._check_error("if 0: yield", "outside function")
747 self._check_error("if 0: yield\nelse: x=1", "outside function")
748 self._check_error("if 1: pass\nelse: yield", "outside function")
749 self._check_error("while 0: yield", "outside function")
750 self._check_error("while 0: yield\nelse: x=1", "outside function")
751 self._check_error("class C:\n if 0: yield", "outside function")
752 self._check_error("class C:\n if 1: pass\n else: yield",
753 "outside function")
754 self._check_error("class C:\n while 0: yield", "outside function")
755 self._check_error("class C:\n while 0: yield\n else: x = 1",
756 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100757
758 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100759 self._check_error("if 0: return", "outside function")
760 self._check_error("if 0: return\nelse: x=1", "outside function")
761 self._check_error("if 1: pass\nelse: return", "outside function")
762 self._check_error("while 0: return", "outside function")
763 self._check_error("class C:\n if 0: return", "outside function")
764 self._check_error("class C:\n while 0: return", "outside function")
765 self._check_error("class C:\n while 0: return\n else: x=1",
766 "outside function")
767 self._check_error("class C:\n if 0: return\n else: x= 1",
768 "outside function")
769 self._check_error("class C:\n if 1: pass\n else: return",
770 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100771
772 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100773 self._check_error("if 0: break", "outside loop")
774 self._check_error("if 0: break\nelse: x=1", "outside loop")
775 self._check_error("if 1: pass\nelse: break", "outside loop")
776 self._check_error("class C:\n if 0: break", "outside loop")
777 self._check_error("class C:\n if 1: pass\n else: break",
778 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100779
780 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100781 self._check_error("if 0: continue", "not properly in loop")
782 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
783 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
784 self._check_error("class C:\n if 0: continue", "not properly in loop")
785 self._check_error("class C:\n if 1: pass\n else: continue",
786 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100787
Thomas Wouters477c8d52006-05-27 19:21:47 +0000788 def test_unexpected_indent(self):
789 self._check_error("foo()\n bar()\n", "unexpected indent",
790 subclass=IndentationError)
791
792 def test_no_indent(self):
793 self._check_error("if 1:\nfoo()", "expected an indented block",
794 subclass=IndentationError)
795
796 def test_bad_outdent(self):
797 self._check_error("if 1:\n foo()\n bar()",
798 "unindent does not match .* level",
799 subclass=IndentationError)
800
801 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400802 self._check_error("int(base=10, '2')",
803 "positional argument follows keyword argument")
804
805 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200806 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400807 "positional argument follows "
808 "keyword argument unpacking")
809
810 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200811 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400812 "iterable argument unpacking follows "
813 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000814
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000815def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000816 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000817 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000818 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000819
820if __name__ == "__main__":
821 test_main()