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.
This commit is contained in:
parent
d3627c78be
commit
a55e14b239
2 changed files with 11 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
|
10
gcc/testsuite/gcc.dg/pr113207.c
Normal file
10
gcc/testsuite/gcc.dg/pr113207.c
Normal file
|
@ -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);
|
Loading…
Add table
Reference in a new issue