blob: 604474f1e83870c1af73bf3df13e590e2ed534e4 [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
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300167Invalid targets in `for` loops and `with` statements should also
168produce a specialized error message
169
170>>> for a() in b: pass
171Traceback (most recent call last):
172SyntaxError: cannot assign to function call
173
174>>> for (a, b()) in b: pass
175Traceback (most recent call last):
176SyntaxError: cannot assign to function call
177
178>>> for [a, b()] in b: pass
179Traceback (most recent call last):
180SyntaxError: cannot assign to function call
181
182>>> for (*a, b, c+1) in b: pass
183Traceback (most recent call last):
184SyntaxError: cannot assign to operator
185
186>>> for (x, *(y, z.d())) in b: pass
187Traceback (most recent call last):
188SyntaxError: cannot assign to function call
189
190>>> for a, b() in c: pass
191Traceback (most recent call last):
192SyntaxError: cannot assign to function call
193
194>>> for a, b, (c + 1, d()): pass
195Traceback (most recent call last):
196SyntaxError: cannot assign to operator
197
198>>> for i < (): pass
199Traceback (most recent call last):
200SyntaxError: invalid syntax
201
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300202>>> for a, b
203Traceback (most recent call last):
204SyntaxError: invalid syntax
205
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300206>>> with a as b(): pass
207Traceback (most recent call last):
208SyntaxError: cannot assign to function call
209
210>>> with a as (b, c()): pass
211Traceback (most recent call last):
212SyntaxError: cannot assign to function call
213
214>>> with a as [b, c()]: pass
215Traceback (most recent call last):
216SyntaxError: cannot assign to function call
217
218>>> with a as (*b, c, d+1): pass
219Traceback (most recent call last):
220SyntaxError: cannot assign to operator
221
222>>> with a as (x, *(y, z.d())): pass
223Traceback (most recent call last):
224SyntaxError: cannot assign to function call
225
226>>> with a as b, c as d(): pass
227Traceback (most recent call last):
228SyntaxError: cannot assign to function call
229
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300230>>> with a as b
231Traceback (most recent call last):
232SyntaxError: invalid syntax
233
Pablo Galindo9f495902020-06-08 02:57:00 +0100234>>> p = p =
235Traceback (most recent call last):
236SyntaxError: invalid syntax
237
Pablo Galindo835f14f2021-01-31 22:52:56 +0000238Comprehensions creating tuples without parentheses
239should produce a specialized error message:
240
241>>> [x,y for x,y in range(100)]
242Traceback (most recent call last):
243SyntaxError: did you forget parentheses around the comprehension target?
244
245>>> {x,y for x,y in range(100)}
246Traceback (most recent call last):
247SyntaxError: did you forget parentheses around the comprehension target?
248
249>>> {x,y: None for x,y in range(100)}
250Traceback (most recent call last):
251SyntaxError: did you forget parentheses around the comprehension target?
252
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000253From compiler_complex_args():
254
255>>> def f(None=1):
256... pass
257Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000258SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000259
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000260From ast_for_arguments():
261
262>>> def f(x, y=1, z):
263... pass
264Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000265SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000266
267>>> def f(x, None):
268... pass
269Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000270SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000271
272>>> def f(*None):
273... pass
274Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000275SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000276
277>>> def f(**None):
278... pass
279Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000280SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000281
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300282>>> import ast; ast.parse('''
283... def f(
284... *, # type: int
285... a, # type: int
286... ):
287... pass
288... ''', type_comments=True)
289Traceback (most recent call last):
290SyntaxError: bare * has associated type comment
291
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000292
293From ast_for_funcdef():
294
295>>> def None(x):
296... pass
297Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000298SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000299
300
301From ast_for_call():
302
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200303>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000304... return list(it)
305>>> L = range(10)
306>>> f(x for x in L)
307[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
308>>> f(x for x in L, 1)
309Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200310SyntaxError: Generator expression must be parenthesized
311>>> f(x for x in L, y=1)
312Traceback (most recent call last):
313SyntaxError: Generator expression must be parenthesized
314>>> f(x for x in L, *[])
315Traceback (most recent call last):
316SyntaxError: Generator expression must be parenthesized
317>>> f(x for x in L, **{})
318Traceback (most recent call last):
319SyntaxError: Generator expression must be parenthesized
Lysandros Nikolaouae145832020-05-22 03:56:52 +0300320>>> f(L, x for x in L)
321Traceback (most recent call last):
322SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400323>>> f(x for x in L, y for y in L)
324Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200325SyntaxError: Generator expression must be parenthesized
326>>> f(x for x in L,)
327Traceback (most recent call last):
328SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000329>>> f((x for x in L), 1)
330[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200331>>> class C(x for x in L):
332... pass
333Traceback (most recent call last):
334SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000335
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200336>>> def g(*args, **kwargs):
337... print(args, sorted(kwargs.items()))
338>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
339... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
340... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
341... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
342... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
343... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
344... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
345... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
346... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
347... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
348... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
349... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
350... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
351... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
352... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
353... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
354... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
355... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
356... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
357... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
358(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000359
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200360>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
361... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
362... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
363... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
364... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
365... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
366... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
367... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
368... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
369... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
370... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
371... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
372... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
373... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
374... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
375... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
376... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
377... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
378... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
379... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
380... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
381... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
382... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
383... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
384... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
385... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
386... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
387... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
388... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
389... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
390... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
391... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
392... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
393... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
394... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
395... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
396... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
397... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
398... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
399... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
400... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
401... # doctest: +ELLIPSIS
402() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403
Yury Selivanovf2392132016-12-13 19:03:51 -0500404>>> class C:
405... def meth(self, *args):
406... return args
407>>> obj = C()
408>>> obj.meth(
409... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
410... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
411... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
412... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
413... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
414... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
415... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
416... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
417... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
418... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
419... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
420... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
421... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
422... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
423... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
424... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
425... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
426... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
427... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
428... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
429(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
430
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100431# >>> f(lambda x: x[0] = 3)
432# Traceback (most recent call last):
433# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434
435The grammar accepts any test (basically, any expression) in the
436keyword slot of a call site. Test a few different options.
437
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100438# >>> f(x()=2)
439# Traceback (most recent call last):
440# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
441# >>> f(a or b=1)
442# Traceback (most recent call last):
443# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
444# >>> f(x.y=1)
445# Traceback (most recent call last):
446# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
447# >>> f((x)=2)
448# Traceback (most recent call last):
449# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
450# >>> f(True=2)
451# Traceback (most recent call last):
452# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200453>>> f(__debug__=1)
454Traceback (most recent call last):
455SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100456>>> __debug__: int
457Traceback (most recent call last):
458SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459
460
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000461More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462
463>>> (x for x in x) += 1
464Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100465SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000466>>> None += 1
467Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100468SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200469>>> __debug__ += 1
470Traceback (most recent call last):
471SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472>>> f() += 1
473Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100474SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000475
476
477Test continue in finally in weird combinations.
478
Ezio Melotti13925002011-03-16 11:05:33 +0200479continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480
481 >>> def test():
482 ... try:
483 ... pass
484 ... finally:
485 ... for abc in range(10):
486 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000487 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488 >>> test()
489 9
490
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200491continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000492
493 >>> def test():
494 ... for abc in range(10):
495 ... try:
496 ... pass
497 ... finally:
498 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200499 ... print(abc)
500 >>> test()
501 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000502
503 >>> def test():
504 ... for abc in range(10):
505 ... try:
506 ... pass
507 ... finally:
508 ... try:
509 ... continue
510 ... except:
511 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200512 ... print(abc)
513 >>> test()
514 9
515
516 >>> def test():
517 ... for abc in range(10):
518 ... try:
519 ... pass
520 ... finally:
521 ... try:
522 ... pass
523 ... except:
524 ... continue
525 ... print(abc)
526 >>> test()
527 9
528
529A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000530
531 >>> def foo():
532 ... try:
533 ... pass
534 ... finally:
535 ... continue
536 Traceback (most recent call last):
537 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200538 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000539
540There is one test for a break that is not in a loop. The compiler
541uses a single data structure to keep track of try-finally and loops,
542so we need to be sure that a break is actually inside a loop. If it
543isn't, there should be a syntax error.
544
545 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000546 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000547 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000548 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000550 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 Traceback (most recent call last):
552 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000553 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000554
Benjamin Petersone09ed542016-07-14 22:00:03 -0700555This raises a SyntaxError, it used to raise a SystemError.
556Context for this change can be found on issue #27514
557
Thomas Wouters89f507f2006-12-13 04:49:30 +0000558In 2.5 there was a missing exception and an assert was triggered in a debug
559build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
560
561 >>> while 1:
562 ... while 2:
563 ... while 3:
564 ... while 4:
565 ... while 5:
566 ... while 6:
567 ... while 8:
568 ... while 9:
569 ... while 10:
570 ... while 11:
571 ... while 12:
572 ... while 13:
573 ... while 14:
574 ... while 15:
575 ... while 16:
576 ... while 17:
577 ... while 18:
578 ... while 19:
579 ... while 20:
580 ... while 21:
581 ... while 22:
582 ... break
583 Traceback (most recent call last):
584 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700585 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586
Guido van Rossum6cff8742016-09-09 09:36:26 -0700587Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
588
589 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200590 ... print(x)
591 ... global x
592 Traceback (most recent call last):
593 ...
594 SyntaxError: name 'x' is used prior to global declaration
595
596 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700597 ... x = 1
598 ... global x
599 Traceback (most recent call last):
600 ...
601 SyntaxError: name 'x' is assigned to before global declaration
602
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200603 >>> def f(x):
604 ... global x
605 Traceback (most recent call last):
606 ...
607 SyntaxError: name 'x' is parameter and global
608
Guido van Rossum6cff8742016-09-09 09:36:26 -0700609 >>> def f():
610 ... x = 1
611 ... def g():
612 ... print(x)
613 ... nonlocal x
614 Traceback (most recent call last):
615 ...
616 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000617
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300618 >>> def f():
619 ... x = 1
620 ... def g():
621 ... x = 2
622 ... nonlocal x
623 Traceback (most recent call last):
624 ...
625 SyntaxError: name 'x' is assigned to before nonlocal declaration
626
Jeremy Hylton81e95022007-02-27 06:50:52 +0000627 >>> def f(x):
628 ... nonlocal x
629 Traceback (most recent call last):
630 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000631 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000632
Jeremy Hylton81e95022007-02-27 06:50:52 +0000633 >>> def f():
634 ... global x
635 ... nonlocal x
636 Traceback (most recent call last):
637 ...
638 SyntaxError: name 'x' is nonlocal and global
639
640 >>> def f():
641 ... nonlocal x
642 Traceback (most recent call last):
643 ...
644 SyntaxError: no binding for nonlocal 'x' found
645
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000646From SF bug #1705365
647 >>> nonlocal x
648 Traceback (most recent call last):
649 ...
650 SyntaxError: nonlocal declaration not allowed at module level
651
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300652From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600653 >>> class A:
654 ... def f(self):
655 ... nonlocal __x
656 Traceback (most recent call last):
657 ...
658 SyntaxError: no binding for nonlocal '_A__x' found
659
Guido van Rossumd8faa362007-04-27 19:54:29 +0000660
661This tests assignment-context; there was a bug in Python 2.5 where compiling
662a complex 'if' (one with 'elif') would fail to notice an invalid suite,
663leading to spurious errors.
664
665 >>> if 1:
666 ... x() = 1
667 ... elif 1:
668 ... pass
669 Traceback (most recent call last):
670 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200671 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000672
673 >>> if 1:
674 ... pass
675 ... elif 1:
676 ... x() = 1
677 Traceback (most recent call last):
678 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200679 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680
681 >>> if 1:
682 ... x() = 1
683 ... elif 1:
684 ... pass
685 ... else:
686 ... pass
687 Traceback (most recent call last):
688 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200689 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000690
691 >>> if 1:
692 ... pass
693 ... elif 1:
694 ... x() = 1
695 ... else:
696 ... pass
697 Traceback (most recent call last):
698 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200699 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000700
701 >>> if 1:
702 ... pass
703 ... elif 1:
704 ... pass
705 ... else:
706 ... x() = 1
707 Traceback (most recent call last):
708 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200709 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000710
Collin Winter828f04a2007-08-31 00:04:24 +0000711Make sure that the old "raise X, Y[, Z]" form is gone:
712 >>> raise X, Y
713 Traceback (most recent call last):
714 ...
715 SyntaxError: invalid syntax
716 >>> raise X, Y, Z
717 Traceback (most recent call last):
718 ...
719 SyntaxError: invalid syntax
720
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000721
722>>> f(a=23, a=234)
723Traceback (most recent call last):
724 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100725SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000726
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000727>>> {1, 2, 3} = 42
728Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200729SyntaxError: cannot assign to set display
730
731>>> {1: 2, 3: 4} = 42
732Traceback (most recent call last):
733SyntaxError: cannot assign to dict display
734
735>>> f'{x}' = 42
736Traceback (most recent call last):
737SyntaxError: cannot assign to f-string expression
738
739>>> f'{x}-{y}' = 42
740Traceback (most recent call last):
741SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000742
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +0300743>>> from t import x,
744Traceback (most recent call last):
745SyntaxError: trailing comma not allowed without surrounding parentheses
746
747>>> from t import x,y,
748Traceback (most recent call last):
749SyntaxError: trailing comma not allowed without surrounding parentheses
750
Batuhan Taskayac8f29ad2020-06-27 21:33:08 +0300751>>> (): int
752Traceback (most recent call last):
753SyntaxError: only single target (not tuple) can be annotated
754>>> []: int
755Traceback (most recent call last):
756SyntaxError: only single target (not list) can be annotated
757>>> (()): int
758Traceback (most recent call last):
759SyntaxError: only single target (not tuple) can be annotated
760>>> ([]): int
761Traceback (most recent call last):
762SyntaxError: only single target (not list) can be annotated
763
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000764Corner-cases that used to fail to raise the correct error:
765
766 >>> def f(*, x=lambda __debug__:0): pass
767 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200768 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000769
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300770 >>> with (lambda *:0): pass
771 Traceback (most recent call last):
772 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000773
774Corner-cases that used to crash:
775
776 >>> def f(**__debug__): pass
777 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200778 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000779
780 >>> def f(*xx, __debug__): pass
781 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200782 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000783
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300784 >>> import ä £
785 Traceback (most recent call last):
786 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000787"""
788
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000789import re
790import unittest
791
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000792from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000793
794class SyntaxTestCase(unittest.TestCase):
795
796 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200797 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000798 """Check that compiling code raises SyntaxError with errtext.
799
800 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000801 test of the exception raised. If subclass is specified it
802 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000803 """
804 try:
805 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000806 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000807 if subclass and not isinstance(err, subclass):
808 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000809 mo = re.search(errtext, str(err))
810 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700811 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200812 self.assertEqual(err.filename, filename)
813 if lineno is not None:
814 self.assertEqual(err.lineno, lineno)
815 if offset is not None:
816 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000817 else:
818 self.fail("compile() did not raise SyntaxError")
819
Pablo Galindo43c4fb62020-12-13 16:46:48 +0000820 def test_expression_with_assignment(self):
821 self._check_error(
822 "print(end1 + end2 = ' ')",
823 'expression cannot contain assignment, perhaps you meant "=="?',
824 offset=19
825 )
826
Lysandros Nikolaou15acc4e2020-10-27 20:54:20 +0200827 def test_curly_brace_after_primary_raises_immediately(self):
828 self._check_error("f{", "invalid syntax", mode="single")
829
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000830 def test_assign_call(self):
831 self._check_error("f() = 1", "assign")
832
833 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700834 self._check_error("del (,)", "invalid syntax")
835 self._check_error("del 1", "delete literal")
836 self._check_error("del (1, 2)", "delete literal")
837 self._check_error("del None", "delete None")
838 self._check_error("del *x", "delete starred")
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300839 self._check_error("del (*x)", "use starred expression")
Shantanu27c0d9b2020-05-11 14:53:58 -0700840 self._check_error("del (*x,)", "delete starred")
841 self._check_error("del [*x,]", "delete starred")
842 self._check_error("del f()", "delete function call")
843 self._check_error("del f(a, b)", "delete function call")
844 self._check_error("del o.f()", "delete function call")
845 self._check_error("del a[0]()", "delete function call")
846 self._check_error("del x, f()", "delete function call")
847 self._check_error("del f(), x", "delete function call")
848 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
849 self._check_error("del (a if True else b)", "delete conditional")
850 self._check_error("del +a", "delete operator")
851 self._check_error("del a, +b", "delete operator")
852 self._check_error("del a + b", "delete operator")
853 self._check_error("del (a + b, c)", "delete operator")
854 self._check_error("del (c[0], a + b)", "delete operator")
855 self._check_error("del a.b.c + 2", "delete operator")
856 self._check_error("del a.b.c[0] + 2", "delete operator")
857 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
858 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
859 self._check_error("del (a := 5)", "delete named expression")
860 # We don't have a special message for this, but make sure we don't
861 # report "cannot delete name"
862 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000863
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200864 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000865 source = """if 1:
866 def error(a):
867 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200868 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000869 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200870 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000871 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200872 self._check_error(source, "parameter and global", lineno=3)
873
874 def test_nonlocal_param_err_first(self):
875 source = """if 1:
876 def error(a):
877 nonlocal a # SyntaxError
878 def error2():
879 b = 1
880 global b # SyntaxError
881 """
882 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000883
Neal Norwitzfcf44352005-11-27 20:37:43 +0000884 def test_break_outside_loop(self):
885 self._check_error("break", "outside loop")
886
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100887 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100888 self._check_error("if 0: yield", "outside function")
889 self._check_error("if 0: yield\nelse: x=1", "outside function")
890 self._check_error("if 1: pass\nelse: yield", "outside function")
891 self._check_error("while 0: yield", "outside function")
892 self._check_error("while 0: yield\nelse: x=1", "outside function")
893 self._check_error("class C:\n if 0: yield", "outside function")
894 self._check_error("class C:\n if 1: pass\n else: yield",
895 "outside function")
896 self._check_error("class C:\n while 0: yield", "outside function")
897 self._check_error("class C:\n while 0: yield\n else: x = 1",
898 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100899
900 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100901 self._check_error("if 0: return", "outside function")
902 self._check_error("if 0: return\nelse: x=1", "outside function")
903 self._check_error("if 1: pass\nelse: return", "outside function")
904 self._check_error("while 0: return", "outside function")
905 self._check_error("class C:\n if 0: return", "outside function")
906 self._check_error("class C:\n while 0: return", "outside function")
907 self._check_error("class C:\n while 0: return\n else: x=1",
908 "outside function")
909 self._check_error("class C:\n if 0: return\n else: x= 1",
910 "outside function")
911 self._check_error("class C:\n if 1: pass\n else: return",
912 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100913
914 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100915 self._check_error("if 0: break", "outside loop")
916 self._check_error("if 0: break\nelse: x=1", "outside loop")
917 self._check_error("if 1: pass\nelse: break", "outside loop")
918 self._check_error("class C:\n if 0: break", "outside loop")
919 self._check_error("class C:\n if 1: pass\n else: break",
920 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100921
922 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100923 self._check_error("if 0: continue", "not properly in loop")
924 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
925 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
926 self._check_error("class C:\n if 0: continue", "not properly in loop")
927 self._check_error("class C:\n if 1: pass\n else: continue",
928 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100929
Thomas Wouters477c8d52006-05-27 19:21:47 +0000930 def test_unexpected_indent(self):
931 self._check_error("foo()\n bar()\n", "unexpected indent",
932 subclass=IndentationError)
933
934 def test_no_indent(self):
935 self._check_error("if 1:\nfoo()", "expected an indented block",
936 subclass=IndentationError)
937
938 def test_bad_outdent(self):
939 self._check_error("if 1:\n foo()\n bar()",
940 "unindent does not match .* level",
941 subclass=IndentationError)
942
943 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400944 self._check_error("int(base=10, '2')",
945 "positional argument follows keyword argument")
946
947 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200948 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400949 "positional argument follows "
950 "keyword argument unpacking")
951
952 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200953 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400954 "iterable argument unpacking follows "
955 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000956
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +0300957 def test_empty_line_after_linecont(self):
958 # See issue-40847
959 s = r"""\
960pass
961 \
962
963pass
964"""
965 try:
966 compile(s, '<string>', 'exec')
967 except SyntaxError:
968 self.fail("Empty line after a line continuation character is valid.")
969
Mark Shannon02d126a2020-09-25 14:04:19 +0100970 @support.cpython_only
971 def test_nested_named_except_blocks(self):
972 code = ""
973 for i in range(12):
974 code += f"{' '*i}try:\n"
975 code += f"{' '*(i+1)}raise Exception\n"
976 code += f"{' '*i}except Exception as e:\n"
977 code += f"{' '*4*12}pass"
978 self._check_error(code, "too many statically nested blocks")
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +0300979
Pablo Galindo06f8c332020-10-30 23:48:42 +0000980 def test_barry_as_flufl_with_syntax_errors(self):
981 # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if
982 # is reading the wrong token in the presence of syntax errors later
983 # in the file. See bpo-42214 for more information.
984 code = """
985def func1():
986 if a != b:
987 raise ValueError
988
989def func2():
990 try
991 return 1
992 finally:
993 pass
994"""
995 self._check_error(code, "invalid syntax")
996
Lysandros Nikolaou02cdfc92020-10-31 20:31:41 +0200997 def test_invalid_line_continuation_left_recursive(self):
998 # Check bpo-42218: SyntaxErrors following left-recursive rules
999 # (t_primary_raw in this case) need to be tested explicitly
1000 self._check_error("A.\u018a\\ ",
1001 "unexpected character after line continuation character")
1002 self._check_error("A.\u03bc\\\n",
1003 "unexpected EOF while parsing")
1004
Pablo Galindod6d63712021-01-19 23:59:33 +00001005 def test_error_parenthesis(self):
1006 for paren in "([{":
1007 self._check_error(paren + "1 + 2", f"\\{paren}' was never closed")
1008
1009 for paren in ")]}":
1010 self._check_error(paren + "1 + 2", f"unmatched '\\{paren}'")
1011
1012
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001013def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001014 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001015 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001016 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001017
1018if __name__ == "__main__":
1019 test_main()