]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-family: Fix ICE on __builtin_speculation_safe_value () [PR94755]
authorJakub Jelinek <jakub@redhat.com>
Mon, 27 Apr 2020 14:05:03 +0000 (16:05 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 16 Sep 2020 17:19:43 +0000 (19:19 +0200)
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.

(cherry picked from commit 26d76be7af6db75aaab662f4e93395f4ff8acb38)

gcc/c-family/c-common.c
gcc/testsuite/c-c++-common/pr94755.c [new file with mode: 0644]

index d220e813564aaa7b82da8136d8956dbcc0957765..22e0efaaf3f82bae71b6f5c609fc9e31858b8c7f 100644 (file)
@@ -7348,9 +7348,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))
diff --git a/gcc/testsuite/c-c++-common/pr94755.c b/gcc/testsuite/c-c++-common/pr94755.c
new file mode 100644 (file)
index 0000000..3520864
--- /dev/null
@@ -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 ();
+}