mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
bpo-28936: Detect lexically first syntax error first (#4097)
Lexically first global and nonlocal syntax errors at given scope should be detected first.
This commit is contained in:
parent
66c88ce30c
commit
8c83c23fa3
3 changed files with 45 additions and 27 deletions
|
@ -399,6 +399,13 @@ build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
|
|||
|
||||
Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
|
||||
|
||||
>>> def f():
|
||||
... print(x)
|
||||
... global x
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: name 'x' is used prior to global declaration
|
||||
|
||||
>>> def f():
|
||||
... x = 1
|
||||
... global x
|
||||
|
@ -406,6 +413,12 @@ Misuse of the nonlocal and global statement can lead to a few unique syntax erro
|
|||
...
|
||||
SyntaxError: name 'x' is assigned to before global declaration
|
||||
|
||||
>>> def f(x):
|
||||
... global x
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
SyntaxError: name 'x' is parameter and global
|
||||
|
||||
>>> def f():
|
||||
... x = 1
|
||||
... def g():
|
||||
|
@ -560,7 +573,6 @@ Corner-cases that used to crash:
|
|||
|
||||
import re
|
||||
import unittest
|
||||
import warnings
|
||||
|
||||
from test import support
|
||||
|
||||
|
@ -596,19 +608,25 @@ class SyntaxTestCase(unittest.TestCase):
|
|||
def test_assign_del(self):
|
||||
self._check_error("del f()", "delete")
|
||||
|
||||
def test_global_err_then_warn(self):
|
||||
# Bug #763201: The SyntaxError raised for one global statement
|
||||
# shouldn't be clobbered by a SyntaxWarning issued for a later one.
|
||||
def test_global_param_err_first(self):
|
||||
source = """if 1:
|
||||
def error(a):
|
||||
global a # SyntaxError
|
||||
def warning():
|
||||
def error2():
|
||||
b = 1
|
||||
global b # SyntaxWarning
|
||||
global b # SyntaxError
|
||||
"""
|
||||
warnings.filterwarnings(action='ignore', category=SyntaxWarning)
|
||||
self._check_error(source, "global")
|
||||
warnings.filters.pop(0)
|
||||
self._check_error(source, "parameter and global", lineno=3)
|
||||
|
||||
def test_nonlocal_param_err_first(self):
|
||||
source = """if 1:
|
||||
def error(a):
|
||||
nonlocal a # SyntaxError
|
||||
def error2():
|
||||
b = 1
|
||||
global b # SyntaxError
|
||||
"""
|
||||
self._check_error(source, "parameter and nonlocal", lineno=3)
|
||||
|
||||
def test_break_outside_loop(self):
|
||||
self._check_error("break", "outside loop")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue