[gcc/devel/ranger] c++: Avoid ICE when constant evaluation of __builtin_strchr fails.

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 18:14:47 GMT 2020


https://gcc.gnu.org/g:6f346913f2a87e26c6095d9fbf3d20f926c5470a

commit 6f346913f2a87e26c6095d9fbf3d20f926c5470a
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Jan 23 12:43:15 2020 -0500

    c++: Avoid ICE when constant evaluation of __builtin_strchr fails.
    
    If we can't change the argument to &"...", use the original arg instead of
    the partially munged one.
    
            PR c++/93331 - ICE with __builtin_strchr.
            * constexpr.c (cxx_eval_builtin_function_call): Use the original
            argument if we didn't manage to extract a STRING_CST.

Diff:
---
 gcc/cp/ChangeLog                                                  | 4 ++++
 gcc/cp/constexpr.c                                                | 3 +++
 gcc/testsuite/{gcc.c-torture/compile => c-c++-common}/pr34029-1.c | 0
 3 files changed, 7 insertions(+)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f99951cb72c..b13ee2b3820 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2020-01-23  Jason Merrill  <jason@redhat.com>
 
+	PR c++/93331 - ICE with __builtin_strchr.
+	* constexpr.c (cxx_eval_builtin_function_call): Use the original
+	argument if we didn't manage to extract a STRING_CST.
+
 	PR c++/93345 - ICE with defaulted dtor and template.
 	PR c++/33799
 	* decl.c (cxx_maybe_build_cleanup): Don't try to set
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 5864b67d4de..f6b8f331bc9 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1293,6 +1293,7 @@ cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
   for (i = 0; i < nargs; ++i)
     {
       tree arg = CALL_EXPR_ARG (t, i);
+      tree oarg = arg;
 
       /* To handle string built-ins we need to pass ADDR_EXPR<STRING_CST> since
 	 expand_builtin doesn't know how to look in the values table.  */
@@ -1327,6 +1328,8 @@ cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
 	    arg = braced_lists_to_strings (TREE_TYPE (arg), arg);
 	  if (TREE_CODE (arg) == STRING_CST)
 	    arg = build_address (arg);
+	  else
+	    arg = oarg;
 	}
 
       args[i] = arg;
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34029-1.c b/gcc/testsuite/c-c++-common/pr34029-1.c
similarity index 100%
rename from gcc/testsuite/gcc.c-torture/compile/pr34029-1.c
rename to gcc/testsuite/c-c++-common/pr34029-1.c


More information about the Gcc-cvs mailing list