blob: 6068dd9fc09e8ed383487634d9162e8b4b8800b2 [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):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000232SyntaxError: expected ':'
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300233
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):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000334SyntaxError: expected ':'
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
Pablo Galindo58fb1562021-02-02 19:54:22 +0000711 Missing ':' before suites:
712
713 >>> def f()
714 ... pass
715 Traceback (most recent call last):
716 SyntaxError: expected ':'
717
718 >>> class A
719 ... pass
720 Traceback (most recent call last):
721 SyntaxError: expected ':'
722
723 >>> if 1
724 ... pass
725 ... elif 1:
726 ... pass
727 ... else:
728 ... x() = 1
729 Traceback (most recent call last):
730 SyntaxError: expected ':'
731
732 >>> if 1:
733 ... pass
734 ... elif 1
735 ... pass
736 ... else:
737 ... x() = 1
738 Traceback (most recent call last):
739 SyntaxError: expected ':'
740
741 >>> if 1:
742 ... pass
743 ... elif 1:
744 ... pass
745 ... else
746 ... x() = 1
747 Traceback (most recent call last):
748 SyntaxError: expected ':'
749
750 >>> for x in range(10)
751 ... pass
752 Traceback (most recent call last):
753 SyntaxError: expected ':'
754
755 >>> while True
756 ... pass
757 Traceback (most recent call last):
758 SyntaxError: expected ':'
759
760 >>> with blech as something
761 ... pass
762 Traceback (most recent call last):
763 SyntaxError: expected ':'
764
765 >>> with blech
766 ... pass
767 Traceback (most recent call last):
768 SyntaxError: expected ':'
769
770 >>> with blech, block as something
771 ... pass
772 Traceback (most recent call last):
773 SyntaxError: expected ':'
774
775 >>> with blech, block as something, bluch
776 ... pass
777 Traceback (most recent call last):
778 SyntaxError: expected ':'
779
780 >>> with (blech as something)
781 ... pass
782 Traceback (most recent call last):
783 SyntaxError: expected ':'
784
785 >>> with (blech)
786 ... pass
787 Traceback (most recent call last):
788 SyntaxError: expected ':'
789
790 >>> with (blech, block as something)
791 ... pass
792 Traceback (most recent call last):
793 SyntaxError: expected ':'
794
795 >>> with (blech, block as something, bluch)
796 ... pass
797 Traceback (most recent call last):
798 SyntaxError: expected ':'
799
800 >>> try
801 ... pass
802 Traceback (most recent call last):
803 SyntaxError: expected ':'
804
805 >>> try:
806 ... pass
807 ... except
808 ... pass
809 Traceback (most recent call last):
810 SyntaxError: expected ':'
811
Collin Winter828f04a2007-08-31 00:04:24 +0000812Make sure that the old "raise X, Y[, Z]" form is gone:
813 >>> raise X, Y
814 Traceback (most recent call last):
815 ...
816 SyntaxError: invalid syntax
817 >>> raise X, Y, Z
818 Traceback (most recent call last):
819 ...
820 SyntaxError: invalid syntax
821
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000822
823>>> f(a=23, a=234)
824Traceback (most recent call last):
825 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100826SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000827
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000828>>> {1, 2, 3} = 42
829Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200830SyntaxError: cannot assign to set display
831
832>>> {1: 2, 3: 4} = 42
833Traceback (most recent call last):
834SyntaxError: cannot assign to dict display
835
836>>> f'{x}' = 42
837Traceback (most recent call last):
838SyntaxError: cannot assign to f-string expression
839
840>>> f'{x}-{y}' = 42
841Traceback (most recent call last):
842SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000843
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +0300844>>> from t import x,
845Traceback (most recent call last):
846SyntaxError: trailing comma not allowed without surrounding parentheses
847
848>>> from t import x,y,
849Traceback (most recent call last):
850SyntaxError: trailing comma not allowed without surrounding parentheses
851
Batuhan Taskayac8f29ad2020-06-27 21:33:08 +0300852>>> (): int
853Traceback (most recent call last):
854SyntaxError: only single target (not tuple) can be annotated
855>>> []: int
856Traceback (most recent call last):
857SyntaxError: only single target (not list) can be annotated
858>>> (()): int
859Traceback (most recent call last):
860SyntaxError: only single target (not tuple) can be annotated
861>>> ([]): int
862Traceback (most recent call last):
863SyntaxError: only single target (not list) can be annotated
864
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000865Corner-cases that used to fail to raise the correct error:
866
867 >>> def f(*, x=lambda __debug__:0): pass
868 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200869 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000870
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300871 >>> with (lambda *:0): pass
872 Traceback (most recent call last):
873 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000874
875Corner-cases that used to crash:
876
877 >>> def f(**__debug__): pass
878 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200879 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000880
881 >>> def f(*xx, __debug__): pass
882 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200883 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000884
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300885 >>> import ä £
886 Traceback (most recent call last):
887 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888"""
889
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000890import re
891import unittest
892
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000893from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000894
895class SyntaxTestCase(unittest.TestCase):
896
897 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200898 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000899 """Check that compiling code raises SyntaxError with errtext.
900
901 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902 test of the exception raised. If subclass is specified it
903 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000904 """
905 try:
906 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000907 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000908 if subclass and not isinstance(err, subclass):
909 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000910 mo = re.search(errtext, str(err))
911 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700912 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200913 self.assertEqual(err.filename, filename)
914 if lineno is not None:
915 self.assertEqual(err.lineno, lineno)
916 if offset is not None:
917 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000918 else:
919 self.fail("compile() did not raise SyntaxError")
920
Pablo Galindo43c4fb62020-12-13 16:46:48 +0000921 def test_expression_with_assignment(self):
922 self._check_error(
923 "print(end1 + end2 = ' ')",
924 'expression cannot contain assignment, perhaps you meant "=="?',
925 offset=19
926 )
927
Lysandros Nikolaou15acc4e2020-10-27 20:54:20 +0200928 def test_curly_brace_after_primary_raises_immediately(self):
929 self._check_error("f{", "invalid syntax", mode="single")
930
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000931 def test_assign_call(self):
932 self._check_error("f() = 1", "assign")
933
934 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700935 self._check_error("del (,)", "invalid syntax")
936 self._check_error("del 1", "delete literal")
937 self._check_error("del (1, 2)", "delete literal")
938 self._check_error("del None", "delete None")
939 self._check_error("del *x", "delete starred")
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300940 self._check_error("del (*x)", "use starred expression")
Shantanu27c0d9b2020-05-11 14:53:58 -0700941 self._check_error("del (*x,)", "delete starred")
942 self._check_error("del [*x,]", "delete starred")
943 self._check_error("del f()", "delete function call")
944 self._check_error("del f(a, b)", "delete function call")
945 self._check_error("del o.f()", "delete function call")
946 self._check_error("del a[0]()", "delete function call")
947 self._check_error("del x, f()", "delete function call")
948 self._check_error("del f(), x", "delete function call")
949 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
950 self._check_error("del (a if True else b)", "delete conditional")
951 self._check_error("del +a", "delete operator")
952 self._check_error("del a, +b", "delete operator")
953 self._check_error("del a + b", "delete operator")
954 self._check_error("del (a + b, c)", "delete operator")
955 self._check_error("del (c[0], a + b)", "delete operator")
956 self._check_error("del a.b.c + 2", "delete operator")
957 self._check_error("del a.b.c[0] + 2", "delete operator")
958 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
959 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
960 self._check_error("del (a := 5)", "delete named expression")
961 # We don't have a special message for this, but make sure we don't
962 # report "cannot delete name"
963 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000964
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200965 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000966 source = """if 1:
967 def error(a):
968 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200969 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000970 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200971 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000972 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200973 self._check_error(source, "parameter and global", lineno=3)
974
975 def test_nonlocal_param_err_first(self):
976 source = """if 1:
977 def error(a):
978 nonlocal a # SyntaxError
979 def error2():
980 b = 1
981 global b # SyntaxError
982 """
983 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000984
Neal Norwitzfcf44352005-11-27 20:37:43 +0000985 def test_break_outside_loop(self):
986 self._check_error("break", "outside loop")
987
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100988 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100989 self._check_error("if 0: yield", "outside function")
990 self._check_error("if 0: yield\nelse: x=1", "outside function")
991 self._check_error("if 1: pass\nelse: yield", "outside function")
992 self._check_error("while 0: yield", "outside function")
993 self._check_error("while 0: yield\nelse: x=1", "outside function")
994 self._check_error("class C:\n if 0: yield", "outside function")
995 self._check_error("class C:\n if 1: pass\n else: yield",
996 "outside function")
997 self._check_error("class C:\n while 0: yield", "outside function")
998 self._check_error("class C:\n while 0: yield\n else: x = 1",
999 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001000
1001 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001002 self._check_error("if 0: return", "outside function")
1003 self._check_error("if 0: return\nelse: x=1", "outside function")
1004 self._check_error("if 1: pass\nelse: return", "outside function")
1005 self._check_error("while 0: return", "outside function")
1006 self._check_error("class C:\n if 0: return", "outside function")
1007 self._check_error("class C:\n while 0: return", "outside function")
1008 self._check_error("class C:\n while 0: return\n else: x=1",
1009 "outside function")
1010 self._check_error("class C:\n if 0: return\n else: x= 1",
1011 "outside function")
1012 self._check_error("class C:\n if 1: pass\n else: return",
1013 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001014
1015 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001016 self._check_error("if 0: break", "outside loop")
1017 self._check_error("if 0: break\nelse: x=1", "outside loop")
1018 self._check_error("if 1: pass\nelse: break", "outside loop")
1019 self._check_error("class C:\n if 0: break", "outside loop")
1020 self._check_error("class C:\n if 1: pass\n else: break",
1021 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001022
1023 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001024 self._check_error("if 0: continue", "not properly in loop")
1025 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
1026 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
1027 self._check_error("class C:\n if 0: continue", "not properly in loop")
1028 self._check_error("class C:\n if 1: pass\n else: continue",
1029 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001030
Thomas Wouters477c8d52006-05-27 19:21:47 +00001031 def test_unexpected_indent(self):
1032 self._check_error("foo()\n bar()\n", "unexpected indent",
1033 subclass=IndentationError)
1034
1035 def test_no_indent(self):
1036 self._check_error("if 1:\nfoo()", "expected an indented block",
1037 subclass=IndentationError)
1038
1039 def test_bad_outdent(self):
1040 self._check_error("if 1:\n foo()\n bar()",
1041 "unindent does not match .* level",
1042 subclass=IndentationError)
1043
1044 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001045 self._check_error("int(base=10, '2')",
1046 "positional argument follows keyword argument")
1047
1048 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001049 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001050 "positional argument follows "
1051 "keyword argument unpacking")
1052
1053 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001054 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001055 "iterable argument unpacking follows "
1056 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +00001057
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001058 def test_empty_line_after_linecont(self):
1059 # See issue-40847
1060 s = r"""\
1061pass
1062 \
1063
1064pass
1065"""
1066 try:
1067 compile(s, '<string>', 'exec')
1068 except SyntaxError:
1069 self.fail("Empty line after a line continuation character is valid.")
1070
Mark Shannon02d126a2020-09-25 14:04:19 +01001071 @support.cpython_only
1072 def test_nested_named_except_blocks(self):
1073 code = ""
1074 for i in range(12):
1075 code += f"{' '*i}try:\n"
1076 code += f"{' '*(i+1)}raise Exception\n"
1077 code += f"{' '*i}except Exception as e:\n"
1078 code += f"{' '*4*12}pass"
1079 self._check_error(code, "too many statically nested blocks")
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001080
Pablo Galindo06f8c332020-10-30 23:48:42 +00001081 def test_barry_as_flufl_with_syntax_errors(self):
1082 # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if
1083 # is reading the wrong token in the presence of syntax errors later
1084 # in the file. See bpo-42214 for more information.
1085 code = """
1086def func1():
1087 if a != b:
1088 raise ValueError
1089
1090def func2():
1091 try
1092 return 1
1093 finally:
1094 pass
1095"""
Pablo Galindo58fb1562021-02-02 19:54:22 +00001096 self._check_error(code, "expected ':'")
Pablo Galindo06f8c332020-10-30 23:48:42 +00001097
Lysandros Nikolaou02cdfc92020-10-31 20:31:41 +02001098 def test_invalid_line_continuation_left_recursive(self):
1099 # Check bpo-42218: SyntaxErrors following left-recursive rules
1100 # (t_primary_raw in this case) need to be tested explicitly
1101 self._check_error("A.\u018a\\ ",
1102 "unexpected character after line continuation character")
1103 self._check_error("A.\u03bc\\\n",
1104 "unexpected EOF while parsing")
1105
Pablo Galindod6d63712021-01-19 23:59:33 +00001106 def test_error_parenthesis(self):
1107 for paren in "([{":
1108 self._check_error(paren + "1 + 2", f"\\{paren}' was never closed")
1109
1110 for paren in ")]}":
1111 self._check_error(paren + "1 + 2", f"unmatched '\\{paren}'")
1112
1113
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001114def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001115 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001116 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001117 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001118
1119if __name__ == "__main__":
1120 test_main()