On 2/13/21 10:21 PM, Patrick Palka wrote:
On Fri, 12 Feb 2021, Patrick Palka wrote:

Here, the problem ultimately seems to be that tsubst_copy_and_build,
when called with empty args as we do during non-dependent expression
folding, doesn't touch BASELINKs at all: it delegates to tsubst_copy
which then immediately exits early due to the empty args.  This means
that the CAST_EXPR int(1) in the BASELINK A::condition<int(1)> never
gets folded (as part of folding of the overall CALL_EXPR), which later
causes us to crash when performing overload resolution of the rebuilt
CALL_EXPR (which is in terms of this still-templated BASELINK).

This doesn't happen when condition() is a namespace-scope function
because then condition<int(1)> is represented as a TEMPLATE_ID_EXPR
rather than a BASELINK, which does get handled directly from
tsubst_copy_and_build.

This patch fixes this issue by having tsubst_copy_and_build handle
BASELINK directly rather than delegating to tsubst_copy, so that it
processes BASELINKS even when args is empty.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?

gcc/cp/ChangeLog:

        PR c++/95468
        * pt.c (tsubst_copy_and_build) <case BASELINK>: New case, copied
        over from tsubst_copy.

gcc/testsuite/ChangeLog:

        PR c++/95468
        * g++.dg/template/non-dependent15.C: New test.
---
  gcc/cp/pt.c                                     |  5 +++++
  gcc/testsuite/g++.dg/template/non-dependent15.C | 12 ++++++++++++
  2 files changed, 17 insertions(+)
  create mode 100644 gcc/testsuite/g++.dg/template/non-dependent15.C

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5102bf02d0f..5b2f43dc5c1 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19856,6 +19856,11 @@ tsubst_copy_and_build (tree t,
      case SCOPE_REF:
        RETURN (tsubst_qualified_id (t, args, complain, in_decl, /*done=*/true,
                                  /*address_p=*/false));
+
+    case BASELINK:
+      return tsubst_baselink (t, current_nonlambda_class_type (),
+                             args, complain, in_decl);

Oops, this should use the RETURN macro instead of a bare 'return' so
that input_location gets properly restored on function exit.

Indeed.

And it looks like there's an existing instance of this bug in the
LAMBDA_EXPR case of tsubst_copy_and_build.  Perhaps it's a good time to
replace these RETURN macros with the equivalent use of iloc_sentinel,
like so?  Bootstrapped and tested on x86_64-pc-linux-gnu.

Both patches are OK.

-- >8 --

Subject: [PATCH] c++: Replace RETURN macros with iloc_sentinel

This replaces the C-era RETURN macro idiom used by some of the tsubsting
functions with an iloc_sentinel declared at the start of each function.

gcc/cp/ChangeLog:

        * pt.c (tsubst_decl): Delete the RETURN macro, and replace its
        uses with a plain 'return'.  Set up an iloc_sentinel at the
        start of the function to set and restore input_location.
        (tsubst_expr): Likewise.  Remove redundant break statements that
        immediately follow a return.
        (tsubst_copy_and_build): Likewise.  Remove 'retval' local
        variable.  Add gcc_unreachable to the end of the function.
---
  gcc/cp/pt.c | 316 ++++++++++++++++++++++++----------------------------
  1 file changed, 145 insertions(+), 171 deletions(-)

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5b2f43dc5c1..32d1759258c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -14414,15 +14414,12 @@ enclosing_instantiation_of (tree otctx)
  static tree
  tsubst_decl (tree t, tree args, tsubst_flags_t complain)
  {
-#define RETURN(EXP) do { r = (EXP); goto out; } while(0)
-  location_t saved_loc;
    tree r = NULL_TREE;
    tree in_decl = t;
    hashval_t hash = 0;
- /* Set the filename and linenumber to improve error-reporting. */
-  saved_loc = input_location;
-  input_location = DECL_SOURCE_LOCATION (t);
+  /* Set the source position to improve error-reporting.  */
+  iloc_sentinel ils (DECL_SOURCE_LOCATION (t));
switch (TREE_CODE (t))
      {
@@ -14453,7 +14450,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
              if (spec
                  && TREE_CODE (spec) == PARM_DECL
                  && TREE_CODE (TREE_TYPE (spec)) != TYPE_PACK_EXPANSION)
-              RETURN (spec);
+             return spec;
/* Expand the TYPE_PACK_EXPANSION that provides the types for
                 the parameters in this function parameter pack.  */
@@ -14466,8 +14463,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
                  /* Zero-length parameter packs are boring. Just substitute
                     into the chain.  */
                if (len == 0 && !cp_unevaluated_operand)
-                  RETURN (tsubst (TREE_CHAIN (t), args, complain,
-                                 TREE_CHAIN (t)));
+                 return tsubst (TREE_CHAIN (t), args, complain,
+                                TREE_CHAIN (t));
                }
              else
                {
@@ -14587,7 +14584,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
                type = tsubst (TREE_TYPE (t), args, complain, in_decl);
if (type == error_mark_node)
-             RETURN (error_mark_node);
+             return error_mark_node;
            TREE_TYPE (r) = type;
            cp_apply_type_quals_to_decl (cp_type_quals (type), r);
@@ -14687,7 +14684,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
        tree type = NULL_TREE;
if (TREE_TYPE (t) == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
if (TREE_CODE (t) == TYPE_DECL
            && t == TYPE_MAIN_DECL (TREE_TYPE (t)))
@@ -14699,7 +14696,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
               we've copied the type for a typedef.  */
            type = tsubst (TREE_TYPE (t), args, complain, in_decl);
            if (type == error_mark_node)
-             RETURN (error_mark_node);
+             return error_mark_node;
            r = TYPE_NAME (type);
            break;
          }
@@ -14745,7 +14742,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
                             argvec, t, complain,
                             /*all*/true, /*defarg*/true));
                if (argvec == error_mark_node)
-                 RETURN (error_mark_node);
+                 return error_mark_node;
                hash = hash_tmpl_and_args (gen_tmpl, argvec);
                spec = retrieve_specialization (gen_tmpl, argvec, hash);
              }
