# HG changeset patch
# User Stefan Behnel <stefan_ml@behnel.de>
# Date 1592665031 -7200
#      Sat Jun 20 16:57:11 2020 +0200
# Node ID ece07b0818941a7472a06c7889c4b91cae53fb36
# Parent  b7f3d8172d230ec8920ea1f548ab6c1d9c272a96
exec() did not allow recent Python syntax features in Py3.8+ due to https://bugs.python.org/issue35975
Closes https://github.com/cython/cython/issues/3695

diff --git a/CHANGES.rst b/CHANGES.rst
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -11,6 +11,10 @@
 * Fix a regression in 0.29.20 where ``__div__`` failed to be found in extension types.
   (Github issue #3688)
 
+* ``exec()`` did not allow recent Python syntax features in Py3.8+ due to
+  https://bugs.python.org/issue35975.
+  (Github issue #3695)
+
 * Binding staticmethods of Cython functions were not behaving like Python methods in Py3.
   Patch by Jeroen Demeyer and Michał Górny.  (Github issue #3106)
 
diff --git a/Cython/Utility/Builtins.c b/Cython/Utility/Builtins.c
--- a/Cython/Utility/Builtins.c
+++ b/Cython/Utility/Builtins.c
@@ -128,6 +128,9 @@
     } else {
         PyCompilerFlags cf;
         cf.cf_flags = 0;
+#if PY_VERSION_HEX >= 0x030800A3
+        cf.cf_feature_version = PY_MINOR_VERSION;
+#endif
         if (PyUnicode_Check(o)) {
             cf.cf_flags = PyCF_SOURCE_IS_UTF8;
             s = PyUnicode_AsUTF8String(o);
diff --git a/tests/run/exectest.pyx b/tests/run/exectest.pyx
--- a/tests/run/exectest.pyx
+++ b/tests/run/exectest.pyx
@@ -145,3 +145,18 @@
     TypeError: exec: arg 1 must be string, bytes or code object, got int
     """
     exec x in {}
+
+
+def exec_with_new_features(s, d):
+    """
+    >>> import sys
+    >>> pyversion = sys.version_info[:2]
+
+    >>> d = {}
+    >>> exec_with_new_features('print(123)', d)
+    123
+    >>> if pyversion == (2, 7): exec_with_new_features('exec "123"', d)
+    >>> if pyversion >= (3, 6): exec_with_new_features('f = f"abc"', d)
+    >>> if pyversion >= (3, 8): exec_with_new_features('a = (b := 1)', d)
+    """
+    exec s in d