blob: f41426a4e9d2dade6e6ca12a05007957c86b743a [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
Pablo Galindo9f495902020-06-08 02:57:00 +010066>>> yield = 1
67Traceback (most recent call last):
68SyntaxError: assignment to yield expression not possible
69
Shantanu27c0d9b2020-05-11 14:53:58 -070070>>> del f()
71Traceback (most recent call last):
72SyntaxError: cannot delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000073
74>>> a + 1 = 2
75Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020076SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78>>> (x for x in x) = 1
79Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020080SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000081
82>>> 1 = 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
86>>> "abc" = 1
87Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020088SyntaxError: cannot assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000089
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050090>>> b"" = 1
91Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020092SyntaxError: cannot assign to literal
93
94>>> ... = 1
95Traceback (most recent call last):
96SyntaxError: cannot assign to Ellipsis
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050097
Jeremy Hyltonc960f262006-01-27 15:18:39 +000098>>> `1` = 1
99Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +0000100SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000101
102If the left-hand side of an assignment is a list or tuple, an illegal
103expression inside that contain should still cause a syntax error.
104This test just checks a couple of cases rather than enumerating all of
105them.
106
Pablo Galindo16ab0702020-05-15 02:04:52 +0100107>>> (a, "b", c) = (1, 2, 3)
108Traceback (most recent call last):
109SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200110
Pablo Galindo16ab0702020-05-15 02:04:52 +0100111>>> (a, True, c) = (1, 2, 3)
112Traceback (most recent call last):
113SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200114
115>>> (a, __debug__, c) = (1, 2, 3)
116Traceback (most recent call last):
117SyntaxError: cannot assign to __debug__
118
Pablo Galindo16ab0702020-05-15 02:04:52 +0100119>>> (a, *True, c) = (1, 2, 3)
120Traceback (most recent call last):
121SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200122
123>>> (a, *__debug__, c) = (1, 2, 3)
124Traceback (most recent call last):
125SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000126
Pablo Galindo16ab0702020-05-15 02:04:52 +0100127>>> [a, b, c + 1] = [1, 2, 3]
128Traceback (most recent call last):
129SyntaxError: cannot assign to operator
130
131>>> [a, b[1], c + 1] = [1, 2, 3]
132Traceback (most recent call last):
133SyntaxError: cannot assign to operator
134
135>>> [a, b.c.d, c + 1] = [1, 2, 3]
136Traceback (most recent call last):
137SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000138
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139>>> a if 1 else b = 1
140Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200141SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000142
Pablo Galindo9f495902020-06-08 02:57:00 +0100143>>> True = True = 3
144Traceback (most recent call last):
145SyntaxError: cannot assign to True
146
147>>> x = y = True = z = 3
148Traceback (most recent call last):
149SyntaxError: cannot assign to True
150
151>>> x = y = yield = 1
152Traceback (most recent call last):
153SyntaxError: assignment to yield expression not possible
154
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300155>>> a, b += 1, 2
156Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100157SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300158
159>>> (a, b) += 1, 2
160Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100161SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300162
163>>> [a, b] += 1, 2
164Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100165SyntaxError: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300166
Pablo Galindo9f495902020-06-08 02:57:00 +0100167>>> p = p =
168Traceback (most recent call last):
169SyntaxError: invalid syntax
170
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000171From compiler_complex_args():
172
173>>> def f(None=1):
174... pass
175Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000176SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000177
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000178From ast_for_arguments():
179
180>>> def f(x, y=1, z):
181... pass
182Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000183SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000184
185>>> def f(x, None):
186... pass
187Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000188SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000189
190>>> def f(*None):
191... pass
192Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000193SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000194
195>>> def f(**None):
196... pass
197Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000198SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000199
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300200>>> import ast; ast.parse('''
201... def f(
202... *, # type: int
203... a, # type: int
204... ):
205... pass
206... ''', type_comments=True)
207Traceback (most recent call last):
208SyntaxError: bare * has associated type comment
209
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000210
211From ast_for_funcdef():
212
213>>> def None(x):
214... pass
215Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000216SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000217
218
219From ast_for_call():
220
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200221>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000222... return list(it)
223>>> L = range(10)
224>>> f(x for x in L)
225[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
226>>> f(x for x in L, 1)
227Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200228SyntaxError: Generator expression must be parenthesized
229>>> f(x for x in L, y=1)
230Traceback (most recent call last):
231SyntaxError: Generator expression must be parenthesized
232>>> f(x for x in L, *[])
233Traceback (most recent call last):
234SyntaxError: Generator expression must be parenthesized
235>>> f(x for x in L, **{})
236Traceback (most recent call last):
237SyntaxError: Generator expression must be parenthesized
Lysandros Nikolaouae145832020-05-22 03:56:52 +0300238>>> f(L, x for x in L)
239Traceback (most recent call last):
240SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400241>>> f(x for x in L, y for y in L)
242Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200243SyntaxError: Generator expression must be parenthesized
244>>> f(x for x in L,)
245Traceback (most recent call last):
246SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000247>>> f((x for x in L), 1)
248[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200249>>> class C(x for x in L):
250... pass
251Traceback (most recent call last):
252SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000253
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200254>>> def g(*args, **kwargs):
255... print(args, sorted(kwargs.items()))
256>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
257... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
258... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
259... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
260... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
261... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
262... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
263... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
264... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
265... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
266... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
267... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
268... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
269... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
270... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
271... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
272... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
273... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
274... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
275... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
276(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000277
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200278>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
279... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
280... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
281... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
282... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
283... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
284... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
285... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
286... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
287... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
288... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
289... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
290... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
291... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
292... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
293... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
294... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
295... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
296... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
297... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
298... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
299... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
300... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
301... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
302... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
303... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
304... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
305... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
306... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
307... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
308... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
309... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
310... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
311... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
312... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
313... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
314... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
315... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
316... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
317... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
318... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
319... # doctest: +ELLIPSIS
320() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000321
Yury Selivanovf2392132016-12-13 19:03:51 -0500322>>> class C:
323... def meth(self, *args):
324... return args
325>>> obj = C()
326>>> obj.meth(
327... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
328... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
329... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
330... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
331... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
332... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
333... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
334... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
335... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
336... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
337... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
338... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
339... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
340... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
341... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
342... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
343... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
344... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
345... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
346... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
347(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
348
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100349# >>> f(lambda x: x[0] = 3)
350# Traceback (most recent call last):
351# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000352
353The grammar accepts any test (basically, any expression) in the
354keyword slot of a call site. Test a few different options.
355
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100356# >>> f(x()=2)
357# Traceback (most recent call last):
358# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
359# >>> f(a or b=1)
360# Traceback (most recent call last):
361# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
362# >>> f(x.y=1)
363# Traceback (most recent call last):
364# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
365# >>> f((x)=2)
366# Traceback (most recent call last):
367# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
368# >>> f(True=2)
369# Traceback (most recent call last):
370# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200371>>> f(__debug__=1)
372Traceback (most recent call last):
373SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100374>>> __debug__: int
375Traceback (most recent call last):
376SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000377
378
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000379More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380
381>>> (x for x in x) += 1
382Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100383SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384>>> None += 1
385Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100386SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200387>>> __debug__ += 1
388Traceback (most recent call last):
389SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000390>>> f() += 1
391Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100392SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000393
394
395Test continue in finally in weird combinations.
396
Ezio Melotti13925002011-03-16 11:05:33 +0200397continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000398
399 >>> def test():
400 ... try:
401 ... pass
402 ... finally:
403 ... for abc in range(10):
404 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000405 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000406 >>> test()
407 9
408
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200409continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410
411 >>> def test():
412 ... for abc in range(10):
413 ... try:
414 ... pass
415 ... finally:
416 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200417 ... print(abc)
418 >>> test()
419 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420
421 >>> def test():
422 ... for abc in range(10):
423 ... try:
424 ... pass
425 ... finally:
426 ... try:
427 ... continue
428 ... except:
429 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200430 ... print(abc)
431 >>> test()
432 9
433
434 >>> def test():
435 ... for abc in range(10):
436 ... try:
437 ... pass
438 ... finally:
439 ... try:
440 ... pass
441 ... except:
442 ... continue
443 ... print(abc)
444 >>> test()
445 9
446
447A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000448
449 >>> def foo():
450 ... try:
451 ... pass
452 ... finally:
453 ... continue
454 Traceback (most recent call last):
455 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200456 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457
458There is one test for a break that is not in a loop. The compiler
459uses a single data structure to keep track of try-finally and loops,
460so we need to be sure that a break is actually inside a loop. If it
461isn't, there should be a syntax error.
462
463 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000464 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000466 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000467 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000468 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000469 Traceback (most recent call last):
470 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000471 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000472
Benjamin Petersone09ed542016-07-14 22:00:03 -0700473This raises a SyntaxError, it used to raise a SystemError.
474Context for this change can be found on issue #27514
475
Thomas Wouters89f507f2006-12-13 04:49:30 +0000476In 2.5 there was a missing exception and an assert was triggered in a debug
477build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
478
479 >>> while 1:
480 ... while 2:
481 ... while 3:
482 ... while 4:
483 ... while 5:
484 ... while 6:
485 ... while 8:
486 ... while 9:
487 ... while 10:
488 ... while 11:
489 ... while 12:
490 ... while 13:
491 ... while 14:
492 ... while 15:
493 ... while 16:
494 ... while 17:
495 ... while 18:
496 ... while 19:
497 ... while 20:
498 ... while 21:
499 ... while 22:
500 ... break
501 Traceback (most recent call last):
502 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700503 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504
Guido van Rossum6cff8742016-09-09 09:36:26 -0700505Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
506
507 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200508 ... print(x)
509 ... global x
510 Traceback (most recent call last):
511 ...
512 SyntaxError: name 'x' is used prior to global declaration
513
514 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700515 ... x = 1
516 ... global x
517 Traceback (most recent call last):
518 ...
519 SyntaxError: name 'x' is assigned to before global declaration
520
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200521 >>> def f(x):
522 ... global x
523 Traceback (most recent call last):
524 ...
525 SyntaxError: name 'x' is parameter and global
526
Guido van Rossum6cff8742016-09-09 09:36:26 -0700527 >>> def f():
528 ... x = 1
529 ... def g():
530 ... print(x)
531 ... nonlocal x
532 Traceback (most recent call last):
533 ...
534 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000535
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300536 >>> def f():
537 ... x = 1
538 ... def g():
539 ... x = 2
540 ... nonlocal x
541 Traceback (most recent call last):
542 ...
543 SyntaxError: name 'x' is assigned to before nonlocal declaration
544
Jeremy Hylton81e95022007-02-27 06:50:52 +0000545 >>> def f(x):
546 ... nonlocal x
547 Traceback (most recent call last):
548 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000549 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000550
Jeremy Hylton81e95022007-02-27 06:50:52 +0000551 >>> def f():
552 ... global x
553 ... nonlocal x
554 Traceback (most recent call last):
555 ...
556 SyntaxError: name 'x' is nonlocal and global
557
558 >>> def f():
559 ... nonlocal x
560 Traceback (most recent call last):
561 ...
562 SyntaxError: no binding for nonlocal 'x' found
563
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000564From SF bug #1705365
565 >>> nonlocal x
566 Traceback (most recent call last):
567 ...
568 SyntaxError: nonlocal declaration not allowed at module level
569
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300570From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600571 >>> class A:
572 ... def f(self):
573 ... nonlocal __x
574 Traceback (most recent call last):
575 ...
576 SyntaxError: no binding for nonlocal '_A__x' found
577
Guido van Rossumd8faa362007-04-27 19:54:29 +0000578
579This tests assignment-context; there was a bug in Python 2.5 where compiling
580a complex 'if' (one with 'elif') would fail to notice an invalid suite,
581leading to spurious errors.
582
583 >>> if 1:
584 ... x() = 1
585 ... elif 1:
586 ... pass
587 Traceback (most recent call last):
588 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200589 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000590
591 >>> if 1:
592 ... pass
593 ... elif 1:
594 ... x() = 1
595 Traceback (most recent call last):
596 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200597 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000598
599 >>> if 1:
600 ... x() = 1
601 ... elif 1:
602 ... pass
603 ... else:
604 ... pass
605 Traceback (most recent call last):
606 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200607 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000608
609 >>> if 1:
610 ... pass
611 ... elif 1:
612 ... x() = 1
613 ... else:
614 ... pass
615 Traceback (most recent call last):
616 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200617 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000618
619 >>> if 1:
620 ... pass
621 ... elif 1:
622 ... pass
623 ... else:
624 ... x() = 1
625 Traceback (most recent call last):
626 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200627 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000628
Collin Winter828f04a2007-08-31 00:04:24 +0000629Make sure that the old "raise X, Y[, Z]" form is gone:
630 >>> raise X, Y
631 Traceback (most recent call last):
632 ...
633 SyntaxError: invalid syntax
634 >>> raise X, Y, Z
635 Traceback (most recent call last):
636 ...
637 SyntaxError: invalid syntax
638
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000639
640>>> f(a=23, a=234)
641Traceback (most recent call last):
642 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100643SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000644
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000645>>> {1, 2, 3} = 42
646Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200647SyntaxError: cannot assign to set display
648
649>>> {1: 2, 3: 4} = 42
650Traceback (most recent call last):
651SyntaxError: cannot assign to dict display
652
653>>> f'{x}' = 42
654Traceback (most recent call last):
655SyntaxError: cannot assign to f-string expression
656
657>>> f'{x}-{y}' = 42
658Traceback (most recent call last):
659SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000660
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +0300661>>> from t import x,
662Traceback (most recent call last):
663SyntaxError: trailing comma not allowed without surrounding parentheses
664
665>>> from t import x,y,
666Traceback (most recent call last):
667SyntaxError: trailing comma not allowed without surrounding parentheses
668
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000669Corner-cases that used to fail to raise the correct error:
670
671 >>> def f(*, x=lambda __debug__:0): pass
672 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200673 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000674
675 >>> def f(*args:(lambda __debug__:0)): pass
676 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200677 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000678
679 >>> def f(**kwargs:(lambda __debug__:0)): pass
680 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200681 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000682
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300683 >>> with (lambda *:0): pass
684 Traceback (most recent call last):
685 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000686
687Corner-cases that used to crash:
688
689 >>> def f(**__debug__): pass
690 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200691 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000692
693 >>> def f(*xx, __debug__): pass
694 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200695 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000696
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300697 >>> import ä £
698 Traceback (most recent call last):
699 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000700"""
701
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000702import re
703import unittest
704
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000705from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000706
707class SyntaxTestCase(unittest.TestCase):
708
709 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200710 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000711 """Check that compiling code raises SyntaxError with errtext.
712
713 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000714 test of the exception raised. If subclass is specified it
715 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000716 """
717 try:
718 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000719 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000720 if subclass and not isinstance(err, subclass):
721 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000722 mo = re.search(errtext, str(err))
723 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700724 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200725 self.assertEqual(err.filename, filename)
726 if lineno is not None:
727 self.assertEqual(err.lineno, lineno)
728 if offset is not None:
729 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000730 else:
731 self.fail("compile() did not raise SyntaxError")
732
733 def test_assign_call(self):
734 self._check_error("f() = 1", "assign")
735
Pablo Galindo16ab0702020-05-15 02:04:52 +0100736 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000737 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700738 self._check_error("del (,)", "invalid syntax")
739 self._check_error("del 1", "delete literal")
740 self._check_error("del (1, 2)", "delete literal")
741 self._check_error("del None", "delete None")
742 self._check_error("del *x", "delete starred")
743 self._check_error("del (*x)", "delete starred")
744 self._check_error("del (*x,)", "delete starred")
745 self._check_error("del [*x,]", "delete starred")
746 self._check_error("del f()", "delete function call")
747 self._check_error("del f(a, b)", "delete function call")
748 self._check_error("del o.f()", "delete function call")
749 self._check_error("del a[0]()", "delete function call")
750 self._check_error("del x, f()", "delete function call")
751 self._check_error("del f(), x", "delete function call")
752 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
753 self._check_error("del (a if True else b)", "delete conditional")
754 self._check_error("del +a", "delete operator")
755 self._check_error("del a, +b", "delete operator")
756 self._check_error("del a + b", "delete operator")
757 self._check_error("del (a + b, c)", "delete operator")
758 self._check_error("del (c[0], a + b)", "delete operator")
759 self._check_error("del a.b.c + 2", "delete operator")
760 self._check_error("del a.b.c[0] + 2", "delete operator")
761 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
762 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
763 self._check_error("del (a := 5)", "delete named expression")
764 # We don't have a special message for this, but make sure we don't
765 # report "cannot delete name"
766 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000767
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200768 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000769 source = """if 1:
770 def error(a):
771 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200772 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000773 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200774 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000775 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200776 self._check_error(source, "parameter and global", lineno=3)
777
778 def test_nonlocal_param_err_first(self):
779 source = """if 1:
780 def error(a):
781 nonlocal a # SyntaxError
782 def error2():
783 b = 1
784 global b # SyntaxError
785 """
786 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000787
Neal Norwitzfcf44352005-11-27 20:37:43 +0000788 def test_break_outside_loop(self):
789 self._check_error("break", "outside loop")
790
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100791 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100792 self._check_error("if 0: yield", "outside function")
793 self._check_error("if 0: yield\nelse: x=1", "outside function")
794 self._check_error("if 1: pass\nelse: yield", "outside function")
795 self._check_error("while 0: yield", "outside function")
796 self._check_error("while 0: yield\nelse: x=1", "outside function")
797 self._check_error("class C:\n if 0: yield", "outside function")
798 self._check_error("class C:\n if 1: pass\n else: yield",
799 "outside function")
800 self._check_error("class C:\n while 0: yield", "outside function")
801 self._check_error("class C:\n while 0: yield\n else: x = 1",
802 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100803
804 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100805 self._check_error("if 0: return", "outside function")
806 self._check_error("if 0: return\nelse: x=1", "outside function")
807 self._check_error("if 1: pass\nelse: return", "outside function")
808 self._check_error("while 0: return", "outside function")
809 self._check_error("class C:\n if 0: return", "outside function")
810 self._check_error("class C:\n while 0: return", "outside function")
811 self._check_error("class C:\n while 0: return\n else: x=1",
812 "outside function")
813 self._check_error("class C:\n if 0: return\n else: x= 1",
814 "outside function")
815 self._check_error("class C:\n if 1: pass\n else: return",
816 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100817
818 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100819 self._check_error("if 0: break", "outside loop")
820 self._check_error("if 0: break\nelse: x=1", "outside loop")
821 self._check_error("if 1: pass\nelse: break", "outside loop")
822 self._check_error("class C:\n if 0: break", "outside loop")
823 self._check_error("class C:\n if 1: pass\n else: break",
824 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100825
826 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100827 self._check_error("if 0: continue", "not properly in loop")
828 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
829 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
830 self._check_error("class C:\n if 0: continue", "not properly in loop")
831 self._check_error("class C:\n if 1: pass\n else: continue",
832 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100833
Thomas Wouters477c8d52006-05-27 19:21:47 +0000834 def test_unexpected_indent(self):
835 self._check_error("foo()\n bar()\n", "unexpected indent",
836 subclass=IndentationError)
837
838 def test_no_indent(self):
839 self._check_error("if 1:\nfoo()", "expected an indented block",
840 subclass=IndentationError)
841
842 def test_bad_outdent(self):
843 self._check_error("if 1:\n foo()\n bar()",
844 "unindent does not match .* level",
845 subclass=IndentationError)
846
847 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400848 self._check_error("int(base=10, '2')",
849 "positional argument follows keyword argument")
850
851 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200852 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400853 "positional argument follows "
854 "keyword argument unpacking")
855
856 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200857 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400858 "iterable argument unpacking follows "
859 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000860
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000861def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000862 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000863 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000864 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000865
866if __name__ == "__main__":
867 test_main()