c-family: Fix ICE on __builtin_speculation_safe_value () [PR94755]
When this builtin has no parameters, speculation_safe_value_resolve_call returns BUILT_IN_NONE, but resolve_overloaded_builtin uselessly dereferences the first param just to return error_mark_node immediately. The following patch rearranges it so that we only read the first parameter if fncode is not BUILT_IN_NONE. 2020-04-27 Jakub Jelinek <jakub@redhat.com> PR c/94755 * c-common.c (resolve_overloaded_builtin): Return error_mark_node for fncode == BUILT_IN_NONE before initialization of first_param. * c-c++-common/pr94755.c: New test.
This commit is contained in:
parent
6b6a77d25e
commit
26d76be7af
4 changed files with 26 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
|||
2020-04-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/94755
|
||||
* c-common.c (resolve_overloaded_builtin): Return error_mark_node for
|
||||
fncode == BUILT_IN_NONE before initialization of first_param.
|
||||
|
||||
2020-04-23 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/94733
|
||||
|
|
|
@ -7402,9 +7402,11 @@ resolve_overloaded_builtin (location_t loc, tree function,
|
|||
enum built_in_function fncode
|
||||
= speculation_safe_value_resolve_call (function, params);;
|
||||
|
||||
if (fncode == BUILT_IN_NONE)
|
||||
return error_mark_node;
|
||||
|
||||
first_param = (*params)[0];
|
||||
if (fncode == BUILT_IN_NONE
|
||||
|| !speculation_safe_value_resolve_params (loc, function, params))
|
||||
if (!speculation_safe_value_resolve_params (loc, function, params))
|
||||
return error_mark_node;
|
||||
|
||||
if (targetm.have_speculation_safe_value (true))
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-04-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/94755
|
||||
* c-c++-common/pr94755.c: New test.
|
||||
|
||||
2020-04-27 Felix Yang <felix.yang@huawei.com>
|
||||
|
||||
PR tree-optimization/94784
|
||||
|
|
11
gcc/testsuite/c-c++-common/pr94755.c
Normal file
11
gcc/testsuite/c-c++-common/pr94755.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* PR c/94755 */
|
||||
/* { dg-do compile } */
|
||||
|
||||
extern void foo (void);
|
||||
|
||||
void
|
||||
bar (double x)
|
||||
{
|
||||
if (x == __builtin_speculation_safe_value ()) /* { dg-error "too few arguments to function" } */
|
||||
foo ();
|
||||
}
|
Loading…
Add table
Reference in a new issue