This patch resets the lambda scope based sequence numbering used to assign
numbers to lambdas during parsing when we pop a module scope. This resets
the numbering for subsequent modules imported during LIPO compilation.

It also renames cp_clear_deferred_fns to reset_parsing_state, as that
routine now (and has for awhile) encompasses more than just deferred
function clearing.

Passes regression tests. Ok for google 4_9?

2015-08-14  Teresa Johnson  <tejohn...@google.com>

        Google ref b/23176787.
        * cp/cp-lang.c: Rename clear_deferred_fns to reset_parsing_state.
        * cp/cp-tree.h: Ditto, declare clear_lambda_scope.
        * cp/decl2.c (cp_reset_parsing_state): Ditto, call clear_lambda_scope.
        * cp/parser.c (clear_lambda_scope): New function.
        * l-ipo.c (pop_module_scope): Rename clear_deferred_fns to
        reset_parsing_state.
        * langhooks-def.h: Ditto.
        * langhooks.h: Ditto.

Index: cp/cp-lang.c
===================================================================
--- cp/cp-lang.c        (revision 226875)
+++ cp/cp-lang.c        (working copy)
@@ -109,8 +109,8 @@ static tree get_template_argument_pack_elems_folde
 #define LANG_HOOKS_COPY_LANG_TYPE cp_lipo_copy_lang_type
 #undef LANG_HOOKS_PROCESS_PENDING_DECLS
 #define LANG_HOOKS_PROCESS_PENDING_DECLS cp_process_pending_declarations
-#undef LANG_HOOKS_CLEAR_DEFFERED_FNS
-#define LANG_HOOKS_CLEAR_DEFFERED_FNS cp_clear_deferred_fns
+#undef LANG_HOOKS_RESET_PARSING_STATE
+#define LANG_HOOKS_RESET_PARSING_STATE cp_reset_parsing_state
 #undef LANG_HOOKS_IS_GENERATED_TYPE
 #define LANG_HOOKS_IS_GENERATED_TYPE cp_is_compiler_generated_type
 #undef LANG_HOOKS_CMP_LANG_TYPE
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h        (revision 226875)
+++ cp/cp-tree.h        (working copy)
@@ -4385,6 +4385,7 @@ extern int cp_unevaluated_operand;
 extern tree cp_convert_range_for (tree, tree, tree, bool);
 extern bool parsing_nsdmi (void);
 extern void inject_this_parameter (tree, cp_cv_quals);
+extern void clear_lambda_scope (void);

 /* in pt.c  */

@@ -5342,7 +5343,7 @@ extern void cplus_decl_attributes         (tree *, tree,
 extern void finish_anon_union                  (tree);
 extern void cp_write_global_declarations       (void);
 extern void cp_process_pending_declarations     (location_t);
-extern void cp_clear_deferred_fns               (void);
+extern void cp_reset_parsing_state              (void);
 extern void cp_clear_constexpr_hashtable        (void);
 extern void cp_clear_conv_type_map              (void);
 extern tree coerce_new_type                    (tree);
Index: cp/decl2.c
===================================================================
--- cp/decl2.c  (revision 226875)
+++ cp/decl2.c  (working copy)
@@ -4178,10 +4178,10 @@ no_linkage_error (tree decl)
               "to declare function %q#D with linkage", t, decl);
 }

-/* Clear the list of deferred functions.  */
+/* Reset the parsing state for the next module.  */

 void
-cp_clear_deferred_fns (void)
+cp_reset_parsing_state (void)
 {
   vec_free (deferred_fns);
   deferred_fns = NULL;
@@ -4192,6 +4192,7 @@ void
   clear_pending_templates ();
   reset_anon_name ();
   reset_temp_count ();
+  clear_lambda_scope ();
 }

 /* Collect declarations from all namespaces relevant to SOURCE_FILE.  */
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 226875)
+++ cp/parser.c (working copy)
@@ -8705,6 +8705,16 @@ finish_lambda_scope (void)
   lambda_scope_stack->pop ();
 }

+void
+clear_lambda_scope (void)
+{
+  if (!lambda_scope_stack)
+    return;
+  gcc_assert(lambda_scope_stack->is_empty());
+  lambda_scope = NULL_TREE;
+  lambda_count = 0;
+}
+
 /* Parse a lambda expression.

    lambda-expression:
Index: l-ipo.c
===================================================================
--- l-ipo.c     (revision 226875)
+++ l-ipo.c     (working copy)
@@ -414,7 +414,7 @@ pop_module_scope (void)
   at_eof = 1;
   cgraph_process_same_body_aliases ();
   lang_hooks.l_ipo.process_pending_decls (input_location);
-  lang_hooks.l_ipo.clear_deferred_fns ();
+  lang_hooks.l_ipo.reset_parsing_state ();
   at_eof = 0;

   is_last = is_last_module (current_module_id);
Index: langhooks-def.h
===================================================================
--- langhooks-def.h     (revision 226875)
+++ langhooks-def.h     (working copy)
@@ -214,7 +214,7 @@ extern tree lhd_make_node (enum tree_code);
 #define LANG_HOOKS_DUP_LANG_TYPE lhd_do_nothing_t_t
 #define LANG_HOOKS_COPY_LANG_TYPE lhd_do_nothing_t_t
 #define LANG_HOOKS_PROCESS_PENDING_DECLS lhd_do_nothing_u
-#define LANG_HOOKS_CLEAR_DEFFERED_FNS lhd_do_nothing
+#define LANG_HOOKS_RESET_PARSING_STATE lhd_do_nothing
 #define LANG_HOOKS_IS_GENERATED_TYPE lhd_do_nothing_t_return_bool
 #define LANG_HOOKS_CMP_LANG_TYPE lhd_do_nothing_t_t_return_int

@@ -231,7 +231,7 @@ extern tree lhd_make_node (enum tree_code);
   LANG_HOOKS_DUP_LANG_TYPE, \
   LANG_HOOKS_COPY_LANG_TYPE, \
   LANG_HOOKS_PROCESS_PENDING_DECLS, \
-  LANG_HOOKS_CLEAR_DEFFERED_FNS, \
+  LANG_HOOKS_RESET_PARSING_STATE, \
   LANG_HOOKS_IS_GENERATED_TYPE, \
   LANG_HOOKS_CMP_LANG_TYPE,  \
 }
Index: langhooks.h
===================================================================
--- langhooks.h (revision 226875)
+++ langhooks.h (working copy)
@@ -275,8 +275,8 @@ struct lang_hooks_for_lipo
   /* Process decls after parsing of a source module.  */
   void (*process_pending_decls) (unsigned);

-  /* Clear the list of deferred functions.  */
-  void (*clear_deferred_fns) (void);
+  /* Reset the parsing state for the next module.  */
+  void (*reset_parsing_state) (void);

   /* Return true if T is compiler generated.  */
   bool (*is_compiler_generated_type) (tree t);


-- 
Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to