c++: Fix up constant expression __builtin_convertvector folding [PR104472]
The following testcase ICEs, because due to the -frounding-math fold_const_call fails, which is it returns NULL, and returning NULL from cxx_eval* is wrong, all the callers rely on them to either return folded value or original with *non_constant_p = true. The following patch does that, and additionally falls through into the default case where there is diagnostics for the !ctx->quiet case too. 2022-02-11 Jakub Jelinek <jakub@redhat.com> PR c++/104472 * constexpr.cc (cxx_eval_internal_function) <case IFN_VEC_CONVERT>: Only return fold_const_call result if it is non-NULL. Otherwise fall through into the default: case to return t, set *non_constant_p and emit diagnostics if needed. * g++.dg/cpp0x/constexpr-104472.C: New test.
This commit is contained in:
parent
fb76c0ad35
commit
84993d94e1
2 changed files with 12 additions and 6 deletions
|
@ -1840,13 +1840,10 @@ cxx_eval_internal_function (const constexpr_ctx *ctx, tree t,
|
|||
false, non_constant_p,
|
||||
overflow_p);
|
||||
if (TREE_CODE (arg) == VECTOR_CST)
|
||||
return fold_const_call (CFN_VEC_CONVERT, TREE_TYPE (t), arg);
|
||||
else
|
||||
{
|
||||
*non_constant_p = true;
|
||||
return t;
|
||||
}
|
||||
if (tree r = fold_const_call (CFN_VEC_CONVERT, TREE_TYPE (t), arg))
|
||||
return r;
|
||||
}
|
||||
/* FALLTHRU */
|
||||
|
||||
default:
|
||||
if (!ctx->quiet)
|
||||
|
|
9
gcc/testsuite/g++.dg/cpp0x/constexpr-104472.C
Normal file
9
gcc/testsuite/g++.dg/cpp0x/constexpr-104472.C
Normal file
|
@ -0,0 +1,9 @@
|
|||
// PR c++/104472
|
||||
// { dg-options "-O2 -frounding-math" }
|
||||
// { dg-add-options float16 }
|
||||
// { dg-require-effective-target float16 }
|
||||
|
||||
typedef short __attribute__((__vector_size__ (16))) V;
|
||||
typedef _Float16 __attribute__((__vector_size__ (16))) F;
|
||||
|
||||
V v = __builtin_convertvector (__builtin_convertvector ((V){5534}, F), V) < 8;
|
Loading…
Add table
Reference in a new issue