blob: c6f53eb3c88af3d2e4af97815a7bc847dc3bc824 [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
Miss Islington (bot)8df4f392020-06-08 02:22:06 -0700139>>> True = True = 3
140Traceback (most recent call last):
141SyntaxError: cannot assign to True
142
143>>> x = y = True = z = 3
144Traceback (most recent call last):
145SyntaxError: cannot assign to True
146
147>>> x = y = yield = 1
148Traceback (most recent call last):
149SyntaxError: assignment to yield expression not possible
150
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300151>>> a, b += 1, 2
152Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100153SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300154
155>>> (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: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300162
Miss Islington (bot)8df4f392020-06-08 02:22:06 -0700163>>> p = p =
164Traceback (most recent call last):
165SyntaxError: invalid syntax
166
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000167From compiler_complex_args():
168
169>>> def f(None=1):
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
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000174From ast_for_arguments():
175
176>>> def f(x, y=1, z):
177... pass
178Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000179SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000180
181>>> def f(x, None):
182... pass
183Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000184SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000185
186>>> def f(*None):
187... pass
188Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000189SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000190
191>>> def f(**None):
192... pass
193Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000194SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000195
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300196>>> import ast; ast.parse('''
197... def f(
198... *, # type: int
199... a, # type: int
200... ):
201... pass
202... ''', type_comments=True)
203Traceback (most recent call last):
204SyntaxError: bare * has associated type comment
205
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000206
207From ast_for_funcdef():
208
209>>> def None(x):
210... pass
211Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000212SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000213
214
215From ast_for_call():
216
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200217>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000218... return list(it)
219>>> L = range(10)
220>>> f(x for x in L)
221[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
222>>> f(x for x in L, 1)
223Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200224SyntaxError: Generator expression must be parenthesized
225>>> f(x for x in L, y=1)
226Traceback (most recent call last):
227SyntaxError: Generator expression must be parenthesized
228>>> f(x for x in L, *[])
229Traceback (most recent call last):
230SyntaxError: Generator expression must be parenthesized
231>>> f(x for x in L, **{})
232Traceback (most recent call last):
233SyntaxError: Generator expression must be parenthesized
Miss Islington (bot)55c89232020-05-21 18:14:55 -0700234>>> f(L, x for x in L)
235Traceback (most recent call last):
236SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400237>>> f(x for x in L, y for y in L)
238Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200239SyntaxError: Generator expression must be parenthesized
240>>> f(x for x in L,)
241Traceback (most recent call last):
242SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000243>>> f((x for x in L), 1)
244[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200245>>> class C(x for x in L):
246... pass
247Traceback (most recent call last):
248SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000249
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200250>>> def g(*args, **kwargs):
251... print(args, sorted(kwargs.items()))
252>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
253... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
254... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
255... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
256... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
257... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
258... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
259... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
260... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
261... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
262... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
263... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
264... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
265... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
266... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
267... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
268... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
269... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
270... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
271... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
272(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000273
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200274>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
275... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
276... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
277... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
278... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
279... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
280... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
281... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
282... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
283... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
284... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
285... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
286... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
287... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
288... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
289... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
290... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
291... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
292... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
293... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
294... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
295... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
296... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
297... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
298... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
299... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
300... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
301... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
302... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
303... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
304... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
305... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
306... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
307... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
308... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
309... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
310... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
311... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
312... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
313... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
314... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
315... # doctest: +ELLIPSIS
316() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000317
Yury Selivanovf2392132016-12-13 19:03:51 -0500318>>> class C:
319... def meth(self, *args):
320... return args
321>>> obj = C()
322>>> obj.meth(
323... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
324... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
325... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
326... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
327... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
328... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
329... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
330... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
331... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
332... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
333... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
334... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
335... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
336... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
337... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
338... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
339... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
340... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
341... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
342... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
343(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
344
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100345# >>> f(lambda x: x[0] = 3)
346# Traceback (most recent call last):
347# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000348
349The grammar accepts any test (basically, any expression) in the
350keyword slot of a call site. Test a few different options.
351
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100352# >>> f(x()=2)
353# Traceback (most recent call last):
354# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
355# >>> f(a or b=1)
356# Traceback (most recent call last):
357# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
358# >>> f(x.y=1)
359# Traceback (most recent call last):
360# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
361# >>> f((x)=2)
362# Traceback (most recent call last):
363# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
364# >>> f(True=2)
365# Traceback (most recent call last):
366# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200367>>> f(__debug__=1)
368Traceback (most recent call last):
369SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100370>>> __debug__: int
371Traceback (most recent call last):
372SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000373
374
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000375More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376
377>>> (x for x in x) += 1
378Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100379SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380>>> None += 1
381Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100382SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200383>>> __debug__ += 1
384Traceback (most recent call last):
385SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386>>> f() += 1
387Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100388SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000389
390
391Test continue in finally in weird combinations.
392
Ezio Melotti13925002011-03-16 11:05:33 +0200393continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000394
395 >>> def test():
396 ... try:
397 ... pass
398 ... finally:
399 ... for abc in range(10):
400 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000401 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000402 >>> test()
403 9
404
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200405continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000406
407 >>> def test():
408 ... for abc in range(10):
409 ... try:
410 ... pass
411 ... finally:
412 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200413 ... print(abc)
414 >>> test()
415 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000416
417 >>> def test():
418 ... for abc in range(10):
419 ... try:
420 ... pass
421 ... finally:
422 ... try:
423 ... continue
424 ... except:
425 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200426 ... print(abc)
427 >>> test()
428 9
429
430 >>> def test():
431 ... for abc in range(10):
432 ... try:
433 ... pass
434 ... finally:
435 ... try:
436 ... pass
437 ... except:
438 ... continue
439 ... print(abc)
440 >>> test()
441 9
442
443A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444
445 >>> def foo():
446 ... try:
447 ... pass
448 ... finally:
449 ... continue
450 Traceback (most recent call last):
451 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200452 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000453
454There is one test for a break that is not in a loop. The compiler
455uses a single data structure to keep track of try-finally and loops,
456so we need to be sure that a break is actually inside a loop. If it
457isn't, there should be a syntax error.
458
459 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000460 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000462 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000463 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000464 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465 Traceback (most recent call last):
466 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000467 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000468
Benjamin Petersone09ed542016-07-14 22:00:03 -0700469This raises a SyntaxError, it used to raise a SystemError.
470Context for this change can be found on issue #27514
471
Thomas Wouters89f507f2006-12-13 04:49:30 +0000472In 2.5 there was a missing exception and an assert was triggered in a debug
473build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
474
475 >>> while 1:
476 ... while 2:
477 ... while 3:
478 ... while 4:
479 ... while 5:
480 ... while 6:
481 ... while 8:
482 ... while 9:
483 ... while 10:
484 ... while 11:
485 ... while 12:
486 ... while 13:
487 ... while 14:
488 ... while 15:
489 ... while 16:
490 ... while 17:
491 ... while 18:
492 ... while 19:
493 ... while 20:
494 ... while 21:
495 ... while 22:
496 ... break
497 Traceback (most recent call last):
498 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700499 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000500
Guido van Rossum6cff8742016-09-09 09:36:26 -0700501Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
502
503 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200504 ... print(x)
505 ... global x
506 Traceback (most recent call last):
507 ...
508 SyntaxError: name 'x' is used prior to global declaration
509
510 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700511 ... x = 1
512 ... global x
513 Traceback (most recent call last):
514 ...
515 SyntaxError: name 'x' is assigned to before global declaration
516
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200517 >>> def f(x):
518 ... global x
519 Traceback (most recent call last):
520 ...
521 SyntaxError: name 'x' is parameter and global
522
Guido van Rossum6cff8742016-09-09 09:36:26 -0700523 >>> def f():
524 ... x = 1
525 ... def g():
526 ... print(x)
527 ... nonlocal x
528 Traceback (most recent call last):
529 ...
530 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000531
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300532 >>> def f():
533 ... x = 1
534 ... def g():
535 ... x = 2
536 ... nonlocal x
537 Traceback (most recent call last):
538 ...
539 SyntaxError: name 'x' is assigned to before nonlocal declaration
540
Jeremy Hylton81e95022007-02-27 06:50:52 +0000541 >>> def f(x):
542 ... nonlocal x
543 Traceback (most recent call last):
544 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000545 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546
Jeremy Hylton81e95022007-02-27 06:50:52 +0000547 >>> def f():
548 ... global x
549 ... nonlocal x
550 Traceback (most recent call last):
551 ...
552 SyntaxError: name 'x' is nonlocal and global
553
554 >>> def f():
555 ... nonlocal x
556 Traceback (most recent call last):
557 ...
558 SyntaxError: no binding for nonlocal 'x' found
559
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000560From SF bug #1705365
561 >>> nonlocal x
562 Traceback (most recent call last):
563 ...
564 SyntaxError: nonlocal declaration not allowed at module level
565
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300566From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600567 >>> class A:
568 ... def f(self):
569 ... nonlocal __x
570 Traceback (most recent call last):
571 ...
572 SyntaxError: no binding for nonlocal '_A__x' found
573
Guido van Rossumd8faa362007-04-27 19:54:29 +0000574
575This tests assignment-context; there was a bug in Python 2.5 where compiling
576a complex 'if' (one with 'elif') would fail to notice an invalid suite,
577leading to spurious errors.
578
579 >>> if 1:
580 ... x() = 1
581 ... elif 1:
582 ... pass
583 Traceback (most recent call last):
584 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200585 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000586
587 >>> if 1:
588 ... pass
589 ... elif 1:
590 ... x() = 1
591 Traceback (most recent call last):
592 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200593 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000594
595 >>> if 1:
596 ... x() = 1
597 ... elif 1:
598 ... pass
599 ... else:
600 ... pass
601 Traceback (most recent call last):
602 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200603 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000604
605 >>> if 1:
606 ... pass
607 ... elif 1:
608 ... x() = 1
609 ... else:
610 ... pass
611 Traceback (most recent call last):
612 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200613 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000614
615 >>> if 1:
616 ... pass
617 ... elif 1:
618 ... pass
619 ... else:
620 ... x() = 1
621 Traceback (most recent call last):
622 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200623 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000624
Collin Winter828f04a2007-08-31 00:04:24 +0000625Make sure that the old "raise X, Y[, Z]" form is gone:
626 >>> raise X, Y
627 Traceback (most recent call last):
628 ...
629 SyntaxError: invalid syntax
630 >>> raise X, Y, Z
631 Traceback (most recent call last):
632 ...
633 SyntaxError: invalid syntax
634
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000635
636>>> f(a=23, a=234)
637Traceback (most recent call last):
638 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100639SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000640
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000641>>> {1, 2, 3} = 42
642Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200643SyntaxError: cannot assign to set display
644
645>>> {1: 2, 3: 4} = 42
646Traceback (most recent call last):
647SyntaxError: cannot assign to dict display
648
649>>> f'{x}' = 42
650Traceback (most recent call last):
651SyntaxError: cannot assign to f-string expression
652
653>>> f'{x}-{y}' = 42
654Traceback (most recent call last):
655SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000656
Pablo Galindo275d7e12020-05-21 22:04:54 +0100657>>> from t import x,
658Traceback (most recent call last):
659SyntaxError: trailing comma not allowed without surrounding parentheses
660
661>>> from t import x,y,
662Traceback (most recent call last):
663SyntaxError: trailing comma not allowed without surrounding parentheses
664
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000665Corner-cases that used to fail to raise the correct error:
666
667 >>> def f(*, x=lambda __debug__:0): pass
668 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200669 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000670
671 >>> def f(*args:(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(**kwargs:(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
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300679 >>> with (lambda *:0): pass
680 Traceback (most recent call last):
681 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000682
683Corner-cases that used to crash:
684
685 >>> def f(**__debug__): pass
686 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200687 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000688
689 >>> def f(*xx, __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
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300693 >>> import ä £
694 Traceback (most recent call last):
695 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000696"""
697
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000698import re
699import unittest
700
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000701from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000702
703class SyntaxTestCase(unittest.TestCase):
704
705 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200706 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000707 """Check that compiling code raises SyntaxError with errtext.
708
709 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000710 test of the exception raised. If subclass is specified it
711 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000712 """
713 try:
714 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000715 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000716 if subclass and not isinstance(err, subclass):
717 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000718 mo = re.search(errtext, str(err))
719 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700720 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200721 self.assertEqual(err.filename, filename)
722 if lineno is not None:
723 self.assertEqual(err.lineno, lineno)
724 if offset is not None:
725 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000726 else:
727 self.fail("compile() did not raise SyntaxError")
728
729 def test_assign_call(self):
730 self._check_error("f() = 1", "assign")
731
Pablo Galindo16ab0702020-05-15 02:04:52 +0100732 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000733 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700734 self._check_error("del (,)", "invalid syntax")
735 self._check_error("del 1", "delete literal")
736 self._check_error("del (1, 2)", "delete literal")
737 self._check_error("del None", "delete None")
738 self._check_error("del *x", "delete starred")
739 self._check_error("del (*x)", "delete starred")
740 self._check_error("del (*x,)", "delete starred")
741 self._check_error("del [*x,]", "delete starred")
742 self._check_error("del f()", "delete function call")
743 self._check_error("del f(a, b)", "delete function call")
744 self._check_error("del o.f()", "delete function call")
745 self._check_error("del a[0]()", "delete function call")
746 self._check_error("del x, f()", "delete function call")
747 self._check_error("del f(), x", "delete function call")
748 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
749 self._check_error("del (a if True else b)", "delete conditional")
750 self._check_error("del +a", "delete operator")
751 self._check_error("del a, +b", "delete operator")
752 self._check_error("del a + b", "delete operator")
753 self._check_error("del (a + b, c)", "delete operator")
754 self._check_error("del (c[0], a + b)", "delete operator")
755 self._check_error("del a.b.c + 2", "delete operator")
756 self._check_error("del a.b.c[0] + 2", "delete operator")
757 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
758 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
759 self._check_error("del (a := 5)", "delete named expression")
760 # We don't have a special message for this, but make sure we don't
761 # report "cannot delete name"
762 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000763
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200764 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000765 source = """if 1:
766 def error(a):
767 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200768 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000769 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200770 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000771 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200772 self._check_error(source, "parameter and global", lineno=3)
773
774 def test_nonlocal_param_err_first(self):
775 source = """if 1:
776 def error(a):
777 nonlocal a # SyntaxError
778 def error2():
779 b = 1
780 global b # SyntaxError
781 """
782 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000783
Neal Norwitzfcf44352005-11-27 20:37:43 +0000784 def test_break_outside_loop(self):
785 self._check_error("break", "outside loop")
786
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100787 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100788 self._check_error("if 0: yield", "outside function")
789 self._check_error("if 0: yield\nelse: x=1", "outside function")
790 self._check_error("if 1: pass\nelse: yield", "outside function")
791 self._check_error("while 0: yield", "outside function")
792 self._check_error("while 0: yield\nelse: x=1", "outside function")
793 self._check_error("class C:\n if 0: yield", "outside function")
794 self._check_error("class C:\n if 1: pass\n else: yield",
795 "outside function")
796 self._check_error("class C:\n while 0: yield", "outside function")
797 self._check_error("class C:\n while 0: yield\n else: x = 1",
798 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100799
800 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100801 self._check_error("if 0: return", "outside function")
802 self._check_error("if 0: return\nelse: x=1", "outside function")
803 self._check_error("if 1: pass\nelse: return", "outside function")
804 self._check_error("while 0: return", "outside function")
805 self._check_error("class C:\n if 0: return", "outside function")
806 self._check_error("class C:\n while 0: return", "outside function")
807 self._check_error("class C:\n while 0: return\n else: x=1",
808 "outside function")
809 self._check_error("class C:\n if 0: return\n else: x= 1",
810 "outside function")
811 self._check_error("class C:\n if 1: pass\n else: return",
812 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100813
814 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100815 self._check_error("if 0: break", "outside loop")
816 self._check_error("if 0: break\nelse: x=1", "outside loop")
817 self._check_error("if 1: pass\nelse: break", "outside loop")
818 self._check_error("class C:\n if 0: break", "outside loop")
819 self._check_error("class C:\n if 1: pass\n else: break",
820 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100821
822 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100823 self._check_error("if 0: continue", "not properly in loop")
824 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
825 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
826 self._check_error("class C:\n if 0: continue", "not properly in loop")
827 self._check_error("class C:\n if 1: pass\n else: continue",
828 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100829
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830 def test_unexpected_indent(self):
831 self._check_error("foo()\n bar()\n", "unexpected indent",
832 subclass=IndentationError)
833
834 def test_no_indent(self):
835 self._check_error("if 1:\nfoo()", "expected an indented block",
836 subclass=IndentationError)
837
838 def test_bad_outdent(self):
839 self._check_error("if 1:\n foo()\n bar()",
840 "unindent does not match .* level",
841 subclass=IndentationError)
842
843 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400844 self._check_error("int(base=10, '2')",
845 "positional argument follows keyword argument")
846
847 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200848 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400849 "positional argument follows "
850 "keyword argument unpacking")
851
852 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200853 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400854 "iterable argument unpacking follows "
855 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000856
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000857def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000858 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000859 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000860 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000861
862if __name__ == "__main__":
863 test_main()