@@ -14815,7 +14812,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
            DECL_INITIALIZED_P (r) = 0;
            DECL_TEMPLATE_INSTANTIATED (r) = 0;
            if (type == error_mark_node)
-             RETURN (error_mark_node);
+             return error_mark_node;
            if (TREE_CODE (type) == FUNCTION_TYPE)
              {
                /* It may seem that this case cannot occur, since:
@@ -14835,7 +14832,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
                       /* R is not yet sufficiently initialized, so we
                          just use its name.  */
                       DECL_NAME (r));
-               RETURN (error_mark_node);
+               return error_mark_node;
              }
            type = complete_type (type);
            /* Wait until cp_finish_decl to set this again, to handle
@@ -14952,11 +14949,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t 
complain)
      default:
        gcc_unreachable ();
      }
-#undef RETURN
-
- out:
-  /* Restore the file and line information.  */
-  input_location = saved_loc;
return r;
  }
@@ -18120,21 +18112,17 @@ tree
  tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
             bool integral_constant_expression_p)
  {
-#define RETURN(EXP) do { r = (EXP); goto out; } while(0)
  #define RECUR(NODE)                           \
    tsubst_expr ((NODE), args, complain, in_decl,       \
               integral_constant_expression_p)
tree stmt, tmp;
    tree r;
-  location_t loc;
if (t == NULL_TREE || t == error_mark_node)
      return t;
- loc = input_location;
-  if (location_t eloc = cp_expr_location (t))
-    input_location = eloc;
+  iloc_sentinel ils (cp_expr_location (t));
    if (STATEMENT_CODE_P (TREE_CODE (t)))
      current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t);
@@ -18164,14 +18152,12 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
      case CO_YIELD_EXPR:
        stmt = finish_co_yield_expr (input_location,
                                   RECUR (TREE_OPERAND (t, 0)));
-      RETURN (stmt);
-      break;
+      return stmt;
case CO_AWAIT_EXPR:
        stmt = finish_co_await_expr (input_location,
                                   RECUR (TREE_OPERAND (t, 0)));
-      RETURN (stmt);
-      break;
+      return stmt;
case EXPR_STMT:
        tmp = RECUR (EXPR_STMT_EXPR (t));
@@ -18836,7 +18822,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl,
          error_at (OMP_CLAUSE_LOCATION (tmp),
                    "%<#pragma omp critical%> with %<hint%> clause requires "
                    "a name, except when %<omp_sync_hint_none%> is used");
-         RETURN (error_mark_node);
+         return error_mark_node;
        }
        t = copy_node (t);
        OMP_BODY (t) = stmt;
@@ -19062,7 +19048,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl,
              stmt = build_transaction_expr (EXPR_LOCATION (t),
                                           RECUR (TRANSACTION_EXPR_BODY (t)),
                                           flags, NULL_TREE);
-            RETURN (stmt);
+           return stmt;
            }
        }
        break;
@@ -19071,50 +19057,46 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl,
        {
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        tree cond = RECUR (MUST_NOT_THROW_COND (t));
-       RETURN (build_must_not_throw_expr (op0, cond));
+       return build_must_not_throw_expr (op0, cond);
        }
case EXPR_PACK_EXPANSION:
        error ("invalid use of pack expansion expression");
-      RETURN (error_mark_node);
+      return error_mark_node;
case NONTYPE_ARGUMENT_PACK:
        error ("use %<...%> to expand argument pack");
