blob: b5bebb3d0bdfa103d5e5609fc53240bfbe99cdf8 [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
Dong-hee Na32c1caa2021-08-26 09:52:21 +000062>>> del __debug__
63Traceback (most recent call last):
64SyntaxError: cannot delete __debug__
65
Jeremy Hyltonc960f262006-01-27 15:18:39 +000066>>> f() = 1
67Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010068SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000069
Pablo Galindo9f495902020-06-08 02:57:00 +010070>>> yield = 1
71Traceback (most recent call last):
72SyntaxError: assignment to yield expression not possible
73
Shantanu27c0d9b2020-05-11 14:53:58 -070074>>> del f()
75Traceback (most recent call last):
76SyntaxError: cannot delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78>>> a + 1 = 2
79Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010080SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000081
82>>> (x for x in x) = 1
83Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020084SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000085
86>>> 1 = 1
87Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010088SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000089
90>>> "abc" = 1
91Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010092SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000093
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050094>>> b"" = 1
95Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010096SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020097
98>>> ... = 1
99Traceback (most recent call last):
Pablo Galindo3283bf42021-06-03 22:22:28 +0100100SyntaxError: cannot assign to ellipsis here. Maybe you meant '==' instead of '='?
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500101
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000102>>> `1` = 1
103Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +0000104SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000105
106If the left-hand side of an assignment is a list or tuple, an illegal
107expression inside that contain should still cause a syntax error.
108This test just checks a couple of cases rather than enumerating all of
109them.
110
Pablo Galindo16ab0702020-05-15 02:04:52 +0100111>>> (a, "b", c) = (1, 2, 3)
112Traceback (most recent call last):
113SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200114
Pablo Galindo16ab0702020-05-15 02:04:52 +0100115>>> (a, True, c) = (1, 2, 3)
116Traceback (most recent call last):
117SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200118
119>>> (a, __debug__, c) = (1, 2, 3)
120Traceback (most recent call last):
121SyntaxError: cannot assign to __debug__
122
Pablo Galindo16ab0702020-05-15 02:04:52 +0100123>>> (a, *True, c) = (1, 2, 3)
124Traceback (most recent call last):
125SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200126
127>>> (a, *__debug__, c) = (1, 2, 3)
128Traceback (most recent call last):
129SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000130
Pablo Galindo16ab0702020-05-15 02:04:52 +0100131>>> [a, b, c + 1] = [1, 2, 3]
132Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100133SyntaxError: cannot assign to expression
Pablo Galindo16ab0702020-05-15 02:04:52 +0100134
135>>> [a, b[1], c + 1] = [1, 2, 3]
136Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100137SyntaxError: cannot assign to expression
Pablo Galindo16ab0702020-05-15 02:04:52 +0100138
139>>> [a, b.c.d, c + 1] = [1, 2, 3]
140Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100141SyntaxError: cannot assign to expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000142
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143>>> a if 1 else b = 1
144Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200145SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000146
Miss Islington (bot)56717622021-08-02 12:05:33 -0700147>>> a = 42 if True
148Traceback (most recent call last):
149SyntaxError: expected 'else' after 'if' expression
150
151>>> a = (42 if True)
152Traceback (most recent call last):
153SyntaxError: expected 'else' after 'if' expression
154
155>>> a = [1, 42 if True, 4]
156Traceback (most recent call last):
157SyntaxError: expected 'else' after 'if' expression
158
Pablo Galindo Salgadob1bd16c2021-08-05 19:00:19 +0100159>>> if True:
160... print("Hello"
161...
162... if 2:
163... print(123))
164Traceback (most recent call last):
165SyntaxError: invalid syntax
166
Pablo Galindo9f495902020-06-08 02:57:00 +0100167>>> True = True = 3
168Traceback (most recent call last):
169SyntaxError: cannot assign to True
170
171>>> x = y = True = z = 3
172Traceback (most recent call last):
173SyntaxError: cannot assign to True
174
175>>> x = y = yield = 1
176Traceback (most recent call last):
177SyntaxError: assignment to yield expression not possible
178
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300179>>> a, b += 1, 2
180Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100181SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300182
183>>> (a, b) += 1, 2
184Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100185SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300186
187>>> [a, b] += 1, 2
188Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100189SyntaxError: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300190
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300191Invalid targets in `for` loops and `with` statements should also
192produce a specialized error message
193
194>>> for a() in b: pass
195Traceback (most recent call last):
196SyntaxError: cannot assign to function call
197
198>>> for (a, b()) in b: pass
199Traceback (most recent call last):
200SyntaxError: cannot assign to function call
201
202>>> for [a, b()] in b: pass
203Traceback (most recent call last):
204SyntaxError: cannot assign to function call
205
206>>> for (*a, b, c+1) in b: pass
207Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100208SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300209
210>>> for (x, *(y, z.d())) in b: pass
211Traceback (most recent call last):
212SyntaxError: cannot assign to function call
213
214>>> for a, b() in c: pass
215Traceback (most recent call last):
216SyntaxError: cannot assign to function call
217
218>>> for a, b, (c + 1, d()): pass
219Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100220SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300221
222>>> for i < (): pass
223Traceback (most recent call last):
224SyntaxError: invalid syntax
225
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300226>>> for a, b
227Traceback (most recent call last):
228SyntaxError: invalid syntax
229
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300230>>> with a as b(): pass
231Traceback (most recent call last):
232SyntaxError: cannot assign to function call
233
234>>> with a as (b, c()): pass
235Traceback (most recent call last):
236SyntaxError: cannot assign to function call
237
238>>> with a as [b, c()]: pass
239Traceback (most recent call last):
240SyntaxError: cannot assign to function call
241
242>>> with a as (*b, c, d+1): pass
243Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100244SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300245
246>>> with a as (x, *(y, z.d())): pass
247Traceback (most recent call last):
248SyntaxError: cannot assign to function call
249
250>>> with a as b, c as d(): pass
251Traceback (most recent call last):
252SyntaxError: cannot assign to function call
253
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300254>>> with a as b
255Traceback (most recent call last):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000256SyntaxError: expected ':'
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300257
Pablo Galindo9f495902020-06-08 02:57:00 +0100258>>> p = p =
259Traceback (most recent call last):
260SyntaxError: invalid syntax
261
Pablo Galindo835f14f2021-01-31 22:52:56 +0000262Comprehensions creating tuples without parentheses
263should produce a specialized error message:
264
265>>> [x,y for x,y in range(100)]
266Traceback (most recent call last):
267SyntaxError: did you forget parentheses around the comprehension target?
268
269>>> {x,y for x,y in range(100)}
270Traceback (most recent call last):
271SyntaxError: did you forget parentheses around the comprehension target?
272
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000273# Missing commas in literals collections should not
274# produce special error messages regarding missing
Pablo Galindob2802482021-04-15 21:38:45 +0100275# parentheses, but about missing commas instead
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000276
277>>> [1, 2 3]
Pablo Galindo835f14f2021-01-31 22:52:56 +0000278Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100279SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000280
281>>> {1, 2 3}
282Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100283SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000284
285>>> {1:2, 2:5 3:12}
286Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100287SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000288
289>>> (1, 2 3)
290Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100291SyntaxError: invalid syntax. Perhaps you forgot a comma?
292
293# Make sure soft keywords constructs don't raise specialized
Miss Islington (bot)f807a4f2021-06-09 14:45:43 -0700294# errors regarding missing commas or other spezialiced errors
Pablo Galindob2802482021-04-15 21:38:45 +0100295
296>>> match x:
297... y = 3
298Traceback (most recent call last):
299SyntaxError: invalid syntax
300
301>>> match x:
302... case y:
303... 3 $ 3
304Traceback (most recent call last):
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000305SyntaxError: invalid syntax
Pablo Galindo835f14f2021-01-31 22:52:56 +0000306
Miss Islington (bot)f807a4f2021-06-09 14:45:43 -0700307>>> match x:
308... case $:
309... ...
310Traceback (most recent call last):
311SyntaxError: invalid syntax
312
313>>> match ...:
314... case {**rest, "key": value}:
315... ...
316Traceback (most recent call last):
317SyntaxError: invalid syntax
318
319>>> match ...:
320... case {**_}:
321... ...
322Traceback (most recent call last):
323SyntaxError: invalid syntax
324
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000325From compiler_complex_args():
326
327>>> def f(None=1):
328... pass
329Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000330SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000331
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000332From ast_for_arguments():
333
334>>> def f(x, y=1, z):
335... pass
336Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000337SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000338
339>>> def f(x, None):
340... pass
341Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000342SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343
344>>> def f(*None):
345... pass
346Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000347SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000348
349>>> def f(**None):
350... pass
351Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000352SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000353
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300354>>> import ast; ast.parse('''
355... def f(
356... *, # type: int
357... a, # type: int
358... ):
359... pass
360... ''', type_comments=True)
361Traceback (most recent call last):
362SyntaxError: bare * has associated type comment
363
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000364
365From ast_for_funcdef():
366
367>>> def None(x):
368... pass
369Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000371
372
373From ast_for_call():
374
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200375>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376... return list(it)
377>>> L = range(10)
378>>> f(x for x in L)
379[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
380>>> f(x for x in L, 1)
381Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200382SyntaxError: Generator expression must be parenthesized
383>>> f(x for x in L, y=1)
384Traceback (most recent call last):
385SyntaxError: Generator expression must be parenthesized
386>>> f(x for x in L, *[])
387Traceback (most recent call last):
388SyntaxError: Generator expression must be parenthesized
389>>> f(x for x in L, **{})
390Traceback (most recent call last):
391SyntaxError: Generator expression must be parenthesized
Lysandros Nikolaouae145832020-05-22 03:56:52 +0300392>>> f(L, x for x in L)
393Traceback (most recent call last):
394SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400395>>> f(x for x in L, y for y in L)
396Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200397SyntaxError: Generator expression must be parenthesized
398>>> f(x for x in L,)
399Traceback (most recent call last):
400SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000401>>> f((x for x in L), 1)
402[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200403>>> class C(x for x in L):
404... pass
405Traceback (most recent call last):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000406SyntaxError: expected ':'
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000407
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200408>>> def g(*args, **kwargs):
409... print(args, sorted(kwargs.items()))
410>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
411... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
412... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
413... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
414... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
415... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
416... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
417... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
418... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
419... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
420... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
421... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
422... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
423... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
424... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
425... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
426... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
427... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
428... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
429... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
430(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000431
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200432>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
433... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
434... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
435... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
436... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
437... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
438... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
439... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
440... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
441... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
442... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
443... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
444... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
445... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
446... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
447... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
448... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
449... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
450... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
451... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
452... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
453... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
454... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
455... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
456... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
457... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
458... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
459... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
460... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
461... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
462... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
463... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
464... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
465... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
466... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
467... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
468... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
469... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
470... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
471... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
472... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
473... # doctest: +ELLIPSIS
474() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000475
Yury Selivanovf2392132016-12-13 19:03:51 -0500476>>> class C:
477... def meth(self, *args):
478... return args
479>>> obj = C()
480>>> obj.meth(
481... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
482... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
483... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
484... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
485... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
486... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
487... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
488... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
489... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
490... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
491... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
492... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
493... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
494... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
495... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
496... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
497... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
498... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
499... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
500... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
501(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
502
Miss Islington (bot)ec0699c2021-05-19 11:28:31 -0700503>>> f(lambda x: x[0] = 3)
504Traceback (most recent call last):
505SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
506
507# Check that this error doesn't trigger for names:
508>>> f(a={x: for x in {}})
509Traceback (most recent call last):
510SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000511
512The grammar accepts any test (basically, any expression) in the
513keyword slot of a call site. Test a few different options.
514
Miss Islington (bot)ec0699c2021-05-19 11:28:31 -0700515>>> f(x()=2)
516Traceback (most recent call last):
517SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
518>>> f(a or b=1)
519Traceback (most recent call last):
520SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
521>>> f(x.y=1)
522Traceback (most recent call last):
523SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
524>>> f((x)=2)
525Traceback (most recent call last):
526SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Pablo Galindo Salgado5618c812021-11-16 22:31:16 +0000527>>> f(True=1)
Miss Islington (bot)ec0699c2021-05-19 11:28:31 -0700528Traceback (most recent call last):
Pablo Galindo Salgado5618c812021-11-16 22:31:16 +0000529SyntaxError: cannot assign to True
530>>> f(False=1)
531Traceback (most recent call last):
532SyntaxError: cannot assign to False
533>>> f(None=1)
534Traceback (most recent call last):
535SyntaxError: cannot assign to None
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200536>>> f(__debug__=1)
537Traceback (most recent call last):
538SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100539>>> __debug__: int
540Traceback (most recent call last):
541SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000542
543
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000544More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000545
546>>> (x for x in x) += 1
547Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100548SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000549>>> None += 1
550Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100551SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200552>>> __debug__ += 1
553Traceback (most recent call last):
554SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000555>>> f() += 1
556Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100557SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000558
559
560Test continue in finally in weird combinations.
561
Ezio Melotti13925002011-03-16 11:05:33 +0200562continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000563
564 >>> def test():
565 ... try:
566 ... pass
567 ... finally:
568 ... for abc in range(10):
569 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000570 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 >>> test()
572 9
573
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200574continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575
576 >>> def test():
577 ... for abc in range(10):
578 ... try:
579 ... pass
580 ... finally:
581 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200582 ... print(abc)
583 >>> test()
584 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585
586 >>> def test():
587 ... for abc in range(10):
588 ... try:
589 ... pass
590 ... finally:
591 ... try:
592 ... continue
593 ... except:
594 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200595 ... print(abc)
596 >>> test()
597 9
598
599 >>> def test():
600 ... for abc in range(10):
601 ... try:
602 ... pass
603 ... finally:
604 ... try:
605 ... pass
606 ... except:
607 ... continue
608 ... print(abc)
609 >>> test()
610 9
611
612A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000613
614 >>> def foo():
615 ... try:
616 ... pass
617 ... finally:
618 ... continue
619 Traceback (most recent call last):
620 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200621 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000622
623There is one test for a break that is not in a loop. The compiler
624uses a single data structure to keep track of try-finally and loops,
625so we need to be sure that a break is actually inside a loop. If it
626isn't, there should be a syntax error.
627
628 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000629 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000630 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000631 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000632 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000633 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000634 Traceback (most recent call last):
635 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000636 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000637
Guido van Rossum6cff8742016-09-09 09:36:26 -0700638Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
639
640 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200641 ... print(x)
642 ... global x
643 Traceback (most recent call last):
644 ...
645 SyntaxError: name 'x' is used prior to global declaration
646
647 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700648 ... x = 1
649 ... global x
650 Traceback (most recent call last):
651 ...
652 SyntaxError: name 'x' is assigned to before global declaration
653
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200654 >>> def f(x):
655 ... global x
656 Traceback (most recent call last):
657 ...
658 SyntaxError: name 'x' is parameter and global
659
Guido van Rossum6cff8742016-09-09 09:36:26 -0700660 >>> def f():
661 ... x = 1
662 ... def g():
663 ... print(x)
664 ... nonlocal x
665 Traceback (most recent call last):
666 ...
667 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000668
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300669 >>> def f():
670 ... x = 1
671 ... def g():
672 ... x = 2
673 ... nonlocal x
674 Traceback (most recent call last):
675 ...
676 SyntaxError: name 'x' is assigned to before nonlocal declaration
677
Jeremy Hylton81e95022007-02-27 06:50:52 +0000678 >>> def f(x):
679 ... nonlocal x
680 Traceback (most recent call last):
681 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000682 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000683
Jeremy Hylton81e95022007-02-27 06:50:52 +0000684 >>> def f():
685 ... global x
686 ... nonlocal x
687 Traceback (most recent call last):
688 ...
689 SyntaxError: name 'x' is nonlocal and global
690
691 >>> def f():
692 ... nonlocal x
693 Traceback (most recent call last):
694 ...
695 SyntaxError: no binding for nonlocal 'x' found
696
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000697From SF bug #1705365
698 >>> nonlocal x
699 Traceback (most recent call last):
700 ...
701 SyntaxError: nonlocal declaration not allowed at module level
702
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300703From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600704 >>> class A:
705 ... def f(self):
706 ... nonlocal __x
707 Traceback (most recent call last):
708 ...
709 SyntaxError: no binding for nonlocal '_A__x' found
710
Guido van Rossumd8faa362007-04-27 19:54:29 +0000711
712This tests assignment-context; there was a bug in Python 2.5 where compiling
713a complex 'if' (one with 'elif') would fail to notice an invalid suite,
714leading to spurious errors.
715
716 >>> if 1:
717 ... x() = 1
718 ... elif 1:
719 ... pass
720 Traceback (most recent call last):
721 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100722 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000723
724 >>> if 1:
725 ... pass
726 ... elif 1:
727 ... x() = 1
728 Traceback (most recent call last):
729 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100730 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000731
732 >>> if 1:
733 ... x() = 1
734 ... elif 1:
735 ... pass
736 ... else:
737 ... pass
738 Traceback (most recent call last):
739 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100740 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000741
742 >>> if 1:
743 ... pass
744 ... elif 1:
745 ... x() = 1
746 ... else:
747 ... pass
748 Traceback (most recent call last):
749 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100750 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000751
752 >>> if 1:
753 ... pass
754 ... elif 1:
755 ... pass
756 ... else:
757 ... x() = 1
758 Traceback (most recent call last):
759 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100760 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Jeremy Hylton81e95022007-02-27 06:50:52 +0000761
Pablo Galindo58fb1562021-02-02 19:54:22 +0000762 Missing ':' before suites:
763
764 >>> def f()
765 ... pass
766 Traceback (most recent call last):
767 SyntaxError: expected ':'
768
769 >>> class A
770 ... pass
771 Traceback (most recent call last):
772 SyntaxError: expected ':'
773
774 >>> if 1
775 ... pass
776 ... elif 1:
777 ... pass
778 ... else:
779 ... x() = 1
780 Traceback (most recent call last):
781 SyntaxError: expected ':'
782
783 >>> if 1:
784 ... pass
785 ... elif 1
786 ... pass
787 ... else:
788 ... x() = 1
789 Traceback (most recent call last):
790 SyntaxError: expected ':'
791
792 >>> if 1:
793 ... pass
794 ... elif 1:
795 ... pass
796 ... else
797 ... x() = 1
798 Traceback (most recent call last):
799 SyntaxError: expected ':'
800
801 >>> for x in range(10)
802 ... pass
803 Traceback (most recent call last):
804 SyntaxError: expected ':'
805
806 >>> while True
807 ... pass
808 Traceback (most recent call last):
809 SyntaxError: expected ':'
810
811 >>> with blech as something
812 ... pass
813 Traceback (most recent call last):
814 SyntaxError: expected ':'
815
816 >>> with blech
817 ... pass
818 Traceback (most recent call last):
819 SyntaxError: expected ':'
820
821 >>> with blech, block as something
822 ... pass
823 Traceback (most recent call last):
824 SyntaxError: expected ':'
825
826 >>> with blech, block as something, bluch
827 ... pass
828 Traceback (most recent call last):
829 SyntaxError: expected ':'
830
831 >>> with (blech as something)
832 ... pass
833 Traceback (most recent call last):
834 SyntaxError: expected ':'
835
836 >>> with (blech)
837 ... pass
838 Traceback (most recent call last):
839 SyntaxError: expected ':'
840
841 >>> with (blech, block as something)
842 ... pass
843 Traceback (most recent call last):
844 SyntaxError: expected ':'
845
846 >>> with (blech, block as something, bluch)
847 ... pass
848 Traceback (most recent call last):
849 SyntaxError: expected ':'
850
851 >>> try
852 ... pass
853 Traceback (most recent call last):
854 SyntaxError: expected ':'
855
856 >>> try:
857 ... pass
858 ... except
859 ... pass
860 Traceback (most recent call last):
861 SyntaxError: expected ':'
862
Pablo Galindo08fb8ac2021-03-18 01:03:11 +0000863 >>> match x
864 ... case list():
865 ... pass
866 Traceback (most recent call last):
867 SyntaxError: expected ':'
868
869 >>> match x:
870 ... case list()
871 ... pass
872 Traceback (most recent call last):
873 SyntaxError: expected ':'
874
875 >>> match x:
876 ... case [y] if y > 0
877 ... pass
878 Traceback (most recent call last):
879 SyntaxError: expected ':'
880
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100881 >>> if x = 3:
882 ... pass
883 Traceback (most recent call last):
884 SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
885
886 >>> while x = 3:
887 ... pass
888 Traceback (most recent call last):
889 SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
890
891 >>> if x.a = 3:
892 ... pass
893 Traceback (most recent call last):
894 SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
895
896 >>> while x.a = 3:
897 ... pass
898 Traceback (most recent call last):
899 SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
900
Pablo Galindoe53f72a2021-06-04 00:11:43 +0100901Custom error messages for try blocks that are not followed by except/finally
902
903 >>> try:
904 ... x = 34
905 ...
906 Traceback (most recent call last):
907 SyntaxError: expected 'except' or 'finally' block
908
Pablo Galindod9151cb2021-04-13 02:32:33 +0100909Ensure that early = are not matched by the parser as invalid comparisons
Pablo Galindob2802482021-04-15 21:38:45 +0100910 >>> f(2, 4, x=34); 1 $ 2
Pablo Galindod9151cb2021-04-13 02:32:33 +0100911 Traceback (most recent call last):
912 SyntaxError: invalid syntax
913
Pablo Galindo30ed93b2021-04-13 17:51:21 +0100914 >>> dict(x=34); x $ y
915 Traceback (most recent call last):
916 SyntaxError: invalid syntax
917
918 >>> dict(x=34, (x for x in range 10), 1); x $ y
919 Traceback (most recent call last):
920 SyntaxError: invalid syntax
921
922 >>> dict(x=34, x=1, y=2); x $ y
923 Traceback (most recent call last):
924 SyntaxError: invalid syntax
925
Pablo Galindoda743502021-04-15 14:06:39 +0100926Incomplete dictionary literals
927
928 >>> {1:2, 3:4, 5}
929 Traceback (most recent call last):
930 SyntaxError: ':' expected after dictionary key
931
932 >>> {1:2, 3:4, 5:}
933 Traceback (most recent call last):
934 SyntaxError: expression expected after dictionary key and ':'
935
936 >>> {1: *12+1, 23: 1}
937 Traceback (most recent call last):
938 SyntaxError: cannot use a starred expression in a dictionary value
939
940 >>> {1: *12+1}
941 Traceback (most recent call last):
942 SyntaxError: cannot use a starred expression in a dictionary value
943
944 >>> {1: 23, 1: *12+1}
945 Traceback (most recent call last):
946 SyntaxError: cannot use a starred expression in a dictionary value
947
948 >>> {1:}
949 Traceback (most recent call last):
950 SyntaxError: expression expected after dictionary key and ':'
951
952 # Ensure that the error is not raise for syntax errors that happen after sets
953
954 >>> {1} $
955 Traceback (most recent call last):
956 SyntaxError: invalid syntax
957
Pablo Galindo56c95df2021-04-21 15:28:21 +0100958Specialized indentation errors:
959
960 >>> while condition:
961 ... pass
962 Traceback (most recent call last):
963 IndentationError: expected an indented block after 'while' statement on line 1
964
965 >>> for x in range(10):
966 ... pass
967 Traceback (most recent call last):
968 IndentationError: expected an indented block after 'for' statement on line 1
969
970 >>> for x in range(10):
971 ... pass
972 ... else:
973 ... pass
974 Traceback (most recent call last):
975 IndentationError: expected an indented block after 'else' statement on line 3
976
977 >>> async for x in range(10):
978 ... pass
979 Traceback (most recent call last):
980 IndentationError: expected an indented block after 'for' statement on line 1
981
982 >>> async for x in range(10):
983 ... pass
984 ... else:
985 ... pass
986 Traceback (most recent call last):
987 IndentationError: expected an indented block after 'else' statement on line 3
988
989 >>> if something:
990 ... pass
991 Traceback (most recent call last):
992 IndentationError: expected an indented block after 'if' statement on line 1
993
994 >>> if something:
995 ... pass
996 ... elif something_else:
997 ... pass
998 Traceback (most recent call last):
999 IndentationError: expected an indented block after 'elif' statement on line 3
1000
1001 >>> if something:
1002 ... pass
1003 ... elif something_else:
1004 ... pass
1005 ... else:
1006 ... pass
1007 Traceback (most recent call last):
1008 IndentationError: expected an indented block after 'else' statement on line 5
1009
1010 >>> try:
1011 ... pass
1012 Traceback (most recent call last):
1013 IndentationError: expected an indented block after 'try' statement on line 1
1014
1015 >>> try:
1016 ... something()
1017 ... except A:
1018 ... pass
1019 Traceback (most recent call last):
1020 IndentationError: expected an indented block after 'except' statement on line 3
1021
1022 >>> try:
1023 ... something()
1024 ... except A:
1025 ... pass
1026 ... finally:
1027 ... pass
1028 Traceback (most recent call last):
1029 IndentationError: expected an indented block after 'finally' statement on line 5
1030
1031 >>> with A:
1032 ... pass
1033 Traceback (most recent call last):
1034 IndentationError: expected an indented block after 'with' statement on line 1
1035
1036 >>> with A as a, B as b:
1037 ... pass
1038 Traceback (most recent call last):
1039 IndentationError: expected an indented block after 'with' statement on line 1
1040
1041 >>> with (A as a, B as b):
1042 ... pass
1043 Traceback (most recent call last):
1044 IndentationError: expected an indented block after 'with' statement on line 1
1045
1046 >>> async with A:
1047 ... pass
1048 Traceback (most recent call last):
1049 IndentationError: expected an indented block after 'with' statement on line 1
1050
1051 >>> async with A as a, B as b:
1052 ... pass
1053 Traceback (most recent call last):
1054 IndentationError: expected an indented block after 'with' statement on line 1
1055
1056 >>> async with (A as a, B as b):
1057 ... pass
1058 Traceback (most recent call last):
1059 IndentationError: expected an indented block after 'with' statement on line 1
1060
1061 >>> def foo(x, /, y, *, z=2):
1062 ... pass
1063 Traceback (most recent call last):
1064 IndentationError: expected an indented block after function definition on line 1
1065
1066 >>> class Blech(A):
1067 ... pass
1068 Traceback (most recent call last):
1069 IndentationError: expected an indented block after class definition on line 1
1070
1071 >>> match something:
1072 ... pass
1073 Traceback (most recent call last):
1074 IndentationError: expected an indented block after 'match' statement on line 1
1075
1076 >>> match something:
1077 ... case []:
1078 ... pass
1079 Traceback (most recent call last):
1080 IndentationError: expected an indented block after 'case' statement on line 2
1081
1082 >>> match something:
1083 ... case []:
1084 ... ...
1085 ... case {}:
1086 ... pass
1087 Traceback (most recent call last):
1088 IndentationError: expected an indented block after 'case' statement on line 4
1089
Collin Winter828f04a2007-08-31 00:04:24 +00001090Make sure that the old "raise X, Y[, Z]" form is gone:
1091 >>> raise X, Y
1092 Traceback (most recent call last):
1093 ...
1094 SyntaxError: invalid syntax
1095 >>> raise X, Y, Z
1096 Traceback (most recent call last):
1097 ...
1098 SyntaxError: invalid syntax
1099
Miss Islington (bot)9a0e65c2021-05-09 14:13:50 -07001100Check that an multiple exception types with missing parentheses
Pablo Galindo206cbda2021-02-07 18:42:21 +00001101raise a custom exception
1102
1103 >>> try:
1104 ... pass
1105 ... except A, B:
1106 ... pass
1107 Traceback (most recent call last):
Miss Islington (bot)9a0e65c2021-05-09 14:13:50 -07001108 SyntaxError: multiple exception types must be parenthesized
Pablo Galindo206cbda2021-02-07 18:42:21 +00001109
1110 >>> try:
1111 ... pass
1112 ... except A, B, C:
1113 ... pass
1114 Traceback (most recent call last):
Miss Islington (bot)9a0e65c2021-05-09 14:13:50 -07001115 SyntaxError: multiple exception types must be parenthesized
Pablo Galindo206cbda2021-02-07 18:42:21 +00001116
1117 >>> try:
1118 ... pass
1119 ... except A, B, C as blech:
1120 ... pass
1121 Traceback (most recent call last):
Miss Islington (bot)9a0e65c2021-05-09 14:13:50 -07001122 SyntaxError: multiple exception types must be parenthesized
Pablo Galindo206cbda2021-02-07 18:42:21 +00001123
1124 >>> try:
1125 ... pass
1126 ... except A, B, C as blech:
1127 ... pass
1128 ... finally:
1129 ... pass
1130 Traceback (most recent call last):
Miss Islington (bot)9a0e65c2021-05-09 14:13:50 -07001131 SyntaxError: multiple exception types must be parenthesized
Pablo Galindo206cbda2021-02-07 18:42:21 +00001132
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001133
1134>>> f(a=23, a=234)
1135Traceback (most recent call last):
1136 ...
Pablo Galindo254ec782020-04-03 20:37:13 +01001137SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001138
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +00001139>>> {1, 2, 3} = 42
1140Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001141SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001142
1143>>> {1: 2, 3: 4} = 42
1144Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001145SyntaxError: cannot assign to dict literal here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001146
1147>>> f'{x}' = 42
1148Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001149SyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001150
1151>>> f'{x}-{y}' = 42
1152Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001153SyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='?
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +00001154
Miss Islington (bot)ae1732d2021-05-21 11:20:43 -07001155>>> (x, y, z=3, d, e)
1156Traceback (most recent call last):
1157SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
1158
1159>>> [x, y, z=3, d, e]
1160Traceback (most recent call last):
1161SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
1162
1163>>> [z=3]
1164Traceback (most recent call last):
1165SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
1166
1167>>> {x, y, z=3, d, e}
1168Traceback (most recent call last):
1169SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
1170
1171>>> {z=3}
1172Traceback (most recent call last):
1173SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
1174
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +03001175>>> from t import x,
1176Traceback (most recent call last):
1177SyntaxError: trailing comma not allowed without surrounding parentheses
1178
1179>>> from t import x,y,
1180Traceback (most recent call last):
1181SyntaxError: trailing comma not allowed without surrounding parentheses
1182
Miss Islington (bot)846a10f2021-08-18 13:32:01 -07001183# Check that we dont raise the "trailing comma" error if there is more
1184# input to the left of the valid part that we parsed.
1185
1186>>> from t import x,y, and 3
1187Traceback (most recent call last):
1188SyntaxError: invalid syntax
1189
Batuhan Taskayac8f29ad2020-06-27 21:33:08 +03001190>>> (): int
1191Traceback (most recent call last):
1192SyntaxError: only single target (not tuple) can be annotated
1193>>> []: int
1194Traceback (most recent call last):
1195SyntaxError: only single target (not list) can be annotated
1196>>> (()): int
1197Traceback (most recent call last):
1198SyntaxError: only single target (not tuple) can be annotated
1199>>> ([]): int
1200Traceback (most recent call last):
1201SyntaxError: only single target (not list) can be annotated
1202
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001203Corner-cases that used to fail to raise the correct error:
1204
1205 >>> def f(*, x=lambda __debug__:0): pass
1206 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001207 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001208
Pablo Galindob0544ba2021-04-21 12:41:19 +01001209 >>> def f(*args:(lambda __debug__:0)): pass
1210 Traceback (most recent call last):
1211 SyntaxError: cannot assign to __debug__
1212
1213 >>> def f(**kwargs:(lambda __debug__:0)): pass
1214 Traceback (most recent call last):
1215 SyntaxError: cannot assign to __debug__
1216
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +03001217 >>> with (lambda *:0): pass
1218 Traceback (most recent call last):
1219 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001220
1221Corner-cases that used to crash:
1222
1223 >>> def f(**__debug__): pass
1224 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001225 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001226
1227 >>> def f(*xx, __debug__): pass
1228 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001229 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001230
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +03001231 >>> import ä £
1232 Traceback (most recent call last):
1233 SyntaxError: invalid character '£' (U+00A3)
Pablo Galindoa8c418d2021-06-18 22:15:57 +01001234
1235 Invalid pattern matching constructs:
1236
1237 >>> match ...:
1238 ... case 42 as _:
1239 ... ...
1240 Traceback (most recent call last):
1241 SyntaxError: cannot use '_' as a target
1242
1243 >>> match ...:
1244 ... case 42 as 1+2+4:
1245 ... ...
1246 Traceback (most recent call last):
1247 SyntaxError: invalid pattern target
Miss Islington (bot)11f1a302021-06-24 08:34:28 -07001248
1249 >>> match ...:
1250 ... case Foo(z=1, y=2, x):
1251 ... ...
1252 Traceback (most recent call last):
1253 SyntaxError: positional patterns follow keyword patterns
1254
1255 >>> match ...:
1256 ... case Foo(a, z=1, y=2, x):
1257 ... ...
1258 Traceback (most recent call last):
1259 SyntaxError: positional patterns follow keyword patterns
1260
1261 >>> match ...:
1262 ... case Foo(z=1, x, y=2):
1263 ... ...
1264 Traceback (most recent call last):
1265 SyntaxError: positional patterns follow keyword patterns
1266
1267 >>> match ...:
1268 ... case C(a=b, c, d=e, f, g=h, i, j=k, ...):
1269 ... ...
1270 Traceback (most recent call last):
1271 SyntaxError: positional patterns follow keyword patterns
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001272"""
1273
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001274import re
1275import unittest
1276
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001277from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001278
1279class SyntaxTestCase(unittest.TestCase):
1280
1281 def _check_error(self, code, errtext,
Miss Islington (bot)9e209d42021-09-27 07:05:20 -07001282 filename="<testcase>", mode="exec", subclass=None,
1283 lineno=None, offset=None, end_lineno=None, end_offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001284 """Check that compiling code raises SyntaxError with errtext.
1285
1286 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +00001287 test of the exception raised. If subclass is specified it
1288 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001289 """
1290 try:
1291 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +00001292 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001293 if subclass and not isinstance(err, subclass):
1294 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001295 mo = re.search(errtext, str(err))
1296 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -07001297 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001298 self.assertEqual(err.filename, filename)
1299 if lineno is not None:
1300 self.assertEqual(err.lineno, lineno)
1301 if offset is not None:
1302 self.assertEqual(err.offset, offset)
Miss Islington (bot)9e209d42021-09-27 07:05:20 -07001303 if end_lineno is not None:
1304 self.assertEqual(err.end_lineno, end_lineno)
1305 if end_offset is not None:
1306 self.assertEqual(err.end_offset, end_offset)
Serhiy Storchaka93242d72021-10-03 20:03:49 +03001307
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001308 else:
1309 self.fail("compile() did not raise SyntaxError")
1310
Pablo Galindo43c4fb62020-12-13 16:46:48 +00001311 def test_expression_with_assignment(self):
1312 self._check_error(
1313 "print(end1 + end2 = ' ')",
Pablo Galindo30ed93b2021-04-13 17:51:21 +01001314 'expression cannot contain assignment, perhaps you meant "=="?',
Pablo Galindoa77aac42021-04-23 14:27:05 +01001315 offset=7
Pablo Galindo43c4fb62020-12-13 16:46:48 +00001316 )
1317
Lysandros Nikolaou15acc4e2020-10-27 20:54:20 +02001318 def test_curly_brace_after_primary_raises_immediately(self):
Pablo Galindo Salgadob977f852021-07-27 18:52:32 +01001319 self._check_error("f{}", "invalid syntax", mode="single")
Lysandros Nikolaou15acc4e2020-10-27 20:54:20 +02001320
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001321 def test_assign_call(self):
1322 self._check_error("f() = 1", "assign")
1323
1324 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -07001325 self._check_error("del (,)", "invalid syntax")
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001326 self._check_error("del 1", "cannot delete literal")
1327 self._check_error("del (1, 2)", "cannot delete literal")
1328 self._check_error("del None", "cannot delete None")
1329 self._check_error("del *x", "cannot delete starred")
1330 self._check_error("del (*x)", "cannot use starred expression")
1331 self._check_error("del (*x,)", "cannot delete starred")
1332 self._check_error("del [*x,]", "cannot delete starred")
1333 self._check_error("del f()", "cannot delete function call")
1334 self._check_error("del f(a, b)", "cannot delete function call")
1335 self._check_error("del o.f()", "cannot delete function call")
1336 self._check_error("del a[0]()", "cannot delete function call")
1337 self._check_error("del x, f()", "cannot delete function call")
1338 self._check_error("del f(), x", "cannot delete function call")
1339 self._check_error("del [a, b, ((c), (d,), e.f())]", "cannot delete function call")
1340 self._check_error("del (a if True else b)", "cannot delete conditional")
1341 self._check_error("del +a", "cannot delete expression")
1342 self._check_error("del a, +b", "cannot delete expression")
1343 self._check_error("del a + b", "cannot delete expression")
1344 self._check_error("del (a + b, c)", "cannot delete expression")
1345 self._check_error("del (c[0], a + b)", "cannot delete expression")
1346 self._check_error("del a.b.c + 2", "cannot delete expression")
1347 self._check_error("del a.b.c[0] + 2", "cannot delete expression")
1348 self._check_error("del (a, b, (c, d.e.f + 2))", "cannot delete expression")
1349 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "cannot delete expression")
1350 self._check_error("del (a := 5)", "cannot delete named expression")
Shantanu27c0d9b2020-05-11 14:53:58 -07001351 # We don't have a special message for this, but make sure we don't
1352 # report "cannot delete name"
1353 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001354
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001355 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001356 source = """if 1:
1357 def error(a):
1358 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001359 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001360 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001361 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001362 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001363 self._check_error(source, "parameter and global", lineno=3)
1364
1365 def test_nonlocal_param_err_first(self):
1366 source = """if 1:
1367 def error(a):
1368 nonlocal a # SyntaxError
1369 def error2():
1370 b = 1
1371 global b # SyntaxError
1372 """
1373 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +00001374
Neal Norwitzfcf44352005-11-27 20:37:43 +00001375 def test_break_outside_loop(self):
1376 self._check_error("break", "outside loop")
1377
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001378 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001379 self._check_error("if 0: yield", "outside function")
1380 self._check_error("if 0: yield\nelse: x=1", "outside function")
1381 self._check_error("if 1: pass\nelse: yield", "outside function")
1382 self._check_error("while 0: yield", "outside function")
1383 self._check_error("while 0: yield\nelse: x=1", "outside function")
1384 self._check_error("class C:\n if 0: yield", "outside function")
1385 self._check_error("class C:\n if 1: pass\n else: yield",
1386 "outside function")
1387 self._check_error("class C:\n while 0: yield", "outside function")
1388 self._check_error("class C:\n while 0: yield\n else: x = 1",
1389 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001390
1391 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001392 self._check_error("if 0: return", "outside function")
1393 self._check_error("if 0: return\nelse: x=1", "outside function")
1394 self._check_error("if 1: pass\nelse: return", "outside function")
1395 self._check_error("while 0: return", "outside function")
1396 self._check_error("class C:\n if 0: return", "outside function")
1397 self._check_error("class C:\n while 0: return", "outside function")
1398 self._check_error("class C:\n while 0: return\n else: x=1",
1399 "outside function")
1400 self._check_error("class C:\n if 0: return\n else: x= 1",
1401 "outside function")
1402 self._check_error("class C:\n if 1: pass\n else: return",
1403 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001404
1405 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001406 self._check_error("if 0: break", "outside loop")
1407 self._check_error("if 0: break\nelse: x=1", "outside loop")
1408 self._check_error("if 1: pass\nelse: break", "outside loop")
1409 self._check_error("class C:\n if 0: break", "outside loop")
1410 self._check_error("class C:\n if 1: pass\n else: break",
1411 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001412
1413 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001414 self._check_error("if 0: continue", "not properly in loop")
1415 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
1416 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
1417 self._check_error("class C:\n if 0: continue", "not properly in loop")
1418 self._check_error("class C:\n if 1: pass\n else: continue",
1419 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001420
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421 def test_unexpected_indent(self):
1422 self._check_error("foo()\n bar()\n", "unexpected indent",
1423 subclass=IndentationError)
1424
1425 def test_no_indent(self):
1426 self._check_error("if 1:\nfoo()", "expected an indented block",
1427 subclass=IndentationError)
1428
1429 def test_bad_outdent(self):
1430 self._check_error("if 1:\n foo()\n bar()",
1431 "unindent does not match .* level",
1432 subclass=IndentationError)
1433
1434 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001435 self._check_error("int(base=10, '2')",
1436 "positional argument follows keyword argument")
1437
1438 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001439 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001440 "positional argument follows "
1441 "keyword argument unpacking")
1442
1443 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001444 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001445 "iterable argument unpacking follows "
1446 "keyword argument unpacking")
Serhiy Storchaka93242d72021-10-03 20:03:49 +03001447
Miss Islington (bot)9e209d42021-09-27 07:05:20 -07001448 def test_generator_in_function_call(self):
1449 self._check_error("foo(x, y for y in range(3) for z in range(2) if z , p)",
1450 "Generator expression must be parenthesized",
1451 lineno=1, end_lineno=1, offset=11, end_offset=53)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001453 def test_empty_line_after_linecont(self):
1454 # See issue-40847
1455 s = r"""\
1456pass
1457 \
1458
1459pass
1460"""
1461 try:
1462 compile(s, '<string>', 'exec')
1463 except SyntaxError:
1464 self.fail("Empty line after a line continuation character is valid.")
1465
Mark Shannon02d126a2020-09-25 14:04:19 +01001466 @support.cpython_only
1467 def test_nested_named_except_blocks(self):
1468 code = ""
1469 for i in range(12):
1470 code += f"{' '*i}try:\n"
1471 code += f"{' '*(i+1)}raise Exception\n"
1472 code += f"{' '*i}except Exception as e:\n"
1473 code += f"{' '*4*12}pass"
1474 self._check_error(code, "too many statically nested blocks")
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001475
Pablo Galindo06f8c332020-10-30 23:48:42 +00001476 def test_barry_as_flufl_with_syntax_errors(self):
1477 # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if
1478 # is reading the wrong token in the presence of syntax errors later
1479 # in the file. See bpo-42214 for more information.
1480 code = """
1481def func1():
1482 if a != b:
1483 raise ValueError
1484
1485def func2():
1486 try
1487 return 1
1488 finally:
1489 pass
1490"""
Pablo Galindo58fb1562021-02-02 19:54:22 +00001491 self._check_error(code, "expected ':'")
Pablo Galindo06f8c332020-10-30 23:48:42 +00001492
Pablo Galindo96eeff52021-03-22 17:28:11 +00001493 def test_invalid_line_continuation_error_position(self):
1494 self._check_error(r"a = 3 \ 4",
1495 "unexpected character after line continuation character",
Miss Islington (bot)bf26a6d2021-11-13 17:30:03 -08001496 lineno=1, offset=8)
1497 self._check_error('1,\\#\n2',
1498 "unexpected character after line continuation character",
1499 lineno=1, offset=4)
1500 self._check_error('\nfgdfgf\n1,\\#\n2\n',
1501 "unexpected character after line continuation character",
1502 lineno=3, offset=4)
Pablo Galindo96eeff52021-03-22 17:28:11 +00001503
Lysandros Nikolaou02cdfc92020-10-31 20:31:41 +02001504 def test_invalid_line_continuation_left_recursive(self):
1505 # Check bpo-42218: SyntaxErrors following left-recursive rules
1506 # (t_primary_raw in this case) need to be tested explicitly
1507 self._check_error("A.\u018a\\ ",
1508 "unexpected character after line continuation character")
1509 self._check_error("A.\u03bc\\\n",
1510 "unexpected EOF while parsing")
1511
Pablo Galindod6d63712021-01-19 23:59:33 +00001512 def test_error_parenthesis(self):
1513 for paren in "([{":
1514 self._check_error(paren + "1 + 2", f"\\{paren}' was never closed")
1515
1516 for paren in ")]}":
1517 self._check_error(paren + "1 + 2", f"unmatched '\\{paren}'")
1518
Pablo Galindo08fb8ac2021-03-18 01:03:11 +00001519 def test_match_call_does_not_raise_syntax_error(self):
1520 code = """
1521def match(x):
1522 return 1+1
1523
1524match(34)
1525"""
1526 compile(code, "<string>", "exec")
1527
1528 def test_case_call_does_not_raise_syntax_error(self):
1529 code = """
1530def case(x):
1531 return 1+1
1532
1533case(34)
1534"""
1535 compile(code, "<string>", "exec")
Miss Islington (bot)ec0699c2021-05-19 11:28:31 -07001536
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07001537 def test_multiline_compiler_error_points_to_the_end(self):
1538 self._check_error(
1539 "call(\na=1,\na=1\n)",
1540 "keyword argument repeated",
1541 lineno=3
1542 )
Pablo Galindo08fb8ac2021-03-18 01:03:11 +00001543
Miss Islington (bot)779b9ae2021-08-28 12:24:02 -07001544 @support.cpython_only
1545 def test_syntax_error_on_deeply_nested_blocks(self):
1546 # This raises a SyntaxError, it used to raise a SystemError. Context
1547 # for this change can be found on issue #27514
1548
1549 # In 2.5 there was a missing exception and an assert was triggered in a
1550 # debug build. The number of blocks must be greater than CO_MAXBLOCKS.
1551 # SF #1565514
1552
1553 source = """
1554while 1:
1555 while 2:
1556 while 3:
1557 while 4:
1558 while 5:
1559 while 6:
1560 while 8:
1561 while 9:
1562 while 10:
1563 while 11:
1564 while 12:
1565 while 13:
1566 while 14:
1567 while 15:
1568 while 16:
1569 while 17:
1570 while 18:
1571 while 19:
1572 while 20:
1573 while 21:
1574 while 22:
1575 break
1576"""
1577 self._check_error(source, "too many statically nested blocks")
1578
Pablo Galindo Salgadodc731992021-12-20 16:23:37 +00001579 @support.cpython_only
1580 def test_error_on_parser_stack_overflow(self):
1581 source = "-" * 100000 + "4"
1582 for mode in ["exec", "eval", "single"]:
1583 with self.subTest(mode=mode):
1584 with self.assertRaises(MemoryError):
1585 compile(source, "<string>", mode)
1586
Pablo Galindod6d63712021-01-19 23:59:33 +00001587
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001588def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001589 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001590 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001591 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001592
1593if __name__ == "__main__":
1594 test_main()