blob: 5d398e6688ba9be747c10ef59075b9db948f9cce [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
128>>> def f(it, *varargs):
129... 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):
Guido van Rossum33d26892007-08-05 15:29:28 +0000135SyntaxError: Generator expression must be parenthesized if not sole argument
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400136>>> f(x for x in L, y for y in L)
137Traceback (most recent call last):
138SyntaxError: Generator expression must be parenthesized if not sole argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000139>>> f((x for x in L), 1)
140[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
141
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200142>>> def g(*args, **kwargs):
143... print(args, sorted(kwargs.items()))
144>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
145... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
146... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
147... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
148... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
149... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
150... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
151... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
152... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
153... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
154... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
155... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
156... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
157... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
158... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
159... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
160... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
161... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
162... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
163... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
164(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000165
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200166>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
167... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
168... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
169... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
170... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
171... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
172... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
173... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
174... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
175... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
176... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
177... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
178... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
179... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
180... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
181... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
182... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
183... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
184... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
185... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
186... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
187... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
188... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
189... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
190... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
191... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
192... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
193... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
194... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
195... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
196... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
197... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
198... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
199... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
200... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
201... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
202... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
203... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
204... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
205... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
206... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
207... # doctest: +ELLIPSIS
208() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000209
Yury Selivanovf2392132016-12-13 19:03:51 -0500210>>> class C:
211... def meth(self, *args):
212... return args
213>>> obj = C()
214>>> obj.meth(
215... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
216... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
217... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
218... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
219... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
220... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
221... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
222... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
223... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
224... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
225... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
226... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
227... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
228... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
229... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
230... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
231... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
232... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
233... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
234... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
235(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
236
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000237>>> f(lambda x: x[0] = 3)
238Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000239SyntaxError: lambda cannot contain assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000240
241The grammar accepts any test (basically, any expression) in the
242keyword slot of a call site. Test a few different options.
243
244>>> f(x()=2)
245Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000246SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000247>>> f(a or b=1)
248Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000249SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000250>>> f(x.y=1)
251Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000252SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000253
254
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000255More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000256
257>>> (x for x in x) += 1
258Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000259SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000260>>> None += 1
261Traceback (most recent call last):
Benjamin Peterson442f2092012-12-06 17:41:04 -0500262SyntaxError: can't assign to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000263>>> f() += 1
264Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000265SyntaxError: can't assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000266
267
268Test continue in finally in weird combinations.
269
Ezio Melotti13925002011-03-16 11:05:33 +0200270continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000271
272 >>> def test():
273 ... try:
274 ... pass
275 ... finally:
276 ... for abc in range(10):
277 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000278 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000279 >>> test()
280 9
281
282Start simple, a continue in a finally should not be allowed.
283
284 >>> def test():
285 ... for abc in range(10):
286 ... try:
287 ... pass
288 ... finally:
289 ... continue
290 Traceback (most recent call last):
291 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000292 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000293
294This is essentially a continue in a finally which should not be allowed.
295
296 >>> def test():
297 ... for abc in range(10):
298 ... try:
299 ... pass
300 ... finally:
301 ... try:
302 ... continue
303 ... except:
304 ... pass
305 Traceback (most recent call last):
306 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000307 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000308
309 >>> def foo():
310 ... try:
311 ... pass
312 ... finally:
313 ... continue
314 Traceback (most recent call last):
315 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000316 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000317
318 >>> def foo():
319 ... for a in ():
320 ... try:
321 ... pass
322 ... finally:
323 ... continue
324 Traceback (most recent call last):
325 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000326 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000327
328 >>> def foo():
329 ... for a in ():
330 ... try:
331 ... pass
332 ... finally:
333 ... try:
334 ... continue
335 ... finally:
336 ... pass
337 Traceback (most recent call last):
338 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000339 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000340
341 >>> def foo():
342 ... for a in ():
343 ... try: pass
344 ... finally:
345 ... try:
346 ... pass
347 ... except:
348 ... continue
349 Traceback (most recent call last):
350 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000351 SyntaxError: 'continue' not supported inside 'finally' clause
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():
403 ... x = 1
404 ... global x
405 Traceback (most recent call last):
406 ...
407 SyntaxError: name 'x' is assigned to before global declaration
408
409 >>> def f():
410 ... x = 1
411 ... def g():
412 ... print(x)
413 ... nonlocal x
414 Traceback (most recent call last):
415 ...
416 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000417
418 >>> def f(x):
419 ... nonlocal x
420 Traceback (most recent call last):
421 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000422 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423
Jeremy Hylton81e95022007-02-27 06:50:52 +0000424 >>> def f():
425 ... global x
426 ... nonlocal x
427 Traceback (most recent call last):
428 ...
429 SyntaxError: name 'x' is nonlocal and global
430
431 >>> def f():
432 ... nonlocal x
433 Traceback (most recent call last):
434 ...
435 SyntaxError: no binding for nonlocal 'x' found
436
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000437From SF bug #1705365
438 >>> nonlocal x
439 Traceback (most recent call last):
440 ...
441 SyntaxError: nonlocal declaration not allowed at module level
442
Jeremy Hylton81e95022007-02-27 06:50:52 +0000443TODO(jhylton): Figure out how to test SyntaxWarning with doctest.
444
445## >>> def f(x):
446## ... def f():
447## ... print(x)
448## ... nonlocal x
449## Traceback (most recent call last):
450## ...
451## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
Guido van Rossumd8faa362007-04-27 19:54:29 +0000452
Jeremy Hylton81e95022007-02-27 06:50:52 +0000453## >>> def f():
454## ... x = 1
455## ... nonlocal x
456## Traceback (most recent call last):
457## ...
458## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
459
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600460 From https://bugs.python.org/issue25973
461 >>> class A:
462 ... def f(self):
463 ... nonlocal __x
464 Traceback (most recent call last):
465 ...
466 SyntaxError: no binding for nonlocal '_A__x' found
467
Guido van Rossumd8faa362007-04-27 19:54:29 +0000468
469This tests assignment-context; there was a bug in Python 2.5 where compiling
470a complex 'if' (one with 'elif') would fail to notice an invalid suite,
471leading to spurious errors.
472
473 >>> if 1:
474 ... x() = 1
475 ... elif 1:
476 ... pass
477 Traceback (most recent call last):
478 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000479 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000480
481 >>> if 1:
482 ... pass
483 ... elif 1:
484 ... x() = 1
485 Traceback (most recent call last):
486 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000487 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000488
489 >>> if 1:
490 ... x() = 1
491 ... elif 1:
492 ... pass
493 ... else:
494 ... pass
495 Traceback (most recent call last):
496 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000497 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000498
499 >>> if 1:
500 ... pass
501 ... elif 1:
502 ... x() = 1
503 ... else:
504 ... pass
505 Traceback (most recent call last):
506 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000507 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000508
509 >>> if 1:
510 ... pass
511 ... elif 1:
512 ... pass
513 ... else:
514 ... x() = 1
515 Traceback (most recent call last):
516 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000517 SyntaxError: can't assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000518
Collin Winter828f04a2007-08-31 00:04:24 +0000519Make sure that the old "raise X, Y[, Z]" form is gone:
520 >>> raise X, Y
521 Traceback (most recent call last):
522 ...
523 SyntaxError: invalid syntax
524 >>> raise X, Y, Z
525 Traceback (most recent call last):
526 ...
527 SyntaxError: invalid syntax
528
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000529
530>>> f(a=23, a=234)
531Traceback (most recent call last):
532 ...
533SyntaxError: keyword argument repeated
534
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000535>>> {1, 2, 3} = 42
536Traceback (most recent call last):
537SyntaxError: can't assign to literal
538
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000539Corner-cases that used to fail to raise the correct error:
540
541 >>> def f(*, x=lambda __debug__:0): pass
542 Traceback (most recent call last):
543 SyntaxError: assignment to keyword
544
545 >>> def f(*args:(lambda __debug__:0)): pass
546 Traceback (most recent call last):
547 SyntaxError: assignment to keyword
548
549 >>> def f(**kwargs:(lambda __debug__:0)): pass
550 Traceback (most recent call last):
551 SyntaxError: assignment to keyword
552
553 >>> with (lambda *:0): pass
554 Traceback (most recent call last):
555 SyntaxError: named arguments must follow bare *
556
557Corner-cases that used to crash:
558
559 >>> def f(**__debug__): pass
560 Traceback (most recent call last):
561 SyntaxError: assignment to keyword
562
563 >>> def f(*xx, __debug__): pass
564 Traceback (most recent call last):
565 SyntaxError: assignment to keyword
566
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000567"""
568
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000569import re
570import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000571import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000572
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000573from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000574
575class SyntaxTestCase(unittest.TestCase):
576
577 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200578 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000579 """Check that compiling code raises SyntaxError with errtext.
580
581 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582 test of the exception raised. If subclass is specified it
583 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000584 """
585 try:
586 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000587 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000588 if subclass and not isinstance(err, subclass):
589 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000590 mo = re.search(errtext, str(err))
591 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000592 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200593 self.assertEqual(err.filename, filename)
594 if lineno is not None:
595 self.assertEqual(err.lineno, lineno)
596 if offset is not None:
597 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000598 else:
599 self.fail("compile() did not raise SyntaxError")
600
601 def test_assign_call(self):
602 self._check_error("f() = 1", "assign")
603
604 def test_assign_del(self):
605 self._check_error("del f()", "delete")
606
Jeremy Hylton42d90162003-07-15 20:24:27 +0000607 def test_global_err_then_warn(self):
Serhiy Storchaka8b583392016-12-11 14:39:01 +0200608 # Bug #763201: The SyntaxError raised for one global statement
Jeremy Hylton42d90162003-07-15 20:24:27 +0000609 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000610 source = """if 1:
611 def error(a):
612 global a # SyntaxError
613 def warning():
614 b = 1
615 global b # SyntaxWarning
616 """
Jeremy Hylton42d90162003-07-15 20:24:27 +0000617 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
618 self._check_error(source, "global")
619 warnings.filters.pop(0)
620
Neal Norwitzfcf44352005-11-27 20:37:43 +0000621 def test_break_outside_loop(self):
622 self._check_error("break", "outside loop")
623
Thomas Wouters477c8d52006-05-27 19:21:47 +0000624 def test_unexpected_indent(self):
625 self._check_error("foo()\n bar()\n", "unexpected indent",
626 subclass=IndentationError)
627
628 def test_no_indent(self):
629 self._check_error("if 1:\nfoo()", "expected an indented block",
630 subclass=IndentationError)
631
632 def test_bad_outdent(self):
633 self._check_error("if 1:\n foo()\n bar()",
634 "unindent does not match .* level",
635 subclass=IndentationError)
636
637 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400638 self._check_error("int(base=10, '2')",
639 "positional argument follows keyword argument")
640
641 def test_kwargs_last2(self):
642 self._check_error("int(**{base: 10}, '2')",
643 "positional argument follows "
644 "keyword argument unpacking")
645
646 def test_kwargs_last3(self):
647 self._check_error("int(**{base: 10}, *['2'])",
648 "iterable argument unpacking follows "
649 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000650
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000651def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000652 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000653 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000654 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000655
656if __name__ == "__main__":
657 test_main()