commit:     07367a96580437b5de949e04a39b408fd673448e
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 20 20:45:01 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Aug 20 20:45:01 2025 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=07367a96

16.0.0: drop obsolete C++ patch

It's been fixed upstream now.

Signed-off-by: Sam James <sam <AT> gentoo.org>

 ...036R3-Change-scope-of-lambda-trailing-ret.patch | 1186 --------------------
 16.0.0/gentoo/README.history                       |    1 +
 2 files changed, 1 insertion(+), 1186 deletions(-)

diff --git 
a/16.0.0/gentoo/87_all_PR121553-Revert-c-P2036R3-Change-scope-of-lambda-trailing-ret.patch
 
b/16.0.0/gentoo/87_all_PR121553-Revert-c-P2036R3-Change-scope-of-lambda-trailing-ret.patch
deleted file mode 100644
index ad792d0..0000000
--- 
a/16.0.0/gentoo/87_all_PR121553-Revert-c-P2036R3-Change-scope-of-lambda-trailing-ret.patch
+++ /dev/null
@@ -1,1186 +0,0 @@
-From 358ad796de168eedb8bcf9509a7dc40861f057a0 Mon Sep 17 00:00:00 2001
-Message-ID: 
<358ad796de168eedb8bcf9509a7dc40861f057a0.1755561114.git....@gentoo.org>
-From: Sam James <[email protected]>
-Date: Tue, 19 Aug 2025 00:51:27 +0100
-Subject: [PATCH] Revert "c++: P2036R3 - Change scope of lambda
- trailing-return-type [PR102610]"
-
-This reverts commit d2dccd1bf79b862b9989c1b62ed8c074980cd457.
-
-Bug: https://gcc.gnu.org/PR121553
----
- gcc/cp/cp-tree.h                              |  11 -
- gcc/cp/lambda.cc                              |  40 +---
- gcc/cp/name-lookup.cc                         |  11 +-
- gcc/cp/name-lookup.h                          |   1 -
- gcc/cp/parser.cc                              |  94 --------
- gcc/cp/pt.cc                                  |  21 --
- gcc/cp/semantics.cc                           |  64 ++----
- .../g++.dg/cpp0x/lambda/lambda-decltype3.C    |   2 +-
- gcc/testsuite/g++.dg/cpp23/lambda-scope1.C    |  85 -------
- gcc/testsuite/g++.dg/cpp23/lambda-scope2.C    | 217 ------------------
- gcc/testsuite/g++.dg/cpp23/lambda-scope3.C    |  44 ----
- gcc/testsuite/g++.dg/cpp23/lambda-scope4.C    |  41 ----
- gcc/testsuite/g++.dg/cpp23/lambda-scope4b.C   |  42 ----
- gcc/testsuite/g++.dg/cpp23/lambda-scope5.C    |  22 --
- gcc/testsuite/g++.dg/cpp23/lambda-scope6.C    |  20 --
- gcc/testsuite/g++.dg/cpp23/lambda-scope7.C    |  20 --
- gcc/testsuite/g++.dg/cpp23/lambda-scope8.C    |  25 --
- gcc/testsuite/g++.dg/cpp23/lambda-scope9.C    |  15 --
- gcc/testsuite/g++.dg/warn/Wshadow-19.C        |   4 +-
- gcc/testsuite/g++.dg/warn/Wshadow-6.C         |   8 +-
- 20 files changed, 37 insertions(+), 750 deletions(-)
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope1.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope2.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope3.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope4.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope4b.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope5.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope6.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope7.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope8.C
- delete mode 100644 gcc/testsuite/g++.dg/cpp23/lambda-scope9.C
-
-diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
-index 55e8e0736272..d29d996e55e5 100644
---- a/gcc/cp/cp-tree.h
-+++ b/gcc/cp/cp-tree.h
-@@ -476,7 +476,6 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
-       ATOMIC_CONSTR_EXPR_FROM_CONCEPT_P (in ATOMIC_CONSTR)
-       STATIC_INIT_DECOMP_BASE_P (in the TREE_LIST for {static,tls}_aggregates)
-       MUST_NOT_THROW_THROW_P (in MUST_NOT_THROW_EXPR)
--      LAMBDA_EXPR_CONST_QUAL_P (in LAMBDA_EXPR)
-    2: IDENTIFIER_KIND_BIT_2 (in IDENTIFIER_NODE)
-       ICS_THIS_FLAG (in _CONV)
-       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
-@@ -1558,13 +1557,6 @@ enum cp_lambda_default_capture_mode_type {
- #define LAMBDA_EXPR_CONSTEVAL_BLOCK_P(NODE) \
-   TREE_LANG_FLAG_0 (LAMBDA_EXPR_CHECK (NODE))
- 
--/* True if we should add "const" when figuring out the type of an entity
--   in a lambda.  This is false in the parameter-declaration-clause of
--   a lambda; after that, it will remain false if the mutable keyword is
--   present.  */
--#define LAMBDA_EXPR_CONST_QUAL_P(NODE) \
--  TREE_LANG_FLAG_1 (LAMBDA_EXPR_CHECK (NODE))
--
- /* True iff uses of a const variable capture were optimized away.  */
- #define LAMBDA_EXPR_CAPTURE_OPTIMIZED(NODE) \
-   TREE_LANG_FLAG_2 (LAMBDA_EXPR_CHECK (NODE))
-@@ -7807,8 +7799,6 @@ extern location_t defparse_location (tree);
- extern void maybe_show_extern_c_location (void);
- extern bool literal_integer_zerop (const_tree);
- extern tree attr_chainon (tree, tree);
--extern tree maybe_add_dummy_lambda_op (tree);
--extern void remove_dummy_lambda_op (tree, tree);
- 
- /* in pt.cc */
- extern tree canonical_type_parameter          (tree);
-@@ -8339,7 +8329,6 @@ extern void record_lambda_scope                  (tree 
lambda);
- extern void record_lambda_scope_discriminator (tree lambda);
- extern void record_lambda_scope_sig_discriminator (tree lambda, tree fn);
- extern tree start_lambda_function             (tree fn, tree lambda_expr);
--extern void push_capture_proxies              (tree, bool = false);
- extern void finish_lambda_function            (tree body);
- extern bool regenerated_lambda_fn_p           (tree);
- extern tree lambda_regenerating_args          (tree);
-diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
-index 711e3b7a18e4..c798967f8e1c 100644
---- a/gcc/cp/lambda.cc
-+++ b/gcc/cp/lambda.cc
-@@ -409,11 +409,10 @@ lambda_proxy_type (tree ref)
- 
- /* MEMBER is a capture field in a lambda closure class.  Now that we're
-    inside the operator(), build a placeholder var for future lookups and
--   debugging.  But if EARLY_P is true, we do not have the real operator()
--   yet and we have to proceed differently.  */
-+   debugging.  */
- 
--tree
--build_capture_proxy (tree member, tree init, bool early_p)
-+static tree
-+build_capture_proxy (tree member, tree init)
- {
-   tree var, object, fn, closure, name, lam, type;
- 
-@@ -504,19 +503,11 @@ build_capture_proxy (tree member, tree init, bool 
early_p)
- 
-   if (name == this_identifier)
-     {
--      if (early_p)
--      return var;
-       gcc_assert (LAMBDA_EXPR_THIS_CAPTURE (lam) == member);
-       LAMBDA_EXPR_THIS_CAPTURE (lam) = var;
-     }
- 
--  if (early_p)
--    {
--      gcc_checking_assert (current_binding_level->kind == sk_lambda);
--      /* insert_capture_proxy below wouldn't push into the lambda scope.  */
--      pushdecl (var);
--    }
--  else if (fn == current_function_decl)
-+  if (fn == current_function_decl)
-     insert_capture_proxy (var);
-   else
-     vec_safe_push (LAMBDA_EXPR_PENDING_PROXIES (lam), var);
-@@ -736,7 +727,7 @@ add_capture (tree lambda, tree id, tree orig_init, bool 
by_reference_p,
-     = tree_cons (listmem, initializer, LAMBDA_EXPR_CAPTURE_LIST (lambda));
- 
-   if (LAMBDA_EXPR_CLOSURE (lambda))
--    return build_capture_proxy (member, initializer, /*early_p=*/false);
-+    return build_capture_proxy (member, initializer);
-   /* For explicit captures we haven't started the function yet, so we wait
-      and build the proxy from cp_parser_lambda_body.  */
-   LAMBDA_CAPTURE_EXPLICIT_P (LAMBDA_EXPR_CAPTURE_LIST (lambda)) = true;
-@@ -989,14 +980,10 @@ resolvable_dummy_lambda (tree object)
-   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (object));
-   gcc_assert (!TYPE_PTR_P (type));
- 
--  tree fn;
-   if (type != current_class_type
-       && current_class_type
-       && LAMBDA_TYPE_P (current_class_type)
--      && (fn = lambda_function (current_class_type))
--      /* Even dummy lambdas have an operator() since P2036, but the
--       dummy operator() doesn't have this set.  */
--      && DECL_LAMBDA_FUNCTION_P (fn)
-+      && lambda_function (current_class_type)
-       && DERIVED_FROM_P (type, nonlambda_method_basetype()))
-     return CLASSTYPE_LAMBDA_EXPR (current_class_type);
- 
-@@ -1797,17 +1784,6 @@ record_lambda_scope_sig_discriminator (tree lambda, 
tree fn)
-   LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR (lambda) = sig->count++;
- }
- 
--/* Push the proxies for any explicit captures in LAMBDA_EXPR.
--   If EARLY_P, we do not have the real operator() yet.  */
--
--void
--push_capture_proxies (tree lambda_expr, bool early_p)
--{
--  for (tree cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
--       cap = TREE_CHAIN (cap))
--    build_capture_proxy (TREE_PURPOSE (cap), TREE_VALUE (cap), early_p);
--}
--
- tree
- start_lambda_function (tree fco, tree lambda_expr)
- {
-@@ -1820,7 +1796,9 @@ start_lambda_function (tree fco, tree lambda_expr)
-   tree body = begin_function_body ();
- 
-   /* Push the proxies for any explicit captures.  */
--  push_capture_proxies (lambda_expr);
-+  for (tree cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
-+       cap = TREE_CHAIN (cap))
-+    build_capture_proxy (TREE_PURPOSE (cap), TREE_VALUE (cap));
- 
-   return body;
- }
-diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
-index fa367214507e..a805f42f6668 100644
---- a/gcc/cp/name-lookup.cc
-+++ b/gcc/cp/name-lookup.cc
-@@ -3351,11 +3351,8 @@ check_local_shadow (tree decl)
-       }
-       /* Don't complain if it's from an enclosing function.  */
-       else if (DECL_CONTEXT (old) == current_function_decl
--             && ((TREE_CODE (decl) != PARM_DECL
--                  && TREE_CODE (old) == PARM_DECL)
--                 /* We should also give an error for
--                     [x=1]{ int x; }  */
--                 || is_capture_proxy (old)))
-+             && TREE_CODE (decl) != PARM_DECL
-+             && TREE_CODE (old) == PARM_DECL)
-       {
-         /* Go to where the parms should be and see if we find
-            them there.  */
-@@ -4641,8 +4638,7 @@ cp_binding_level_descriptor (cp_binding_level *scope)
-     "template-parameter-scope",
-     "template-explicit-spec-scope",
-     "transaction-scope",
--    "openmp-scope",
--    "lambda-scope"
-+    "openmp-scope"
-   };
-   static_assert (ARRAY_SIZE (scope_kind_names) == sk_count,
-                "must keep names aligned with scope_kind enum");
-@@ -4734,7 +4730,6 @@ begin_scope (scope_kind kind, tree entity)
-     case sk_transaction:
-     case sk_omp:
-     case sk_stmt_expr:
--    case sk_lambda:
-       scope->keep = keep_next_level_flag;
-       break;
- 
-diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h
-index 5b142e748999..6a3c0df47007 100644
---- a/gcc/cp/name-lookup.h
-+++ b/gcc/cp/name-lookup.h
-@@ -215,7 +215,6 @@ enum scope_kind {
-                       "template <>", this scope is always empty.  */
-   sk_transaction,    /* A synchronized or atomic statement.  */
-   sk_omp,          /* An OpenMP structured block.  */
--  sk_lambda,       /* A lambda scope.  */
-   sk_count         /* Number of scope_kind enumerations.  */
- };
- 
-diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
-index d66b658b748f..9dbd254dc61b 100644
---- a/gcc/cp/parser.cc
-+++ b/gcc/cp/parser.cc
-@@ -11887,10 +11887,6 @@ cp_parser_lambda_expression (cp_parser* parser,
-     if (cp_parser_start_tentative_firewall (parser))
-       start = token;
- 
--    /* A lambda scope starts immediately after the lambda-introducer of E
--       and extends to the end of the compound-statement of E.  */
--    begin_scope (sk_lambda, NULL_TREE);
--
-     ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr,
-                                          consteval_block_p);
- 
-@@ -11912,8 +11908,6 @@ cp_parser_lambda_expression (cp_parser* parser,
-     if (ok)
-       maybe_add_lambda_conv_op (type);
- 
--    /* Leave the lambda scope.  */
--    pop_bindings_and_leave_scope ();
-     finish_struct (type, /*attributes=*/NULL_TREE);
- 
-     in_expansion_stmt = save_in_expansion_stmt;
-@@ -12305,13 +12299,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, 
tree lambda_expr,
-   clear_decl_specs (&lambda_specs);
-   /* A lambda op() is const unless explicitly 'mutable'.  */
-   cp_cv_quals quals = TYPE_QUAL_CONST;
--  /* Don't add "const" to entities in the parameter-declaration-clause.  */
--  LAMBDA_EXPR_CONST_QUAL_P (lambda_expr) = false;
--
--  /* Inject the captures into the lambda scope as they may be used in the
--     declarator and we have to be able to look them up.  */
--  tree dummy_fco = maybe_add_dummy_lambda_op (lambda_expr);
--  push_capture_proxies (lambda_expr, /*early_p=*/true);
- 
-   /* The template-parameter-list is optional, but must begin with
-      an opening angle if present.  */
-@@ -12502,10 +12489,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, 
tree lambda_expr,
-       }
-     }
- 
--  /* Now we're done with the parameter-declaration-clause, and should
--     assume "const" unless "mutable" was present.  */
--  LAMBDA_EXPR_CONST_QUAL_P (lambda_expr) = quals == TYPE_QUAL_CONST;
--
-   tx_qual = cp_parser_tx_qualifier_opt (parser);
-   if (omitted_parms_loc && tx_qual)
-     {
-@@ -12563,10 +12546,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, 
tree lambda_expr,
-       pop_bindings_and_leave_scope ();
-     }
- 
--  /* We are about to create the real operator(), so get rid of the old one.  
*/
--  if (dummy_fco)
--    remove_dummy_lambda_op (dummy_fco, lambda_expr);
--
-   /* Create the function call operator.
- 
-      Messing with declarators like this is no uglier than building up the
-@@ -12646,79 +12625,6 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, 
tree lambda_expr,
-   }
- }
- 
--/* Create a fake operator() for a lambda.  We do this so that we can
--   build_capture_proxy even before start_lambda_function.  */
--
--static tree
--make_dummy_lambda_op ()
--{
--  cp_decl_specifier_seq return_type_specs;
--  cp_cv_quals quals = TYPE_UNQUALIFIED;
--
--  clear_decl_specs (&return_type_specs);
--  return_type_specs.type = make_auto ();
--
--  void *p = obstack_alloc (&declarator_obstack, 0);
--
--  cp_declarator *declarator = make_id_declarator (NULL_TREE,
--                                                call_op_identifier,
--                                                sfk_none,
--                                                input_location);
--
--  declarator = make_call_declarator (declarator, void_list_node, quals,
--                                   VIRT_SPEC_UNSPECIFIED,
--                                   REF_QUAL_NONE, NULL_TREE,
--                                   NULL_TREE, NULL_TREE, NULL_TREE,
--                                   NULL_TREE, UNKNOWN_LOCATION);
--
--  tree fco = grokmethod (&return_type_specs, declarator, NULL_TREE);
--  obstack_free (&declarator_obstack, p);
--
--  return fco;
--}
--
--/* We need to push early capture proxies (for parsing the lambda-declarator),
--   and we may need a dummy operator() to be able to build the proxies.
--   LAMBDA_EXPR is the lambda we are building the captures for.  */
--
--tree
--maybe_add_dummy_lambda_op (tree lambda_expr)
--{
--  /* If there are no captures, we don't need this.  */
--  if (!LAMBDA_EXPR_CAPTURE_LIST (lambda_expr))
--    return NULL_TREE;
--
--  tree fco = make_dummy_lambda_op ();
--  if (fco != error_mark_node)
--    finish_member_declaration (fco);
--
--  return fco;
--}
--
--/* Remove the dummy operator() DUMMY_FCO we built for parsing the
--   lambda-declarator of LAMBDA_EXPR.  */
--
--void
--remove_dummy_lambda_op (tree dummy_fco, tree lambda_expr)
--{
--  tree type = TREE_TYPE (lambda_expr);
--  if (TYPE_FIELDS (type) == dummy_fco)
--    {
--      /* Stitch out the dummy operator().  */
--      TYPE_FIELDS (type) = DECL_CHAIN (TYPE_FIELDS (type));
--      /* And clear the member vector as well.  */
--      auto *member_vec = CLASSTYPE_MEMBER_VEC (type);
--      gcc_assert (member_vec->length () == 1);
--      member_vec->truncate (0);
--    }
--  /* Class templates will have the dummy operator() stashed here too.  */
--  tree &list = CLASSTYPE_DECL_LIST (type);
--  if (list && TREE_VALUE (list) == dummy_fco)
--    list = TREE_CHAIN (list);
--  /* ??? We can't ggc_free dummy_fco yet.  There's still a binding in the
--     closure to it, and the captures have it as their DECL_CONTEXT.  */
--}
--
- /* Parse the body of a lambda expression, which is simply
- 
-    compound-statement
-diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
-index bb2d0b48fd42..b72f285d86d6 100644
---- a/gcc/cp/pt.cc
-+++ b/gcc/cp/pt.cc
-@@ -20590,18 +20590,6 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
- 
-   tree fntype = static_fn_type (oldfn);
- 
--  begin_scope (sk_lambda, NULL_TREE);
--
--  /* Like in cp_parser_lambda_expression, we need to bring the captures
--     into the lambda scope.  */
--  tree ns = decl_namespace_context (type);
--  push_nested_namespace (ns);
--  push_nested_class (type);
--  tree dummy_fco = maybe_add_dummy_lambda_op (r);
--  pop_nested_class ();
--  pop_nested_namespace (ns);
--  push_capture_proxies (r, /*early_p=*/true);
--
-   tree saved_ctp = current_template_parms;
-   if (oldtmpl)
-     {
-@@ -20615,10 +20603,6 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
-       --processing_template_decl;
-     }
- 
--  /* We are about to create the real operator(), so get rid of the old one.  
*/
--  if (dummy_fco)
--    remove_dummy_lambda_op (dummy_fco, r);
--
-   if (fntype == error_mark_node)
-     r = error_mark_node;
-   else
-@@ -20652,10 +20636,6 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
-        enclosing expression.  */
-       cp_evaluated ev;
- 
--      /* Now we're done with the parameter-declaration-clause, and should
--       assume "const" unless "mutable" was present.  */
--      LAMBDA_EXPR_CONST_QUAL_P (r) = LAMBDA_EXPR_CONST_QUAL_P (t);
--
-       bool nested = cfun;
-       if (nested)
-       push_function_context ();
-@@ -20724,7 +20704,6 @@ tsubst_lambda_expr (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
-     }
- 
- out:
--  pop_bindings_and_leave_scope ();
-   finish_struct (type, /*attr*/NULL_TREE);
- 
-   insert_pending_capture_proxies ();
-diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
-index 26709c7a33bf..ef331f64f8da 100644
---- a/gcc/cp/semantics.cc
-+++ b/gcc/cp/semantics.cc
-@@ -4511,17 +4511,6 @@ baselink_for_fns (tree fns)
-   return build_baselink (conv_path, access_path, fns, /*optype=*/NULL_TREE);
- }
- 
--/* Returns true iff we are currently parsing a lambda-declarator.  */
--
--static bool
--parsing_lambda_declarator ()
--{
--  cp_binding_level *b = current_binding_level;
--  while (b->kind == sk_template_parms || b->kind == sk_function_parms)
--    b = b->level_chain;
--  return b->kind == sk_lambda;
--}
--
- /* Returns true iff DECL is a variable from a function outside
-    the current one.  */
- 
-@@ -4536,15 +4525,7 @@ outer_var_p (tree decl)
-         /* Don't get confused by temporaries.  */
-         && DECL_NAME (decl)
-         && (DECL_CONTEXT (decl) != current_function_decl
--            || parsing_nsdmi ()
--            /* Also consider captures as outer vars if we are in
--               decltype in a lambda declarator as in:
--                 auto l = [j=0]() -> decltype((j)) { ... }
--               for the sake of finish_decltype_type.
--
--               (Similar issue also affects non-lambdas, but vexing parse
--               makes it more difficult to handle than lambdas.)  */
--            || parsing_lambda_declarator ()));
-+            || parsing_nsdmi ()));
- }
- 
- /* As above, but also checks that DECL is automatic.  */
-@@ -4590,7 +4571,7 @@ process_outer_var_ref (tree decl, tsubst_flags_t 
complain, bool odr_use)
-   if (!mark_used (decl, complain))
-     return error_mark_node;
- 
--  if (parsing_nsdmi () || parsing_lambda_declarator ())
-+  if (parsing_nsdmi ())
-     containing_function = NULL_TREE;
- 
-   if (containing_function && LAMBDA_FUNCTION_P (containing_function))
-@@ -12960,9 +12941,9 @@ finish_decltype_type (tree expr, bool 
id_expression_or_member_access_p,
-     }
-   else
-     {
--      tree decl = STRIP_REFERENCE_REF (expr);
--      tree lam = current_lambda_expr ();
--      if (lam && outer_automatic_var_p (decl))
-+      if (outer_automatic_var_p (STRIP_REFERENCE_REF (expr))
-+        && current_function_decl
-+        && LAMBDA_FUNCTION_P (current_function_decl))
-       {
-         /* [expr.prim.id.unqual]/3: If naming the entity from outside of an
-            unevaluated operand within S would refer to an entity captured by
-@@ -12979,6 +12960,8 @@ finish_decltype_type (tree expr, bool 
id_expression_or_member_access_p,
-            local variable inside decltype, not just decltype((x)) (PR83167).
-            And we don't handle nested lambdas properly, where we need to
-            consider the outer lambdas as well (PR112926). */
-+        tree decl = STRIP_REFERENCE_REF (expr);
-+        tree lam = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT 
(current_function_decl));
-         tree cap = lookup_name (DECL_NAME (decl), LOOK_where::BLOCK,
-                                 LOOK_want::HIDDEN_LAMBDA);
- 
-@@ -12994,28 +12977,17 @@ finish_decltype_type (tree expr, bool 
id_expression_or_member_access_p,
- 
-         if (type && !TYPE_REF_P (type))
-           {
--            int quals;
--            if (current_function_decl
--                && LAMBDA_FUNCTION_P (current_function_decl)
--                && DECL_XOBJ_MEMBER_FUNCTION_P (current_function_decl))
--              {
--                tree obtype = TREE_TYPE (DECL_ARGUMENTS 
(current_function_decl));
--                if (WILDCARD_TYPE_P (non_reference (obtype)))
--                  /* We don't know what the eventual obtype quals will be.  */
--                  goto dependent;
--                auto direct_type = [](tree t){
--                    if (INDIRECT_TYPE_P (t))
--                      return TREE_TYPE (t);
--                    return t;
--                 };
--                quals = (cp_type_quals (type)
--                         | cp_type_quals (direct_type (obtype)));
--              }
--            else
--              /* We are in the parameter clause, trailing return type, or
--                 the requires clause and have no relevant c_f_decl yet.  */
--              quals = (LAMBDA_EXPR_CONST_QUAL_P (lam)
--                       ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
-+            tree obtype = TREE_TYPE (DECL_ARGUMENTS (current_function_decl));
-+            if (WILDCARD_TYPE_P (non_reference (obtype)))
-+              /* We don't know what the eventual obtype quals will be.  */
-+              goto dependent;
-+            auto direct_type = [](tree t){
-+                if (INDIRECT_TYPE_P (t))
-+                  return TREE_TYPE (t);
-+                return t;
-+             };
-+            int const quals = cp_type_quals (type)
-+                            | cp_type_quals (direct_type (obtype));
-             type = cp_build_qualified_type (type, quals);
-             type = build_reference_type (type);
-           }
-diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype3.C 
b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype3.C
-index 6ba0dabc37d5..2e06e4961408 100644
---- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype3.C
-+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-decltype3.C
-@@ -11,7 +11,7 @@ void f() {
-     decltype((x)) y2 = y1;      // y2 has type float const&
-     decltype(r) r1 = y1;        // r1 has type float&
-     decltype((r)) r2 = y2;      // r2 has type float const&
--    return y2;                  // { dg-bogus "'float&' to 'const float'" }
-+    return y2;                  // { dg-bogus "'float&' to 'const float'" "" 
{ xfail *-*-* } }
-   };
- 
-   [=](decltype((x)) y) {
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope1.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope1.C
-deleted file mode 100644
-index 000979e30778..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope1.C
-+++ /dev/null
-@@ -1,85 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++23 } }
--
--template <typename T, typename U>
--constexpr bool is_same = false;
--
--template <typename T>
--constexpr bool is_same<T, T> = true;
--
--struct S {
--  void foo () {
--    auto counter1 = [j=0]() mutable -> decltype(j) {
--      return j++;
--    };
--    auto counter2 = [j=0, o=0, k=0, e=0]() mutable -> decltype(j) {
--      return j + o + k + e;
--    };
--  }
--};
--
--// [expr.prim.id.unqual]/3.2
--void
--f ()
--{
--  float x, &r = x;
--
--  [=]() -> decltype((x)) {      // lambda returns float const& because this 
lambda is not mutable and
--                                // x is an lvalue
--    decltype(x) y1;             // y1 has type float
--    decltype((x)) y2 = y1;      // y2 has type float const&
--    decltype(r) r1 = y1;        // r1 has type float&
--    decltype((r)) r2 = y2;      // r2 has type float const&
--    return y2;
--  };
--
--  [=](decltype((x)) y) {
--    decltype((x)) z = x;        // OK, y has type float&, z has type float 
const&
--    static_assert(is_same<float&, decltype((y))>);
--    static_assert(is_same<const float&, decltype((z))>);
--  };
--
--  [=] {
--    [](decltype((x)) y) {     // OK, lambda takes a parameter of type float 
const&
--    };
--
--    [x=1](decltype((x)) y) {
--      decltype((x)) z = x;      // OK, y has type int&, z has type int const&
--      // FIXME We don't handle nested lambdas yet?
--      //static_assert(is_same<int&, decltype((y))>);
--      static_assert(is_same<const int&, decltype((z))>);
--    };
--  };
--
--  [x=1](decltype((x)) y) {
--    decltype((x)) z = x;
--    static_assert(is_same<int&, decltype((y))>);
--    static_assert(is_same<const int&, decltype((z))>);
--  };
--}
--
--void
--ok ()
--{
--  auto counter1 = [j=0]() mutable -> decltype(j) {
--    static_assert(is_same<int&, decltype((j))>);
--    return j++;
--  };
--
--  auto l = [j=0]() -> decltype(j) {
--    static_assert(is_same<const int&, decltype((j))>);
--    return j;
--  };
--
--  int y;
--  [=] -> decltype((y)) {
--    return y;
--  };
--}
--
--void
--foo ()
--{
--  int x = [x](int y[sizeof x]){return sizeof x;}(0);
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope2.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope2.C
-deleted file mode 100644
-index 6b55e5fe5134..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope2.C
-+++ /dev/null
-@@ -1,217 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++23 } }
--// From LLVM's test/SemaCXX/lambda-capture-type-deduction.cpp
--
--template <typename T, typename U>
--constexpr bool is_same = false;
--
--template <typename T>
--constexpr bool is_same<T, T> = true;
--
--void
--f ()
--{
--  int y;
--
--  static_assert(is_same<const int &,
--                      decltype([x = 1] -> decltype((x)) { return x; }())>);
--
--  static_assert(is_same<int &,
--                        decltype([x = 1] mutable -> decltype((x)) { return x; 
}())>);
--
--  static_assert(is_same<const int &,
--                        decltype([=] -> decltype((y)) { return y; }())>);
--
--  static_assert(is_same<int &,
--                        decltype([=] mutable -> decltype((y)) { return y; 
}())>);
--
--  // Clang++ rejects this one, though the only difference is the extra (),
--  // and without the () the result is correct, as demonstrated above.
--  static_assert(is_same<const int &,
--                        decltype([=]() -> decltype((y)) { return y; }())>);
--
--  static_assert(is_same<int &,
--                        decltype([=]() mutable -> decltype((y)) { return y; 
}())>);
--
--  static_assert(is_same<const int &,
--                      decltype([y] -> decltype((y)) { return y; }())>);
--
--  static_assert(is_same<int &,
--                        decltype([y] mutable -> decltype((y)) { return y; 
}())>);
--
--
--  auto ref = [&x = y](
--                 decltype([&](decltype(x)) { return 0; }) y) {
--    return x;
--  };
--}
--
--void
--nested ()
--{
--  int x, y, z;
--  (void)[&](
--      decltype([&](
--                   decltype([=](
--                                decltype([&](
--                                             decltype([&](decltype(x)) {})) 
{})) {})) {})){};
--
--  (void)[&](
--      decltype([&](
--                   decltype([&](
--                                decltype([&](
--                                             decltype([&](decltype(y)) {})) 
{})) {})) {})){};
--
--  (void)[=](
--      decltype([=](
--                   decltype([=](
--                                decltype([=](
--                                             decltype([&]<decltype(z)> {})) 
{})) {})) {})){};
--}
--
--void
--test_noexcept ()
--{
--  int y;
--
--  static_assert(noexcept([x = 1] noexcept(is_same<const int &, 
decltype((x))>) {}()));
--  static_assert(noexcept([x = 1] mutable noexcept(is_same<int &, 
decltype((x))>) {}()));
--  static_assert(noexcept([y] noexcept(is_same<const int &, decltype((y))>) 
{}()));
--  static_assert(noexcept([y] mutable noexcept(is_same<int &, decltype((y))>) 
{}()));
--  static_assert(noexcept([=] noexcept(is_same<const int &, decltype((y))>) 
{}()));
--  static_assert(noexcept([=] mutable noexcept(is_same<int &, decltype((y))>) 
{}()));
--  static_assert(noexcept([&] noexcept(is_same<int &, decltype((y))>) {}()));
--  static_assert(noexcept([&] mutable noexcept(is_same<int &, decltype((y))>) 
{}()));
--}
--
--void
--check_params ()
--{
--  int i = 0;
--  int &j = i;
--
--  [=](decltype((j)) jp, decltype((i)) ip) {
--    static_assert(is_same<const int&, decltype((j))>);
--    static_assert(is_same<const int &, decltype((i))>);
--    static_assert(is_same<int &, decltype((jp))>);
--    static_assert(is_same<int &, decltype((ip))>);
--  };
--
--  [=](decltype((j)) jp, decltype((i)) ip) mutable {
--    static_assert(is_same<int &, decltype((j))>);
--    static_assert(is_same<int &, decltype((i))>);
--    static_assert(is_same<int &, decltype((jp))>);
--    static_assert(is_same<int &, decltype((ip))>);
--    static_assert(is_same<int &, decltype(jp)>);
--    static_assert(is_same<int &, decltype(ip)>);
--  };
--
--  [a = 0](decltype((a)) ap) mutable {
--    static_assert(is_same<int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int &, decltype(ap)>);
--    decltype(a) x;
--    decltype((a)) y = x;
--    static_assert(is_same<int &, decltype(y)>);
--  };
--
--  [a = 0](decltype((a)) ap) {
--    static_assert(is_same<const int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int&, decltype((ap))>);
--    decltype(a) x;
--    decltype((a)) y = x;
--    static_assert(is_same<const int &, decltype(y)>);
--  };
--
--  int a;
--  [a](decltype((a)) ap) mutable {
--    static_assert(is_same<int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int &, decltype(ap)>);
--    decltype(a) x;
--    decltype((a)) y = x;
--    static_assert(is_same<int &, decltype(y)>);
--  };
--
--  [a](decltype((a)) ap) {
--    static_assert(is_same<const int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int&, decltype((ap))>);
--    decltype(a) x;
--    decltype((a)) y = x;
--    static_assert(is_same<const int &, decltype(y)>);
--  };
--}
--
--template <typename T>
--void
--check_params_tpl ()
--{
--  T i = 0;
--  T &j = i;
--  (void)[=](decltype((j)) jp, decltype((i)) ip) {
--    static_assert(is_same<const int&, decltype((j))>);
--    static_assert(is_same<const int &, decltype((i))>);
--    // In these two, clang++ produces 'const int&'.  Why, when it's
--    // the same as in check_params, just not a template?
--    static_assert(is_same<int &, decltype((jp))>);
--    static_assert(is_same<int &, decltype((ip))>);
--  };
--
--  (void)[=](decltype((j)) jp, decltype((i)) ip) mutable {
--    static_assert(is_same<int &, decltype((j))>);
--    static_assert(is_same<int &, decltype((i))>);
--    static_assert(is_same<int &, decltype((jp))>);
--    static_assert(is_same<int &, decltype((ip))>);
--    static_assert(is_same<int &, decltype(jp)>);
--    static_assert(is_same<int &, decltype(ip)>);
--  };
--
--  (void)[a = 0](decltype((a)) ap) mutable {
--    static_assert(is_same<int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int &, decltype(ap)>);
--  };
--  (void)[a = 0](decltype((a)) ap) {
--    static_assert(is_same<const int &, decltype((a))>);
--    static_assert(is_same<int, decltype(a)>);
--    static_assert(is_same<int&, decltype((ap))>);
--  };
--}
--
--template<typename T>
--void
--test_requires ()
--{
--  int x;
--
--  [x = 1]() requires is_same<const int &, decltype((x))> {} ();
--  [x = 1]() mutable requires is_same<int &, decltype((x))> {}
--  ();
--  [x]() requires is_same<const int &, decltype((x))> {} ();
--  [x]() mutable requires is_same<int &, decltype((x))> {}
--  ();
--  [=]() requires is_same<const int &, decltype((x))> {} ();
--  [=]() mutable requires is_same<int &, decltype((x))> {}
--  ();
--  [&]() requires is_same<int &, decltype((x))> {}
--  ();
--  [&]() mutable requires is_same<int &, decltype((x))> {}
--  ();
--  [&x]() requires is_same<int &, decltype((x))> {}
--  ();
--  [&x]() mutable requires is_same<int &, decltype((x))> {}
--  ();
--
--  [x = 1]() requires is_same<const int &, decltype((x))> {} ();
--  [x = 1]() mutable requires is_same<int &, decltype((x))> {} ();
--}
--
--void
--use ()
--{
--  test_requires<int>();
--  check_params_tpl<int>();
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope3.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope3.C
-deleted file mode 100644
-index 697fdaae0955..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope3.C
-+++ /dev/null
-@@ -1,44 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++17 } }
--
--template <typename T>
--inline constexpr auto
--equal1 (T &&t)
--{
--  return [t = 3](const auto& obj) -> decltype(obj == t)
--    {
--      return obj == t;
--    };
--}
--
--template <typename T>
--inline constexpr auto
--equal2 (T &&t)
--{
--  return [t = t](const auto& obj) -> decltype(obj == t)
--    {
--      return obj == t;
--    };
--}
--
--template <typename T>
--inline constexpr auto
--equal3 (T &&t)
--{
--  return [t = 4](const auto& obj) -> decltype(obj == t)
--    {
--      return obj == t;
--    };
--}
--
--void
--g ()
--{
--  constexpr auto l1 = equal1 (5);
--  static_assert (l1 (3));
--  constexpr auto l2 = equal2 (3);
--  static_assert (l2 (3));
--  constexpr auto l3 = equal3 (2);
--  static_assert (l3 (4));
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope4.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope4.C
-deleted file mode 100644
-index 9442db3f9567..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope4.C
-+++ /dev/null
-@@ -1,41 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++17 } }
--
--struct integral_constant {
--  using type = integral_constant;
--};
--template <bool> using __bool_constant = integral_constant;
--template <typename _Fn, typename>
--struct is_invocable : __bool_constant<true> {};
--int forward() { return 42; }
--template <typename...> class tuple;
--struct plus {
--  template <typename _Tp, typename _Up>
--  constexpr auto operator()(_Tp __t, _Up __u) {
--    return __t > __u;
--  }
--};
--constexpr auto equal() {
--  int t = 0;
--  return [t = 3](auto obj) -> decltype(obj == t) { return t; };
--}
--template <typename> struct is_tuple_invocable;
--template <typename... Ts> struct is_tuple_invocable<tuple<Ts...>> {
--  using type = typename is_invocable<Ts...>::type;
--};
--namespace detail {
--template <typename F, typename Tail, typename... T>
--constexpr auto compose(__bool_constant<true>, F f, Tail tail, T... objs) {
--  return f(tail(objs...));
--}
--} // namespace detail
--template <typename F, typename... Fs> constexpr auto compose(F f, Fs... fs) {
--  return [f, tail(fs...)](auto... objs) {
--    auto unitail =
--        typename is_tuple_invocable<tuple<decltype(objs)...>>::type{};
--    return detail::compose(unitail, f, tail, objs...);
--  };
--}
--template <auto> constexpr auto eq = equal();
--static_assert(compose(eq<3>, plus{})(1, 2));
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope4b.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope4b.C
-deleted file mode 100644
-index 6a9e6ec5e9d7..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope4b.C
-+++ /dev/null
-@@ -1,42 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++17 } }
--
--struct integral_constant {
--  using type = integral_constant;
--};
--template <bool> using __bool_constant = integral_constant;
--template <typename _Fn, typename>
--struct is_invocable : __bool_constant<true> {};
--int forward() { return 42; }
--template <typename...> class tuple;
--struct plus {
--  template <typename _Tp, typename _Up>
--  constexpr auto operator()(_Tp __t, _Up __u) {
--    return __t > __u;
--  }
--};
--constexpr auto equal() {
--  int t = 0;
--  return [t = 3](auto obj) -> decltype(obj == t) { return t; };
--}
--template <typename> struct is_tuple_invocable;
--template <typename... Ts> struct is_tuple_invocable<tuple<Ts...>> {
--  using type = typename is_invocable<Ts...>::type;
--};
--namespace detail {
--template <typename F, typename Tail, typename... T>
--constexpr auto compose(__bool_constant<true>, F f, Tail tail, T... objs) {
--  return f(tail(objs...));
--}
--} // namespace detail
--template <typename F, typename... Fs>
--constexpr auto compose(F f, Fs... fs) {
--  return [f, tail(fs...)](auto... objs) -> decltype (detail::compose(typename 
is_tuple_invocable<tuple<decltype(objs)...>>::type{}, f, tail, objs...)) {
--    auto unitail =
--        typename is_tuple_invocable<tuple<decltype(objs)...>>::type{};
--    return detail::compose(unitail, f, tail, objs...);
--  };
--}
--template <auto> constexpr auto eq = equal();
--static_assert(compose(eq<3>, plus{})(1, 2));
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope5.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope5.C
-deleted file mode 100644
-index 48b5ef34c9e9..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope5.C
-+++ /dev/null
-@@ -1,22 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++17 } }
--
--constexpr auto equal() {
--  int t = 0;
--  return [t](auto obj) { return obj; };
--}
--template <typename F>
--constexpr int bar (F) {
--  return 42;
--}
--
--template <typename F>
--constexpr auto compose(F f)
--{
--  return [f=f](int i) -> decltype(bar (f)) {
--      return 42;
--  };
--}
--template <auto> constexpr auto eq = equal();
--static_assert(compose(eq<3>)(1));
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope6.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope6.C
-deleted file mode 100644
-index 720c1ec6cba2..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope6.C
-+++ /dev/null
-@@ -1,20 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++23 } }
--
--void
--g ()
--{
--  /* It looks like this shouldn't work but [expr.prim.lambda.closure]/6
--     says "Otherwise, it is a non-static member function or member function
--     template that is declared const if and only if the lambda-expression's
--     parameter-declaration-clause is not followed by mutable and the
--     lambda-declarator does not contain an explicit object parameter."  */
--  auto counter = [j=0](this auto const& self) -> decltype(j) {
--      return j++;
--  };
--
--  auto counter2 = [j=0](this auto& self) -> decltype(j) {
--      return j++;
--  };
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope7.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope7.C
-deleted file mode 100644
-index 6db39bd8692c..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope7.C
-+++ /dev/null
-@@ -1,20 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++14_only } }
--
--template <typename T>
--inline constexpr auto
--equal1 (T &&t)
--{
--  return [t = 3](const auto& obj) -> decltype(obj == t)
--    {
--      return obj == t;
--    };
--}
--
--void
--g ()
--{
--  constexpr auto l1 = equal1 (5); // { dg-error "not literal" }
--  static_assert (l1 (3), "");   // { dg-error "non-constant|non-.constexpr." }
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope8.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope8.C
-deleted file mode 100644
-index 87ad47323809..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope8.C
-+++ /dev/null
-@@ -1,25 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++23 } }
--// { dg-options "-Wshadow" }
--
--void
--bad ()
--{
--  [x=1](int x){};  // { dg-error "declared as a capture" }
--  // { dg-warning "shadows a lambda capture" "" { target *-*-* } .-1 }
--  [x=1]{ int x; };  // { dg-error "shadows a parameter" }
--
--  auto f = [i = 5] () { int i; return 0; }; // { dg-error "shadows a 
parameter" }
--  auto f2 = [i = 5] <int N> () { int i; return 0; };  // { dg-error "shadows 
a parameter" }
--
--  // [expr.prim.lambda.capture]/5
--  int x = 0;
--  auto g = [x](int x) { return 0; };  // { dg-error "declared as a capture" }
--  // { dg-warning "shadows a lambda capture" "" { target *-*-* } .-1 }
--  auto h = [y = 0]<typename y>(y) { return 0; };  // { dg-error "shadows 
template parameter" }
--
--  auto l2 = [i = 0, j = i]() -> decltype(i) { // { dg-error "not declared in 
this scope" }
--    return i;
--  };
--}
-diff --git a/gcc/testsuite/g++.dg/cpp23/lambda-scope9.C 
b/gcc/testsuite/g++.dg/cpp23/lambda-scope9.C
-deleted file mode 100644
-index b75e97cb89d7..000000000000
---- a/gcc/testsuite/g++.dg/cpp23/lambda-scope9.C
-+++ /dev/null
-@@ -1,15 +0,0 @@
--// P2036R3 - Change scope of lambda trailing-return-type
--// PR c++/102610
--// { dg-do compile { target c++23 } }
--// { dg-options "" }
--
--constexpr char f(auto a) { return 'a'; }
--
--namespace A {
--  int i = 42;
--  template<char X = f([i]{})> void g() { } // { dg-warning "capture of 
variable .A::i. with non-automatic storage duration" }
--}
--
--namespace B {
--  void call() { A::g(); }
--}
-diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-19.C 
b/gcc/testsuite/g++.dg/warn/Wshadow-19.C
-index d0b8dba8549f..030aefd153d8 100644
---- a/gcc/testsuite/g++.dg/warn/Wshadow-19.C
-+++ b/gcc/testsuite/g++.dg/warn/Wshadow-19.C
-@@ -1,5 +1,5 @@
- // { dg-do compile }
--// { dg-options "-Wshadow -Wpedantic" }
-+// { dg-options "-Wshadow" }
- 
- void
- foo (int x)
-@@ -10,7 +10,7 @@ foo (int x)
-     extern int y;                             // { dg-warning "declaration of 
'y' shadows a previous local" }
-   }
- #if __cplusplus >= 201102L
--  auto fn = [x] () { extern int x; return 0; };    // { dg-warning 
"declaration of 'int x' shadows a parameter" "" { target c++11 } }
-+  auto fn = [x] () { extern int x; return 0; };       // { dg-warning 
"declaration of 'x' shadows a lambda capture" "" { target c++11 } }
- #endif
- }
- 
-diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-6.C 
b/gcc/testsuite/g++.dg/warn/Wshadow-6.C
-index 7b44d52781aa..1d8d21b9b6f1 100644
---- a/gcc/testsuite/g++.dg/warn/Wshadow-6.C
-+++ b/gcc/testsuite/g++.dg/warn/Wshadow-6.C
-@@ -33,8 +33,8 @@ void f2(struct S i, int j) {
- 
- void f3(int i) {
-  [=]{
--   int j = i;                 // { dg-message "previously declared here" }
--   int i;                     // { dg-error "shadows a parameter" }
-+   int j = i;                 // { dg-message "shadowed declaration" }
-+   int i;                     // { dg-warning "shadows a lambda capture" }
-    i = 1;
-  };
- }
-@@ -42,8 +42,8 @@ void f3(int i) {
- template <class T>
- void f4(int i) {
-  [=]{
--   int j = i;                 // { dg-message "previously declared here" }
--   int i;                     // { dg-error "shadows a parameter" }
-+   int j = i;                 // { dg-message "shadowed declaration" }
-+   int i;                     // { dg-warning "shadows a " }
-    i = 1;
-  };
- }
-
-base-commit: 2be801a805c6cca08aaa33fd387dcc7bd4fe8aac
--- 
-2.51.0
-

diff --git a/16.0.0/gentoo/README.history b/16.0.0/gentoo/README.history
index ff3cbb8..a3bc300 100644
--- a/16.0.0/gentoo/README.history
+++ b/16.0.0/gentoo/README.history
@@ -1,6 +1,7 @@
 12     ????
 
        - 
86_all_PR121572_x86-Place-the-TLS-call-before-all-FLAGS_REG-setting-.patch
+       - 
87_all_PR121553-Revert-c-P2036R3-Change-scope-of-lambda-trailing-ret.patch
        + 88_all_PR121607-TLS-ICE.patch
 
 11     20 August 2025


Reply via email to