c++: Preserve location in maybe_constant_value.
authorJason Merrill <jason@redhat.com>
Fri, 7 Feb 2020 21:28:20 +0000 (16:28 -0500)
committerJason Merrill <jason@redhat.com>
Sat, 8 Feb 2020 16:14:58 +0000 (11:14 -0500)
If cxx_eval_outermost_constant_expr doesn't change the argument, we really
shouldn't unshare it when we try to fold it again.

PR c++/92852
* constexpr.c (maybe_constant_value): Don't unshare if the cached
value is the same as the argument.

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index 0894457b7a336dad91318358610d2443c2aab7c3..3e5e547fd87aa3fbc825ba6f7ebaaf029de369e6 100644 (file)
@@ -1,5 +1,9 @@
 2020-02-08  Jason Merrill  <jason@redhat.com>
 
+       PR c++/92852
+       * constexpr.c (maybe_constant_value): Don't unshare if the cached
+       value is the same as the argument.
+
        * typeck.c (maybe_warn_about_returning_address_of_local): Add
        location parameter.
 
index aa47ded52c0b958c264853bdd78df9b294f5c76a..1b35bc107e95b2bb49bc76f6a58204cbde7eca2f 100644 (file)
@@ -6651,7 +6651,15 @@ maybe_constant_value (tree t, tree decl, bool manifestly_const_eval)
   if (cv_cache == NULL)
     cv_cache = hash_map<tree, tree>::create_ggc (101);
   if (tree *cached = cv_cache->get (t))
-    return unshare_expr_without_location (*cached);
+    {
+      r = *cached;
+      if (r != t)
+       {
+         r = unshare_expr_without_location (r);
+         protected_set_expr_location (r, EXPR_LOCATION (t));
+       }
+      return r;
+    }
 
   r = cxx_eval_outermost_constant_expr (t, true, true, false, false, decl);
   gcc_checking_assert (r == t