gh-156459: Fix cleanup on error in compiler_set_qualname (#156462)
diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h
index 911cc1f..7e24842 100644
--- a/Include/internal/pycore_compile.h
+++ b/Include/internal/pycore_compile.h
@@ -137,6 +137,7 @@ int _PyCompile_EnterScope(struct _PyCompiler *c, identifier name, int scope_type
void *key, int lineno, PyObject *private,
_PyCompile_CodeUnitMetadata *umd);
void _PyCompile_ExitScope(struct _PyCompiler *c);
+int _PyCompile_SetQualname(struct _PyCompiler *c);
Py_ssize_t _PyCompile_AddConst(struct _PyCompiler *c, PyObject *o);
_PyInstructionSequence *_PyCompile_InstrSequence(struct _PyCompiler *c);
int _PyCompile_StartAnnotationSetup(struct _PyCompiler *c);
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst
new file mode 100644
index 0000000..2de2e0e
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst
@@ -0,0 +1,3 @@
+Fix cleanup on error in ``compiler_set_qualname``. Previously it was called in
+``_PyCompile_EnterScope``, after the scope had been entered, and this was not
+reversed in case of an error.
diff --git a/Python/codegen.c b/Python/codegen.c
index 7eb96f0..f4cdb17 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -687,6 +687,7 @@ codegen_enter_scope(compiler *c, identifier name, int scope_type,
{
RETURN_IF_ERROR(
_PyCompile_EnterScope(c, name, scope_type, key, lineno, private, umd));
+ RETURN_IF_ERROR_IN_SCOPE(c, _PyCompile_SetQualname(c));
location loc = LOCATION(lineno, lineno, 0, 0);
if (scope_type == COMPILE_SCOPE_MODULE) {
loc.lineno = 0;
diff --git a/Python/compile.c b/Python/compile.c
index 2717037..f385204 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -233,13 +233,17 @@ _PyCompile_MaybeAddStaticAttributeToClass(compiler *c, expr_ty e)
return SUCCESS;
}
-static int
-compiler_set_qualname(compiler *c)
+int
+_PyCompile_SetQualname(compiler *c)
{
Py_ssize_t stack_size;
struct compiler_unit *u = c->u;
PyObject *name, *base;
+ if (u->u_scope_type == COMPILE_SCOPE_MODULE) {
+ return SUCCESS;
+ }
+
base = NULL;
stack_size = PyList_GET_SIZE(c->c_stack);
assert(stack_size >= 1);
@@ -724,9 +728,6 @@ _PyCompile_EnterScope(compiler *c, identifier name, int scope_type,
u->u_private = Py_XNewRef(private);
c->u = u;
- if (scope_type != COMPILE_SCOPE_MODULE) {
- RETURN_IF_ERROR(compiler_set_qualname(c));
- }
return SUCCESS;
}