semantics.c (end_maybe_infinite_loop): Use fold_non_dependent_expr.
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 14 Nov 2014 16:59:52 +0000 (16:59 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 14 Nov 2014 16:59:52 +0000 (16:59 +0000)
2014-11-14  Paolo Carlini  <paolo.carlini@oracle.com>

* semantics.c (end_maybe_infinite_loop): Use fold_non_dependent_expr.
* parser.c (cp_parser_omp_clause_collapse): Likewise.
(cp_parser_enumerator_definition): Don't call
instantiate_non_dependent_expr...
* decl.c (build_enumerator): ... call fold_non_dependent_expr here.
* typeck2.c (massage_init_elt): Use fold_non_dependent_expr.
* constexpr.c (maybe_constant_value): Allow VIEW_CONVERT_EXPR in
the final gcc_assert.

* constexpr.c (fold_non_dependent_expr): Add.
* cp-tree.h (fold_non_dependent_expr): Declare it.
* call.c (null_ptr_cst_p): Use it.
* pt.c (tsubst_copy_and_build, build_non_dependent_expr): Likewise.
* semantics.c (begin_maybe_infinite_loop): Likewise.
* typeck.c (cp_build_binary_op): Likewise.
* typeck2.c (check_narrowing): Likewise.

* pt.c (fold_non_dependent_expr): Rename to
instantiate_non_dependent_expr.
(fold_non_dependent_expr_sfinae): Rename to
instantiate_non_dependent_expr_sfinae.
(convert_nontype_argument, build_non_dependent_expr): Adjust.
* decl.c (compute_array_index_type): Likewise.
* parser.c (cp_parser_parenthesized_expression_list,
cp_parser_enumerator_definition, cp_parser_omp_clause_collapse):
Likewise.
* semantics.c (end_maybe_infinite_loop, finish_static_assert):
Likewise.
* typeck.c (cxx_alignas_expr): Likewise.
* typeck2.c (store_init_value, massage_init_elt): Likewise.
* call.c: Adjust comments.
* class.c: Likewise.
* constexpr.c: Likewise.
* decl2.c: Likewise.
* tree.c: Likewise.

From-SVN: r217577

13 files changed:
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/constexpr.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/cp/typeck2.c

index ddef4ff68b21bd864e101000fe7518cea6747ecd..5311649d12dc15a47181642e6b27a1f0cc8dea5d 100644 (file)
@@ -1,3 +1,41 @@
+2014-11-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * semantics.c (end_maybe_infinite_loop): Use fold_non_dependent_expr.
+       * parser.c (cp_parser_omp_clause_collapse): Likewise.
+       (cp_parser_enumerator_definition): Don't call
+       instantiate_non_dependent_expr...
+       * decl.c (build_enumerator): ... call fold_non_dependent_expr here.
+       * typeck2.c (massage_init_elt): Use fold_non_dependent_expr.
+       * constexpr.c (maybe_constant_value): Allow VIEW_CONVERT_EXPR in
+       the final gcc_assert.
+
+       * constexpr.c (fold_non_dependent_expr): Add.
+       * cp-tree.h (fold_non_dependent_expr): Declare it.
+       * call.c (null_ptr_cst_p): Use it.
+       * pt.c (tsubst_copy_and_build, build_non_dependent_expr): Likewise.
+       * semantics.c (begin_maybe_infinite_loop): Likewise.
+       * typeck.c (cp_build_binary_op): Likewise.
+       * typeck2.c (check_narrowing): Likewise.
+
+       * pt.c (fold_non_dependent_expr): Rename to
+       instantiate_non_dependent_expr.
+       (fold_non_dependent_expr_sfinae): Rename to
+       instantiate_non_dependent_expr_sfinae.
+       (convert_nontype_argument, build_non_dependent_expr): Adjust.
+       * decl.c (compute_array_index_type): Likewise.
+       * parser.c (cp_parser_parenthesized_expression_list,
+       cp_parser_enumerator_definition, cp_parser_omp_clause_collapse):
+       Likewise.
+       * semantics.c (end_maybe_infinite_loop, finish_static_assert):
+       Likewise.
+       * typeck.c (cxx_alignas_expr): Likewise.
+       * typeck2.c (store_init_value, massage_init_elt): Likewise.
+       * call.c: Adjust comments.
+       * class.c: Likewise.
+       * constexpr.c: Likewise.
+       * decl2.c: Likewise.
+       * tree.c: Likewise.
+
 2014-11-14  Jonathan Wakely  <jwakely@redhat.com>
 
        * mangle.c (find_substitution): Look for abi_tag on class templates.
index bf191cadfd476d5977309524e45e3c6cf506fc94..4f0b1725da2e945c71907f21af4e2e09f83def33 100644 (file)
@@ -572,7 +572,7 @@ null_ptr_cst_p (tree t)
     {
       /* Core issue 903 says only literal 0 is a null pointer constant.  */
       if (cxx_dialect < cxx11)
-       t = maybe_constant_value (fold_non_dependent_expr_sfinae (t, tf_none));
+       t = fold_non_dependent_expr (t);
       STRIP_NOPS (t);
       if (integer_zerop (t) && !TREE_OVERFLOW (t))
        return true;
@@ -7437,8 +7437,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
     return error_mark_node;
 
   if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0
-      /* Don't mess with virtual lookup in fold_non_dependent_expr; virtual
-        functions can't be constexpr.  */
+      /* Don't mess with virtual lookup in instantiate_non_dependent_expr;
+        virtual functions can't be constexpr.  */
       && !in_template_function ())
     {
       tree t;
@@ -9361,7 +9361,7 @@ perform_implicit_conversion_flags (tree type, tree expr,
         type of non-dependent expressions, so we do not have to
         perform the actual conversion.  But for initializers, we
         need to be able to perform it at instantiation
-        (or fold_non_dependent_expr) time.  */
+        (or instantiate_non_dependent_expr) time.  */
       expr = build1 (IMPLICIT_CONV_EXPR, type, expr);
       if (!(flags & LOOKUP_ONLYCONVERTING))
        IMPLICIT_CONV_EXPR_DIRECT_INIT (expr) = true;
index ce1d07c90efeb80617989b7e3920d08dccf98f61..c83c8adfab278dfc81543745f54b79c8dad7bcc7 100644 (file)
@@ -359,9 +359,9 @@ build_base_path (enum tree_code code,
 
   /* Don't bother with the calculations inside sizeof; they'll ICE if the
      source type is incomplete and the pointer value doesn't matter.  In a
-     template (even in fold_non_dependent_expr), we don't have vtables set
-     up properly yet, and the value doesn't matter there either; we're just
-     interested in the result of overload resolution.  */
+     template (even in instantiate_non_dependent_expr), we don't have vtables
+     set up properly yet, and the value doesn't matter there either; we're
+     just interested in the result of overload resolution.  */
   if (cp_unevaluated_operand != 0
       || in_template_function ())
     {
@@ -6933,7 +6933,8 @@ resolves_to_fixed_type_p (tree instance, int* nonnull)
   tree fixed;
 
   /* processing_template_decl can be false in a template if we're in
-     fold_non_dependent_expr, but we still want to suppress this check.  */
+     instantiate_non_dependent_expr, but we still want to suppress
+     this check.  */
   if (in_template_function ())
     {
       /* In a template we only care about the type of the result.  */
index 3901e9a53da9913a7de94d0891547c6584828363..d30bf635d84d0dfd5701400b838a052d5e829dea 100644 (file)
@@ -2908,12 +2908,83 @@ maybe_constant_value (tree t, tree decl)
   /* cp_tree_equal looks through NOPs, so allow them.  */
   gcc_assert (r == t
              || CONVERT_EXPR_P (t)
+             || TREE_CODE (t) == VIEW_CONVERT_EXPR
              || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
              || !cp_tree_equal (r, t));
 #endif
   return r;
 }
 
+/* Like maybe_constant_value but first fully instantiate the argument.
+
+   Note: this is equivalent to instantiate_non_dependent_expr_sfinae
+   (t, tf_none) followed by maybe_constant_value but is more efficient,
+   because calls instantiation_dependent_expression_p and
+   potential_constant_expression at most once.  */
+
+tree
+fold_non_dependent_expr (tree t)
+{
+  if (t == NULL_TREE)
+    return NULL_TREE;
+
+  /* If we're in a template, but T isn't value dependent, simplify
+     it.  We're supposed to treat:
+
+       template <typename T> void f(T[1 + 1]);
+       template <typename T> void f(T[2]);
+
+     as two declarations of the same function, for example.  */
+  if (processing_template_decl)
+    {
+      if (!instantiation_dependent_expression_p (t)
+         && potential_constant_expression (t))
+       {
+         HOST_WIDE_INT saved_processing_template_decl;
+
+         saved_processing_template_decl = processing_template_decl;
+         processing_template_decl = 0;
+         t = tsubst_copy_and_build (t,
+                                    /*args=*/NULL_TREE,
+                                    tf_none,
+                                    /*in_decl=*/NULL_TREE,
+                                    /*function_p=*/false,
+                                    /*integral_constant_expression_p=*/true);
+         processing_template_decl = saved_processing_template_decl;
+
+         if (type_unknown_p (t)
+             || BRACE_ENCLOSED_INITIALIZER_P (t))
+           {
+             if (TREE_OVERFLOW_P (t))
+               {
+                 t = build_nop (TREE_TYPE (t), t);
+                 TREE_CONSTANT (t) = false;
+               }
+             return t;
+           }
+
+         tree r = cxx_eval_outermost_constant_expr (t, true, NULL_TREE);
+#ifdef ENABLE_CHECKING
+         /* cp_tree_equal looks through NOPs, so allow them.  */
+         gcc_assert (r == t
+                     || CONVERT_EXPR_P (t)
+                     || TREE_CODE (t) == VIEW_CONVERT_EXPR
+                     || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
+                     || !cp_tree_equal (r, t));
+#endif
+         return r;
+       }
+      else if (TREE_OVERFLOW_P (t))
+       {
+         t = build_nop (TREE_TYPE (t), t);
+         TREE_CONSTANT (t) = false;
+       }
+      return t;
+    }
+
+  return maybe_constant_value (t);
+}
+
 /* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
    than wrapped in a TARGET_EXPR.  */
 
@@ -3386,7 +3457,7 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
        if (!potential_constant_expression_1 (denom, rval, flags))
          return false;
        /* We can't call cxx_eval_outermost_constant_expr on an expression
-          that hasn't been through fold_non_dependent_expr yet.  */
+          that hasn't been through instantiate_non_dependent_expr yet.  */
        if (!processing_template_decl)
          denom = cxx_eval_outermost_constant_expr (denom, true);
        if (integer_zerop (denom))
index 7a1a0f74b02da3d652d078bbe99e60abd91ab16b..b69c73695890c7f5994cb83947ccebda5d0d4877 100644 (file)
@@ -5690,8 +5690,8 @@ extern tree template_for_substitution             (tree);
 extern tree build_non_dependent_expr           (tree);
 extern void make_args_non_dependent            (vec<tree, va_gc> *);
 extern bool reregister_specialization          (tree, tree, tree);
-extern tree fold_non_dependent_expr            (tree);
-extern tree fold_non_dependent_expr_sfinae     (tree, tsubst_flags_t);
+extern tree instantiate_non_dependent_expr     (tree);
+extern tree instantiate_non_dependent_expr_sfinae (tree, tsubst_flags_t);
 extern bool alias_type_or_template_p            (tree);
 extern bool alias_template_specialization_p     (const_tree);
 extern bool dependent_alias_template_spec_p     (const_tree);
@@ -6331,6 +6331,7 @@ extern bool require_potential_rvalue_constant_expression (tree);
 extern tree cxx_constant_value                 (tree, tree = NULL_TREE);
 extern tree maybe_constant_value               (tree, tree = NULL_TREE);
 extern tree maybe_constant_init                        (tree, tree = NULL_TREE);
+extern tree fold_non_dependent_expr            (tree);
 extern bool is_sub_constant_expr                (tree);
 extern bool reduced_constant_expression_p       (tree);
 extern bool is_instantiation_of_constexpr       (tree);
index 9ca32e37d9532d1cd1a3008f506b9276507bfa28..1ef97637426d859fd79034fad393138b4fe93355 100644 (file)
@@ -8356,7 +8356,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
           NOP_EXPR with TREE_SIDE_EFFECTS; don't fold in that case.  */;
       else
        {
-         size = fold_non_dependent_expr_sfinae (size, complain);
+         size = instantiate_non_dependent_expr_sfinae (size, complain);
 
          if (CLASS_TYPE_P (type)
              && CLASSTYPE_LITERAL_P (type))
@@ -12999,6 +12999,11 @@ build_enumerator (tree name, tree value, tree enumtype, location_t loc)
   tree context;
   tree type;
 
+  /* integral_constant_value will pull out this expression, so make sure
+     it's folded as appropriate.  */
+  if (processing_template_decl)
+    value = fold_non_dependent_expr (value);
+
   /* If the VALUE was erroneous, pretend it wasn't there; that will
      result in the enum being assigned the next value in sequence.  */
   if (value == error_mark_node)
index ff407101f081e10e451a2a3e6878fe4758aab01f..1b686ef95ae10e5d4af6f5e8faa3220828d0e15e 100644 (file)
@@ -4951,7 +4951,7 @@ mark_used (tree decl, tsubst_flags_t complain)
   if (processing_template_decl)
     return true;
 
-  /* Check this too in case we're within fold_non_dependent_expr.  */
+  /* Check this too in case we're within instantiate_non_dependent_expr.  */
   if (DECL_TEMPLATE_INFO (decl)
       && uses_template_parms (DECL_TI_ARGS (decl)))
     return true;
index 93520bc4ecf72e6ec9f4b872990098f5ef632a93..3ab65a915565ad90a64e9a681c5d1db1e4c8ce90 100644 (file)
@@ -6886,7 +6886,7 @@ cp_parser_parenthesized_expression_list (cp_parser* parser,
              }
 
            if (fold_expr_p)
-             expr = fold_non_dependent_expr (expr);
+             expr = instantiate_non_dependent_expr (expr);
 
             /* If we have an ellipsis, then this is an expression
               expansion.  */
@@ -15996,10 +15996,6 @@ cp_parser_enumerator_definition (cp_parser* parser, tree type)
   if (check_for_bare_parameter_packs (value))
     value = error_mark_node;
 
-  /* integral_constant_value will pull out this expression, so make sure
-     it's folded as appropriate.  */
-  value = fold_non_dependent_expr (value);
-
   /* Create the enumerator.  */
   build_enumerator (identifier, value, type, loc);
 }
index f408680abbf86c0a8f7f3c02b2c26d2fae5adafa..1ee3dc1190635fbc196bc019d8d521c2458590bf 100644 (file)
@@ -5216,7 +5216,7 @@ redeclare_class_template (tree type, tree parms)
    (possibly simplified) expression.  */
 
 tree
-fold_non_dependent_expr_sfinae (tree expr, tsubst_flags_t complain)
+instantiate_non_dependent_expr_sfinae (tree expr, tsubst_flags_t complain)
 {
   if (expr == NULL_TREE)
     return NULL_TREE;
@@ -5248,9 +5248,9 @@ fold_non_dependent_expr_sfinae (tree expr, tsubst_flags_t complain)
 }
 
 tree
-fold_non_dependent_expr (tree expr)
+instantiate_non_dependent_expr (tree expr)
 {
-  return fold_non_dependent_expr_sfinae (expr, tf_error);
+  return instantiate_non_dependent_expr_sfinae (expr, tf_error);
 }
 
 /* Return TRUE iff T is a type alias, a TEMPLATE_DECL for an alias
@@ -5740,7 +5740,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
       && has_value_dependent_address (expr))
     /* If we want the address and it's value-dependent, don't fold.  */;
   else if (!type_unknown_p (expr))
-    expr = fold_non_dependent_expr_sfinae (expr, complain);
+    expr = instantiate_non_dependent_expr_sfinae (expr, complain);
   if (error_operand_p (expr))
     return error_mark_node;
   expr_type = TREE_TYPE (expr);
@@ -8314,7 +8314,7 @@ uses_template_parms (tree t)
 
 /* Returns true iff current_function_decl is an incompletely instantiated
    template.  Useful instead of processing_template_decl because the latter
-   is set to 0 during fold_non_dependent_expr.  */
+   is set to 0 during instantiate_non_dependent_expr.  */
 
 bool
 in_template_function (void)
@@ -15138,8 +15138,7 @@ tsubst_copy_and_build (tree t,
     case COND_EXPR:
       {
        tree cond = RECUR (TREE_OPERAND (t, 0));
-       tree folded_cond = (maybe_constant_value
-                           (fold_non_dependent_expr_sfinae (cond, tf_none)));
+       tree folded_cond = fold_non_dependent_expr (cond);
        tree exp1, exp2;
 
        if (TREE_CODE (folded_cond) == INTEGER_CST)
@@ -21110,7 +21109,7 @@ value_dependent_expression_p (tree expression)
 
     case STMT_EXPR:
       /* Treat a GNU statement expression as dependent to avoid crashing
-        under fold_non_dependent_expr; it can't be constant.  */
+        under instantiate_non_dependent_expr; it can't be constant.  */
       return true;
 
     default:
@@ -21864,7 +21863,7 @@ build_non_dependent_expr (tree expr)
   /* Try to get a constant value for all non-dependent expressions in
       order to expose bugs in *_dependent_expression_p and constexpr.  */
   if (cxx_dialect >= cxx11)
-    maybe_constant_value (fold_non_dependent_expr_sfinae (expr, tf_none));
+    fold_non_dependent_expr (expr);
 #endif
 
   /* Preserve OVERLOADs; the functions must be available to resolve
index ebd9a43b949e290981b0b3debdda24e32dd81e83..6888121d5d0cd89587700920dd76ef1d13642f29 100644 (file)
@@ -511,8 +511,7 @@ begin_maybe_infinite_loop (tree cond)
   bool maybe_infinite = true;
   if (cond)
     {
-      cond = fold_non_dependent_expr_sfinae (cond, tf_none);
-      cond = maybe_constant_value (cond);
+      cond = fold_non_dependent_expr (cond);
       maybe_infinite = integer_nonzerop (cond);
     }
   vec_safe_push (cp_function_chain->infinite_loops,
@@ -543,7 +542,6 @@ end_maybe_infinite_loop (tree cond)
   if (current != NULL_TREE)
     {
       cond = fold_non_dependent_expr (cond);
-      cond = maybe_constant_value (cond);
       if (integer_nonzerop (cond))
        current_function_infinite_loop = 1;
     }
@@ -7043,7 +7041,7 @@ finish_static_assert (tree condition, tree message, location_t location,
     }
 
   /* Fold the expression and convert it to a boolean value. */
-  condition = fold_non_dependent_expr (condition);
+  condition = instantiate_non_dependent_expr (condition);
   condition = cp_convert (boolean_type_node, condition, tf_warning_or_error);
   condition = maybe_constant_value (condition);
 
index e0c2af1576c5e9c251a2783303a99ab2da4d55b3..21cecc2e39c8da17813be99ab125c2607475564d 100644 (file)
@@ -4143,7 +4143,7 @@ fold_if_not_in_template (tree expr)
   /* In the body of a template, there is never any need to call
      "fold".  We will call fold later when actually instantiating the
      template.  Integral constant expressions in templates will be
-     evaluated via fold_non_dependent_expr, as necessary.  */
+     evaluated via instantiate_non_dependent_expr, as necessary.  */
   if (processing_template_decl)
     return expr;
 
index 184363e64465430ce8b7abe81acf3531cfb8b898..05bc916cdc7188eb59812e4baee0c90163020597 100644 (file)
@@ -1787,7 +1787,7 @@ cxx_alignas_expr (tree e)
     /* Leave value-dependent expression alone for now. */
     return e;
 
-  e = fold_non_dependent_expr (e);
+  e = instantiate_non_dependent_expr (e);
   e = mark_rvalue_use (e);
 
   /* [dcl.align]/2 says:
@@ -4135,8 +4135,7 @@ cp_build_binary_op (location_t location,
              || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
        {
          enum tree_code tcode0 = code0, tcode1 = code1;
-         tree cop1 = fold_non_dependent_expr_sfinae (op1, tf_none);
-         cop1 = maybe_constant_value (cop1);
+         tree cop1 = fold_non_dependent_expr (op1);
          doing_div_or_mod = true;
          warn_for_div_by_zero (location, cop1);
 
@@ -4175,8 +4174,7 @@ cp_build_binary_op (location_t location,
     case TRUNC_MOD_EXPR:
     case FLOOR_MOD_EXPR:
       {
-       tree cop1 = fold_non_dependent_expr_sfinae (op1, tf_none);
-       cop1 = maybe_constant_value (cop1);
+       tree cop1 = fold_non_dependent_expr (op1);
        doing_div_or_mod = true;
        warn_for_div_by_zero (location, cop1);
       }
@@ -4270,8 +4268,7 @@ cp_build_binary_op (location_t location,
        }
       else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
        {
-         tree const_op1 = fold_non_dependent_expr_sfinae (op1, tf_none);
-         const_op1 = maybe_constant_value (const_op1);
+         tree const_op1 = fold_non_dependent_expr (op1);
          if (TREE_CODE (const_op1) != INTEGER_CST)
            const_op1 = op1;
          result_type = type0;
@@ -4320,8 +4317,7 @@ cp_build_binary_op (location_t location,
        }
       else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
        {
-         tree const_op1 = fold_non_dependent_expr_sfinae (op1, tf_none);
-         const_op1 = maybe_constant_value (const_op1);
+         tree const_op1 = fold_non_dependent_expr (op1);
          if (TREE_CODE (const_op1) != INTEGER_CST)
            const_op1 = op1;
          result_type = type0;
@@ -4993,10 +4989,8 @@ cp_build_binary_op (location_t location,
       /* OP0 and/or OP1 might have side-effects.  */
       op0 = cp_save_expr (op0);
       op1 = cp_save_expr (op1);
-      op0 = maybe_constant_value (fold_non_dependent_expr_sfinae (op0,
-                                                                 tf_none));
-      op1 = maybe_constant_value (fold_non_dependent_expr_sfinae (op1,
-                                                                 tf_none));
+      op0 = fold_non_dependent_expr (op0);
+      op1 = fold_non_dependent_expr (op1);
       if (doing_div_or_mod && (flag_sanitize & (SANITIZE_DIVIDE
                                                | SANITIZE_FLOAT_DIVIDE)))
        {
index d57f75dadc59d529d8ac544987fd87396c4833d5..01a0671341eb774483966168960fc54150953a0b 100644 (file)
@@ -797,7 +797,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
   if (decl_maybe_constant_var_p (decl) || TREE_STATIC (decl))
     {
       bool const_init;
-      value = fold_non_dependent_expr (value);
+      value = instantiate_non_dependent_expr (value);
       if (DECL_DECLARED_CONSTEXPR_P (decl)
          || DECL_IN_AGGR_P (decl))
        {
@@ -872,7 +872,7 @@ check_narrowing (tree type, tree init, tsubst_flags_t complain)
       return ok;
     }
 
-  init = maybe_constant_value (fold_non_dependent_expr_sfinae (init, tf_none));
+  init = fold_non_dependent_expr (init);
 
   if (TREE_CODE (type) == INTEGER_TYPE
       && TREE_CODE (ftype) == REAL_TYPE)
@@ -1176,7 +1176,7 @@ massage_init_elt (tree type, tree init, tsubst_flags_t complain)
     init = TARGET_EXPR_INITIAL (init);
   /* When we defer constant folding within a statement, we may want to
      defer this folding as well.  */
-  tree t = fold_non_dependent_expr_sfinae (init, complain);
+  tree t = fold_non_dependent_expr (init);
   t = maybe_constant_init (t);
   if (TREE_CONSTANT (t))
     init = t;