blob: c5b2496e010d18903047163fef59e6ad9e76b57b [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):
Benjamin Peterson442f2092012-12-06 17:41:04 -050036SyntaxError: can't assign to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +000037
Jeremy Hyltonc960f262006-01-27 15:18:39 +000038>>> f() = 1
39Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000040SyntaxError: can't assign to function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000041
42>>> del f()
43Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000044SyntaxError: can't delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000045
46>>> a + 1 = 2
47Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000048SyntaxError: can't assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000049
50>>> (x for x in x) = 1
51Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000052SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000053
54>>> 1 = 1
55Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000056SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000057
58>>> "abc" = 1
59Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000060SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000061
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050062>>> b"" = 1
63Traceback (most recent call last):
64SyntaxError: can't assign to literal
65
Jeremy Hyltonc960f262006-01-27 15:18:39 +000066>>> `1` = 1
67Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +000068SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000069
70If the left-hand side of an assignment is a list or tuple, an illegal
71expression inside that contain should still cause a syntax error.
72This test just checks a couple of cases rather than enumerating all of
73them.
74
75>>> (a, "b", c) = (1, 2, 3)
76Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000077SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000078
79>>> [a, b, c + 1] = [1, 2, 3]
80Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000081SyntaxError: can't assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000082
Thomas Wouters477c8d52006-05-27 19:21:47 +000083>>> a if 1 else b = 1
84Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000085SyntaxError: can't assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000086
87From compiler_complex_args():
88
89>>> def f(None=1):
90... pass
91Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000092SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000093
94
95From ast_for_arguments():
96
97>>> def f(x, y=1, z):
98... pass
99Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000100SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000101
102>>> def f(x, None):
103... pass
104Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000105SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000106
107>>> def f(*None):
108... pass
109Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000110SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000111
112>>> def f(**None):
113... pass
114Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000115SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000116
117
118From ast_for_funcdef():
119
120>>> def None(x):
121... pass
122Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000123SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000124
125
126From ast_for_call():
127
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200128>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000129... return list(it)
130>>> L = range(10)
131>>> f(x for x in L)
132[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
133>>> f(x for x in L, 1)
134Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200135SyntaxError: Generator expression must be parenthesized
136>>> f(x for x in L, y=1)
137Traceback (most recent call last):
138SyntaxError: Generator expression must be parenthesized
139>>> f(x for x in L, *[])
140Traceback (most recent call last):
141SyntaxError: Generator expression must be parenthesized
142>>> f(x for x in L, **{})
143Traceback (most recent call last):
144SyntaxError: Generator expression must be parenthesized
145>>> f(L, x for x in L)
146Traceback (most recent call last):
147SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400148>>> f(x for x in L, y for y in L)
149Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200150SyntaxError: Generator expression must be parenthesized
151>>> f(x for x in L,)
152Traceback (most recent call last):
153SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000154>>> f((x for x in L), 1)
155[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200156>>> class C(x for x in L):
157... pass
158Traceback (most recent call last):
159SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000160
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200161>>> def g(*args, **kwargs):
162... print(args, sorted(kwargs.items()))
163>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
164... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
165... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
166... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
167... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
168... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
169... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
170... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
171... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
172... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
173... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
174... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
175... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
176... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
177... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
178... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
179... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
180... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
181... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
182... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
183(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000184
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200185>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
186... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
187... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
188... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
189... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
190... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
191... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
192... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
193... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
194... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
195... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
196... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
197... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
198... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
199... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
200... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
201... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
202... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
203... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
204... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
205... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
206... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
207... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
208... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
209... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
210... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
211... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
212... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
213... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
214... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
215... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
216... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
217... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
218... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
219... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
220... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
221... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
222... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
223... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
224... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
225... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
226... # doctest: +ELLIPSIS
227() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000228
Yury Selivanovf2392132016-12-13 19:03:51 -0500229>>> class C:
230... def meth(self, *args):
231... return args
232>>> obj = C()
233>>> obj.meth(
234... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
235... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
236... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
237... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
238... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
239... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
240... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
241... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
242... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
243... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
244... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
245... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
246... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
247... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
248... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
249... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
250... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
251... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
252... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
253... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
254(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
255
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000256>>> f(lambda x: x[0] = 3)
257Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000258SyntaxError: lambda cannot contain assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000259
260The grammar accepts any test (basically, any expression) in the
261keyword slot of a call site. Test a few different options.
262
263>>> f(x()=2)
264Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000265SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000266>>> f(a or b=1)
267Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000268SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000269>>> f(x.y=1)
270Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000271SyntaxError: keyword can't be an expression
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -0700272>>> f((x)=2)
273Traceback (most recent call last):
274SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000275
276
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000277More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000278
279>>> (x for x in x) += 1
280Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000281SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000282>>> None += 1
283Traceback (most recent call last):
Benjamin Peterson442f2092012-12-06 17:41:04 -0500284SyntaxError: can't assign to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000285>>> f() += 1
286Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000287SyntaxError: can't assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000288
289
290Test continue in finally in weird combinations.
291
Ezio Melotti13925002011-03-16 11:05:33 +0200292continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000293
294 >>> def test():
295 ... try:
296 ... pass
297 ... finally:
298 ... for abc in range(10):
299 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000300 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000301 >>> test()
302 9
303
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200304continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000305
306 >>> def test():
307 ... for abc in range(10):
308 ... try:
309 ... pass
310 ... finally:
311 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200312 ... print(abc)
313 >>> test()
314 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000315
316 >>> def test():
317 ... for abc in range(10):
318 ... try:
319 ... pass
320 ... finally:
321 ... try:
322 ... continue
323 ... except:
324 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200325 ... print(abc)
326 >>> test()
327 9
328
329 >>> def test():
330 ... for abc in range(10):
331 ... try:
332 ... pass
333 ... finally:
334 ... try:
335 ... pass
336 ... except:
337 ... continue
338 ... print(abc)
339 >>> test()
340 9
341
342A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000343
344 >>> def foo():
345 ... try:
346 ... pass
347 ... finally:
348 ... continue
349 Traceback (most recent call last):
350 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200351 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000352
353There is one test for a break that is not in a loop. The compiler
354uses a single data structure to keep track of try-finally and loops,
355so we need to be sure that a break is actually inside a loop. If it
356isn't, there should be a syntax error.
357
358 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000359 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000360 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000361 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000362 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000363 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000364 Traceback (most recent call last):
365 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000366 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000367
Benjamin Petersone09ed542016-07-14 22:00:03 -0700368This raises a SyntaxError, it used to raise a SystemError.
369Context for this change can be found on issue #27514
370
Thomas Wouters89f507f2006-12-13 04:49:30 +0000371In 2.5 there was a missing exception and an assert was triggered in a debug
372build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
373
374 >>> while 1:
375 ... while 2:
376 ... while 3:
377 ... while 4:
378 ... while 5:
379 ... while 6:
380 ... while 8:
381 ... while 9:
382 ... while 10:
383 ... while 11:
384 ... while 12:
385 ... while 13:
386 ... while 14:
387 ... while 15:
388 ... while 16:
389 ... while 17:
390 ... while 18:
391 ... while 19:
392 ... while 20:
393 ... while 21:
394 ... while 22:
395 ... break
396 Traceback (most recent call last):
397 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700398 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000399
Guido van Rossum6cff8742016-09-09 09:36:26 -0700400Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
401
402 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200403 ... print(x)
404 ... global x
405 Traceback (most recent call last):
406 ...
407 SyntaxError: name 'x' is used prior to global declaration
408
409 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700410 ... x = 1
411 ... global x
412 Traceback (most recent call last):
413 ...
414 SyntaxError: name 'x' is assigned to before global declaration
415
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200416 >>> def f(x):
417 ... global x
418 Traceback (most recent call last):
419 ...
420 SyntaxError: name 'x' is parameter and global
421
Guido van Rossum6cff8742016-09-09 09:36:26 -0700422 >>> def f():
423 ... x = 1
424 ... def g():
425 ... print(x)
426 ... nonlocal x
427 Traceback (most recent call last):
428 ...
429 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000430
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300431 >>> def f():
432 ... x = 1
433 ... def g():
434 ... x = 2
435 ... nonlocal x
436 Traceback (most recent call last):
437 ...
438 SyntaxError: name 'x' is assigned to before nonlocal declaration
439
Jeremy Hylton81e95022007-02-27 06:50:52 +0000440 >>> def f(x):
441 ... nonlocal x
442 Traceback (most recent call last):
443 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000444 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000445
Jeremy Hylton81e95022007-02-27 06:50:52 +0000446 >>> def f():
447 ... global x
448 ... nonlocal x
449 Traceback (most recent call last):
450 ...
451 SyntaxError: name 'x' is nonlocal and global
452
453 >>> def f():
454 ... nonlocal x
455 Traceback (most recent call last):
456 ...
457 SyntaxError: no binding for nonlocal 'x' found
458
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000459From SF bug #1705365
460 >>> nonlocal x
461 Traceback (most recent call last):
462 ...
463 SyntaxError: nonlocal declaration not allowed at module level
464
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300465From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600466 >>> class A:
467 ... def f(self):
468 ... nonlocal __x
469 Traceback (most recent call last):
470 ...
471 SyntaxError: no binding for nonlocal '_A__x' found
472
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473
474This tests assignment-context; there was a bug in Python 2.5 where compiling
475a complex 'if' (one with 'elif') would fail to notice an invalid suite,
476leading to spurious errors.
477
478 >>> if 1:
479 ... x() = 1
480 ... elif 1:
481 ... pass
482 Traceback (most recent call last):
483 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000484 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000485
486 >>> if 1:
487 ... pass
488 ... elif 1:
489 ... x() = 1
490 Traceback (most recent call last):
491 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000492 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000493
494 >>> if 1:
495 ... x() = 1
496 ... elif 1:
497 ... pass
498 ... else:
499 ... pass
500 Traceback (most recent call last):
501 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000502 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503
504 >>> if 1:
505 ... pass
506 ... elif 1:
507 ... x() = 1
508 ... else:
509 ... pass
510 Traceback (most recent call last):
511 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000512 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000513
514 >>> if 1:
515 ... pass
516 ... elif 1:
517 ... pass
518 ... else:
519 ... x() = 1
520 Traceback (most recent call last):
521 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000522 SyntaxError: can't assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000523
Collin Winter828f04a2007-08-31 00:04:24 +0000524Make sure that the old "raise X, Y[, Z]" form is gone:
525 >>> raise X, Y
526 Traceback (most recent call last):
527 ...
528 SyntaxError: invalid syntax
529 >>> raise X, Y, Z
530 Traceback (most recent call last):
531 ...
532 SyntaxError: invalid syntax
533
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000534
535>>> f(a=23, a=234)
536Traceback (most recent call last):
537 ...
538SyntaxError: keyword argument repeated
539
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000540>>> {1, 2, 3} = 42
541Traceback (most recent call last):
542SyntaxError: can't assign to literal
543
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000544Corner-cases that used to fail to raise the correct error:
545
546 >>> def f(*, x=lambda __debug__:0): pass
547 Traceback (most recent call last):
548 SyntaxError: assignment to keyword
549
550 >>> def f(*args:(lambda __debug__:0)): pass
551 Traceback (most recent call last):
552 SyntaxError: assignment to keyword
553
554 >>> def f(**kwargs:(lambda __debug__:0)): pass
555 Traceback (most recent call last):
556 SyntaxError: assignment to keyword
557
558 >>> with (lambda *:0): pass
559 Traceback (most recent call last):
560 SyntaxError: named arguments must follow bare *
561
562Corner-cases that used to crash:
563
564 >>> def f(**__debug__): pass
565 Traceback (most recent call last):
566 SyntaxError: assignment to keyword
567
568 >>> def f(*xx, __debug__): pass
569 Traceback (most recent call last):
570 SyntaxError: assignment to keyword
571
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000572"""
573
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000574import re
575import unittest
576
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000577from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000578
579class SyntaxTestCase(unittest.TestCase):
580
581 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200582 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000583 """Check that compiling code raises SyntaxError with errtext.
584
585 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000586 test of the exception raised. If subclass is specified it
587 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000588 """
589 try:
590 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000591 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 if subclass and not isinstance(err, subclass):
593 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000594 mo = re.search(errtext, str(err))
595 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000596 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200597 self.assertEqual(err.filename, filename)
598 if lineno is not None:
599 self.assertEqual(err.lineno, lineno)
600 if offset is not None:
601 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000602 else:
603 self.fail("compile() did not raise SyntaxError")
604
605 def test_assign_call(self):
606 self._check_error("f() = 1", "assign")
607
608 def test_assign_del(self):
609 self._check_error("del f()", "delete")
610
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200611 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000612 source = """if 1:
613 def error(a):
614 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200615 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000616 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200617 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000618 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200619 self._check_error(source, "parameter and global", lineno=3)
620
621 def test_nonlocal_param_err_first(self):
622 source = """if 1:
623 def error(a):
624 nonlocal a # SyntaxError
625 def error2():
626 b = 1
627 global b # SyntaxError
628 """
629 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +0000630
Neal Norwitzfcf44352005-11-27 20:37:43 +0000631 def test_break_outside_loop(self):
632 self._check_error("break", "outside loop")
633
Thomas Wouters477c8d52006-05-27 19:21:47 +0000634 def test_unexpected_indent(self):
635 self._check_error("foo()\n bar()\n", "unexpected indent",
636 subclass=IndentationError)
637
638 def test_no_indent(self):
639 self._check_error("if 1:\nfoo()", "expected an indented block",
640 subclass=IndentationError)
641
642 def test_bad_outdent(self):
643 self._check_error("if 1:\n foo()\n bar()",
644 "unindent does not match .* level",
645 subclass=IndentationError)
646
647 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400648 self._check_error("int(base=10, '2')",
649 "positional argument follows keyword argument")
650
651 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200652 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400653 "positional argument follows "
654 "keyword argument unpacking")
655
656 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +0200657 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400658 "iterable argument unpacking follows "
659 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000660
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000661def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000662 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000663 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000664 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000665
666if __name__ == "__main__":
667 test_main()