summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2023-05-17 06:05:42 -0700
committerGitHub <noreply@github.com>2023-05-17 06:05:42 -0700
commit97db2f3e07bf7d56750e215e4f32653bf3867ef8 (patch)
tree937151e98c3f0e16603209e9e968098b429b8564
parent0cb2fdc6217aa7c04b5c798cfd195c8d0f4af353 (diff)
downloadcpython-git-97db2f3e07bf7d56750e215e4f32653bf3867ef8.tar.gz
gh-104572: Improve error messages for invalid constructs in PEP 695 contexts (#104573)
-rw-r--r--Lib/test/test_syntax.py62
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-05-16-19-17-48.gh-issue-104572.eBZQYS.rst2
-rw-r--r--Python/symtable.c8
3 files changed, 68 insertions, 4 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index f959bbb440..477879db2f 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -1877,6 +1877,68 @@ Invalid bytes literals:
^^^^^^^^^^^
SyntaxError: bytes can only contain ASCII literal characters
+Invalid expressions in type scopes:
+
+ >>> type A[T: (x:=3)] = int
+ Traceback (most recent call last):
+ ...
+ SyntaxError: named expression cannot be used within a TypeVar bound
+
+ >>> type A[T: (yield 3)] = int
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within a TypeVar bound
+
+ >>> type A[T: (await 3)] = int
+ Traceback (most recent call last):
+ ...
+ SyntaxError: await expression cannot be used within a TypeVar bound
+
+ >>> type A[T: (yield from [])] = int
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within a TypeVar bound
+
+ >>> type A = (x := 3)
+ Traceback (most recent call last):
+ ...
+ SyntaxError: named expression cannot be used within a type alias
+
+ >>> type A = (yield 3)
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within a type alias
+
+ >>> type A = (await 3)
+ Traceback (most recent call last):
+ ...
+ SyntaxError: await expression cannot be used within a type alias
+
+ >>> type A = (yield from [])
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within a type alias
+
+ >>> class A[T]((x := 3)): ...
+ Traceback (most recent call last):
+ ...
+ SyntaxError: named expression cannot be used within the definition of a generic
+
+ >>> class A[T]((yield 3)): ...
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within the definition of a generic
+
+ >>> class A[T]((await 3)): ...
+ Traceback (most recent call last):
+ ...
+ SyntaxError: await expression cannot be used within the definition of a generic
+
+ >>> class A[T]((yield from [])): ...
+ Traceback (most recent call last):
+ ...
+ SyntaxError: yield expression cannot be used within the definition of a generic
+
"""
import re
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-05-16-19-17-48.gh-issue-104572.eBZQYS.rst b/Misc/NEWS.d/next/Core and Builtins/2023-05-16-19-17-48.gh-issue-104572.eBZQYS.rst
new file mode 100644
index 0000000000..25bad8aa6e
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-05-16-19-17-48.gh-issue-104572.eBZQYS.rst
@@ -0,0 +1,2 @@
+Improve syntax error message for invalid constructs in :pep:`695` contexts
+and in annotations when ``from __future__ import annotations`` is active.
diff --git a/Python/symtable.c b/Python/symtable.c
index 3451f6c7bf..f896f7cbe3 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -45,16 +45,16 @@
"assignment expression cannot be used in a comprehension iterable expression"
#define ANNOTATION_NOT_ALLOWED \
-"'%s' can not be used within an annotation"
+"%s cannot be used within an annotation"
#define TYPEVAR_BOUND_NOT_ALLOWED \
-"'%s' can not be used within a TypeVar bound"
+"%s cannot be used within a TypeVar bound"
#define TYPEALIAS_NOT_ALLOWED \
-"'%s' can not be used within a type alias"
+"%s cannot be used within a type alias"
#define TYPEPARAM_NOT_ALLOWED \
-"'%s' can not be used within the definition of a generic"
+"%s cannot be used within the definition of a generic"
#define DUPLICATE_TYPE_PARAM \
"duplicate type parameter '%U'"