diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr97830.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 5 |
2 files changed, 28 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr97830.c b/gcc/testsuite/gcc.dg/pr97830.c new file mode 100644 index 0000000..3729a65 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97830.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef enum { LangC } cLanguage; +typedef enum { FunctionOneArg, FunctionStandard } cFunctionType; +void *CCTK_CallFunction_function; +cLanguage CCTK_CallFunction_fdata_0; +cFunctionType CCTK_CallFunction_fdata_1; +void CCTK_CallFunction_data() { + void (*standardfunc)(); + int (*oneargfunc)(); + switch (CCTK_CallFunction_fdata_1) { + case FunctionOneArg: + oneargfunc = CCTK_CallFunction_function; + oneargfunc(CCTK_CallFunction_data); + break; + case FunctionStandard: + switch (CCTK_CallFunction_fdata_0) { + case LangC: + standardfunc = CCTK_CallFunction_function; + standardfunc(CCTK_CallFunction_data); + } + } +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 4d78054..81990fc 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -702,7 +702,10 @@ vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2) if (vr1->operands == vr2->operands) return true; - if (!expressions_equal_p (TYPE_SIZE (vr1->type), TYPE_SIZE (vr2->type))) + if (COMPLETE_TYPE_P (vr1->type) != COMPLETE_TYPE_P (vr2->type) + || (COMPLETE_TYPE_P (vr1->type) + && !expressions_equal_p (TYPE_SIZE (vr1->type), + TYPE_SIZE (vr2->type)))) return false; if (INTEGRAL_TYPE_P (vr1->type) |