• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""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):
8SyntaxError: name 'x' is local and global (<doctest test.test_syntax[0]>, line 1)
9
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
30>>> obj.None = 1
31Traceback (most recent call last):
32  File "<doctest test.test_syntax[1]>", line 1
33SyntaxError: cannot assign to None
34
35>>> None = 1
36Traceback (most recent call last):
37  File "<doctest test.test_syntax[2]>", line 1
38SyntaxError: cannot assign to None
39
40It's a syntax error to assign to the empty tuple.  Why isn't it an
41error to assign to the empty list?  It will always raise some error at
42runtime.
43
44>>> () = 1
45Traceback (most recent call last):
46  File "<doctest test.test_syntax[3]>", line 1
47SyntaxError: can't assign to ()
48
49>>> f() = 1
50Traceback (most recent call last):
51  File "<doctest test.test_syntax[4]>", line 1
52SyntaxError: can't assign to function call
53
54>>> del f()
55Traceback (most recent call last):
56  File "<doctest test.test_syntax[5]>", line 1
57SyntaxError: can't delete function call
58
59>>> a + 1 = 2
60Traceback (most recent call last):
61  File "<doctest test.test_syntax[6]>", line 1
62SyntaxError: can't assign to operator
63
64>>> (x for x in x) = 1
65Traceback (most recent call last):
66  File "<doctest test.test_syntax[7]>", line 1
67SyntaxError: can't assign to generator expression
68
69>>> 1 = 1
70Traceback (most recent call last):
71  File "<doctest test.test_syntax[8]>", line 1
72SyntaxError: can't assign to literal
73
74>>> "abc" = 1
75Traceback (most recent call last):
76  File "<doctest test.test_syntax[9]>", line 1
77SyntaxError: can't assign to literal
78
79>>> b"" = 1
80Traceback (most recent call last):
81SyntaxError: can't assign to literal
82
83If the left-hand side of an assignment is a list or tuple, an illegal
84expression inside that contain should still cause a syntax error.
85This test just checks a couple of cases rather than enumerating all of
86them.
87
88>>> (a, "b", c) = (1, 2, 3)
89Traceback (most recent call last):
90  File "<doctest test.test_syntax[11]>", line 1
91SyntaxError: can't assign to literal
92
93>>> [a, b, c + 1] = [1, 2, 3]
94Traceback (most recent call last):
95  File "<doctest test.test_syntax[12]>", line 1
96SyntaxError: can't assign to operator
97
98>>> a if 1 else b = 1
99Traceback (most recent call last):
100  File "<doctest test.test_syntax[13]>", line 1
101SyntaxError: can't assign to conditional expression
102
103From compiler_complex_args():
104
105>>> def f(None=1):
106...     pass
107Traceback (most recent call last):
108  File "<doctest test.test_syntax[14]>", line 1
109SyntaxError: cannot assign to None
110
111
112From ast_for_arguments():
113
114>>> def f(x, y=1, z):
115...     pass
116Traceback (most recent call last):
117  File "<doctest test.test_syntax[15]>", line 1
118SyntaxError: non-default argument follows default argument
119
120>>> def f(x, None):
121...     pass
122Traceback (most recent call last):
123  File "<doctest test.test_syntax[16]>", line 1
124SyntaxError: cannot assign to None
125
126>>> def f(*None):
127...     pass
128Traceback (most recent call last):
129  File "<doctest test.test_syntax[17]>", line 1
130SyntaxError: cannot assign to None
131
132>>> def f(**None):
133...     pass
134Traceback (most recent call last):
135  File "<doctest test.test_syntax[18]>", line 1
136SyntaxError: cannot assign to None
137
138
139From ast_for_funcdef():
140
141>>> def None(x):
142...     pass
143Traceback (most recent call last):
144  File "<doctest test.test_syntax[19]>", line 1
145SyntaxError: cannot assign to None
146
147
148From ast_for_call():
149
150>>> def f(it, *varargs, **kwargs):
151...     return list(it)
152>>> L = range(10)
153>>> f(x for x in L)
154[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
155>>> f(x for x in L, 1)
156Traceback (most recent call last):
157  File "<doctest test.test_syntax[23]>", line 1
158SyntaxError: Generator expression must be parenthesized if not sole argument
159>>> f(x for x in L, y=1)
160Traceback (most recent call last):
161SyntaxError: Generator expression must be parenthesized if not sole argument
162>>> f(L, x for x in L)
163Traceback (most recent call last):
164SyntaxError: Generator expression must be parenthesized if not sole argument
165>>> f(x for x in L, y for y in L)
166Traceback (most recent call last):
167SyntaxError: Generator expression must be parenthesized if not sole argument
168>>> f(x for x in L,)
169[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
170>>> f((x for x in L), 1)
171[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
172
173>>> def g(*args, **kwargs):
174...     print args, sorted(kwargs.items())
175>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
176...   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
177...   38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
178...   56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
179...   74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
180...   92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
181...   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
182...   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
183...   136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
184...   150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
185...   164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
186...   178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
187...   192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
188...   206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
189...   220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
190...   234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
191...   248, 249, 250, 251, 252, 253, 254)  # doctest: +ELLIPSIS
192(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 252, 253, 254) []
193>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
194...   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
195...   38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
196...   56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
197...   74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
198...   92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
199...   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
200...   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
201...   136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
202...   150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
203...   164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
204...   178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
205...   192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
206...   206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
207...   220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
208...   234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
209...   248, 249, 250, 251, 252, 253, 254, 255)
210Traceback (most recent call last):
211  File "<doctest test.test_syntax[25]>", line 1
212SyntaxError: more than 255 arguments
213
214>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
215...   a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
216...   a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
217...   a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
218...   a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
219...   a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
220...   a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
221...   a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
222...   a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
223...   a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
224...   a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
225...   a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
226...   a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
227...   a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
228...   a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
229...   a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
230...   a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
231...   a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
232...   a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
233...   a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
234...   a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
235...   a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
236...   a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
237...   a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
238...   a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
239...   a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
240...   a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
241...   a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
242...   a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
243...   a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
244...   a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
245...   a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
246...   a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
247...   a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
248...   a251=251, a252=252, a253=253, a254=254)  # doctest: +ELLIPSIS
249() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a253', 253), ('a254', 254)]
250>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
251...   a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
252...   a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
253...   a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
254...   a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
255...   a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
256...   a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
257...   a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
258...   a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
259...   a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
260...   a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
261...   a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
262...   a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
263...   a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
264...   a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
265...   a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
266...   a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
267...   a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
268...   a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
269...   a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
270...   a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
271...   a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
272...   a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
273...   a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
274...   a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
275...   a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
276...   a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
277...   a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
278...   a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
279...   a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
280...   a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
281...   a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
282...   a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
283...   a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
284...   a251=251, a252=252, a253=253, a254=254, a255=255)
285Traceback (most recent call last):
286  File "<doctest test.test_syntax[35]>", line 1
287SyntaxError: more than 255 arguments
288
289>>> class C:
290...     def meth(self, *args):
291...         return args
292>>> obj = C()
293>>> obj.meth(
294...   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
295...   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
296...   38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
297...   56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
298...   74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
299...   92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
300...   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
301...   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
302...   136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
303...   150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
304...   164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
305...   178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
306...   192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
307...   206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
308...   220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
309...   234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
310...   248, 249, 250, 251, 252, 253, 254)  # doctest: +ELLIPSIS
311(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 252, 253, 254)
312>>> obj.meth(
313...   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
314...   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
315...   38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
316...   56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
317...   74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
318...   92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
319...   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
320...   122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
321...   136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
322...   150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
323...   164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
324...   178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
325...   192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
326...   206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
327...   220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
328...   234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
329...   248, 249, 250, 251, 252, 253, 254, 255)
330Traceback (most recent call last):
331  File "<doctest test.test_syntax[38]>", line 1
332SyntaxError: more than 255 arguments
333
334>>> f(lambda x: x[0] = 3)
335Traceback (most recent call last):
336  File "<doctest test.test_syntax[27]>", line 1
337SyntaxError: lambda cannot contain assignment
338
339The grammar accepts any test (basically, any expression) in the
340keyword slot of a call site.  Test a few different options.
341
342>>> f(x()=2)
343Traceback (most recent call last):
344  File "<doctest test.test_syntax[28]>", line 1
345SyntaxError: keyword can't be an expression
346>>> f(a or b=1)
347Traceback (most recent call last):
348  File "<doctest test.test_syntax[29]>", line 1
349SyntaxError: keyword can't be an expression
350>>> f(x.y=1)
351Traceback (most recent call last):
352  File "<doctest test.test_syntax[30]>", line 1
353SyntaxError: keyword can't be an expression
354
355
356More set_context():
357
358>>> (x for x in x) += 1
359Traceback (most recent call last):
360  File "<doctest test.test_syntax[31]>", line 1
361SyntaxError: can't assign to generator expression
362>>> None += 1
363Traceback (most recent call last):
364  File "<doctest test.test_syntax[32]>", line 1
365SyntaxError: cannot assign to None
366>>> f() += 1
367Traceback (most recent call last):
368  File "<doctest test.test_syntax[33]>", line 1
369SyntaxError: can't assign to function call
370
371
372Test continue in finally in weird combinations.
373
374continue in for loop under finally should be ok.
375
376    >>> def test():
377    ...     try:
378    ...         pass
379    ...     finally:
380    ...         for abc in range(10):
381    ...             continue
382    ...     print abc
383    >>> test()
384    9
385
386Start simple, a continue in a finally should not be allowed.
387
388    >>> def test():
389    ...    for abc in range(10):
390    ...        try:
391    ...            pass
392    ...        finally:
393    ...            continue
394    Traceback (most recent call last):
395      ...
396      File "<doctest test.test_syntax[36]>", line 6
397    SyntaxError: 'continue' not supported inside 'finally' clause
398
399This is essentially a continue in a finally which should not be allowed.
400
401    >>> def test():
402    ...    for abc in range(10):
403    ...        try:
404    ...            pass
405    ...        finally:
406    ...            try:
407    ...                continue
408    ...            except:
409    ...                pass
410    Traceback (most recent call last):
411      ...
412      File "<doctest test.test_syntax[37]>", line 6
413    SyntaxError: 'continue' not supported inside 'finally' clause
414
415    >>> def foo():
416    ...     try:
417    ...         pass
418    ...     finally:
419    ...         continue
420    Traceback (most recent call last):
421      ...
422      File "<doctest test.test_syntax[38]>", line 5
423    SyntaxError: 'continue' not supported inside 'finally' clause
424
425    >>> def foo():
426    ...     for a in ():
427    ...       try:
428    ...           pass
429    ...       finally:
430    ...           continue
431    Traceback (most recent call last):
432      ...
433      File "<doctest test.test_syntax[39]>", line 6
434    SyntaxError: 'continue' not supported inside 'finally' clause
435
436    >>> def foo():
437    ...     for a in ():
438    ...         try:
439    ...             pass
440    ...         finally:
441    ...             try:
442    ...                 continue
443    ...             finally:
444    ...                 pass
445    Traceback (most recent call last):
446      ...
447      File "<doctest test.test_syntax[40]>", line 7
448    SyntaxError: 'continue' not supported inside 'finally' clause
449
450    >>> def foo():
451    ...  for a in ():
452    ...   try: pass
453    ...   finally:
454    ...    try:
455    ...     pass
456    ...    except:
457    ...     continue
458    Traceback (most recent call last):
459      ...
460      File "<doctest test.test_syntax[41]>", line 8
461    SyntaxError: 'continue' not supported inside 'finally' clause
462
463There is one test for a break that is not in a loop.  The compiler
464uses a single data structure to keep track of try-finally and loops,
465so we need to be sure that a break is actually inside a loop.  If it
466isn't, there should be a syntax error.
467
468   >>> try:
469   ...     print 1
470   ...     break
471   ...     print 2
472   ... finally:
473   ...     print 3
474   Traceback (most recent call last):
475     ...
476     File "<doctest test.test_syntax[42]>", line 3
477   SyntaxError: 'break' outside loop
478
479This raises a SyntaxError, it used to raise a SystemError.
480Context for this change can be found on issue #27514
481
482In 2.5 there was a missing exception and an assert was triggered in a debug
483build.  The number of blocks must be greater than CO_MAXBLOCKS.  SF #1565514
484
485   >>> while 1:
486   ...  while 2:
487   ...   while 3:
488   ...    while 4:
489   ...     while 5:
490   ...      while 6:
491   ...       while 8:
492   ...        while 9:
493   ...         while 10:
494   ...          while 11:
495   ...           while 12:
496   ...            while 13:
497   ...             while 14:
498   ...              while 15:
499   ...               while 16:
500   ...                while 17:
501   ...                 while 18:
502   ...                  while 19:
503   ...                   while 20:
504   ...                    while 21:
505   ...                     while 22:
506   ...                      break
507   Traceback (most recent call last):
508     ...
509   SyntaxError: too many statically nested blocks
510
511Misuse of the global statement can lead to a few unique syntax errors.
512
513   >>> def f(x):
514   ...     global x
515   ... # doctest: +ELLIPSIS
516   Traceback (most recent call last):
517     ...
518   SyntaxError: name 'x' is local and global (<doctest ...>, line 1)
519
520
521This tests assignment-context; there was a bug in Python 2.5 where compiling
522a complex 'if' (one with 'elif') would fail to notice an invalid suite,
523leading to spurious errors.
524
525   >>> if 1:
526   ...   x() = 1
527   ... elif 1:
528   ...   pass
529   Traceback (most recent call last):
530     ...
531     File "<doctest test.test_syntax[44]>", line 2
532   SyntaxError: can't assign to function call
533
534   >>> if 1:
535   ...   pass
536   ... elif 1:
537   ...   x() = 1
538   Traceback (most recent call last):
539     ...
540     File "<doctest test.test_syntax[45]>", line 4
541   SyntaxError: can't assign to function call
542
543   >>> if 1:
544   ...   x() = 1
545   ... elif 1:
546   ...   pass
547   ... else:
548   ...   pass
549   Traceback (most recent call last):
550     ...
551     File "<doctest test.test_syntax[46]>", line 2
552   SyntaxError: can't assign to function call
553
554   >>> if 1:
555   ...   pass
556   ... elif 1:
557   ...   x() = 1
558   ... else:
559   ...   pass
560   Traceback (most recent call last):
561     ...
562     File "<doctest test.test_syntax[47]>", line 4
563   SyntaxError: can't assign to function call
564
565   >>> if 1:
566   ...   pass
567   ... elif 1:
568   ...   pass
569   ... else:
570   ...   x() = 1
571   Traceback (most recent call last):
572     ...
573     File "<doctest test.test_syntax[48]>", line 6
574   SyntaxError: can't assign to function call
575
576Test the "raise X, Y[, Z]" form:
577
578   >>> raise ArithmeticError, 'bad number'
579   Traceback (most recent call last):
580     ...
581   ArithmeticError: bad number
582   >>> raise ArithmeticError, 'bad number', None
583   Traceback (most recent call last):
584     ...
585   ArithmeticError: bad number
586
587
588>>> f(a=23, a=234)
589Traceback (most recent call last):
590  ...
591  File "<doctest test.test_syntax[49]>", line 1
592SyntaxError: keyword argument repeated
593
594>>> del ()
595Traceback (most recent call last):
596   ...
597  File "<doctest test.test_syntax[50]>", line 1
598SyntaxError: can't delete ()
599
600>>> {1, 2, 3} = 42
601Traceback (most recent call last):
602   ...
603   File "<doctest test.test_syntax[50]>", line 1
604SyntaxError: can't assign to literal
605
606Corner-case that used to fail to raise the correct error:
607
608    >>> def f(x=lambda __debug__:0): pass
609    Traceback (most recent call last):
610    SyntaxError: cannot assign to __debug__
611
612Corner-case that used to crash:
613
614    >>> def f(*xx, **__debug__): pass
615    Traceback (most recent call last):
616    SyntaxError: cannot assign to __debug__
617
618"""
619
620import re
621import unittest
622import warnings
623
624from test import support
625
626class SyntaxTestCase(unittest.TestCase):
627
628    def _check_error(self, code, errtext,
629                     filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
630        """Check that compiling code raises SyntaxError with errtext.
631
632        errtest is a regular expression that must be present in the
633        test of the exception raised.  If subclass is specified it
634        is the expected subclass of SyntaxError (e.g. IndentationError).
635        """
636        try:
637            compile(code, filename or "<testcase>", mode)
638        except SyntaxError as err:
639            if subclass and not isinstance(err, subclass):
640                self.fail("SyntaxError is not a %s" % subclass.__name__)
641            mo = re.search(errtext, str(err))
642            if mo is None:
643                self.fail("%s did not contain '%r'" % (err, errtext,))
644            if filename is not None:
645                self.assertEqual(err.filename, filename)
646            if lineno is not None:
647                self.assertEqual(err.lineno, lineno)
648            if offset is not None:
649                self.assertEqual(err.offset, offset)
650        else:
651            self.fail("compile() did not raise SyntaxError")
652
653    def test_paren_arg_with_default(self):
654        self._check_error("def f((x)=23): pass",
655                          "parenthesized arg with default")
656
657    def test_assign_repr(self):
658        with support.check_py3k_warnings(('backquote not supported',
659                                          SyntaxWarning)):
660            self._check_error("`1` = 1", "assign to repr")
661
662    def test_assign_call(self):
663        self._check_error("f() = 1", "assign")
664
665    def test_assign_del(self):
666        self._check_error("del f()", "delete")
667
668    def test_global_err_then_warn(self):
669        # Bug tickler:  The SyntaxError raised for one global statement
670        # shouldn't be clobbered by a SyntaxWarning issued for a later one.
671        source = """if 1:
672            def error(a):
673                global a  # SyntaxError
674            def warning():
675                b = 1
676                global b  # SyntaxWarning
677            """
678        with support.check_warnings((".*assigned to before global declaration",
679                                     SyntaxWarning)):
680            self._check_error(source, "local and global", lineno=2)
681
682    def test_misuse_global(self):
683        source = """if 1:
684            def f():
685                print(x)
686                global x
687            """
688        with support.check_warnings(('.*used prior to global declaration',
689                                     SyntaxWarning)):
690            compile(source, '<testcase>', 'exec')
691
692    def test_misuse_global_2(self):
693        source = """if 1:
694            def f():
695                x = 1
696                global x
697            """
698        with support.check_warnings(('.*assigned to before global declaration',
699                                     SyntaxWarning)):
700            compile(source, '<testcase>', 'exec')
701
702    def test_break_outside_loop(self):
703        self._check_error("break", "outside loop")
704
705    def test_delete_deref(self):
706        source = """if 1:
707            def foo(x):
708                def bar():
709                    print(x)
710                del x
711            """
712        self._check_error(source, "nested scope", filename=None)
713
714    def test_unexpected_indent(self):
715        self._check_error("foo()\n bar()\n", "unexpected indent",
716                          subclass=IndentationError)
717
718    def test_no_indent(self):
719        self._check_error("if 1:\nfoo()", "expected an indented block",
720                          subclass=IndentationError)
721
722    def test_bad_outdent(self):
723        self._check_error("if 1:\n  foo()\n bar()",
724                          "unindent does not match .* level",
725                          subclass=IndentationError)
726
727    def test_kwargs_last(self):
728        self._check_error("int(base=10, '2')", "non-keyword arg")
729
730def test_main():
731    support.run_unittest(SyntaxTestCase)
732    from test import test_syntax
733    support.run_doctest(test_syntax, verbosity=True)
734
735if __name__ == "__main__":
736    test_main()
737