On Tue, 10 Mar 2026, Jakub Jelinek wrote: > Hi! > > The recent r16-7938 PR112520 fix hasn't changed much in the testsuite > results for me: > @@ -154,41 +151,34 @@ FAIL: gcc.dg/plugin/cpython-plugin-test- > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 42) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so at line 18 (test for warnings, line 17) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so at line 43 (test for warnings, line 42) > -FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: Segmentation > fault) > +FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: tree check: > expected record_type or union_type or qual_union_type, have integer_type in > get_field_by_name, at > /home/jakub/src/gcc/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc:62) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_Append.c > -fplugin=./analyzer_cpython_plugin.so (test for excess errors) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 17) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 18) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 21) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 29) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so at line 37 (test for warnings, line 36) > -FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: Segmentation > fault) > +FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: tree check: > expected record_type or union_type or qual_union_type, have integer_type in > get_field_by_name, at > /home/jakub/src/gcc/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc:62) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyList_New.c > -fplugin=./analyzer_cpython_plugin.so (test for excess errors) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 17) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 18) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 21) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (test for warnings, line 29) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so at line 37 (test for warnings, line 36) > -FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: Segmentation > fault) > +FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (internal compiler error: tree check: > expected record_type or union_type or qual_union_type, have integer_type in > get_field_by_name, at > /home/jakub/src/gcc/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc:62) > FAIL: gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c > -fplugin=./analyzer_cpython_plugin.so (test for excess errors) > ... > > The problem is that get_field_by_name now recurses on TREE_TYPE of > everything in TYPE_FIELDS (which can be FIELD_DECL but many other > things (though primarily for C++ and other languages)). More importantly, > it recurses even for FIELD_DECLs with scalar (e.g. INTEGER_TYPE) types > and using TYPE_FIELDS on such types results in checking ICE. > > The following patch fixes that by only recursing on anonymous struct/union > FIELD_DECLs. For C those have NULL DECL_NAME, for C++ they would have > IDENTIFIER_ANON_P IDENTIFIER_NODE as DECL_NAME (but it seems this plugin > is only used for C). > > Tested on x86_64-linux, ok for trunk?
OK. Richard. > No FAILs from plugin.exp now: > Running /usr/src/gcc/gcc/testsuite/gcc.dg/plugin/plugin.exp ... > > === gcc Summary === > > # of expected passes 963 > # of expected failures 15 > # of unsupported tests 27 > > 2026-03-10 Jakub Jelinek <[email protected]> > > PR testsuite/112520 > * gcc.dg/plugin/analyzer_cpython_plugin.cc (get_field_by_name): > If name is "ob_refcnt", recurse only for types of FIELD_DECLs > with no DECL_NAME and record or union type. > > --- gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc.jj 2026-03-09 > 10:05:44.674968374 +0100 > +++ gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc 2026-03-10 > 12:38:35.398138956 +0100 > @@ -69,11 +69,14 @@ get_field_by_name (tree type, const char > return field; > } > > - /* Prior to python 3.11, ob_refcnt a field of PyObject. > + /* Prior to python 3.11, ob_refcnt was a field of PyObject. > In Python 3.11 ob_refcnt was moved to an anonymous union within > PyObject (as part of PEP 683 "Immortal Objects, Using a > Fixed Refcount"). */ > - if (0 == strcmp (name, "ob_refcnt")) > + if (strcmp (name, "ob_refcnt") == 0 > + && TREE_CODE (field) == FIELD_DECL > + && DECL_NAME (field) == NULL_TREE > + && RECORD_OR_UNION_TYPE_P (TREE_TYPE (field))) > if (tree subfield = get_field_by_name (TREE_TYPE (field), name, false)) > return subfield; > } > > > > Jakub > > -- Richard Biener <[email protected]> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)
