On 10/29/20 10:36 PM, Marek Polacek wrote:
We may not call value_dependent_expression_p on expressions that are
not potential constant expressions, otherwise value_d could crash,
as I saw recently (in C++98).  So beef up the checking in i_d_e_p.

This revealed a curious issue: when we have __PRETTY_FUNCTION__ in
a template function, we set its DECL_VALUE_EXPR to error_mark_node
(cp_make_fname_decl), so potential_c_e returns false when it gets it,
but value_dependent_expression_p handles it specially and says true.
This broke lambda-generic-pretty1.C.  So take care of that.

And then also tweak uses_template_parms.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

OK, thanks.

gcc/cp/ChangeLog:

        * constexpr.c (potential_constant_expression_1): Treat
        __PRETTY_FUNCTION__ inside a template function as
        potentially-constant.
        * pt.c (uses_template_parms): Call
        instantiation_dependent_expression_p instead of
        value_dependent_expression_p.
        (instantiation_dependent_expression_p): Check
        potential_constant_expression before calling
        value_dependent_expression_p.
---
  gcc/cp/constexpr.c | 5 +++++
  gcc/cp/pt.c        | 5 +++--
  2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index b46824f128d..c257dfcb2e6 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -7716,6 +7716,11 @@ potential_constant_expression_1 (tree t, bool want_rval, 
bool strict, bool now,
                }
              return false;
            }
+         /* Treat __PRETTY_FUNCTION__ inside a template function as
+            potentially-constant.  */
+         else if (DECL_PRETTY_FUNCTION_P (t)
+                  && DECL_VALUE_EXPR (t) == error_mark_node)
+           return true;
          return RECUR (DECL_VALUE_EXPR (t), rval);
        }
        if (want_rval
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b569644514c..c419fb470ee 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10755,7 +10755,7 @@ uses_template_parms (tree t)
    else if (t == error_mark_node)
      dependent_p = false;
    else
-    dependent_p = value_dependent_expression_p (t);
+    dependent_p = instantiation_dependent_expression_p (t);
processing_template_decl = saved_processing_template_decl; @@ -27293,7 +27293,8 @@ bool
  instantiation_dependent_expression_p (tree expression)
  {
    return (instantiation_dependent_uneval_expression_p (expression)
-         || value_dependent_expression_p (expression));
+         || (potential_constant_expression (expression)
+             && value_dependent_expression_p (expression)));
  }
/* Like type_dependent_expression_p, but it also works while not processing

base-commit: 4f0606fe4bbf1346f83dd4d0c9060c6b46672a7d


Reply via email to