===================================================================
@@ -16982,14 +16982,22 @@ struct cp_manage_requirements {
static tree
cp_parser_trailing_requirements (cp_parser *parser, cp_declarator *decl)
{
- // A function declaration may have a trailing requires-clause.
if (function_declarator_p (decl))
- if (tree reqs = cp_parser_requires_clause_opt (parser))
- current_template_reqs = save_trailing_requirements (reqs);
+ {
+ if (cp_lexer_next_token_is_keyword (parser->lexer, RID_REQUIRES))
+ {
+ ++cp_unevaluated_operand;
+ push_function_parms (decl);
+ cp_lexer_consume_token (parser->lexer);
+ tree reqs = cp_parser_requires_clause (parser);
+ current_template_reqs = save_trailing_requirements (reqs);
+ finish_scope();
+ --cp_unevaluated_operand;
+ }
+ }
return current_template_reqs;
}
-
/* Declarators [gram.dcl.decl] */
/* Parse an init-declarator.
===================================================================
@@ -13864,6 +13864,30 @@ store_parm_decls (tree current_function_
current_eh_spec_block = begin_eh_spec_block ();
}
+// Bring the parameters of a function declaration back into
+// scope without entering the function body. The declarator
+// must be a function declarator. The caller is responsible
+// for calling finish_scope.
+void
+push_function_parms (cp_declarator *declarator)
+{
+ // Find the actual function declarator.
+ while (declarator)
+ {
+ if (declarator->kind == cdk_function)
+ break;
+ declarator = declarator->declarator;
+ }
+
+ begin_scope (sk_function_parms, NULL_TREE);
+ tree p = declarator->u.function.parameters;
+ while (p != NULL_TREE && !VOID_TYPE_P (TREE_VALUE (p)))
+ {
+ pushdecl (TREE_VALUE (p));
+ p = TREE_CHAIN (p);
+ }
+}
+
/* We have finished doing semantic analysis on DECL, but have not yet
generated RTL for its body. Save away our current state, so that
===================================================================
@@ -5432,6 +5432,7 @@ extern bool defer_mark_used_calls;
extern GTY(()) vec<tree, va_gc> *deferred_mark_used_calls;
extern tree finish_case_label (location_t, tree, tree);
extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t);
+extern void push_function_parms (cp_declarator *);
/* in decl2.c */
extern bool check_java_method (tree);