-      RETURN (error_mark_node);
+      return error_mark_node;
case COMPOUND_EXPR:
        tmp = RECUR (TREE_OPERAND (t, 0));
        if (tmp == NULL_TREE)
        /* If the first operand was a statement, we're done with it.  */
-       RETURN (RECUR (TREE_OPERAND (t, 1)));
-      RETURN (build_x_compound_expr (EXPR_LOCATION (t), tmp,
+       return RECUR (TREE_OPERAND (t, 1));
+      return build_x_compound_expr (EXPR_LOCATION (t), tmp,
                                    RECUR (TREE_OPERAND (t, 1)),
-                                   complain));
+                                   complain);
case ANNOTATE_EXPR:
        tmp = RECUR (TREE_OPERAND (t, 0));
-      RETURN (build3_loc (EXPR_LOCATION (t), ANNOTATE_EXPR,
-                         TREE_TYPE (tmp), tmp,
-                         RECUR (TREE_OPERAND (t, 1)),
-                         RECUR (TREE_OPERAND (t, 2))));
+      return build3_loc (EXPR_LOCATION (t), ANNOTATE_EXPR,
+                        TREE_TYPE (tmp), tmp,
+                        RECUR (TREE_OPERAND (t, 1)),
+                        RECUR (TREE_OPERAND (t, 2)));
case PREDICT_EXPR:
-      RETURN (add_stmt (copy_node (t)));
+      return add_stmt (copy_node (t));
default:
        gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t)));
- RETURN (tsubst_copy_and_build (t, args, complain, in_decl,
+      return tsubst_copy_and_build (t, args, complain, in_decl,
                                    /*function_p=*/false,
-                                   integral_constant_expression_p));
+                                   integral_constant_expression_p);
      }
- RETURN (NULL_TREE);
- out:
-  input_location = loc;
-  return r;
+  return NULL_TREE;
  #undef RECUR
-#undef RETURN
  }
/* Instantiate the special body of the artificial DECL_OMP_DECLARE_REDUCTION
@@ -19485,21 +19467,17 @@ tsubst_copy_and_build (tree t,
                       bool function_p,
                       bool integral_constant_expression_p)
  {
-#define RETURN(EXP) do { retval = (EXP); goto out; } while(0)
  #define RECUR(NODE)                                           \
    tsubst_copy_and_build (NODE, args, complain, in_decl,       \
                         /*function_p=*/false,                  \
                         integral_constant_expression_p)
- tree retval, op1;
-  location_t save_loc;
+  tree op1;
if (t == NULL_TREE || t == error_mark_node)
      return t;
- save_loc = input_location;
-  if (location_t eloc = cp_expr_location (t))
-    input_location = eloc;
+  iloc_sentinel ils (cp_expr_location (t));
/* N3276 decltype magic only applies to calls at the top level or on the
       right side of a comma.  */
@@ -19551,7 +19529,7 @@ tsubst_copy_and_build (tree t,
              unqualified_name_lookup_error (decl);
            decl = error_mark_node;
          }
-       RETURN (decl);
+       return decl;
        }
