]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: add parsing_function_declarator predicate
authorJason Merrill <jason@redhat.com>
Fri, 10 Sep 2021 20:36:21 +0000 (16:36 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 15 Sep 2021 20:26:15 +0000 (16:26 -0400)
While looking at PR96184 I noticed that we were recognizing the situation of
parsing a function declarator based on current_binding_level, and that we
ought to make that a predicate function.  This patch is just refactoring,
but I just suggested using it in a review of another patch.

gcc/cp/ChangeLog:

* cp-tree.h (parsing_function_declarator): Declare.
* name-lookup.c (set_decl_context_in_fn): Use it.
* parser.c (cp_parser_direct_declarator): Use it.
(parsing_function_declarator): New.

gcc/cp/cp-tree.h
gcc/cp/name-lookup.c
gcc/cp/parser.c

index 060d1a0a3dbc37bd8af0a432fccca00d8f18038a..e5f632afba4659e92caf1cb3a7a6468f36ad6e45 100644 (file)
@@ -7136,6 +7136,7 @@ extern void cp_convert_omp_range_for (tree &, vec<tree, va_gc> *, tree &,
                                      tree &, tree &, tree &, tree &, tree &);
 extern void cp_finish_omp_range_for (tree, tree);
 extern bool parsing_nsdmi (void);
+extern bool parsing_function_declarator ();
 extern bool parsing_default_capturing_generic_lambda_in_template (void);
 extern void inject_this_parameter (tree, cp_cv_quals);
 extern location_t defparse_location (tree);
index 8e9c61e1ee8d72a3233001339be2a13cb29babe0..ddee8b390f9debed0f5515bc45e4667b28bb8dd6 100644 (file)
@@ -3363,12 +3363,9 @@ set_decl_context_in_fn (tree ctx, tree decl)
 
   if (!DECL_CONTEXT (decl)
       /* When parsing the parameter list of a function declarator,
-        don't set DECL_CONTEXT to an enclosing function.  When we
-        push the PARM_DECLs in order to process the function body,
-        current_binding_level->this_entity will be set.  */
+        don't set DECL_CONTEXT to an enclosing function.  */
       && !(TREE_CODE (decl) == PARM_DECL
-          && current_binding_level->kind == sk_function_parms
-          && current_binding_level->this_entity == NULL))
+          && parsing_function_declarator ()))
     DECL_CONTEXT (decl) = ctx;
 }
 
index 7a0b62343509ba040b15877e093fca01f4a061fb..8d60f40706bd85ba26dd4a882157020a4cea6d19 100644 (file)
@@ -23107,7 +23107,7 @@ cp_parser_direct_declarator (cp_parser* parser,
              else if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
                /* Let compute_array_index_type diagnose this.  */;
              else if (!parser->in_function_body
-                      || current_binding_level->kind == sk_function_parms)
+                      || parsing_function_declarator ())
                {
                  /* Normally, the array bound must be an integral constant
                     expression.  However, as an extension, we allow VLAs
@@ -23831,6 +23831,17 @@ parsing_nsdmi (void)
   return false;
 }
 
+/* True if we're parsing a function declarator.  */
+
+bool
+parsing_function_declarator ()
+{
+  /* this_entity is NULL for a function parameter scope while parsing the
+     declarator; it is set when parsing the body of the function.  */
+  return (current_binding_level->kind == sk_function_parms
+         && !current_binding_level->this_entity);
+}
+
 /* Parse a late-specified return type, if any.  This is not a separate
    non-terminal, but part of a function declarator, which looks like