blob: d6583b9d30c272ca1746f7dd5b064343abb9ce1f [file] [log] [blame]
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001"""This module tests SyntaxErrors.
2
3Here's an example of the sort of thing that is tested.
4
5>>> def f(x):
6... global x
7Traceback (most recent call last):
Nick Coghlan650f0d02007-04-15 12:05:43 +00008SyntaxError: name 'x' is parameter and global
Jeremy Hyltonc960f262006-01-27 15:18:39 +00009
10The tests are all raise SyntaxErrors. They were created by checking
11each C call that raises SyntaxError. There are several modules that
12raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and
13symtable.c.
14
15The parser itself outlaws a lot of invalid syntax. None of these
16errors are tested here at the moment. We should add some tests; since
17there are infinitely many programs with invalid syntax, we would need
18to be judicious in selecting some.
19
20The compiler generates a synthetic module name for code executed by
21doctest. Since all the code comes from the same module, a suffix like
22[1] is appended to the module name, As a consequence, changing the
23order of tests in this module means renumbering all the errors after
24it. (Maybe we should enable the ellipsis option for these tests.)
25
26In ast.c, syntax errors are raised by calling ast_error().
27
28Errors from set_context():
29
Jeremy Hyltonc960f262006-01-27 15:18:39 +000030>>> obj.None = 1
31Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000032SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000033
34>>> None = 1
35Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020036SyntaxError: cannot assign to None
37
38>>> obj.True = 1
39Traceback (most recent call last):
40SyntaxError: invalid syntax
41
42>>> True = 1
43Traceback (most recent call last):
44SyntaxError: cannot assign to True
45
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020046>>> (True := 1)
47Traceback (most recent call last):
Ned Batchelder37143a82019-12-31 21:40:58 -050048SyntaxError: cannot use assignment expressions with True
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020049
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020050>>> obj.__debug__ = 1
51Traceback (most recent call last):
52SyntaxError: cannot assign to __debug__
53
54>>> __debug__ = 1
55Traceback (most recent call last):
56SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +000057
Stéphane Wirtel3ad91672019-02-21 11:11:53 +010058>>> (__debug__ := 1)
59Traceback (most recent call last):
60SyntaxError: cannot assign to __debug__
61
Jeremy Hyltonc960f262006-01-27 15:18:39 +000062>>> f() = 1
63Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020064SyntaxError: cannot assign to function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000065
Shantanu27c0d9b2020-05-11 14:53:58 -070066>>> del f()
67Traceback (most recent call last):
68SyntaxError: cannot delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000069
70>>> a + 1 = 2
71Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020072SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000073
74>>> (x for x in x) = 1
75Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020076SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78>>> 1 = 1
79Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020080SyntaxError: cannot assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000081
82>>> "abc" = 1
83Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020084SyntaxError: cannot assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000085
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050086>>> b"" = 1
87Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020088SyntaxError: cannot assign to literal
89
90>>> ... = 1
91Traceback (most recent call last):
92SyntaxError: cannot assign to Ellipsis
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050093
Jeremy Hyltonc960f262006-01-27 15:18:39 +000094>>> `1` = 1
95Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +000096SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000097
98If the left-hand side of an assignment is a list or tuple, an illegal
99expression inside that contain should still cause a syntax error.
100This test just checks a couple of cases rather than enumerating all of
101them.
102
Pablo Galindo16ab0702020-05-15 02:04:52 +0100103>>> (a, "b", c) = (1, 2, 3)
104Traceback (most recent call last):
105SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200106
Pablo Galindo16ab0702020-05-15 02:04:52 +0100107>>> (a, True, c) = (1, 2, 3)
108Traceback (most recent call last):
109SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200110
111>>> (a, __debug__, c) = (1, 2, 3)
112Traceback (most recent call last):
113SyntaxError: cannot assign to __debug__
114
Pablo Galindo16ab0702020-05-15 02:04:52 +0100115>>> (a, *True, c) = (1, 2, 3)
116Traceback (most recent call last):
117SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200118
119>>> (a, *__debug__, c) = (1, 2, 3)
120Traceback (most recent call last):
121SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000122
Pablo Galindo16ab0702020-05-15 02:04:52 +0100123>>> [a, b, c + 1] = [1, 2, 3]
124Traceback (most recent call last):
125SyntaxError: cannot assign to operator
126
127>>> [a, b[1], c + 1] = [1, 2, 3]
128Traceback (most recent call last):
129SyntaxError: cannot assign to operator
130
131>>> [a, b.c.d, c + 1] = [1, 2, 3]
132Traceback (most recent call last):
133SyntaxError: cannot assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000134
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135>>> a if 1 else b = 1
136Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200137SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000138
Miss Islington (bot)8df4f392020-06-08 02:22:06 -0700139>>> True = True = 3
140Traceback (most recent call last):
141SyntaxError: cannot assign to True
142
143>>> x = y = True = z = 3
144Traceback (most recent call last):
145SyntaxError: cannot assign to True
146
147>>> x = y = yield = 1
148Traceback (most recent call last):
149SyntaxError: assignment to yield expression not possible
150
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300151>>> a, b += 1, 2
152Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100153SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300154
155>>> (a, b) += 1, 2
156Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100157SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300158
159>>> [a, b] += 1, 2
160Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100161SyntaxError: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300162
Lysandros Nikolaoua5442b22020-06-19 03:03:58 +0300163Invalid targets in `for` loops and `with` statements should also
164produce a specialized error message
165
166>>> for a() in b: pass
167Traceback (most recent call last):
168SyntaxError: cannot assign to function call
169
170>>> for (a, b()) 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, c+1) in b: pass
179Traceback (most recent call last):
180SyntaxError: cannot assign to operator
181
182>>> for (x, *(y, z.d())) in b: pass
183Traceback (most recent call last):
184SyntaxError: cannot assign to function call
185
186>>> for a, b() in c: pass
187Traceback (most recent call last):
188SyntaxError: cannot assign to function call
189
190>>> for i < (): pass
191Traceback (most recent call last):
192SyntaxError: invalid syntax
193
Lysandros Nikolaou71bb9212020-06-21 05:47:22 +0300194>>> for a, b
195Traceback (most recent call last):
196SyntaxError: invalid syntax
197
Lysandros Nikolaoua5442b22020-06-19 03:03:58 +0300198>>> with a as b(): pass
199Traceback (most recent call last):
200SyntaxError: cannot assign to function call
201
202>>> with a as (b, c()): pass
203Traceback (most recent call last):
204SyntaxError: cannot assign to function call
205
206>>> with a as [b, c()]: pass
207Traceback (most recent call last):
208SyntaxError: cannot assign to function call
209
210>>> with a as (*b, c, d+1): pass
211Traceback (most recent call last):
212SyntaxError: cannot assign to operator
213
214>>> with a as (x, *(y, z.d())): pass
215Traceback (most recent call last):
216SyntaxError: cannot assign to function call
217
218>>> with a as b, c as d(): pass
219Traceback (most recent call last):
220SyntaxError: cannot assign to function call
221
Lysandros Nikolaou71bb9212020-06-21 05:47:22 +0300222>>> with a as b
223Traceback (most recent call last):
224SyntaxError: invalid syntax
225
Miss Islington (bot)8df4f392020-06-08 02:22:06 -0700226>>> p = p =
227Traceback (most recent call last):
228SyntaxError: invalid syntax
229
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000230From compiler_complex_args():
231
232>>> def f(None=1):
233... pass
234Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000235SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000236
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000237From ast_for_arguments():
238
239>>> def f(x, y=1, z):
240... pass
241Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000242SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000243
244>>> def f(x, None):
245... pass
246Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000247SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000248
249>>> def f(*None):
250... pass
251Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000252SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000253
254>>> def f(**None):
255... pass
256Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000257SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000258
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300259>>> import ast; ast.parse('''
260... def f(
261... *, # type: int
262... a, # type: int
263... ):
264... pass
265... ''', type_comments=True)
266Traceback (most recent call last):
267SyntaxError: bare * has associated type comment
268
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000269
270From ast_for_funcdef():
271
272>>> def None(x):
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
278From ast_for_call():
279
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200280>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000281... return list(it)
282>>> L = range(10)
283>>> f(x for x in L)
284[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
285>>> f(x for x in L, 1)
286Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200287SyntaxError: Generator expression must be parenthesized
288>>> f(x for x in L, y=1)
289Traceback (most recent call last):
290SyntaxError: Generator expression must be parenthesized
291>>> f(x for x in L, *[])
292Traceback (most recent call last):
293SyntaxError: Generator expression must be parenthesized
294>>> f(x for x in L, **{})
295Traceback (most recent call last):
296SyntaxError: Generator expression must be parenthesized
Miss Islington (bot)55c89232020-05-21 18:14:55 -0700297>>> f(L, x for x in L)
298Traceback (most recent call last):
299SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400300>>> f(x for x in L, y for y in L)
301Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200302SyntaxError: Generator expression must be parenthesized
303>>> f(x for x in L,)
304Traceback (most recent call last):
305SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000306>>> f((x for x in L), 1)
307[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200308>>> class C(x for x in L):
309... pass
310Traceback (most recent call last):
311SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000312
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200313>>> def g(*args, **kwargs):
314... print(args, sorted(kwargs.items()))
315>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
316... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
317... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
318... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
319... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
320... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
321... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
322... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
323... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
324... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
325... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
326... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
327... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
328... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
329... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
330... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
331... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
332... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
333... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
334... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
335(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000336
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200337>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
338... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
339... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
340... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
341... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
342... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
343... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
344... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
345... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
346... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
347... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
348... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
349... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
350... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
351... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
352... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
353... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
354... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
355... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
356... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
357... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
358... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
359... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
360... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
361... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
362... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
363... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
364... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
365... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
366... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
367... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
368... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
369... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
370... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
371... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
372... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
373... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
374... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
375... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
376... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
377... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
378... # doctest: +ELLIPSIS
379() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380
Yury Selivanovf2392132016-12-13 19:03:51 -0500381>>> class C:
382... def meth(self, *args):
383... return args
384>>> obj = C()
385>>> obj.meth(
386... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
387... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
388... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
389... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
390... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
391... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
392... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
393... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
394... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
395... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
396... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
397... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
398... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
399... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
400... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
401... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
402... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
403... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
404... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
405... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
406(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
407
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100408# >>> f(lambda x: x[0] = 3)
409# Traceback (most recent call last):
410# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000411
412The grammar accepts any test (basically, any expression) in the
413keyword slot of a call site. Test a few different options.
414
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100415# >>> f(x()=2)
416# Traceback (most recent call last):
417# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
418# >>> f(a or b=1)
419# Traceback (most recent call last):
420# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
421# >>> f(x.y=1)
422# Traceback (most recent call last):
423# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
424# >>> f((x)=2)
425# Traceback (most recent call last):
426# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
427# >>> f(True=2)
428# Traceback (most recent call last):
429# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200430>>> f(__debug__=1)
431Traceback (most recent call last):
432SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100433>>> __debug__: int
434Traceback (most recent call last):
435SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436
437
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000438More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000439
440>>> (x for x in x) += 1
441Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100442SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000443>>> None += 1
444Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100445SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200446>>> __debug__ += 1
447Traceback (most recent call last):
448SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000449>>> f() += 1
450Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100451SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452
453
454Test continue in finally in weird combinations.
455
Ezio Melotti13925002011-03-16 11:05:33 +0200456continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457
458 >>> def test():
459 ... try:
460 ... pass
461 ... finally:
462 ... for abc in range(10):
463 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000464 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000465 >>> test()
466 9
467
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200468continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000469
470 >>> def test():
471 ... for abc in range(10):
472 ... try:
473 ... pass
474 ... finally:
475 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200476 ... print(abc)
477 >>> test()
478 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479
480 >>> def test():
481 ... for abc in range(10):
482 ... try:
483 ... pass
484 ... finally:
485 ... try:
486 ... continue
487 ... except:
488 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200489 ... print(abc)
490 >>> test()
491 9
492
493 >>> def test():
494 ... for abc in range(10):
495 ... try:
496 ... pass
497 ... finally:
498 ... try:
499 ... pass
500 ... except:
501 ... continue
502 ... print(abc)
503 >>> test()
504 9
505
506A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507
508 >>> def foo():
509 ... try:
510 ... pass
511 ... finally:
512 ... continue
513 Traceback (most recent call last):
514 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200515 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000516
517There is one test for a break that is not in a loop. The compiler
518uses a single data structure to keep track of try-finally and loops,
519so we need to be sure that a break is actually inside a loop. If it
520isn't, there should be a syntax error.
521
522 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000523 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000524 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000525 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000526 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000527 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000528 Traceback (most recent call last):
529 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000530 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000531
Benjamin Petersone09ed542016-07-14 22:00:03 -0700532This raises a SyntaxError, it used to raise a SystemError.
533Context for this change can be found on issue #27514
534
Thomas Wouters89f507f2006-12-13 04:49:30 +0000535In 2.5 there was a missing exception and an assert was triggered in a debug
536build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
537
538 >>> while 1:
539 ... while 2:
540 ... while 3:
541 ... while 4:
542 ... while 5:
543 ... while 6:
544 ... while 8:
545 ... while 9:
546 ... while 10:
547 ... while 11:
548 ... while 12:
549 ... while 13:
550 ... while 14:
551 ... while 15:
552 ... while 16:
553 ... while 17:
554 ... while 18:
555 ... while 19:
556 ... while 20:
557 ... while 21:
558 ... while 22:
559 ... break
560 Traceback (most recent call last):
561 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700562 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000563
Guido van Rossum6cff8742016-09-09 09:36:26 -0700564Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
565
566 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200567 ... print(x)
568 ... global x
569 Traceback (most recent call last):
570 ...
571 SyntaxError: name 'x' is used prior to global declaration
572
573 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700574 ... x = 1
575 ... global x
576 Traceback (most recent call last):
577 ...
578 SyntaxError: name 'x' is assigned to before global declaration
579
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200580 >>> def f(x):
581 ... global x
582 Traceback (most recent call last):
583 ...
584 SyntaxError: name 'x' is parameter and global
585
Guido van Rossum6cff8742016-09-09 09:36:26 -0700586 >>> def f():
587 ... x = 1
588 ... def g():
589 ... print(x)
590 ... nonlocal x
591 Traceback (most recent call last):
592 ...
593 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000594
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300595 >>> def f():
596 ... x = 1
597 ... def g():
598 ... x = 2
599 ... nonlocal x
600 Traceback (most recent call last):
601 ...
602 SyntaxError: name 'x' is assigned to before nonlocal declaration
603
Jeremy Hylton81e95022007-02-27 06:50:52 +0000604 >>> def f(x):
605 ... nonlocal x
606 Traceback (most recent call last):
607 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000608 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000609
Jeremy Hylton81e95022007-02-27 06:50:52 +0000610 >>> def f():
611 ... global x
612 ... nonlocal x
613 Traceback (most recent call last):
614 ...
615 SyntaxError: name 'x' is nonlocal and global
616
617 >>> def f():
618 ... nonlocal x
619 Traceback (most recent call last):
620 ...
621 SyntaxError: no binding for nonlocal 'x' found
622
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000623From SF bug #1705365
624 >>> nonlocal x
625 Traceback (most recent call last):
626 ...
627 SyntaxError: nonlocal declaration not allowed at module level
628
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300629From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600630 >>> class A:
631 ... def f(self):
632 ... nonlocal __x
633 Traceback (most recent call last):
634 ...
635 SyntaxError: no binding for nonlocal '_A__x' found
636
Guido van Rossumd8faa362007-04-27 19:54:29 +0000637
638This tests assignment-context; there was a bug in Python 2.5 where compiling
639a complex 'if' (one with 'elif') would fail to notice an invalid suite,
640leading to spurious errors.
641
642 >>> if 1:
643 ... x() = 1
644 ... elif 1:
645 ... pass
646 Traceback (most recent call last):
647 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200648 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000649
650 >>> if 1:
651 ... pass
652 ... elif 1:
653 ... x() = 1
654 Traceback (most recent call last):
655 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200656 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000657
658 >>> if 1:
659 ... x() = 1
660 ... elif 1:
661 ... pass
662 ... else:
663 ... pass
664 Traceback (most recent call last):
665 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200666 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000667
668 >>> if 1:
669 ... pass
670 ... elif 1:
671 ... x() = 1
672 ... else:
673 ... pass
674 Traceback (most recent call last):
675 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200676 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000677
678 >>> if 1:
679 ... pass
680 ... elif 1:
681 ... pass
682 ... else:
683 ... x() = 1
684 Traceback (most recent call last):
685 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200686 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000687
Collin Winter828f04a2007-08-31 00:04:24 +0000688Make sure that the old "raise X, Y[, Z]" form is gone:
689 >>> raise X, Y
690 Traceback (most recent call last):
691 ...
692 SyntaxError: invalid syntax
693 >>> raise X, Y, Z
694 Traceback (most recent call last):
695 ...
696 SyntaxError: invalid syntax
697
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000698
699>>> f(a=23, a=234)
700Traceback (most recent call last):
701 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100702SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000703
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000704>>> {1, 2, 3} = 42
705Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200706SyntaxError: cannot assign to set display
707
708>>> {1: 2, 3: 4} = 42
709Traceback (most recent call last):
710SyntaxError: cannot assign to dict display
711
712>>> f'{x}' = 42
713Traceback (most recent call last):
714SyntaxError: cannot assign to f-string expression
715
716>>> f'{x}-{y}' = 42
717Traceback (most recent call last):
718SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000719
Pablo Galindo275d7e12020-05-21 22:04:54 +0100720>>> from t import x,
721Traceback (most recent call last):
722SyntaxError: trailing comma not allowed without surrounding parentheses
723
724>>> from t import x,y,
725Traceback (most recent call last):
726SyntaxError: trailing comma not allowed without surrounding parentheses
727
Pablo Galindo102ca522020-06-28 00:40:41 +0100728>>> (): int
729Traceback (most recent call last):
730SyntaxError: only single target (not tuple) can be annotated
731>>> []: int
732Traceback (most recent call last):
733SyntaxError: only single target (not list) can be annotated
734>>> (()): int
735Traceback (most recent call last):
736SyntaxError: only single target (not tuple) can be annotated
737>>> ([]): int
738Traceback (most recent call last):
739SyntaxError: only single target (not list) can be annotated
740
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000741Corner-cases that used to fail to raise the correct error:
742
743 >>> def f(*, x=lambda __debug__:0): pass
744 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200745 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000746
747 >>> def f(*args:(lambda __debug__:0)): pass
748 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200749 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000750
751 >>> def f(**kwargs:(lambda __debug__:0)): pass
752 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200753 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000754
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300755 >>> with (lambda *:0): pass
756 Traceback (most recent call last):
757 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000758
759Corner-cases that used to crash:
760
761 >>> def f(**__debug__): pass
762 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200763 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000764
765 >>> def f(*xx, __debug__): pass
766 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200767 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000768
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300769 >>> import ä £
770 Traceback (most recent call last):
771 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000772"""
773
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000774import re
775import unittest
776
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000777from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000778
779class SyntaxTestCase(unittest.TestCase):
780
781 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200782 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000783 """Check that compiling code raises SyntaxError with errtext.
784
785 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000786 test of the exception raised. If subclass is specified it
787 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000788 """
789 try:
790 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000791 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000792 if subclass and not isinstance(err, subclass):
793 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000794 mo = re.search(errtext, str(err))
795 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700796 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200797 self.assertEqual(err.filename, filename)
798 if lineno is not None:
799 self.assertEqual(err.lineno, lineno)
800 if offset is not None:
801 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000802 else:
803 self.fail("compile() did not raise SyntaxError")
804
805 def test_assign_call(self):
806 self._check_error("f() = 1", "assign")
807
Pablo Galindo16ab0702020-05-15 02:04:52 +0100808 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000809 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700810 self._check_error("del (,)", "invalid syntax")
811 self._check_error("del 1", "delete literal")
812 self._check_error("del (1, 2)", "delete literal")
813 self._check_error("del None", "delete None")
814 self._check_error("del *x", "delete starred")
Lysandros Nikolaoua5442b22020-06-19 03:03:58 +0300815 self._check_error("del (*x)", "use starred expression")
Shantanu27c0d9b2020-05-11 14:53:58 -0700816 self._check_error("del (*x,)", "delete starred")
817 self._check_error("del [*x,]", "delete starred")
818 self._check_error("del f()", "delete function call")
819 self._check_error("del f(a, b)", "delete function call")
820 self._check_error("del o.f()", "delete function call")
821 self._check_error("del a[0]()", "delete function call")
822 self._check_error("del x, f()", "delete function call")
823 self._check_error("del f(), x", "delete function call")
824 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
825 self._check_error("del (a if True else b)", "delete conditional")
826 self._check_error("del +a", "delete operator")
827 self._check_error("del a, +b", "delete operator")
828 self._check_error("del a + b", "delete operator")
829 self._check_error("del (a + b, c)", "delete operator")
830 self._check_error("del (c[0], a + b)", "delete operator")
831 self._check_error("del a.b.c + 2", "delete operator")
832 self._check_error("del a.b.c[0] + 2", "delete operator")
833 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
834 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
835 self._check_error("del (a := 5)", "delete named expression")
836 # We don't have a special message for this, but make sure we don't
837 # report "cannot delete name"
838 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000839
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200840 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000841 source = """if 1:
842 def error(a):
843 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200844 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000845 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200846 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000847 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200848 self._check_error(source, "parameter and global", lineno=3)
849
850 def test_nonlocal_param_err_first(self):
851 source = """if 1:
852 def error(a):
853 nonlocal a # SyntaxError
854 def error2():
855 b = 1
856 global b # SyntaxError
857 """
858 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000859
Neal Norwitzfcf44352005-11-27 20:37:43 +0000860 def test_break_outside_loop(self):
861 self._check_error("break", "outside loop")
862
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100863 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100864 self._check_error("if 0: yield", "outside function")
865 self._check_error("if 0: yield\nelse: x=1", "outside function")
866 self._check_error("if 1: pass\nelse: yield", "outside function")
867 self._check_error("while 0: yield", "outside function")
868 self._check_error("while 0: yield\nelse: x=1", "outside function")
869 self._check_error("class C:\n if 0: yield", "outside function")
870 self._check_error("class C:\n if 1: pass\n else: yield",
871 "outside function")
872 self._check_error("class C:\n while 0: yield", "outside function")
873 self._check_error("class C:\n while 0: yield\n else: x = 1",
874 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100875
876 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100877 self._check_error("if 0: return", "outside function")
878 self._check_error("if 0: return\nelse: x=1", "outside function")
879 self._check_error("if 1: pass\nelse: return", "outside function")
880 self._check_error("while 0: return", "outside function")
881 self._check_error("class C:\n if 0: return", "outside function")
882 self._check_error("class C:\n while 0: return", "outside function")
883 self._check_error("class C:\n while 0: return\n else: x=1",
884 "outside function")
885 self._check_error("class C:\n if 0: return\n else: x= 1",
886 "outside function")
887 self._check_error("class C:\n if 1: pass\n else: return",
888 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100889
890 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100891 self._check_error("if 0: break", "outside loop")
892 self._check_error("if 0: break\nelse: x=1", "outside loop")
893 self._check_error("if 1: pass\nelse: break", "outside loop")
894 self._check_error("class C:\n if 0: break", "outside loop")
895 self._check_error("class C:\n if 1: pass\n else: break",
896 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100897
898 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100899 self._check_error("if 0: continue", "not properly in loop")
900 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
901 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
902 self._check_error("class C:\n if 0: continue", "not properly in loop")
903 self._check_error("class C:\n if 1: pass\n else: continue",
904 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100905
Thomas Wouters477c8d52006-05-27 19:21:47 +0000906 def test_unexpected_indent(self):
907 self._check_error("foo()\n bar()\n", "unexpected indent",
908 subclass=IndentationError)
909
910 def test_no_indent(self):
911 self._check_error("if 1:\nfoo()", "expected an indented block",
912 subclass=IndentationError)
913
914 def test_bad_outdent(self):
915 self._check_error("if 1:\n foo()\n bar()",
916 "unindent does not match .* level",
917 subclass=IndentationError)
918
919 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400920 self._check_error("int(base=10, '2')",
921 "positional argument follows keyword argument")
922
923 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200924 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400925 "positional argument follows "
926 "keyword argument unpacking")
927
928 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200929 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400930 "iterable argument unpacking follows "
931 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932
Miss Islington (bot)e3ce3bb2020-06-10 17:14:16 -0700933 def test_empty_line_after_linecont(self):
934 # See issue-40847
935 s = r"""\
936pass
937 \
938
939pass
940"""
941 try:
942 compile(s, '<string>', 'exec')
943 except SyntaxError:
944 self.fail("Empty line after a line continuation character is valid.")
945
946
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000947def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000948 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000949 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000950 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000951
952if __name__ == "__main__":
953 test_main()