summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-02-08 21:45:06 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-02-08 21:45:06 (GMT)
commit15a3095d64e96d0fe7448270f2c5b0bf22f9c4e1 (patch)
treeda112b21f47896fd48d61ac70429cf5001d89f90
parent896632ea6b2b03815ae948aea05972b4e51247ed (diff)
downloadcpython-15a3095d64e96d0fe7448270f2c5b0bf22f9c4e1.zip
cpython-15a3095d64e96d0fe7448270f2c5b0bf22f9c4e1.tar.gz
cpython-15a3095d64e96d0fe7448270f2c5b0bf22f9c4e1.tar.bz2
compiler: don't emit SyntaxWarning on const stmt
Issue #26204: the compiler doesn't emit SyntaxWarning warnings anymore when constant statements are ignored.
-rw-r--r--Lib/test/test_ast.py7
-rw-r--r--Lib/test/test_code.py58
-rw-r--r--Lib/test/test_grammar.py6
-rw-r--r--Misc/NEWS7
-rw-r--r--Python/compile.c24
5 files changed, 27 insertions, 75 deletions
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index dbcd9f7..a025c20 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -3,7 +3,6 @@ import dis
import os
import sys
import unittest
-import warnings
import weakref
from test import support
@@ -240,10 +239,8 @@ class AST_Tests(unittest.TestCase):
ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
self.assertEqual(to_tuple(ast_tree), o)
self._assertTrueorder(ast_tree, (0, 0))
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=SyntaxWarning)
- with self.subTest(action="compiling", input=i, kind=kind):
- compile(ast_tree, "?", kind)
+ with self.subTest(action="compiling", input=i, kind=kind):
+ compile(ast_tree, "?", kind)
def test_slice(self):
slc = ast.parse("x[::]").body[0].value.slice
diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
index 2cf088c..21b12a5 100644
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -66,6 +66,24 @@ nlocals: 1
flags: 67
consts: ('None',)
+>>> def optimize_away():
+... 'doc string'
+... 'not a docstring'
+... 53
+... 0x53
+
+>>> dump(optimize_away.__code__)
+name: optimize_away
+argcount: 0
+kwonlyargcount: 0
+names: ()
+varnames: ()
+cellvars: ()
+freevars: ()
+nlocals: 0
+flags: 67
+consts: ("'doc string'", 'None')
+
>>> def keywordonly_args(a,b,*,k1):
... return a,b,k1
...
@@ -84,10 +102,8 @@ consts: ('None',)
"""
-import textwrap
import unittest
import weakref
-import warnings
from test.support import run_doctest, run_unittest, cpython_only
@@ -118,44 +134,6 @@ class CodeTest(unittest.TestCase):
self.assertEqual(co.co_name, "funcname")
self.assertEqual(co.co_firstlineno, 15)
- def dump(self, co):
- dump = {}
- for attr in ["name", "argcount", "kwonlyargcount", "names", "varnames",
- "cellvars", "freevars", "nlocals", "flags"]:
- dump[attr] = getattr(co, "co_" + attr)
- dump['consts'] = tuple(consts(co.co_consts))
- return dump
-
- def test_optimize_away(self):
- ns = {}
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore', category=SyntaxWarning)
- exec(textwrap.dedent('''
- def optimize_away():
- 'doc string'
- 'not a docstring'
- 53
- 0x53
- b'bytes'
- 1.0
- True
- False
- None
- ...
- '''), ns)
-
- self.assertEqual(self.dump(ns['optimize_away'].__code__),
- {'name': 'optimize_away',
- 'argcount': 0,
- 'kwonlyargcount': 0,
- 'names': (),
- 'varnames': (),
- 'cellvars': (),
- 'freevars': (),
- 'nlocals': 0,
- 'flags': 67,
- 'consts': ("'doc string'", 'None')})
-
class CodeWeakRefTest(unittest.TestCase):
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 2d6f5ed..8f8d71c 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -7,7 +7,6 @@ import unittest
import sys
# testing import *
from sys import *
-from test import support
class TokenTests(unittest.TestCase):
@@ -425,11 +424,8 @@ class GrammarTests(unittest.TestCase):
# Tested below
def test_expr_stmt(self):
- msg = 'ignore constant statement'
- with support.check_warnings((msg, SyntaxWarning)):
- exec("1")
-
# (exprlist '=')* exprlist
+ 1
1, 2, 3
x = 1
x = 1, 2, 3
diff --git a/Misc/NEWS b/Misc/NEWS
index e1875c0..d60aeb6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,9 +10,10 @@ Release date: tba
Core and Builtins
-----------------
-- Issue #26204: The compiler now ignores constant statements (ex: "def f(): 1")
- and emit a SyntaxWarning warning. The warning is not emitted for string and
- ellipsis (...) statements.
+- Issue #26204: The compiler now ignores all constant statements: bytes, str,
+ int, float, complex, name constants (None, False, True), Ellipsis
+ and ast.Constant; not only str and int. For example, ``1.0`` is now ignored
+ in ``def f(): 1.0``.
- Issue #4806: Avoid masking the original TypeError exception when using star
(*) unpacking in function calls. Based on patch by Hagen Fürstenau and
diff --git a/Python/compile.c b/Python/compile.c
index 84b79a2..ca1d865 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2619,33 +2619,13 @@ compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
switch (value->kind)
{
case Str_kind:
+ case Num_kind:
case Ellipsis_kind:
- /* Issue #26204: ignore string statement, but don't emit a
- * SyntaxWarning. Triple quoted strings is a common syntax for
- * multiline comments.
- *
- * Don't emit warning on "def f(): ..." neither. It's a legit syntax
- * for abstract function. */
- return 1;
-
case Bytes_kind:
- case Num_kind:
case NameConstant_kind:
case Constant_kind:
- {
- PyObject *msg = PyUnicode_FromString("ignore constant statement");
- if (msg == NULL)
- return 0;
- if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning,
- msg,
- c->c_filename, c->u->u_lineno,
- NULL, NULL) == -1) {
- Py_DECREF(msg);
- return 0;
- }
- Py_DECREF(msg);
+ /* ignore constant statement */
return 1;
- }
default:
break;