[gcc(refs/vendors/ARM/heads/arm-perf-staging)] c-family: Fix ICE on __builtin_speculation_safe_value () [PR94755]

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 14:59:49 GMT 2020


https://gcc.gnu.org/g:26d76be7af6db75aaab662f4e93395f4ff8acb38

commit 26d76be7af6db75aaab662f4e93395f4ff8acb38
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Apr 27 16:05:03 2020 +0200

    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.

Diff:
---
 gcc/c-family/ChangeLog               |  6 ++++++
 gcc/c-family/c-common.c              |  6 ++++--
 gcc/testsuite/ChangeLog              |  5 +++++
 gcc/testsuite/c-c++-common/pr94755.c | 11 +++++++++++
 4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 55e6eb8ae45..973dc701c2a 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 8e5a9243827..4e46178d595 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f61955dabb9..5a85af479c8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/c-c++-common/pr94755.c b/gcc/testsuite/c-c++-common/pr94755.c
new file mode 100644
index 00000000000..3520864c77a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr94755.c
@@ -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 ();
+}


More information about the Gcc-cvs mailing list