blob: b231f1ce3c2d8f3db688b643ce547bae2748c213 [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
194>>> with a as b(): pass
195Traceback (most recent call last):
196SyntaxError: cannot assign to function call
197
198>>> with a as (b, c()): 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, d+1): pass
207Traceback (most recent call last):
208SyntaxError: cannot assign to operator
209
210>>> with a as (x, *(y, z.d())): pass
211Traceback (most recent call last):
212SyntaxError: cannot assign to function call
213
214>>> with a as b, c as d(): pass
215Traceback (most recent call last):
216SyntaxError: cannot assign to function call
217
Miss Islington (bot)8df4f392020-06-08 02:22:06 -0700218>>> p = p =
219Traceback (most recent call last):
220SyntaxError: invalid syntax
221
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000222From compiler_complex_args():
223
224>>> def f(None=1):
225... pass
226Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000227SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000228
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000229From ast_for_arguments():
230
231>>> def f(x, y=1, z):
232... pass
233Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000234SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000235
236>>> def f(x, None):
237... pass
238Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000239SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000240
241>>> def f(*None):
242... pass
243Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000244SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000245
246>>> def f(**None):
247... pass
248Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000249SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000250
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300251>>> import ast; ast.parse('''
252... def f(
253... *, # type: int
254... a, # type: int
255... ):
256... pass
257... ''', type_comments=True)
258Traceback (most recent call last):
259SyntaxError: bare * has associated type comment
260
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000261
262From ast_for_funcdef():
263
264>>> def None(x):
265... pass
266Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000267SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000268
269
270From ast_for_call():
271
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200272>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000273... return list(it)
274>>> L = range(10)
275>>> f(x for x in L)
276[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
277>>> f(x for x in L, 1)
278Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200279SyntaxError: Generator expression must be parenthesized
280>>> f(x for x in L, y=1)
281Traceback (most recent call last):
282SyntaxError: Generator expression must be parenthesized
283>>> f(x for x in L, *[])
284Traceback (most recent call last):
285SyntaxError: Generator expression must be parenthesized
286>>> f(x for x in L, **{})
287Traceback (most recent call last):
288SyntaxError: Generator expression must be parenthesized
Miss Islington (bot)55c89232020-05-21 18:14:55 -0700289>>> f(L, x for x in L)
290Traceback (most recent call last):
291SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400292>>> f(x for x in L, y for y in L)
293Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200294SyntaxError: Generator expression must be parenthesized
295>>> f(x for x in L,)
296Traceback (most recent call last):
297SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000298>>> f((x for x in L), 1)
299[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200300>>> class C(x for x in L):
301... pass
302Traceback (most recent call last):
303SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000304
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200305>>> def g(*args, **kwargs):
306... print(args, sorted(kwargs.items()))
307>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
308... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
309... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
310... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
311... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
312... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
313... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
314... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
315... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
316... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
317... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
318... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
319... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
320... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
321... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
322... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
323... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
324... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
325... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
326... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
327(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000328
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200329>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
330... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
331... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
332... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
333... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
334... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
335... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
336... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
337... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
338... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
339... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
340... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
341... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
342... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
343... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
344... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
345... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
346... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
347... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
348... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
349... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
350... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
351... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
352... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
353... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
354... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
355... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
356... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
357... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
358... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
359... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
360... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
361... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
362... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
363... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
364... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
365... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
366... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
367... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
368... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
369... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
370... # doctest: +ELLIPSIS
371() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000372
Yury Selivanovf2392132016-12-13 19:03:51 -0500373>>> class C:
374... def meth(self, *args):
375... return args
376>>> obj = C()
377>>> obj.meth(
378... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
379... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
380... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
381... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
382... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
383... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
384... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
385... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
386... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
387... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
388... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
389... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
390... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
391... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
392... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
393... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
394... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
395... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
396... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
397... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
398(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
399
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100400# >>> f(lambda x: x[0] = 3)
401# Traceback (most recent call last):
402# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403
404The grammar accepts any test (basically, any expression) in the
405keyword slot of a call site. Test a few different options.
406
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100407# >>> f(x()=2)
408# Traceback (most recent call last):
409# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
410# >>> f(a or b=1)
411# Traceback (most recent call last):
412# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
413# >>> f(x.y=1)
414# Traceback (most recent call last):
415# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
416# >>> f((x)=2)
417# Traceback (most recent call last):
418# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
419# >>> f(True=2)
420# Traceback (most recent call last):
421# SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200422>>> f(__debug__=1)
423Traceback (most recent call last):
424SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100425>>> __debug__: int
426Traceback (most recent call last):
427SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428
429
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000430More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000431
432>>> (x for x in x) += 1
433Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100434SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000435>>> None += 1
436Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100437SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200438>>> __debug__ += 1
439Traceback (most recent call last):
440SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000441>>> f() += 1
442Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100443SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444
445
446Test continue in finally in weird combinations.
447
Ezio Melotti13925002011-03-16 11:05:33 +0200448continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000449
450 >>> def test():
451 ... try:
452 ... pass
453 ... finally:
454 ... for abc in range(10):
455 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000456 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 >>> test()
458 9
459
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200460continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461
462 >>> def test():
463 ... for abc in range(10):
464 ... try:
465 ... pass
466 ... finally:
467 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200468 ... print(abc)
469 >>> test()
470 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000471
472 >>> def test():
473 ... for abc in range(10):
474 ... try:
475 ... pass
476 ... finally:
477 ... try:
478 ... continue
479 ... except:
480 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200481 ... print(abc)
482 >>> test()
483 9
484
485 >>> def test():
486 ... for abc in range(10):
487 ... try:
488 ... pass
489 ... finally:
490 ... try:
491 ... pass
492 ... except:
493 ... continue
494 ... print(abc)
495 >>> test()
496 9
497
498A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000499
500 >>> def foo():
501 ... try:
502 ... pass
503 ... finally:
504 ... continue
505 Traceback (most recent call last):
506 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200507 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508
509There is one test for a break that is not in a loop. The compiler
510uses a single data structure to keep track of try-finally and loops,
511so we need to be sure that a break is actually inside a loop. If it
512isn't, there should be a syntax error.
513
514 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000515 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000516 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000517 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000519 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 Traceback (most recent call last):
521 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000522 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523
Benjamin Petersone09ed542016-07-14 22:00:03 -0700524This raises a SyntaxError, it used to raise a SystemError.
525Context for this change can be found on issue #27514
526
Thomas Wouters89f507f2006-12-13 04:49:30 +0000527In 2.5 there was a missing exception and an assert was triggered in a debug
528build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
529
530 >>> while 1:
531 ... while 2:
532 ... while 3:
533 ... while 4:
534 ... while 5:
535 ... while 6:
536 ... while 8:
537 ... while 9:
538 ... while 10:
539 ... while 11:
540 ... while 12:
541 ... while 13:
542 ... while 14:
543 ... while 15:
544 ... while 16:
545 ... while 17:
546 ... while 18:
547 ... while 19:
548 ... while 20:
549 ... while 21:
550 ... while 22:
551 ... break
552 Traceback (most recent call last):
553 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700554 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000555
Guido van Rossum6cff8742016-09-09 09:36:26 -0700556Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
557
558 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200559 ... print(x)
560 ... global x
561 Traceback (most recent call last):
562 ...
563 SyntaxError: name 'x' is used prior to global declaration
564
565 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700566 ... x = 1
567 ... global x
568 Traceback (most recent call last):
569 ...
570 SyntaxError: name 'x' is assigned to before global declaration
571
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200572 >>> def f(x):
573 ... global x
574 Traceback (most recent call last):
575 ...
576 SyntaxError: name 'x' is parameter and global
577
Guido van Rossum6cff8742016-09-09 09:36:26 -0700578 >>> def f():
579 ... x = 1
580 ... def g():
581 ... print(x)
582 ... nonlocal x
583 Traceback (most recent call last):
584 ...
585 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000586
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300587 >>> def f():
588 ... x = 1
589 ... def g():
590 ... x = 2
591 ... nonlocal x
592 Traceback (most recent call last):
593 ...
594 SyntaxError: name 'x' is assigned to before nonlocal declaration
595
Jeremy Hylton81e95022007-02-27 06:50:52 +0000596 >>> def f(x):
597 ... nonlocal x
598 Traceback (most recent call last):
599 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000601
Jeremy Hylton81e95022007-02-27 06:50:52 +0000602 >>> def f():
603 ... global x
604 ... nonlocal x
605 Traceback (most recent call last):
606 ...
607 SyntaxError: name 'x' is nonlocal and global
608
609 >>> def f():
610 ... nonlocal x
611 Traceback (most recent call last):
612 ...
613 SyntaxError: no binding for nonlocal 'x' found
614
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000615From SF bug #1705365
616 >>> nonlocal x
617 Traceback (most recent call last):
618 ...
619 SyntaxError: nonlocal declaration not allowed at module level
620
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300621From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600622 >>> class A:
623 ... def f(self):
624 ... nonlocal __x
625 Traceback (most recent call last):
626 ...
627 SyntaxError: no binding for nonlocal '_A__x' found
628
Guido van Rossumd8faa362007-04-27 19:54:29 +0000629
630This tests assignment-context; there was a bug in Python 2.5 where compiling
631a complex 'if' (one with 'elif') would fail to notice an invalid suite,
632leading to spurious errors.
633
634 >>> if 1:
635 ... x() = 1
636 ... elif 1:
637 ... pass
638 Traceback (most recent call last):
639 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200640 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000641
642 >>> if 1:
643 ... pass
644 ... elif 1:
645 ... x() = 1
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 ... x() = 1
652 ... elif 1:
653 ... pass
654 ... else:
655 ... pass
656 Traceback (most recent call last):
657 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200658 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000659
660 >>> if 1:
661 ... pass
662 ... elif 1:
663 ... x() = 1
664 ... else:
665 ... pass
666 Traceback (most recent call last):
667 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200668 SyntaxError: cannot assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000669
670 >>> if 1:
671 ... pass
672 ... elif 1:
673 ... pass
674 ... else:
675 ... x() = 1
676 Traceback (most recent call last):
677 ...
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200678 SyntaxError: cannot assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000679
Collin Winter828f04a2007-08-31 00:04:24 +0000680Make sure that the old "raise X, Y[, Z]" form is gone:
681 >>> raise X, Y
682 Traceback (most recent call last):
683 ...
684 SyntaxError: invalid syntax
685 >>> raise X, Y, Z
686 Traceback (most recent call last):
687 ...
688 SyntaxError: invalid syntax
689
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000690
691>>> f(a=23, a=234)
692Traceback (most recent call last):
693 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100694SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000695
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000696>>> {1, 2, 3} = 42
697Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200698SyntaxError: cannot assign to set display
699
700>>> {1: 2, 3: 4} = 42
701Traceback (most recent call last):
702SyntaxError: cannot assign to dict display
703
704>>> f'{x}' = 42
705Traceback (most recent call last):
706SyntaxError: cannot assign to f-string expression
707
708>>> f'{x}-{y}' = 42
709Traceback (most recent call last):
710SyntaxError: cannot assign to f-string expression
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000711
Pablo Galindo275d7e12020-05-21 22:04:54 +0100712>>> from t import x,
713Traceback (most recent call last):
714SyntaxError: trailing comma not allowed without surrounding parentheses
715
716>>> from t import x,y,
717Traceback (most recent call last):
718SyntaxError: trailing comma not allowed without surrounding parentheses
719
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000720Corner-cases that used to fail to raise the correct error:
721
722 >>> def f(*, x=lambda __debug__:0): pass
723 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200724 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000725
726 >>> def f(*args:(lambda __debug__:0)): pass
727 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200728 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000729
730 >>> def f(**kwargs:(lambda __debug__:0)): pass
731 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200732 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000733
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +0300734 >>> with (lambda *:0): pass
735 Traceback (most recent call last):
736 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000737
738Corner-cases that used to crash:
739
740 >>> def f(**__debug__): pass
741 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200742 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000743
744 >>> def f(*xx, __debug__): pass
745 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200746 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000747
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +0300748 >>> import ä £
749 Traceback (most recent call last):
750 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000751"""
752
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000753import re
754import unittest
755
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000756from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000757
758class SyntaxTestCase(unittest.TestCase):
759
760 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200761 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000762 """Check that compiling code raises SyntaxError with errtext.
763
764 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000765 test of the exception raised. If subclass is specified it
766 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000767 """
768 try:
769 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000770 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000771 if subclass and not isinstance(err, subclass):
772 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000773 mo = re.search(errtext, str(err))
774 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -0700775 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200776 self.assertEqual(err.filename, filename)
777 if lineno is not None:
778 self.assertEqual(err.lineno, lineno)
779 if offset is not None:
780 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000781 else:
782 self.fail("compile() did not raise SyntaxError")
783
784 def test_assign_call(self):
785 self._check_error("f() = 1", "assign")
786
Pablo Galindo16ab0702020-05-15 02:04:52 +0100787 @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000788 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -0700789 self._check_error("del (,)", "invalid syntax")
790 self._check_error("del 1", "delete literal")
791 self._check_error("del (1, 2)", "delete literal")
792 self._check_error("del None", "delete None")
793 self._check_error("del *x", "delete starred")
Lysandros Nikolaoua5442b22020-06-19 03:03:58 +0300794 self._check_error("del (*x)", "use starred expression")
Shantanu27c0d9b2020-05-11 14:53:58 -0700795 self._check_error("del (*x,)", "delete starred")
796 self._check_error("del [*x,]", "delete starred")
797 self._check_error("del f()", "delete function call")
798 self._check_error("del f(a, b)", "delete function call")
799 self._check_error("del o.f()", "delete function call")
800 self._check_error("del a[0]()", "delete function call")
801 self._check_error("del x, f()", "delete function call")
802 self._check_error("del f(), x", "delete function call")
803 self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call")
804 self._check_error("del (a if True else b)", "delete conditional")
805 self._check_error("del +a", "delete operator")
806 self._check_error("del a, +b", "delete operator")
807 self._check_error("del a + b", "delete operator")
808 self._check_error("del (a + b, c)", "delete operator")
809 self._check_error("del (c[0], a + b)", "delete operator")
810 self._check_error("del a.b.c + 2", "delete operator")
811 self._check_error("del a.b.c[0] + 2", "delete operator")
812 self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator")
813 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator")
814 self._check_error("del (a := 5)", "delete named expression")
815 # We don't have a special message for this, but make sure we don't
816 # report "cannot delete name"
817 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000818
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200819 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000820 source = """if 1:
821 def error(a):
822 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200823 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000824 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200825 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000826 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200827 self._check_error(source, "parameter and global", lineno=3)
828
829 def test_nonlocal_param_err_first(self):
830 source = """if 1:
831 def error(a):
832 nonlocal a # SyntaxError
833 def error2():
834 b = 1
835 global b # SyntaxError
836 """
837 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000838
Neal Norwitzfcf44352005-11-27 20:37:43 +0000839 def test_break_outside_loop(self):
840 self._check_error("break", "outside loop")
841
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100842 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100843 self._check_error("if 0: yield", "outside function")
844 self._check_error("if 0: yield\nelse: x=1", "outside function")
845 self._check_error("if 1: pass\nelse: yield", "outside function")
846 self._check_error("while 0: yield", "outside function")
847 self._check_error("while 0: yield\nelse: x=1", "outside function")
848 self._check_error("class C:\n if 0: yield", "outside function")
849 self._check_error("class C:\n if 1: pass\n else: yield",
850 "outside function")
851 self._check_error("class C:\n while 0: yield", "outside function")
852 self._check_error("class C:\n while 0: yield\n else: x = 1",
853 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100854
855 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100856 self._check_error("if 0: return", "outside function")
857 self._check_error("if 0: return\nelse: x=1", "outside function")
858 self._check_error("if 1: pass\nelse: return", "outside function")
859 self._check_error("while 0: return", "outside function")
860 self._check_error("class C:\n if 0: return", "outside function")
861 self._check_error("class C:\n while 0: return", "outside function")
862 self._check_error("class C:\n while 0: return\n else: x=1",
863 "outside function")
864 self._check_error("class C:\n if 0: return\n else: x= 1",
865 "outside function")
866 self._check_error("class C:\n if 1: pass\n else: return",
867 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100868
869 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100870 self._check_error("if 0: break", "outside loop")
871 self._check_error("if 0: break\nelse: x=1", "outside loop")
872 self._check_error("if 1: pass\nelse: break", "outside loop")
873 self._check_error("class C:\n if 0: break", "outside loop")
874 self._check_error("class C:\n if 1: pass\n else: break",
875 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100876
877 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100878 self._check_error("if 0: continue", "not properly in loop")
879 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
880 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
881 self._check_error("class C:\n if 0: continue", "not properly in loop")
882 self._check_error("class C:\n if 1: pass\n else: continue",
883 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +0100884
Thomas Wouters477c8d52006-05-27 19:21:47 +0000885 def test_unexpected_indent(self):
886 self._check_error("foo()\n bar()\n", "unexpected indent",
887 subclass=IndentationError)
888
889 def test_no_indent(self):
890 self._check_error("if 1:\nfoo()", "expected an indented block",
891 subclass=IndentationError)
892
893 def test_bad_outdent(self):
894 self._check_error("if 1:\n foo()\n bar()",
895 "unindent does not match .* level",
896 subclass=IndentationError)
897
898 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400899 self._check_error("int(base=10, '2')",
900 "positional argument follows keyword argument")
901
902 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200903 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400904 "positional argument follows "
905 "keyword argument unpacking")
906
907 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200908 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400909 "iterable argument unpacking follows "
910 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000911
Miss Islington (bot)e3ce3bb2020-06-10 17:14:16 -0700912 def test_empty_line_after_linecont(self):
913 # See issue-40847
914 s = r"""\
915pass
916 \
917
918pass
919"""
920 try:
921 compile(s, '<string>', 'exec')
922 except SyntaxError:
923 self.fail("Empty line after a line continuation character is valid.")
924
925
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000926def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000927 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000928 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000929 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000930
931if __name__ == "__main__":
932 test_main()