[syntax-errors] Allow yield in base classes and annotations (#17206)

Summary
--

This PR fixes the issue pointed out by @JelleZijlstra in
https://github.com/astral-sh/ruff/pull/17101#issuecomment-2777480204.
Namely, I conflated two very different errors from CPython:

```pycon
>>> def m[T](x: (yield from 1)): ...
  File "<python-input-310>", line 1
    def m[T](x: (yield from 1)): ...
                 ^^^^^^^^^^^^
SyntaxError: yield expression cannot be used within the definition of a generic
>>> def m(x: (yield from 1)): ...
  File "<python-input-311>", line 1
    def m(x: (yield from 1)): ...
              ^^^^^^^^^^^^
SyntaxError: 'yield from' outside function
>>> def outer():
...     def m(x: (yield from 1)): ...
...
>>>
```

I thought the second error was the same as the first, but `yield` (and
`yield from`) is actually valid in this position when inside a function
scope. The same is true for base classes, as pointed out in the original
comment.

We don't currently raise an error for `yield` outside of a function, but
that should be handled separately.

On the upside, this had the benefit of removing the
`InvalidExpressionPosition::BaseClass` variant and the
`allow_named_expr` field from the visitor because they were both no
longer used.

Test Plan
--

Updated inline tests.
This commit is contained in:
Brent Westbrook 2025-04-04 13:48:28 -04:00 committed by GitHub
parent 33a56f198b
commit acc5662e8b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 1081 additions and 686 deletions

View file

@ -490,6 +490,10 @@ impl SemanticSyntaxContext for TestContext<'_> {
false
}
fn future_annotations_or_stub(&self) -> bool {
false
}
fn python_version(&self) -> PythonVersion {
self.python_version
}