case TEMPLATE_ID_EXPR:
@@ -19566,30 +19544,30 @@ tsubst_copy_and_build (tree t,
        if (targs)
          targs = tsubst_template_args (targs, args, complain, in_decl);
        if (targs == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
if (TREE_CODE (templ) == SCOPE_REF)
          {
            tree name = TREE_OPERAND (templ, 1);
            tree tid = lookup_template_function (name, targs);
            TREE_OPERAND (templ, 1) = tid;
-           RETURN (templ);
+           return templ;
          }
if (concept_definition_p (templ))
          {
            tree check = build_concept_check (templ, targs, complain);
            if (check == error_mark_node)
-             RETURN (error_mark_node);
+             return error_mark_node;
tree id = unpack_concept_check (check); /* If we built a function concept check, return the underlying
               template-id. So we can evaluate it as a function call.  */
            if (function_concept_p (TREE_OPERAND (id, 0)))
-             RETURN (id);
+             return id;
- RETURN (check);
+           return check;
          }
if (variable_template_p (templ))
@@ -19597,7 +19575,7 @@ tsubst_copy_and_build (tree t,
            tree r = lookup_and_finish_template_variable (templ, targs,
                                                          complain);
            r = maybe_wrap_with_location (r, EXPR_LOCATION (t));
-           RETURN (r);
+           return r;
          }
if (TREE_CODE (templ) == COMPONENT_REF)
@@ -19611,17 +19589,17 @@ tsubst_copy_and_build (tree t,
        tree tid = lookup_template_function (templ, targs);
if (object)
-         RETURN (build3 (COMPONENT_REF, TREE_TYPE (tid),
-                        object, tid, NULL_TREE));
+         return build3 (COMPONENT_REF, TREE_TYPE (tid),
+                        object, tid, NULL_TREE);
        else if (identifier_p (templ))
          {
            /* C++20 P0846: we can encounter an IDENTIFIER_NODE here when
               name lookup found nothing when parsing the template name.  */
            gcc_assert (cxx_dialect >= cxx20 || seen_error ());
-           RETURN (tid);
+           return tid;
          }
        else
-         RETURN (baselink_for_fns (tid));
+         return baselink_for_fns (tid);
        }
case INDIRECT_REF:
@@ -19642,14 +19620,14 @@ tsubst_copy_and_build (tree t,
        if (REF_PARENTHESIZED_P (t))
          r = force_paren_expr (r);
- RETURN (r);
+       return r;
        }
case NOP_EXPR:
        {
        tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
        tree op0 = RECUR (TREE_OPERAND (t, 0));
-       RETURN (build_nop (type, op0));
+       return build_nop (type, op0);
        }
case IMPLICIT_CONV_EXPR:
@@ -19658,22 +19636,22 @@ tsubst_copy_and_build (tree t,
        tree expr = RECUR (TREE_OPERAND (t, 0));
        if (dependent_type_p (type) || type_dependent_expression_p (expr))
          {
-           retval = copy_node (t);
-           TREE_TYPE (retval) = type;
-           TREE_OPERAND (retval, 0) = expr;
-           RETURN (retval);
+           tree r = copy_node (t);
+           TREE_TYPE (r) = type;
+           TREE_OPERAND (r, 0) = expr;
+           return r;
          }
        if (IMPLICIT_CONV_EXPR_NONTYPE_ARG (t))
          /* We'll pass this to convert_nontype_argument again, we don't need
             to actually perform any conversion here.  */
-         RETURN (expr);
+         return expr;
        int flags = LOOKUP_IMPLICIT;
        if (IMPLICIT_CONV_EXPR_DIRECT_INIT (t))
          flags = LOOKUP_NORMAL;
        if (IMPLICIT_CONV_EXPR_BRACED_INIT (t))
          flags |= LOOKUP_NO_NARROWING;
-       RETURN (perform_implicit_conversion_flags (type, expr, complain,
-                                                 flags));
+       return perform_implicit_conversion_flags (type, expr, complain,
+                                                 flags);
        }
case CONVERT_EXPR:
@@ -19681,8 +19659,8 @@ tsubst_copy_and_build (tree t,
        tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        if (op0 == error_mark_node)
-         RETURN (error_mark_node);
-       RETURN (build1 (CONVERT_EXPR, type, op0));
+         return error_mark_node;
+       return build1 (CONVERT_EXPR, type, op0);
        }
case CAST_EXPR:
@@ -19701,7 +19679,7 @@ tsubst_copy_and_build (tree t,
              if (complain & tf_error)
                error ("a cast to a type other than an integral or "
                       "enumeration type cannot appear in a 
constant-expression");
-           RETURN (error_mark_node);
+           return error_mark_node;
          }
op = RECUR (TREE_OPERAND (t, 0));
@@ -19731,22 +19709,22 @@ tsubst_copy_and_build (tree t,
            gcc_unreachable ();
          }
- RETURN (r);
+       return r;
        }
case BIT_CAST_EXPR:
        {
        tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
        tree op0 = RECUR (TREE_OPERAND (t, 0));
-       RETURN (cp_build_bit_cast (EXPR_LOCATION (t), type, op0, complain));
+       return cp_build_bit_cast (EXPR_LOCATION (t), type, op0, complain);
        }
case POSTDECREMENT_EXPR:
      case POSTINCREMENT_EXPR:
        op1 = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
                                                args, complain, in_decl);
-      RETURN (build_x_unary_op (input_location, TREE_CODE (t), op1,
-                               complain|decltype_flag));
+      return build_x_unary_op (input_location, TREE_CODE (t), op1,
+                              complain|decltype_flag);
case PREDECREMENT_EXPR:
      case PREINCREMENT_EXPR:
@@ -19757,9 +19735,9 @@ tsubst_copy_and_build (tree t,
      case UNARY_PLUS_EXPR:  /* Unary + */
      case REALPART_EXPR:
      case IMAGPART_EXPR:
-      RETURN (build_x_unary_op (input_location, TREE_CODE (t),
-                               RECUR (TREE_OPERAND (t, 0)),
-                               complain|decltype_flag));
+      return build_x_unary_op (input_location, TREE_CODE (t),
+                              RECUR (TREE_OPERAND (t, 0)),
+                              complain|decltype_flag);
case FIX_TRUNC_EXPR:
        gcc_unreachable ();
@@ -19767,16 +19745,16 @@ tsubst_copy_and_build (tree t,
      case ADDR_EXPR:
        op1 = TREE_OPERAND (t, 0);
        if (TREE_CODE (op1) == LABEL_DECL)
-       RETURN (finish_label_address_expr (DECL_NAME (op1),
-                                         EXPR_LOCATION (op1)));
+       return finish_label_address_expr (DECL_NAME (op1),
+                                         EXPR_LOCATION (op1));
        if (TREE_CODE (op1) == SCOPE_REF)
        op1 = tsubst_qualified_id (op1, args, complain, in_decl,
                                   /*done=*/true, /*address_p=*/true);
        else
        op1 = tsubst_non_call_postfix_expression (op1, args, complain,
                                                  in_decl);
-      RETURN (build_x_unary_op (input_location, ADDR_EXPR, op1,
-                               complain|decltype_flag));
+      return build_x_unary_op (input_location, ADDR_EXPR, op1,
+                              complain|decltype_flag);
case PLUS_EXPR:
      case MINUS_EXPR:
@@ -19839,23 +19817,23 @@ tsubst_copy_and_build (tree t,
        if (EXPR_P (r) && TREE_NO_WARNING (t))
          TREE_NO_WARNING (r) = TREE_NO_WARNING (t);
- RETURN (r);
+       return r;
        }
case POINTER_PLUS_EXPR:
        {
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        if (op0 == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
        tree op1 = RECUR (TREE_OPERAND (t, 1));
        if (op1 == error_mark_node)
-         RETURN (error_mark_node);
-       RETURN (fold_build_pointer_plus (op0, op1));
+         return error_mark_node;
+       return fold_build_pointer_plus (op0, op1);
        }
case SCOPE_REF:
-      RETURN (tsubst_qualified_id (t, args, complain, in_decl, /*done=*/true,
-                                 /*address_p=*/false));
+      return tsubst_qualified_id (t, args, complain, in_decl, /*done=*/true,
+                                 /*address_p=*/false);
case BASELINK:
        return tsubst_baselink (t, current_nonlambda_class_type (),
@@ -19864,14 +19842,14 @@ tsubst_copy_and_build (tree t,
      case ARRAY_REF:
        op1 = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
                                                args, complain, in_decl);
-      RETURN (build_x_array_ref (EXPR_LOCATION (t), op1,
-                                RECUR (TREE_OPERAND (t, 1)),
-                                complain|decltype_flag));
+      return build_x_array_ref (EXPR_LOCATION (t), op1,
+                               RECUR (TREE_OPERAND (t, 1)),
+                               complain|decltype_flag);
case SIZEOF_EXPR:
        if (PACK_EXPANSION_P (TREE_OPERAND (t, 0))
          || ARGUMENT_PACK_P (TREE_OPERAND (t, 0)))
-       RETURN (tsubst_copy (t, args, complain, in_decl));
+       return tsubst_copy (t, args, complain, in_decl);
        /* Fall through */
case ALIGNOF_EXPR:
@@ -19930,7 +19908,7 @@ tsubst_copy_and_build (tree t,
              }
            SET_EXPR_LOCATION (r, EXPR_LOCATION (t));
          }
-       RETURN (r);
+       return r;
        }
case AT_ENCODE_EXPR:
@@ -19943,7 +19921,7 @@ tsubst_copy_and_build (tree t,
                                     /*integral_constant_expression_p=*/false);
        --cp_unevaluated_operand;
        --c_inhibit_evaluation_warnings;
-       RETURN (objc_build_encode_expr (op1));
+       return objc_build_encode_expr (op1);
        }
case NOEXCEPT_EXPR:
@@ -19957,7 +19935,7 @@ tsubst_copy_and_build (tree t,
        --cp_unevaluated_operand;
        --c_inhibit_evaluation_warnings;
        --cp_noexcept_operand;
-      RETURN (finish_noexcept_expr (op1, complain));
+      return finish_noexcept_expr (op1, complain);
case MODOP_EXPR:
        {
@@ -19976,7 +19954,7 @@ tsubst_copy_and_build (tree t,
        if (TREE_NO_WARNING (t))
          TREE_NO_WARNING (r) = TREE_NO_WARNING (t);
- RETURN (r);
+       return r;
        }
case ARROW_EXPR:
@@ -19985,8 +19963,8 @@ tsubst_copy_and_build (tree t,
        /* Remember that there was a reference to this entity.  */
        if (DECL_P (op1)
          && !mark_used (op1, complain) && !(complain & tf_error))
-       RETURN (error_mark_node);
-      RETURN (build_x_arrow (input_location, op1, complain));
+       return error_mark_node;
+      return build_x_arrow (input_location, op1, complain);
case NEW_EXPR:
        {
@@ -20000,7 +19978,7 @@ tsubst_copy_and_build (tree t,
        if (placement == NULL_TREE)
          placement_vec = NULL;
        else if (placement == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
        else
          {
            placement_vec = make_tree_vector ();
@@ -20017,7 +19995,7 @@ tsubst_copy_and_build (tree t,
        if (init == NULL_TREE && TREE_OPERAND (t, 3) == NULL_TREE)
          init_vec = NULL;
        else if (init == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
        else
          {
            init_vec = make_tree_vector ();
@@ -20044,17 +20022,17 @@ tsubst_copy_and_build (tree t,
        if (init_vec != NULL)
          release_tree_vector (init_vec);
- RETURN (ret);
+       return ret;
        }
case DELETE_EXPR:
        {
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        tree op1 = RECUR (TREE_OPERAND (t, 1));
-       RETURN (delete_sanity (input_location, op0, op1,
-                              DELETE_EXPR_USE_VEC (t),
-                              DELETE_EXPR_USE_GLOBAL (t),
-                              complain));
+       return delete_sanity (input_location, op0, op1,
+                             DELETE_EXPR_USE_VEC (t),
+                             DELETE_EXPR_USE_GLOBAL (t),
+                             complain);
        }
case COMPOUND_EXPR:
@@ -20063,10 +20041,10 @@ tsubst_copy_and_build (tree t,
                                          complain & ~tf_decltype, in_decl,
                                          /*function_p=*/false,
                                          integral_constant_expression_p);
-       RETURN (build_x_compound_expr (EXPR_LOCATION (t),
-                                      op0,
-                                      RECUR (TREE_OPERAND (t, 1)),
-                                      complain|decltype_flag));
+       return build_x_compound_expr (EXPR_LOCATION (t),
+                                     op0,
+                                     RECUR (TREE_OPERAND (t, 1)),
+                                     complain|decltype_flag);
        }
case CALL_EXPR:
@@ -20080,7 +20058,7 @@ tsubst_copy_and_build (tree t,
        function = CALL_EXPR_FN (t);
        /* Internal function with no arguments.  */
        if (function == NULL_TREE && call_expr_nargs (t) == 0)
-         RETURN (t);
+         return t;
/* When we parsed the expression, we determined whether or
           not Koenig lookup should be performed.  */
@@ -20224,7 +20202,7 @@ tsubst_copy_and_build (tree t,
            if (CLASS_TYPE_P (TREE_TYPE (ret)))
              CALL_EXPR_RETURN_SLOT_OPT (ret) = true;
- RETURN (ret);
+           return ret;
          }
/* We do not perform argument-dependent lookup if normal
@@ -20263,7 +20241,7 @@ tsubst_copy_and_build (tree t,
                            (function, args, complain, in_decl, true,
                             integral_constant_expression_p));
                if (unq == error_mark_node)
-                 RETURN (error_mark_node);
+                 return error_mark_node;
if (unq != function)
                  {
@@ -20317,7 +20295,7 @@ tsubst_copy_and_build (tree t,
                                  "%qD declared here, later in the "
                                  "translation unit", fn);
                        if (in_lambda)
-                         RETURN (error_mark_node);
+                         return error_mark_node;
                      }
function = unq;
@@ -20327,7 +20305,7 @@ tsubst_copy_and_build (tree t,
              {
                if (complain & tf_error)
                  unqualified_name_lookup_error (function);
-               RETURN (error_mark_node);
+               return error_mark_node;
              }
          }
@@ -20335,7 +20313,7 @@ tsubst_copy_and_build (tree t,
        if (function != NULL_TREE
            && DECL_P (function)
            && !mark_used (function, complain) && !(complain & tf_error))
-         RETURN (error_mark_node);
+         return error_mark_node;
/* Put back tf_decltype for the actual call. */
        complain |= decltype_flag;
@@ -20372,7 +20350,7 @@ tsubst_copy_and_build (tree t,
                                                  complain, in_decl),
                                          complain);
              if (TREE_CODE (ret) == VIEW_CONVERT_EXPR)
-               RETURN (ret);
+               return ret;
              break;
default:
@@ -20443,7 +20421,7 @@ tsubst_copy_and_build (tree t,
              }
          }
- RETURN (ret);
+       return ret;
        }
case COND_EXPR:
@@ -20478,8 +20456,8 @@ tsubst_copy_and_build (tree t,
          }
warning_sentinel s(warn_duplicated_branches);
-       RETURN (build_x_conditional_expr (EXPR_LOCATION (t),
-                                        cond, exp1, exp2, complain));
+       return build_x_conditional_expr (EXPR_LOCATION (t),
+                                        cond, exp1, exp2, complain);
        }
case PSEUDO_DTOR_EXPR:
@@ -20487,12 +20465,12 @@ tsubst_copy_and_build (tree t,
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        tree op1 = RECUR (TREE_OPERAND (t, 1));
        tree op2 = tsubst (TREE_OPERAND (t, 2), args, complain, in_decl);
-       RETURN (finish_pseudo_destructor_expr (op0, op1, op2,
-                                              input_location));
+       return finish_pseudo_destructor_expr (op0, op1, op2,
+                                             input_location);
        }
case TREE_LIST:
-      RETURN (tsubst_tree_list (t, args, complain, in_decl));
+      return tsubst_tree_list (t, args, complain, in_decl);
case COMPONENT_REF:
        {
@@ -20506,7 +20484,7 @@ tsubst_copy_and_build (tree t,
        /* Remember that there was a reference to this entity.  */
        if (DECL_P (object)
            && !mark_used (object, complain) && !(complain & tf_error))
-         RETURN (error_mark_node);
+         return error_mark_node;
        object_type = TREE_TYPE (object);
member = TREE_OPERAND (t, 1);
@@ -20517,14 +20495,14 @@ tsubst_copy_and_build (tree t,
        else
          member = tsubst_copy (member, args, complain, in_decl);
        if (member == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
if (TREE_CODE (member) == FIELD_DECL)
          {
            r = finish_non_static_data_member (member, object, NULL_TREE);
            if (TREE_CODE (r) == COMPONENT_REF)
              REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
-           RETURN (r);
+           return r;
          }
        else if (type_dependent_expression_p (object))
          /* We can't do much here.  */;
@@ -20544,7 +20522,7 @@ tsubst_copy_and_build (tree t,
                  {
                    dtor = TREE_OPERAND (dtor, 0);
                    if (TYPE_P (dtor))
-                     RETURN (finish_pseudo_destructor_expr
+                     return (finish_pseudo_destructor_expr
                              (object, s, dtor, input_location));
                  }
              }
@@ -20572,7 +20550,7 @@ tsubst_copy_and_build (tree t,
              {
                qualified_name_lookup_error (scope, tmpl, member,
                                             input_location);
-               RETURN (error_mark_node);
+               return error_mark_node;
              }
          }
        else if (TREE_CODE (member) == SCOPE_REF
@@ -20588,7 +20566,7 @@ tsubst_copy_and_build (tree t,
                  error ("%qD is not a class or namespace",
                         TREE_OPERAND (member, 0));
              }
-           RETURN (error_mark_node);
+           return error_mark_node;
          }
r = finish_class_member_access_expr (object, member,
@@ -20596,12 +20574,11 @@ tsubst_copy_and_build (tree t,
                                             complain);
        if (TREE_CODE (r) == COMPONENT_REF)
          REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
-       RETURN (r);
+       return r;
        }
case THROW_EXPR:
-      RETURN (build_throw
-       (input_location, RECUR (TREE_OPERAND (t, 0))));
+      return build_throw (input_location, RECUR (TREE_OPERAND (t, 0)));
case CONSTRUCTOR:
        {
@@ -20615,7 +20592,7 @@ tsubst_copy_and_build (tree t,
        tree r;
if (type == error_mark_node)
-         RETURN (error_mark_node);
+         return error_mark_node;
/* We do not want to process the index of aggregate
           initializers as they are identifier nodes which will be
@@ -20625,7 +20602,7 @@ tsubst_copy_and_build (tree t,
        if (null_member_pointer_value_p (t))
          {
            gcc_assert (same_type_p (type, TREE_TYPE (t)));
-           RETURN (t);
+           return t;
          }
n = vec_safe_copy (CONSTRUCTOR_ELTS (t));
@@ -20692,11 +20669,11 @@ tsubst_copy_and_build (tree t,
            fcl_t cl = fcl_functional;
            if (CONSTRUCTOR_C99_COMPOUND_LITERAL (t))
              cl = fcl_c99;
-           RETURN (finish_compound_literal (type, r, complain, cl));
+           return finish_compound_literal (type, r, complain, cl);
          }
TREE_TYPE (r) = type;
-       RETURN (r);
+       return r;
        }
case TYPEID_EXPR:
@@ -20705,18 +20682,18 @@ tsubst_copy_and_build (tree t,
        if (TYPE_P (operand_0))
          {
            operand_0 = tsubst (operand_0, args, complain, in_decl);
-           RETURN (get_typeid (operand_0, complain));
+           return get_typeid (operand_0, complain);
          }
        else
          {
            operand_0 = RECUR (operand_0);
-           RETURN (build_typeid (operand_0, complain));
+           return build_typeid (operand_0, complain);
          }
        }
case VAR_DECL:
        if (!args)
-       RETURN (t);
+       return t;
        /* Fall through */
case PARM_DECL:
@@ -20734,14 +20711,14 @@ tsubst_copy_and_build (tree t,
          /* If the original type was a reference, we'll be wrapped in
             the appropriate INDIRECT_REF.  */
          r = convert_from_reference (r);
-       RETURN (r);
+       return r;
        }
case VA_ARG_EXPR:
        {
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
-       RETURN (build_x_va_arg (EXPR_LOCATION (t), op0, type));
+       return build_x_va_arg (EXPR_LOCATION (t), op0, type);
        }
case OFFSETOF_EXPR:
@@ -20750,14 +20727,14 @@ tsubst_copy_and_build (tree t,
          = tsubst_copy_and_build (TREE_OPERAND (t, 1), args, complain,
                                   in_decl, /*function_p=*/false,
                                   /*integral_constant_expression_p=*/false);
-       RETURN (finish_offsetof (object_ptr,
-                                RECUR (TREE_OPERAND (t, 0)),
-                                EXPR_LOCATION (t)));
+       return finish_offsetof (object_ptr,
+                               RECUR (TREE_OPERAND (t, 0)),
+                               EXPR_LOCATION (t));
        }
case ADDRESSOF_EXPR:
-      RETURN (cp_build_addressof (EXPR_LOCATION (t),
-                                 RECUR (TREE_OPERAND (t, 0)), complain));
+      return cp_build_addressof (EXPR_LOCATION (t),
+                                RECUR (TREE_OPERAND (t, 0)), complain);
case TRAIT_EXPR:
        {
@@ -20765,8 +20742,8 @@ tsubst_copy_and_build (tree t,
                             complain, in_decl);
        tree type2 = tsubst (TRAIT_EXPR_TYPE2 (t), args,
                             complain, in_decl);
-       RETURN (finish_trait_expr (TRAIT_EXPR_LOCATION (t),
-                                  TRAIT_EXPR_KIND (t), type1, type2));
+       return finish_trait_expr (TRAIT_EXPR_LOCATION (t),
+                                 TRAIT_EXPR_KIND (t), type1, type2);
        }
case STMT_EXPR:
@@ -20785,7 +20762,7 @@ tsubst_copy_and_build (tree t,
        if (empty_expr_stmt_p (stmt_expr))
          stmt_expr = void_node;
- RETURN (stmt_expr);
+       return stmt_expr;
        }
case LAMBDA_EXPR:
@@ -20799,7 +20776,7 @@ tsubst_copy_and_build (tree t,
          }
        tree r = tsubst_lambda_expr (t, args, complain, in_decl);
- RETURN (build_lambda_object (r));
+       return build_lambda_object (r);
        }
case TARGET_EXPR:
@@ -20808,43 +20785,43 @@ tsubst_copy_and_build (tree t,
        {
        tree r = get_target_expr_sfinae (RECUR (TARGET_EXPR_INITIAL (t)),
                                         complain);
-       RETURN (r);
+       return r;
        }
case TRANSACTION_EXPR:
-      RETURN (tsubst_expr(t, args, complain, in_decl,
-            integral_constant_expression_p));
+      return tsubst_expr (t, args, complain, in_decl,
+                         integral_constant_expression_p);
case PAREN_EXPR:
-      RETURN (finish_parenthesized_expr (RECUR (TREE_OPERAND (t, 0))));
+      return finish_parenthesized_expr (RECUR (TREE_OPERAND (t, 0)));
case VEC_PERM_EXPR:
        {
        tree op0 = RECUR (TREE_OPERAND (t, 0));
        tree op1 = RECUR (TREE_OPERAND (t, 1));
        tree op2 = RECUR (TREE_OPERAND (t, 2));
-       RETURN (build_x_vec_perm_expr (input_location, op0, op1, op2,
-                                      complain));
+       return build_x_vec_perm_expr (input_location, op0, op1, op2,
+                                     complain);
        }
case REQUIRES_EXPR:
        {
        tree r = tsubst_requires_expr (t, args, tf_none, in_decl);
-       RETURN (r);
+       return r;
        }
case RANGE_EXPR:
        /* No need to substitute further, a RANGE_EXPR will always be built
         with constant operands.  */
-      RETURN (t);
+      return t;
case NON_LVALUE_EXPR:
      case VIEW_CONVERT_EXPR:
        if (location_wrapper_p (t))
        /* We need to do this here as well as in tsubst_copy so we get the
           other tsubst_copy_and_build semantics for a PARM_DECL operand.  */
-       RETURN (maybe_wrap_with_location (RECUR (TREE_OPERAND (t, 0)),
-                                         EXPR_LOCATION (t)));
+       return maybe_wrap_with_location (RECUR (TREE_OPERAND (t, 0)),
+                                        EXPR_LOCATION (t));
        /* fallthrough.  */
default:
@@ -20854,16 +20831,13 @@ tsubst_copy_and_build (tree t,
          = objcp_tsubst_copy_and_build (t, args, complain,
                                         in_decl, /*function_p=*/false);
        if (subst)
-         RETURN (subst);
+         return subst;
        }
-      RETURN (tsubst_copy (t, args, complain, in_decl));
+      return tsubst_copy (t, args, complain, in_decl);
      }
+ gcc_unreachable ();
  #undef RECUR
-#undef RETURN
- out:
-  input_location = save_loc;
-  return retval;
  }
/* Verify that the instantiated ARGS are valid. For type arguments,


Reply via email to