C API: copying a PyStatus emits -Wdeprecated-declarations in C++ with clang since gh-158080
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
Start with the PyStatus definition in Include/cpython/initconfig.h and the Py_COMP_DIAG* macros in Include/pyport.h. Reproduce the warning by compiling the documented Doc/c-api/init_config.rst usage pattern as C++ with clang++ -Werror, then check whether suppressing the diagnostic around the structure definition removes the copy warnings while real uses of deprecated members still warn. Done means the C++ example compiles cleanly and deprecated API uses remain diagnosed; a C++ regression test in Lib/test/test_cppext is suggested.
由索引模型根据 Issue 内容生成。
描述
Bug description:
Since gh-158080 (GH-158085), PyStatus.exitcode is declared with Py_DEPRECATED(3.16) in Include/cpython/initconfig.h. Because the C API passes and returns PyStatus by value (PyStatus_Exception(), PyStatus_IsError(), Py_InitializeFromConfig(), ...), C++ code that uses the API in the documented way makes clang generate the implicit copy constructor / move assignment operator of PyStatus. These use the deprecated member, so clang emits -Wdeprecated-declarations even though the code never touches exitcode. With -Werror, the build fails.
The usage pattern of the Doc/c-api/init_config.rst examples (ex: init_python()), compiled as C++, is enough to reproduce:
#include <Python.h>
int main(int argc, char** argv) {
PyStatus status;
PyConfig config;
PyConfig_InitPythonConfig(&config);
status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);
if (PyStatus_Exception(status)) {
goto exception;
}
status = Py_InitializeFromConfig(&config);
if (PyStatus_Exception(status)) {
goto exception;
}
PyConfig_Clear(&config);
return Py_RunMain();
exception:
PyConfig_Clear(&config);
Py_ExitStatusException(status);
}
$ clang++ -std=c++17 -Wall -Werror -I<cpython>/Include -I<build> -c embed.cpp
Include/cpython/initconfig.h:10:9: error: 'exitcode' is deprecated [-Werror,-Wdeprecated-declarations]
embed.cpp:7:12: note: in implicit move assignment operator for 'PyStatus' first required here
Include/cpython/initconfig.h:10:9: error: 'exitcode' is deprecated [-Werror,-Wdeprecated-declarations]
Include/cpython/initconfig.h:10:9: error: 'exitcode' is deprecated [-Werror,-Wdeprecated-declarations]
embed.cpp:8:28: note: in implicit copy constructor for 'PyStatus' first required here
- Reproduced with 3.16.0a1, with Ubuntu clang 21.1.8 (Linux aarch64) and Apple clang 21.0.0 (macOS arm64); the
PyStatusdefinition is unchanged on currentmain. - g++ 15, and clang compiling the same file as C, emit no warning.
- The diagnostic is reported at the definition of the structure in
initconfig.h, so users cannot silence it locally with a pragma around their own calls; they have to wrap the#include <Python.h>itself.
Possible fix
Suppress the warning around the definition of the structure, with the existing _Py_COMP_DIAG_* macros of pyport.h:
/* --- PyStatus ----------------------------------------------- */
+_Py_COMP_DIAG_PUSH
+_Py_COMP_DIAG_IGNORE_DEPR_DECLS
typedef struct {
enum {
_PyStatus_TYPE_OK=0,
_PyStatus_TYPE_ERROR=1,
_PyStatus_TYPE_EXIT=2 // deprecated
} _type;
const char *func;
const char *err_msg;
Py_DEPRECATED(3.16) int exitcode;
} PyStatus;
+_Py_COMP_DIAG_POP
With this change the example above compiles cleanly with clang++ -Werror, while real uses (status.exitcode, PyStatus_Exit(), PyStatus_IsExit()) still emit the deprecation warning. (Alternatively, only the functions could be marked deprecated and the member documented as deprecated.)
A C++ test in Lib/test/test_cppext that copies a PyStatus would catch regressions of this kind.
CPython versions tested on:
3.16, CPython main branch
Operating systems tested on:
Linux, macOS
- 主要语言
- Python
- 星标
- 77.7k
- 派生
- 38.3k
- 平均合并
- 14 小时 29 分钟
- 30 天内合并 PR
- 699
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
python/cpython 的其他 Issue
-
topic-socket type-bug
难度 2/5 1-3 小时 新手友好度 72/100
python/cpython#160561 · 7 条评论 ·
维护者通常 1 天内回复
-
tests topic-profiling type-bug
难度 2/5 1-3 小时 新手友好度 78/100
python/cpython#160334 · 1 条评论 ·
维护者通常 1 天内回复
-
`iso2022_jp_3` encodes U+9B1D but decodes the result as U+9B1C可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭extension-modules type-bug
难度 2/5 1-3 小时 新手友好度 84/100
维护者通常 1 天内回复
-
interpreter-core type-feature
难度 1/5 1 小时以内 新手友好度 78/100
python/cpython#160109 · 1 条评论 ·
维护者通常 1 天内回复
-
extension-modules type-bug
难度 2/5 1-3 小时 新手友好度 72/100
python/cpython#160001 · 3 条评论 ·
维护者通常 1 天内回复
相似的 Issue
-
automated issue linkchecker report
难度 2/5 1-3 小时 新手友好度 66/100
QuantEcon/lecture-python.myst#1098 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 82/100
-
bug
难度 2/5 1-3 小时 新手友好度 82/100
podly-pure-podcasts/podly_pure_podcasts#279 ·
维护者通常 1 天内回复
-
template-proposal
难度 1/5 1 小时以内 新手友好度 78/100
-
难度 1/5 1 小时以内 新手友好度 82/100
OpenShot/openshot-qt#6230 ·
维护者通常 1 天内回复