]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[C++] constexpr: request insert iff depth is ok
authorAlexandre Oliva <oliva@adacore.com>
Thu, 29 Dec 2022 17:32:59 +0000 (14:32 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Thu, 29 Dec 2022 17:39:47 +0000 (14:39 -0300)
cxx_eval_call_expression requests an INSERT even in cases when it
would later decide not to insert.  This could break double-hashing
chains.  Arrange for it to use NO_INSERT when the insertion would not
be completed.

for  gcc/cp/ChangeLog

* constexpr.cc (cxx_eval_call_expression): Do not request an
INSERT that would not be completed.

gcc/cp/constexpr.cc

index 414af7a6d4c45ca76e3dca2ad939d0cd84214360..a65dbdc5b13d8b01df26d5794190f6ef8ee45688 100644 (file)
@@ -3000,13 +3000,15 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
 
       /* If we have seen this call before, we are done.  */
       maybe_initialize_constexpr_call_table ();
+      bool insert = depth_ok < constexpr_cache_depth;
       constexpr_call **slot
-       = constexpr_call_table->find_slot (&new_call, INSERT);
-      entry = *slot;
+       = constexpr_call_table->find_slot (&new_call,
+                                          insert ? INSERT : NO_INSERT);
+      entry = slot ? *slot : NULL;
       if (entry == NULL)
        {
          /* Only cache up to constexpr_cache_depth to limit memory use.  */
-         if (depth_ok < constexpr_cache_depth)
+         if (insert)
            {
              /* We need to keep a pointer to the entry, not just the slot, as
                 the slot can move during evaluation of the body.  */