https://gcc.gnu.org/g:949f38047860b19a4276b8191d012a3b05aab1e2
commit r13-9510-g949f38047860b19a4276b8191d012a3b05aab1e2 Author: Richard Biener <rguent...@suse.de> Date: Mon Feb 3 14:27:01 2025 +0100 lto/113207 - fix free_lang_data_in_type When we process function types we strip volatile and const qualifiers after building a simplified type variant (which preserves those). The qualified type handling of both isn't really compatible, so avoid bad interaction by swapping this, first dropping const/volatile qualifiers and then building the simplified type thereof. PR lto/113207 * ipa-free-lang-data.cc (free_lang_data_in_type): First drop const/volatile qualifiers from function argument types, then build a simplified type. * gcc.dg/pr113207.c: New testcase. (cherry picked from commit a55e14b239181381204c615335929b3316d75370) Diff: --- gcc/ipa-free-lang-data.cc | 3 +-- gcc/testsuite/gcc.dg/pr113207.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc index ff9657a6e068..b87063b5900d 100644 --- a/gcc/ipa-free-lang-data.cc +++ b/gcc/ipa-free-lang-data.cc @@ -436,9 +436,7 @@ free_lang_data_in_type (tree type, class free_lang_data_d *fld) different front ends. */ for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p)) { - TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld); tree arg_type = TREE_VALUE (p); - if (TYPE_READONLY (arg_type) || TYPE_VOLATILE (arg_type)) { int quals = TYPE_QUALS (arg_type) @@ -448,6 +446,7 @@ free_lang_data_in_type (tree type, class free_lang_data_d *fld) if (!fld->pset.add (TREE_VALUE (p))) free_lang_data_in_type (TREE_VALUE (p), fld); } + TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld); /* C++ FE uses TREE_PURPOSE to store initial values. */ TREE_PURPOSE (p) = NULL; } diff --git a/gcc/testsuite/gcc.dg/pr113207.c b/gcc/testsuite/gcc.dg/pr113207.c new file mode 100644 index 000000000000..81f53d8fcc2f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr113207.c @@ -0,0 +1,10 @@ +/* { dg-compile } */ +/* { dg-require-effective-target lto } */ +/* { dg-options "-flto -fchecking" } */ + +typedef struct cl_lispunion *cl_object; +struct cl_lispunion {}; +cl_object cl_error() __attribute__((noreturn)); +volatile cl_object cl_coerce_value0; +void cl_coerce() { cl_error(); } +void L66safe_canonical_type(cl_object volatile);