public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Nathan Sidwell <nathan@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/c++-modules] Merge trunk f1612b8ae8a Date: Fri, 28 Aug 2020 16:10:07 +0000 (GMT) [thread overview] Message-ID: <20200828161007.B0CE4394847E@sourceware.org> (raw) https://gcc.gnu.org/g:c2285e673564835ee574ae5d9ca7c175767460a8 commit c2285e673564835ee574ae5d9ca7c175767460a8 Merge: 8d670e3e460 f1612b8ae8a Author: Nathan Sidwell <nathan@acm.org> Date: Fri Aug 28 05:32:05 2020 -0700 Merge trunk f1612b8ae8a c++: Check satisfaction before non-dep convs. [CWG2369] gcc/testsuite/ * g++.dg/modules/concept-[13]_b.C: Adjust. Diff: ChangeLog.modules | 5 ++++ gcc/cp/constraint.cc | 12 ++++++-- gcc/cp/cp-tree.h | 2 ++ gcc/cp/pt.c | 35 +++++++++++++++++----- gcc/testsuite/g++.dg/concepts/diagnostic10.C | 2 +- gcc/testsuite/g++.dg/concepts/diagnostic13.C | 2 +- gcc/testsuite/g++.dg/concepts/diagnostic2.C | 2 +- gcc/testsuite/g++.dg/concepts/diagnostic3.C | 4 +-- gcc/testsuite/g++.dg/concepts/diagnostic4.C | 2 +- gcc/testsuite/g++.dg/concepts/diagnostic5.C | 2 +- gcc/testsuite/g++.dg/concepts/diagnostic9.C | 3 +- gcc/testsuite/g++.dg/concepts/expression2.C | 2 +- gcc/testsuite/g++.dg/concepts/fn5.C | 4 +-- gcc/testsuite/g++.dg/concepts/placeholder5.C | 4 +-- gcc/testsuite/g++.dg/concepts/pr67595.C | 2 +- gcc/testsuite/g++.dg/cpp2a/concepts-nondep1.C | 19 ++++++++++++ gcc/testsuite/g++.dg/cpp2a/concepts-nondep1a.C | 20 +++++++++++++ gcc/testsuite/g++.dg/cpp2a/concepts-pr78752-2.C | 2 +- gcc/testsuite/g++.dg/cpp2a/concepts-pr84140.C | 1 - .../g++.dg/cpp2a/concepts-recursive-sat3.C | 2 +- gcc/testsuite/g++.dg/cpp2a/concepts-requires18.C | 4 +-- gcc/testsuite/g++.dg/cpp2a/concepts-requires19.C | 12 ++++---- gcc/testsuite/g++.dg/cpp2a/concepts3.C | 6 ++-- gcc/testsuite/g++.dg/modules/concept-1_b.C | 2 +- gcc/testsuite/g++.dg/modules/concept-3_b.C | 2 +- 25 files changed, 113 insertions(+), 40 deletions(-) diff --cc ChangeLog.modules index 66651a08711,00000000000..a3f00057380 mode 100644,000000..100644 --- a/ChangeLog.modules +++ b/ChangeLog.modules @@@ -1,16461 -1,0 +1,16466 @@@ +2020-08-28 Nathan Sidwell <nathan@acm.org> + ++ Merge trunk f1612b8ae8a. ++ c++: Check satisfaction before non-dep convs. [CWG2369] ++ gcc/testsuite/ ++ * g++.dg/modules/concept-[13]_b.C: Adjust. ++ + Merge trunk e6e01618e83. + +2020-08-27 Nathan Sidwell <nathan@acm.org> + + Stream MEM_REFs, who knew? + gcc/cp/ + * module.cc (trees_{in,out}::start): Permit MEM_REFs. + (trees_{in,out}::core_bools): Likewise. + gcc/testsuite/ + * g++.dg/modules/memref-1_[ab].C: New. + +2020-08-27 Nathan Sidwell <nathan@acm.org> + Jeff Chapman II <jchapman@lock3software.com> + + Fix hash table breakage. + gcc/cp/ + * name-lookup.c (push_namespace): Do not create slot on first + lookup. + gcc/testsuite/ + * g++.dg/modules/string-view1.C: New test. + * g++.dg/modules/string-view2.C: Ditto. + +2020-08-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk 708b3600d04. + +2020-08-26 Nathan Sidwell <nathan@acm.org> + + Merge trunk 17abcc77341. + libstdc++: Replace operator>>(istream&, char*) [LWG 2499] + + Fix type lang specific changing. + gcc/cp/ + * lex.c (copy_lang_type): Split allocation & assignment to be + conditional-breakpoint friendly. + * module.cc (trees_in::read_class_def): Update variants if we + alter TYPE_LANG_SPECIFIC. + * name-lookup.c (maybe_lazily_declare): Look at main variant's + decl. + gcc/testsuite/ + * g++.dg/modules/tdef-inst-1{.h,_[ab].C}: New. + + Fix int_cst caching + gcc/ + * tree.c (cache_integer_cst): Fix pointer type indices. + + Cherry pick 794275711bd. + gcc/cp/ + * name-lookup.c (op_unqualified_lookup): Don't check if matches + global lookup. + gcc/testsuite/ + * g++.dg/lookup/operator-[12].C: New. + +2020-08-25 Nathan Sidwell <nathan@acm.org> + + Operator function lookups in templates + gcc/cp/ + * decl.c (poplevel): A local-binding tree list holds the name in + TREE_PURPOSE. + * name-lookup.c (update_local_overload): Add id to TREE_PURPOSE. + (lookup_name_1): Deal with local-binding error_mark_node marker. + (op_unqualified_lookup): Return error_mark_node for 'nothing + found'. Do other short circuiting here. + (maybe_save_operator_binding): Reimplement to always cache a + result. + (push_operator_bindings): Deal with 'ignore' marker. + gcc/testsuite/ + * g++.dg/modules/operator-1_[ab].C: New. + +2020-08-20 Nathan Sidwell <nathan@acm.org> + + Friend specialization overhaul part 1 + gcc/cp/ + * module.cc + gcc/testsuite/ + * g++.dg/modules/tpl-friend-[12]_a.C: Adjust scan. + * g++.dg/modules/tpl-friend-merge-1*: New. + + Do not stream hidden_friend_p. + gcc/cp/ + * module.cc (trees_{in,out}::lang_decl_bools): Do not stream + anticipated_p or hidden_friend_p. + * name-lookup.c (name_lookup::adl_class_fns): DECL_ANTICIPATED is + not informative. + + Reimplement module binding extraction. + gcc/cp/ + * module.cc (depset::clear_hidden_binding): New. + (depset::hash::add_binding): Delete. + (struct add_binding_data): New. + (depset::hash::add_binding_entity): New. + (writable_cmp): Delete. + (depset::hash::add_namespace_entities): Reimplement. + (module_state::write_cluster): Adjust for unscoped enums. + * name-lookup.h (extract_module_binding): Replace with ... + (walk_module_binding): ... this. + * name-lookup.c (STAT_TYPE_HIDDEN): New. + (extract_module_binding): Replace with ... + (walk_module_binding): ... this. + +2020-08-19 Nathan Sidwell <nathan@acm.org> + + ODR-check enums! + gcc/cp/ + * module.cc (trees_in::maybe_duplicate): New. + (trees_in::read_enum_def): ODR check duplicate. + gcc/testsuite/ + * g++.dg/modules/enum-bad-1_[ab].[HC]: New. + +2020-08-18 Nathan Sidwell <nathan@acm.org> + + Cherry pick 634046d1a81. + gcc/cp/ + * name-lookup.c (qualify_lookup): Drop lambda checking here. + Reorder namespace & type checking. + (lookup_name_1): Do hidden lambda checking here. + + Fix -save-temps issue. + libcpp/ + * lex.c (cpp_maybe_module_directive): Increment prevent_expansion + if not expanding. + +2020-08-17 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Module Mapper): Update documentation. + + Fix disable checking build. + gcc/cp + * module.cc (note_def_cache_hasher): GTY needs this even when + unused. + (not_defs_table_t, note_defs): Likewise. + gcc/ + * gcc.c (driver::maybe_print_and_exit): Warn about disable-checking. + +2020-08-14 Nathan Sidwell <nathan@acm.org> + + Cherry pick e97201385a9. + gcc/cp/ + * name-lookup.h (lookup_name_real, lookup_name_nonclass): Rename + to ... + (lookup_name): ... these new overloads. + * name-lookup.c (identifier_type_value_1): Rename lookup_name_real + call. + (lookup_name_real_1): Rename to ... + (lookup_name_1): ... here. + (lookup_name_real): Rename to ... + (lookup_name): ... here. Rename lookup_name_real_1 call. + (lookup_name_nonclass): Delete. + * call.c (build_operator_new_call): Rename lookup_name_real call. + (add_operator_candidates): Likewise. + (build_op_delete_call): Rename lookup_name_nonclass call. + * parser.c (cp_parser_lookup_name): Likewise. + * pt.c (tsubst_friend_class, lookup_init_capture_pack): Likewise. + (tsubst_expr): Likewise. + * semantics.c (capture_decltype): Likewise. + libcc1/ + * libcp1plugin.cc (plugin_build_dependent_expr): Rename + lookup_name_real call. + + Cherry pick db1c2a89db0. + gcc/cp/ + * cp-tree.h (LOOKUP_HIDDEN): Delete. + (LOOKUP_PREFER_RVALUE): Adjust initializer. + * name-lookup.h (enum class LOOK_want): Add HIDDEN_FRIEND and + HIDDEN_LAMBDA flags. + (lookup_name_real): Drop flags parm. + (lookup_qualified_name): Drop find_hidden parm. + * name-lookup.c (class name_lookup): Drop hidden field, adjust + ctors. + (name_lookup::add_overload): Check want for hiddenness. + (name_lookup::process_binding): Likewise. + (name_lookup::search_unqualified): Likewise. + (identifier_type_value_1): Adjust lookup_name_real call. + (set_decl_namespace): Adjust name_lookup ctor. + (qualify_lookup): Drop flags parm, use want for hiddenness. + (lookup_qualified_name): Drop find_hidden parm. + (lookup_name_real_1): Drop flags parm, adjust qualify_lookup + calls. + (lookup_name_real): Drop flags parm. + (lookup_name_nonclass, lookup_name): Adjust lookup_name_real + calls. + (lookup_type_scope_1): Adjust qualify_lookup calls. + * call.c (build_operator_new_call): Adjust lookup_name_real call. + (add_operator_candidates): Likewise. + * coroutines.cc (morph_fn_to_coro): Adjust lookup_qualified_name + call. + * parser.c (cp_parser_lookup_name): Adjust lookup_name_real calls. + * pt.c (check_explicit_specialization): Adjust + lookup_qualified_name call. + (deduction_guides_for): Likewise. + (tsubst_friend_class): Adjust lookup_name_real call. + (lookup_init_capture_pack): Likewise. + (tsubst_expr): Likewise, don't look in namespaces. + * semantics.c (capture_decltype): Adjust lookup_name_real. Don't + look in namespaces. + libcc1/ + * libcp1plugin.cc (plugin_build_dependent_exp): Adjust + lookup_name_real call. + + Cherry pick c38f8785205. + gcc/cp/ + * cp-tree.h (LOOKUP_PREFER_TYPES, LOOKUP_PREFER_NAMESPACES) + (LOOKUP_NAMESPACES_ONLY, LOOKUP_TYPES_ONLY) + (LOOKUP_QUALIFIERS_ONL): Delete. + (LOOKUP_HIDDEN): Adjust. + * name-lookup.h (enum class LOOK_want): New. + (operator|, operator&): Overloads for it. + (lookup_name_real): Replace prefer_type & namespaces_only with + LOOK_want parm. + (lookup_qualified_name): Replace prefer_type with LOOK_want. + (lookup_name_prefer_type): Replace with ... + (lookup_name): ... this. New overload with LOOK_want parm. + * name-lookup.c (struct name_lookup): Replace flags with want and + hidden fields. Adjust constructors. + (name_lookyp::add_overload): Correct hidden stripping test. Update + for new LOOK_want type. + (name_lookup::process_binding): Likewise. + (name_lookup::search_unqualified): Use hidden flag. + (identifier_type_value_1): Adjust lookup_name_real call. + (set_decl_namespace): Adjust name_lookup ctor. + (lookup_flags): Delete. + (qualify_lookup): Add LOOK_want parm, adjust. + (lookup_qualified_name): Replace prefer_type parm with LOOK_want. + (lookup_name_real_1): Replace prefer_type and namespaces_only with + LOOK_want parm. + (lookup_name_real): Likewise. + (lookup_name_nonclass, lookup_name): Adjust lookup_name_real call. + (lookup_name_prefer_type): Rename to ... + (lookup_name): ... here. New overload with LOOK_want parm. + (lookup_type_scope_1): Adjust qualify_lookup calls. + * call.c (build_operator_new_call) + (add_operator_candidates): Adjust lookup_name_real calls. + * coroutines.cc (find_coro_traits_template_decl) + (find_coro_handle_template_decl, morph_fn_to_coro): Adjust + lookup_qualified_name calls. + * cp-objcp-common.c (identifier_global_tag): Likewise. + * decl.c (get_tuple_size, get_tuple_decomp_init): Likewise. + (lookup_and_check_tag): Use lookup_name overload. + * parser.c (cp_parser_userdef_numeric_literal): Adjust + lookup_qualified_name call. + (prefer_arg_type): Drop template_mem_access parm, return LOOK_want + value. + (cp_parser_lookup_name): Adjust lookup_member, lookup_name_real + calls. + * pt.c (check_explicit_specialization): Adjust lookup_qualified_name + call. + (tsubst_copy_and_build, tsubst_qualified_name): Likewise + (deduction_guides_for): Likewise. + (tsubst_friend_class): Adjust lookup_name_real call. + (lookup_init_capture, tsubst_expr): Likewise. + * rtti.c (emit_support_tinfos): Adjust lookup_qualified_name call. + * semantics.c (omp_reduction_lookup): Likewise. + (capture_decltype): Adjust lookup_name_real call. + libcc1/ + * libcp1plugin.cc (plugin_build_dependent_expr): Adjust + lookup_name_real & lookup_qualified_name calls. + +2020-08-13 Nathan Sidwell <nathan@acm.org> + + Cherry pick 0c5f6bbfe2e + gcc/cp/ + * name-lookup.h (enum class LOOK_where): New. + (operator|, operator&): Overloads for it. + (lookup_name_real): Replace NONCLASS & BLOCK_P parms with WHERE. + * name-lookup.c (identifier_type_value_w): Adjust + lookup_name_real call. + (lookup_name_real_1): Replace NONCLASS and BLOCK_P parameters + with WHERE bitmask. Don't search namespaces if not asked to. + (lookup_name_real): Adjust lookup_name_real_1 call. + (lookup_name_nonclass, lookup_name) + (lookup_name_prefer_type): Likewise. + * call.c (build_operator_new_call) + (add_operator_candidates): Adjust lookup_name_real calls. + * parser.c (cp_parser_lookup_name): Likewise. + * pt.c (tsubst_friend_class, lookup_init_capture_pack) + (tsubst_expr): Likewise. + * semantics.c (capture_decltype): Likewise. + libcc1/ + * libcp1plugin.cc (plugin_build_dependent_expr): Likewise. + +2020-08-07 Nathan Sidwell <nathan@acm.org> + + Merge trunk d21252de6c8. + + Address 2 FIXMEs. + gcc/cp/ + * name-lookup.c (finish_nonmember_using_decl): Here. + (lookup_type_scope_1): Here. + + Global decls. + gcc/cp/ + * name-lookup.c (get_fixed_binding_slot): Skip internal decls when + creating vector. + (record_mergeable_decl): Replace with ... + (maybe_record_mergeable_decl): Skip internal decls. + (do_pushdecl): Adjust. + * decl.c (start_decl): Templated vars are not + internal. (Incomplete fix of PR 96523) + + Shadowed type. + gcc/cp/ + * name-lookup.c (check_module_override): No need to deal with + shadowed type here. + gcc/testsuite/ + * g++.dg/modules/shadowed-1_[ab].C: New. + + Simplify binding extraction. + gcc/cp/ + * name-lookup.h (extract_module_binding): Drop NS arg. + * name-lookup.c (extract_module_binding): Reimplement. + * module.cc (depset::hash::add_namespace_entities): Adjust. + +2020-08-06 Nathan Sidwell <nathan@acm.org> + + Remove now-unneeded dedup bits. + gcc/cp/ + * module.cc (module_state::read_cluster): Don't set dedup for + partition or header unit. + + Determine deduplication via slot flags. + gcc/cp/ + * module.cc (module_state::read_cluster): Disable dedup here. + * name-lookup.cc (get_fixed_binding_slot): Set + MODULE_BINDING_GLOBAL_P if necessary. + (name_lookup::search_bitmap_only): Inspect MODULE_BINDING_$foo_P. + (name_lookup::adl_namespace_fns): Likewise. + (set_module_binding): Always stat hack if mod_glob. + + gcc/cp/ + * module.cc (module_state::read_cluster): Pay attention to hidden + decls even in same module. + * name-lookup.c (name_lookup:adl_namespace_fns): Drop unused parm. + +2020-08-05 Nathan Sidwell <nathan@acm.org> + + Note binding slot origin. + gcc/cp/ + * cp-tree.h (MODULE_BINDING_{GLOBAL,PARTITION}_P): New. + * module_cc (module_state::read_cluster): Adjust + set_module_binding call. + * name-lookup.c (set_module_binding): Replace inter_p with + mod_glob parm. Adjust and set origin. + * name-lookup.h (set_module_binding): Adjust prototype. + + Note duplicates on symbol vector. + gcc/cp/ + * cp-tree.h (MODULE_VECTOR_{GLOBAL,PARTITION}_DUPS_P): New. + * name-lookup.h (mergeable_namespace_entities): Replace with ... + (mergeable_namespace_slots): ... this. + * module.cc (trees_in::key_mergeable): Set dups flag when alread + existing. + * name-lookup.c (mergeable_namespace_entities): Replace with ... + (mergeable_namespace_slots): ... this. Return the vector too. + +2020-08-04 Nathan Sidwell <nathan@acm.org> + + Fix alias templates. + gcc/cp/ + * pt.c (lookup_template_class_1): Fix alias resetting of + ti_template. + gcc/testsuite/ + * g++.dg/template/pr95263.C: Re-enable. + + Merge trunk 1790d13dc8f. + +2020-08-03 Nathan Sidwell <nathan@acm.org> + + Revert local paranoid change. + gcc/cp/ + * cp-tree.h (build_cdtor_clones, clone_cdtor): Drop via_using parm. + * class.c (build_cdtor_clones): Drop via_using parm. + (clone_cdtor): Likewise. + (clone_constructors_and_destructors): Adjust. + * module.cc (trees_in::decl_value): Adjust build_cdtor_clones parms. + + Add private module fragment parsing (only). + gcc/cp/ + * parser.c (enum module_preamble): Replace with ... + (enum module_parse): Update all uses. Add PMF values. + (cp_parser_module_declaration): Add private-module-fragment grammar. + gcc/testsuite/ + * g++.dg/modules/pmp-[123]{,_[ab]}.C: New. + + Fix save-temps & header-units + gcc/cp/ + * lang-specs.h (@c++-{,system-,user-}header): Directives-only + preprocessing for saving temps with modules. + + Merge trunk d1773f58f3a. + + Add c++-user-header c++-system-header languages. + gcc/cp/ + * lang-specs.h (@c++-header): Map -fmodules-ts to -fmodule-header, + inhibit PCH. + (@c++-user-header, @c++-system-header): New. + gcc/ + * doc/invoke.texi (C++ Modules): Document. + +2020-07-31 Nathan Sidwell <nathan@acm.org> + + Preserve reserved locations. + gcc/cp/ + * module.cc (enum loc_kind): Add LK_RESERVED. + (module_state::{read,write}_location): Preserve reserved + locations. + (module_State::{read,write}_macro_maps): Default to + UNKNOWN_LOCATION. + gcc/testsuite/ + * g++.dg/modules/part-mac-1_[abc].[CH]: New. + + Fix location of imports of partitions. + * module.cc (loc_spans::maybe_propagate): New. + (module_state::read_{ordinary,macro}_maps): Use it. + gcc/testsuite/ + * g++.dg/modules/part-hdr-1_[abc].[CH]: New. + + Fix import location reparenting. + gcc/cp/ + * module.cc (preprocess_module): Reparent here, if we're already + imported. + gcc/testsuite/ + * g++.dg/modules/reparent-1_[abc].C: New. + +2020-07-30 Nathan Sidwell <nathan@acm.org> + + Unspellable module control-line tokens. + libcpp/ + * internal.h (struct spec_nodes): Add M__IMPORT. + * init.c (post_options): Adjust module token spelling. + * lex.c (cpp_maybe_module_directive): Adjust. + * macro.c (cpp_get_token_1): Reset to zero. + gcc/c-family/ + * c-common.c (c_common_reswords): Adjust module token spelling. + gcc/testsuite/ + * g++.dg/modules/dir-recovery.C: New. + * g++.dg/modules/cpp-[25]_c.C: Adjust. + * g++.dg/modules/dep-2.C: Adjust. + * g++.dg/modules/dir-only-[234]{,_b}.C: Adjust. + * g++.dg/modules/inc-xlate-1_b.H: Adjust. + * g++.dg/modules/legacy-[36]_[bcd].[HC]: Adjust. + + Fix implicit fns from modules. + gcc/cp/ + * cp-tree.h (build_cdtor_clones): Add parms. + * class.c (build_cdtor_clones): Swallow clone_cdtor's member insertion. + (clone_cdtor): Move member insertion to build_cdtor_clones. + * module.cc (trees_in::decl_value): Insert clones, if there's + already a member vec. + gcc/testsuite/ + * g++.dg/modules/sv-1{.h,_[ab].C}: New. + +2020-07-28 Nathan Sidwell <nathan@acm.org> + + Merge trunk f3665bd1111. + + gcc/cp/ + * class.c (layout_class_type): Restore trunk for unnamed classes. + * cp-tree.h (lang_tree_node): Retore trunk GTY. + (cp_tree_node_structure): Restore trunk API. + * decl.c (cp_tree_node_structure): Restore trunk API. + * diagnostic.c (progname): Restore trunk comment. + gcc/ + * doc/invoke.texi (Precompiled Headers): Restore trunk index + capitalization. + (C++ Modules): Adjust to match. + + Merge trunk 134051f16bd. + + libcpp/ + * directives.c (_cpp_do_file_change): Check we're moving to line + zero of the same file. + +2020-07-22 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-ada-spec.c (decl_sloc): Revert to trunk. + + Merge trunk 6e1e0decc9e. + + Unbreak Ada + gcc/ + * gcc.c (execute): Disable argv[0] munging. + +2020-07-21 Nathan Sidwell <nathan@acm.org> + + Sadly Ada still broken :( + gcc/c-family/ + * c-ada-spec.c (decl_sloc): Actually return the field's loc. + +2020-07-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * rtti.c (init_rtti_processing): Unbreak bootstrap. + + Merge trunk a926eeedf43. + +2020-07-17 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * files.c (_cpp_stack_file): Remove FIXME. + * include/cpplib.h (cpp_main_loc): Declare. + * init.c (cpp_read_main_file): Set main loc. + (cpp_main_loc): New. + * internal.h (struct cpp_reader): Add main_loc. + gcc/cp/ + * module.cc (main_source_loc): Delete. + (module_translate_include): Use cpp_main_loc. + (begin_header_unit, preprocess_module, preprocessed_module) + (init_modules, finish_module_processing): Likewise. + (fini_modules): Adjust. + +2020-07-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_may_redeclare): Deal with declaring a builtin + in a header unit. + * rtti.c (init_rtti_processing): The type is not exported. + + libcpp/ + * directives.c (do_include_common): Drop FIXME question. + * lex.c (cpp_maybe_module_directive): C++ keywords are not a thing + here. + (cpp_directive_only_process): Add assert. + + libcpp/ + * include/cpplib.h (struct cpp_callbacks): Adjust + translate_include's return type. + * files.c (_cpp_stack_file): Push the buffer returned by the hook. + * lex.c (_cpp_clean_line): Fix buffer overrun. + gcc/ + * langhooks.h (struct lang_hooks): Change + preprocess_translate_include's return type. + gcc/cp/ + * cp-tree.h (module_translate_include): Change return type. + * module.cc (module_translate_include): Return a buffer, don't + push it. + + libcpp/ + * include/cpplib.h (enum cpp_main_search): New. + (struct cpp_options): Adjust. + * init.c (cpp_read_main_file): Adjust. + * macro.c (cpp_get_token_1): Remove FIXME. + gcc/cp/ + * module.cc (handle_module_option): Adjust. + + gcc/cp/ + * pt.c (tsubst_expr): Do not process using decls again. + gcc/testsuite/ + * g++.dg/modules/using-6_a.C: Enable elided code. + * g++.dg/modules/using-8_[ab].C: New. + +2020-07-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk 765fbbf9bb3. + +2020-07-14 Nathan Sidwell <nathan@acm.org> + + Merge trunk 5f809982e8e. + +2020-07-13 Nathan Sidwell <nathan@acm.org> + + Delete now-unused new pieces. + gcc/ + * toplev.h (original_argc, original_argv): Delete. + * toplev.c (original_argc, original_argv): Delete. + gcc/cp/ + * cp-tree.h (DECL_CHECK): Delete. + gcc/c-family + * c-pragma.h (C_LEX_STRING_IS_HEADER): Delete. + + gcc/cp/ + * module.cc (module_state::set_filename): New. + (module_state::do_import): Drop fname arg. + (module_state::read_imports): Set filename here. + (module_state::write_locations): Drop duplicate FIXME. + (module_state::read_macros): Drop out of date FIXME. + (direct_import): Adjust. + (module_translate): Set filename if we're told it. + (preprocess_module): Copy if filename already known. + (preprocessed_module, init_modules): Adjust. + + gcc/cp/ + * module.cc (module_state::read_cluster): Add FIXME about + unnecessary deduping. + * name-lookup.c (name_lookup::process_module_binding): Remove + FIXME. + (name_lookup::adl_namespace_fns): Likewise. + (name_lookup::search_adl): Likewise. + (do_push_nested_namespace): Likewise. + + gcc/testsuite/ + * lib/scanlang.exp (scan-lang-dump-not): Fix 3-arg case. + * g++.dg/modules/builtin-3_a.C: Remove unnecessary bracing. + + Merge trunk a1faa8e2470. + + Fix polymorphic type info emission and key-function confusion + gcc/cp/ + * module.cc (trees_out::core_bools): Calculate externalness from + POV of importer. + (trees_{in,out{::lang_decl_bools): Do not stream + not_really_extern. + (trees_in::read_{var,function}_def): Recalculate + not_really_extern. + (trees_in::read_class_def): The key_method might become non-key. + gcc/testsuite/ + * g++.dg/modules/sym-subst-3_a.C: Adjust regexp. + * g++.dg/modules/virt-1_[ab].C: Adjust. + * g++.dg/modules/virt-2_[abc].C: New. + +2020-07-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (trees_out::type_node [VECTOR_TYPE]): poly_int's + to_constant already does the checking we need. + + gcc/testsuite/ + * g++.dg/modules/sym-subst-3_a.C: Adjust scan for other ABIs + + gcc/testuite/ + * g++.dg/modules/builtin-3_[ab].C: Add va_list scans for + aarch64 and powerpc ABIs. + +2020-07-08 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/module.exp: Remove tcl 8.6ism + + Merge trunk 6bf2ff0d52a. + +2020-07-03 Nathan Sidwell <nathan@acm.org> + + Merge trunk ce0f842492c + +2020-07-03 Iain Sandoe <iain@sandoe.co.uk> + + gcc/cp/ + * name-lookup.c (name_lookup::adl_namespace_fns): Last param is + unused, and bootstrap complains :( [Nathan left it like that so + he'd be reminded to remove it if it really turned out not needed] + +2020-07-02 Nathan Sidwell <nathan@acm.org> + + p1779 ABI isolation + gcc/cp/ + * cp-tree.h (named_module_purview_p): New. + * decl.c (grokmethod): Don't always implicitly inline. + * module.cc (module_state_config::get_dialect): Add + module_implicit_inline. + gcc/ + * doc/invoke.texi (fmodule-implicit-inline): Document. + gcc/c-family/ + * c.opt (-fmodule-implicit-inline): New. + gcc/testsuite/ + * g++.dg/modules/imp-member-[12]_b.C: Add some inlines. + * g++.dg/modules/vmort-1_a.C: Likewise. + * g++.dg/modules/imp-inline-1_[ab].C: New. + +2020-07-01 Nathan Sidwell <nathan@acm.org> + + GMF entities are not findable by name + gcc/cp/ + * modules.cc (enum depset::disc_bits): Remove DB_GLOBAL_BIT. + (depset::is_global): Delete + (depset::hash::make_dependency): Drop reachable GMF binding + insertion. + gcc/testsuite/ + * g++.dg/modules/builtin-[13]_[ab].C: Adjust scans. + * g++.dg/modules/mod-sym-2.C: Adjust scans. + + Implement FR039 -- dependent ADL and friend fns + gcc/cp/ + * name-lookup.c (name_lookup::adl_namespace): Instantiation path + is not important here. + (name_lookup::search_adl): Reimplement dependent adl for modules. + gcc/testsuite/ + * g++.dg/modules/adl-[12]_b.C: export. + * g++.dg/modules/adl-[45]_[abcd].C: New. + +2020-06-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * class.c (copyfndecl_with_name): Drop inadvertent + DECL_CLONED_FUNCTION setting. Pass 0 for top_level to + rest_of_decl_compiulation. + + gcc/cp/ + * class.c (copy_fndecl_with_name): Add tree code parm. Adjust + callers. + + libcc1/ + * libcp1plugin.cc (plugin_build_decl): Adjust. + + Unify copy_fndecl_with_name and clone_decls. + gcc/cp/ + * class.c (DECL_NEEDS_VTT_PARM_P): Delete. + (copy_fndecl_with_name): Add ctor booleans, use them. Make static. + (copy_operator_fn): New wrapper. + (build_clone): Adjust to use copy_fndecl_with_name. + (build_clones): Rename to ... + (build_cdtor_clones): ... here. + (clone_function_decl): Rename to ... + (clone_cdtor): ... here. + (clone_constructors_and_destructors): Adjust. + * cp-tree.h (build_clones): Rename to build_cdtor_clones. + (clone_function_decl): Rename to clone_cdtor. + (copy_fndecl_with_name): Rename to copy_operator_fn. Change arg + type. + * method.c (implicitly_declare_fn): Adjust. + (lazily_declare_fn): Likewise. + * module.c (trees_in::decl_value): Adjust. + * pt.c (tsubst_function_Decl, instantiate_template_1): Adjust. + +2020-06-29 Nathan Sidwell <nathan@acm.org> + + Merge master 9a33c41fe42 + + Merge master 44492e248cb + c++: implicit operator== adjustments from P2002. [Jason Merrill] + gcc/cp/ + * class.c (build_clone): Retain old version for the moment. + (DECL_NEETS_VTT_PARM_P): Resurrect, before we kill it again. + +2020-06-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * mapper-server.cc (process_server): We should Write when writing. + (server): Fix off-by-one error. + + Merge master 68df8e8c343 + + Merge master 502d63b6d61 + Lower VEC_COND_EXPR into internal functions. [Martin Liska] + Apply d11c9841d54 Add missing check for gassign. [Martin Liska] + Apply 9435fb9668e Fix typo in tree-ssa-reassoc.c. [Martin Liska] + + Merge master 2021af0c23a + + Merge master 668ef28fbb4 + c++: Clean up previous change [PR41437] [Patrick Palka] + gcc/cp/ + * module.cc (trees_{in,out}::code_vals [TEMPLATE_INFO]): Adjust + access checking streaming. + + Merge master 92bed036098 + c++: Improve access checking inside templates [PR41437] [Patrick Palka] + + Merge master a97e49a89d1 + +2020-06-24 Nathan Sidwell <nathan@acm.org> + + Merge master f2242ec0d3f + Over the hump! + + Constrained partial specializations + gcc/cp/ + * module.cc (depset::hash::add_partial_redirect): Add slot parm. + (enum merge_kind): Add MK_partial. + (merge_kind_name): Likewise. + (trees_out::decl_node): A redirect may be for an EK_DECL. + (trees_out::get_merge_kind): Determine MK_partial. + (trees_{in,out}::key_mergeable): Deal with MK_partial. + (depset::hash::make_dependency): Deal with discovering a partial + specialization. + * pt.c (maybe_new_partial_specialization): Add module bits to the + new typedef. + (tsubst_template_decl): Relax module import assert. + (tsubst_template_decl): Refactor, add fixme to check. + gcc/testsuite/ + * g++.dg/modules/nested-constr-1.h: New. + * g++.dg/modules/nested-constr-1_a.H: New. + * g++.dg/modules/nested-constr-1_b.C: New. + * g++.dg/modules/nested-constr-2_a.C: New. + * g++.dg/modules/nested-constr-2_b.C: New. + * g++.dg/modules/nested-constr-2_c.C: New. + * g++.dg/modules/tmpl-part-req-1.h: New. + * g++.dg/modules/tmpl-part-req-1_a.H: New. + * g++.dg/modules/tmpl-part-req-1_b.C: New. + * g++.dg/modules/tmpl-part-req-2.h: New. + * g++.dg/modules/tmpl-part-req-2_a.H: New. + * g++.dg/modules/tmpl-part-req-2_b.C: New. + +2020-06-11 Nathan Sidwell <nathan@acm.org> + + Merge master b825a228907 + +2020-06-10 Nathan Sidwell <nathan@acm.org> + + Merge master ac9face8d26 + PR c++/95263 + gcc/cp/ + * pt.c (lookup_template_class_1): Do not apply reversion + gcc/testsuite/ + * g++.dg/template/pr95263.C: New (XFAIL) + + Merge master 6c8e16aea85 + +2020-06-10 Iain Sandoe <iain@sandoe.co.uk> + + Fixes for darwin + gcc/cp/ + * mapper-server.cc: Reorder includes. + (server): Block scope potentially empty if clause. + * module.cc (get_mapper): Don't use C++14. + gcc/testsuite/ + * g++.dg/modules/bad-mapper-3: Adjust error. + +2020-06-05 Nathan Sidwell <nathan@acm.org> + + Install V1 module protocol goop + gcc/cp/ + * Make-lang.in: Remove mapper-server2 hack. + * mapper-client.cc: Add additional mechanisms to get a server. + * mapper-client.h: Delete. + * mapper-resolver.cc: Fix file reading bugs + * mapper-server.cc: Original deleted. + * mapper-server2.cc: Renamed to mapper-server.cc. + * mapper.h: Adjust. + * module.cc: Adjust. + gcc/testsuite/ + * g++.dg/modules/bad-mapper-1.C: Adjust expected errors. + * g++.dg/modules/bad-mapper-2.C: Likewise. + * g++.dg/modules/bad-mapper-3.C: Likewise. + * g++.dg/modules/map-2.C: Likewise. + + Add libcody as an external library + * libcody: Delete + * Makefile.def: Revert. + * configure.ac: Revert. Add --with-libcody. + * Makefile.tpl: Add CODYLIB, CODYLIBINC, HOST_CODYLIB, HOST_CODYLIBINC. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + gcc/ + * Makefile.in: Revert. Add CODYLIB, CODYLIBINC. + * configure.ac: Add CODYLIB, CODYLIBINC. + * configure: Rebuilt. + gcc/cp + * Make-lang.in: Revert. + +2020-06-02 Nathan Sidwell <nathan@acm.org> + + Add libcody with stub users + * libcody: New. Currently a symlink to cody repo. + * Makefile.def: Add libcody. + * configure.ac: Add libcody. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + gcc/ + * Makefile.in: Add libcody. + gcc/cp/ + * Make-lang.in: Add libcody + * mapper.h: New stub/ + * mapper-resolver.cc: New stub. + * mapper-server2.cc: New stub. + +2020-05-21 Nathan Sidwell <nathan@acm.org> + + FR39 ... + + Merge master 149c8c7c27a + + Premerging Patrick's c++/95223 fix. + gcc/cp/ + * cp-tree.h (comparing_typenames): Declare. + (module_streaming): Delete. + * modules.cc (module_streaming): Delete. + (module_state::read_cluster): Increment comparing_typenames, not + module_streaming. + * pt.c (comparing_typenames): Define. + (spec_hasher::equal): Increment it. + * typeck.c (structural_comptypes): Check it here for typedefs. + + libcpp/ + * files.c, init.c, internal.h: Adjust file_find_kind names from trunk. + + libcpp/ + * line-map.c (linemap_add): Set range and column bits to zero. + gcc/c-family/ + * c-opts.c (c_common_post_options): Add comment. + (c_finish_options): Call linemap_line_start to start line. + +2020-05-20 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * include/cpplib.h (cpp_read_main): Document preamble arg. + * internal.h (IT_MAIN_{ZERO,REAL}): Rename to ... + (IT_MAIN_PREAMBLE, IT_MAIN): ... these. + * files.c (_cpp_stack_file): Adjust. + * init.c (cpp_read_main_file): Adjust. + + libcpp/ + * directives.c (_cpp_do_file_change): Optimize rewinding one line + to line zero. + gcc/c-family/ + * c-opts.c (c_finish_options): Set locations to zero. + * c-ppoutput.c (cb_define): Always advance line number. + + libcpp/ + * files.c (cpp_push_include): Pass highest_line for loc. + (cpp_push_default): Likewise. + * line-map.c (linemap_add): Set range and column bits to what we + used to figure start location. + +2020-05-19 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * internal.h (enum _find_file_kind): New. + (_cpp_find_file): Use it, not 3 bools. + * files.c (_cpp_find_file): Use _find_file_kind enum, not bools. + (_cpp_stack_include, cpp_find_header_unit, _cpp_fake_include) + (_cpp_do_file_change, _cpp_compare_file_date): Adjust. + * init.c (cpp_read_main): Adjust _cpp_find_file call. + +2020-05-18 Iain Sandoe <iain@sandoe.co.uk> + + gcc/testsuite/ + * g++.dg/modules/sym-subst-3_a.C: Adjust scan asm for Darwin. + * g++.dg/modules/init-2_b.C: Adjust scan-asms for Darwin. + * g++.dg/modules/init-2_c.C: Likewise. + + gcc/cp/ + * mapper-client.cc: Move fallback typedef for sighandler_t + from here ... + * mapper-client.h: ... to here. + +2020-05-19 Nathan Sidwell <nathan@acm.org> + + Merge master ed63c387aa0 + + gcc/cp/ + * name-lookup.c (add_imported_namespace): Clarify + inline/non-inline error message. + + libcpp/ + * lex.c (do_peek_module): Permit non-ascii char sets. + +2020-05-15 Nathan Sidwell <nathan@acm.org> + + Enumerate load states. + gcc/cp/ + * module.cc (enum module_loadedness): New. + (module_state::load_state): Rename to .. + (module_state::loadedness): ... this, change type. + (module_state::read_{imports,preprocessor,language}): Adjust, + (module_State::{load_section,do_mport}): Likewise, + (direct_import, {import,declare,preprocess}_module): Likewise. + + Remove {,purview_,partition_}direct_p flags. + gcc/cp/ + * module.cc (module_state::{,purview_,partition_}_direct_p): + Remove flags. + (module_state::is{,purview_,partition_}direct_p}): Adjust. + (module_state::{read,write}_imports): Remove direct flag handling. + (module_state::write): Likewise. + (direct_import, process_module): Likewise. + + Duplicate {,purview_,partition_}direct_p flags in an enum. + gcc/cp/ + * module.cc (enum module_directness): New. + (module_state): Add it. + (module_state::is{,purview_,partition_}direct_p}): Consistency + asserts. + (module_state::{read,write}_imports): Adjust and add Consistency + asserts. + (module_state::write): Likewise. + (direct_import, preprocess_module): Likewise. + +2020-05-14 Nathan Sidwell <nathan@acm.org> + + Stop GMF leakage from interface to implementation + gcc/cp/ + * cp-tree.h (preprocess_module): Add in_purview param. + * lex.c (token_coro::resume): Adjust. + * module.cc (module_state::purview_direct_p): New flag. + (module_state::{read,write}_imports): Pay attention to it for + invisible imports. + (begin_header_unit): Adjust preprocess_module call. + (preprocess_module): Set purview_direct_p as appropriate. + gcc/testsuite/ + * g++.dg/modules/gmf-2_[abcd].[CH]: New. + + Merge master f497e36ae56 + +2020-05-13 Nathan Sidwell <nathan@acm.org> + + Implement P1874 Dynamic Initialization Order + gcc/cp/ + * cp-tree.h (module_initializer_kind) + (module_add_import_initializers): Declare. + (mangle_module): Add include_partition parm. + (init_module_processing): Rename to init_modules. + (fini_modules): Declare. + (mangle_identifier): Add prefix char. + (mangle_module_global_init): Declare. + * decl.c (cxx_init_decl_processing): Adjust for module init + rename. + * decl2.c (start_objects): Maybe mangle module initializer name. + Add module initializers. + (generate_ctor_or_dtor_function): Add module init support. + (c_parse_final_cleanups): Likewise, adjust for module fini + addition. + * mangle.c (mangle_identifier): Add prefix char. + (write_module): New, broken out of ... + (maybe_write_module): ... here. Call it. + (mangle_module_global_init): New. + * module.cc (module_state): Add call_init_p flag. + (num_init_calls_needed): New global. + (module_state::mangle): Add include_partition parm. + (mangle_module): Likewise. + (module_initializer_kind): New. + (module_add_import_initializers): New. + (init_module_processing): Rename to ... + (init_modules): ... here. + (finish_module_processing): Calculate call_init_p. + (fini_modules): New, broken out of finish_module_processing. + gcc/testsuite/ + * g++.dg/modules/init-[12]_[abc].C: New. + +2020-05-12 Nathan Sidwell <nathan@acm.org> + + Merge master 2a0225e4786. + +2020-05-08 Nathan Sidwell <nathan@acm.org> + + Merge master b224c3763e0. + + EOF has a location + gcc/cp/ + * parser.c (cp_lexer_set_source_position_from_token): Don't + special-case EOF. + gcc/testsuite/ + * c-c++-common/raw-string-6.c: Adjust expected locations: + * g++.dg/cpp0x/decltype63.C: Likewise. + * g++.dg/cpp0x/gen-attrs-64.C + * g++.dg/cpp0x/pr68726.C: Likewise. + * g++.dg/cpp0x/pr78341.C: Likewise. + * g++.dg/cpp1y/pr65202.C: Likewise. + * g++.dg/cpp1z/class-deduction44.C: Likewise. + * g++.dg/diagnostic/unclosed-extern-c.C: Likewise. + * g++.dg/diagnostic/unclosed-function.C: Likewise. + * g++.dg/diagnostic/unclosed-namespace.C: Likewise. + * g++.dg/diagnostic/unclosed-struct.C: Likewise. + * g++.dg/ext/pr84598.C: Likewise. + * g++.dg/other/switch4.C: Likewise. + * g++.dg/parse/crash10.C: Likewise. + * g++.dg/parse/crash18.C: Likewise. + * g++.dg/parse/crash35.C: Likewise. + * g++.dg/parse/crash59.C: Likewise. + * g++.dg/parse/crash61.C: Likewise. + * g++.dg/parse/crash67.C: Likewise. + * g++.dg/parse/ctor3.C: Likewise. + * g++.dg/parse/error14.C: Likewise. + * g++.dg/parse/error5.C: Likewise. + * g++.dg/parse/error56.C: Likewise. + * g++.dg/parse/invalid1.C: Likewise. + * g++.dg/parse/parameter-declaration-1.C: Likewise. + * g++.dg/parse/parser-pr28152-2.C: Likewise. + * g++.dg/parse/parser-pr28152.C: Likewise. + * g++.dg/parse/pr68722.C: Likewise. + * g++.dg/pr46852.C: Likewise. + * g++.dg/pr46868.C: Likewise. + * g++.dg/template/crash115.C: Likewise. + * g++.dg/template/crash43.C: Likewise. + * g++.dg/template/error-recovery1.C: Likewise. + * g++.dg/template/error57.C: Likewise. + * g++.old-deja/g++.other/crash31.C: Likewise. + +2020-05-07 Nathan Sidwell <nathan@acm.org> + + Merge master ab2952c77d0 + +2020-05-05 Nathan Sidwell <nathan@acm.org> + + Just push the eh decls. + gcc/cp/ + * except.c (declare_library_fn_1): Don't look at current binding. + Just make the decl and push it. + * name-lookup.h (get_global_module_decls): Delete decl. + * name-lookup.c (get_global_module_decls): Delete defn. + + Fix eh specs + gcc/testsuite/ + * g++.dg/eh/builtin{5,7,9,10,11}.C: Fix eh specs on __cxa fn decls. + + Fix libitm's decls + libitm/ + * eh_cpp.cc (__cxa_allocate_exception, __cxa_free_exception) + (__cxa_begin_catch, __cxa_tm_cleanup, __cxa_eh_globals): Fix + exception specification. + (_ITM_cxa_allocate_exception, _ITM_cxa_free_exception) + (_ITM_cxa_begin_catch): Likewise. + * libitm.h (_ITM_NOTHROW): New define. + (_ITM_cxa_allocate_exception, _ITM_cxa_free_exception) + (_ITM_cxa_begin_catch): Use it. + * testsuite/lib/libitm.exp (libitm_init): Add + -fdiagnostics-color=never. + +2020-05-04 Nathan Sidwell <nathan@acm.org> + + Simplify except fn helper pushing part 1 + gcc/cp/ + * decl.c (push_library_fn): Return the decl pushdecl_toplevel returns. + * except.c (verify_library_fn): Replace with ... + (declare_library_fn_1): ... this fn. + (declare_library_fn): Call it. + (build_throw): Call declare_library_fn_1. + * name-lookup.h (get_global_module_decls): Declare. + * name-lookup.c (get_namespace_binding): Return this TU's + bindings. + (get_global_module_decls): New. + gcc/testsuite/ + * g++.dg/eh/builtin10.C: Adjust expected errors. + * g++.dg/eh/builtin11.C: Likewise. + * g++.dg/eh/builtin6.C: Likewise. + * g++.dg/eh/builtin7.C: Likewise. + * g++.dg/eh/builtin9.C: Likewise. + * g++.dg/parse/crash55.C: Likewise. + +2020-05-01 Nathan Sidwell <nathan@acm.org> + + Fix macro expansion of header-unit names + libcpp/ + * macro.c (cpp_get_token_1): Pay attention to arg parsing mode, + and the existence of padding/comment tokens. + gcc/testsuite/ + * g++.dg/modules/cpp-6_[abc].[CH]: New. + +2020-04-30 Nathan Sidwell <nathan@acm.org> + + Set TREE_USED on stream in. + gcc/cp/ + * module.cc (trees_in::unused): New field. + (trees_in::tree_node): Add defaulted off is_use arg, set TREE_USED + on streamed in obect. Adjust callers to set it. + (trees_{in,out}::core_bools): Do not stream base.used_flag. + (trees_{in,out}::core_vals): Reorder BINFO fields. Increment + unused around vtbl pieces. + (trees_in::decl_value): Save and reset unused field. + (trees_in::read_var_def): Increment unsused for vtbl initializers. + gcc/testsuite/ + * g++.dg/modules/used-1_[abc].C: New. + + Tweak builtin fn hack + gcc/cp/ + * name-lookup.c (get_namespace_binding): Strip singleton + overloads. + gcc/testsuite/ + * g++.dg/modules/libfn-1_[ab].C: New. + +2020-04-28 Nathan Sidwell <nathan@acm.org> + + Partition pending indirection fixes + gcc/cp/ + * module.cc (trees_in::install_entity): Treat pending flags + independently, adjust indirection installation. + (pendset_lazy_load): Add specialization_p arg. Use for + indirection adjustment. + (get_primary_module): Look at implementation unit's parent. + (lazy_load_{specializations,members}): Adjust. + gcc/testsuite/ + * g++.dg/modules/part-6_[abcde].C: New. + +2020-04-23 Nathan Sidwell <nathan@acm.org> + + Stream definitions after decls. + gcc/cp + * module.cc (module_state::write_cluster): Break out definition + streaming to separate loop. + gcc/testsuite/ + * g++.dg/modules/member-def-[12]_c.C: Adjust scans, oh for CHECK-DAG. + + Stream node types last + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Move type streaming to + end. + gcc/testsuite/ + * g++.dg/modules/indirect-4_c.C: Adjust scan. + +2020-04-22 Nathan Sidwell <nathan@acm.org> + + Stream imports at start of cluster + gcc/cp/ + * module.cc (trees_out::importedness): New checker. + (depset::hash::add_dependency): Add imports. + (depset::tarjan::connect): Skip imports. + (module_state::{read,write}_cluster): Seed imports before the + cluster itself. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust scans. + * g++.dg/modules/imp-member-[12]_[ce].C: Adjust scans. + * g++.dg/modules/member-def-2_c.C: Adjust scans. + * g++.dg/modules/vmort-2_c.C: Adjust scans. + + +2020-04-21 Nathan Sidwell <nathan@acm.org> + + Don't stream DECL_ODR_USED or TREE_ASM_WRITTEN + gcc/cp/ + * module.cc (trees_{in,out}::core_values): Don't stream + base.asm_written_flag. + (trees_{in,out}::lang_decl_bools): Don't stream u.base.odr_used. + + Remove DECL_MODULE_PARTITION_P, it is not needed. + gcc/cp/ + * cp-tree.h (DECL_MODULE_PARTITION_P): Delete. + (lang_decl_base): Remove module_partition_p bitfield. + * decl.c (duplicate_decls): No need to check or reset it. + * lex.c (cxx_dup_lang_specific): No need to reset it. + * pt.c (build_template_decl): No need to check it. + (tsubst_template_decl): Likewise, or reset it. + * module.cc (trees_in::decl_value): No need to set it. + (trees_out::decl_node): No need to check it. + (depset::hash::make_dependency): Likewise, Adjust import marking + code. + (set_instantiating_module): No need to reset it. + +2020-04-17 Nathan Sidwell <nathan@acm.org> + + Merge master a28edad3da5c59f09565d3d42e20be1a924986c4 + + gcc/cp/ + * cxx-mapper.cc: Rename to ... + * mapper-server.cc: ... here. + * Make-lang.in: Adjust. + * module.cc (make_mapper): Adjust. + gcc/testsuite/ + * g++.dg/modulex/inc-xlate-1_e.C: Adjust. + * g++.dg/modulex/legacy-[26]_[bcdef].[CH]: Likewise. + + gcc/cp/ + * module.cc (mapper_{import_export,export_done}): Revert + 2020-04-13 change. + + gcc/cp/ + * mapper-client.{h,cc}: New, broken out of ... + * module.cc: ... here. + (maybe_remove_cmi_prefix): Delete. + * Make-lang.in: Add mapper-client. + + gcc/cp/ + * module.cc (module_mapper::{get,make}): Replace with ... + (get_mapper, make_mapper): ... these. + (module_mapper:(kill,fini): Delete. + (module_mapper::{import_export,export_done}): Replace with ... + (mapper_import_export, mapper_export_done): ... these. + + gcc/cp/ + * module.cc (module_mapper::to): Drop unneeded field. + + gcc/cp/ + * module.cc (module_mapper::{open,close}): New methods, use them. + + gcc/cp/ + * module.cc (module_mapper): Break more stuff out of ctor. + +2020-04-13 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_mapper): Remove knowledge of module_state, + update all callers. + +2020-04-08 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/hello-1_[ab].C: New. + + gcc/cp/ + * module.cc (trees_in::decl_value): Need to retrofit lang for + inner. + gcc/testsuite/ + * g++.dg/modules/gmf-1_[ab].C: New. + + gcc/testsuite/ + * g++.dg/modules/xtreme-header-[1-6]_c.C: New. + + gcc/cp/ + * module.cc (trees_in::key_mergeable): Avoid null deref. + (direct_import): Create attachment table. + gcc/testsuite/ + * g++.dg/modules/lambda-[23]_c.C: New. + + Merge master 50c7853216e8511971c55b51d7fe29173db4749b + +2020-04-07 Nathan Sidwell <nathan@acm.org> + + C++20 Ranges! + gcc/testsuite/ + * g++.dg/modules/xtreme-header-2.h: Enable in c++20 mode. + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parm_value): Stream auto + placeholder & constraints. + gcc/testsuite/ + * g++.dg/modules/lambda-4{,_[ab]}.[hHC]: New. + + _FUN with recursive types (pun intended) + gcc/cp/ + * module.cc (trees_out::key_mergeable): A lambda's static _FUN has + a recursive return type. + (trees_in::is_matching_decl): Likewise. + gcc/testsuite/ + * g++.dg/modules/lambda-4{,_[ab]}.[hHC]: New. + * g++.dg/modules/concept-6_b.C: Remove xfail. + + gcc/ + * print-tree.c (print_node): Explicitly show CALL_EXPR null arguments. + + gcc/cp/ + * module.cc (trees_out::key_mergeable): Instantiations can have + requires. Not just the template. + gcc/testsuite/ + * g++.dg/modules/concept-6{,_[ab]}.[hHC]: New. + + gcc/cp/ + * tree.c (cp_tree_equal): [CALL_EXPR] Directly check number of + arguments to a call. Assert they exist. + * typeck.c (structural_comptypes): [DECLTYPE_TYPE] Break apart if + conditional. + +2020-04-06 Nathan Sidwell <nathan@acm.org> + + gcc/cp + * module.cc (depset::hash::make_dependency): Imported namespaces + from a partition don't have PARTITION_P set. + (module_state::write): Likewise. + gcc/testsuite/ + * g++.dg/modules/part-5_[abc].C: New. + +2020-04-03 Nathan Sidwell <nathan@acm.org> + + PR c++/94476 + gcc/cp/ + * class.c (layout_class_type): Zap NSDMI of as_base fields. + gcc/testsuite/ + * g++.dg/modules/nsdmi-2.C: New. + + Merge master bcafd8748cf9eb83a9e71bf67c4e2a7c5c8f513c + + NSDMIs + WARNING causes ICES in the STL header tests. There's a trunk + NSDMI parsing bug (pr94476) + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Write FIELD_DECL initial + value. + gcc/testsuite/ + * g++.dg/modules/nsdmi-1_[ab].C: New. + + gcc/testsuite/ + * g++.dg/modules/xtreme-header-[123456]{,_[ab]}.[hHC]: New. + + gcc/ + * gcc.c (driver::maybe_print_and_exit): Shout about + experimentalness. + (driver::final_actions): Likewise. + * diagnostic.c (diagnostic_action_after_output): Likewise. + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Prune the shouting. + + Template vars inited to lambdas + gcc/cp/ + * module.cc (depset::hash::find_dependencies): Adjust dump + predicate. + gcc/testsuite/ + * g++.dg/modules/lambda-3{,_[ab]}.[hHC]: New. + + Resurrect topological key-order sort for clusters + gcc/cp/ + * module.cc (depset::hash): Add chain, is_key_order. + (trees_out::is_key_order): New. + (trees_out::decl_value): Adjust for key-order walk. + (trees_out::{get_merge_kind,key_mergeable}): Likewise. + (depset::hash::add_dependency): Deal with key-order dependency. + (depset::hash::add_mergeable): New. + (depset::hash::find_dependencies): Adjust for key-order walk. + (cluster_cmp): Delete. + (sort_cluster): New. + (module_state::write): Call sort_cluster, not qsort (cluster_cmp). + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_b.C: Adjust final scan. + * g++.dg/modules/late-ret-3_a.H: Likewise. + * g++.dg/modules/member-def-[12]_c.C: Likewise. + * g++.dg/modules/tpl-alias-1_a.H: Likewise. + * g++.dg/modules/tpl-friend-1_a.C: Likewise. + * g++.dg/modules/tpl-spec-3_[ab].C: Likewise. + * g++.dg/modules/using-7.C: Likewise. + +2020-04-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (trees_out::decl_node): Treat namespaces like other + decls. + (module_state::write): When checking, insert non-imported + namespace-decls into the entity map here. + + gcc/cp/ + * modules.cc (trees_out::decl_value): Public. + (trees_out::decl_node): Do not expect by-value namespaces. + (depset::hash::find_dependencies): Deal with namespaces here. + +2020-04-01 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/tpl-alias-1_[ab].[HC]: Fix unresolved tests. + * g++.dg/modules/vtt-2_b.C: Likewise. + + Lambdas attached to namespace-scope non-template vars + gcc/cp/ + * cp-tree.h (DECL_ATTACHED_DECLS_P): New. + (struct lang_decl_base): Add attached_decls_p. + (maybe_attach_decl): Declare. + * lambda.c (record_lambda_scope): Call maybe_attach_decl. + * lex.c (cxx_dup_lang_specific): Clear DECL_ATTACHED_DECLS_P. + * module.c (uintset<T>::hash::create): New member function. + (attachset, attached_tables): Declare. + (enum merge_kind): Add MK_attached. Adjust. + (trees_{in,out}::lang_decl_bools): Stream attached_decls_p. + (trees_{in,out}::decl_value): Stream attached decls. + (trees_out::get_merge_kind): Determine if MK_attached. + (trees_{in,out}::key_mergeable): Stream MK_attached. + (depset::hash::make_dependency): You can get anonymous templatey + things (lambdas). + (maybe_attach_decl): New. + (finish_module_processing): Delete attached_table. + gcc/testsuite/ + * g++.dg/modules/lambda-2_[ab].[HC]: Remove xfail, add dump scans. + +2020-03-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (module_streaming): Declare. + * module.cc (module_streaming): Define. + (cluster_cmp): Do not strip template off an alias instantiation. + (module_state::read_cluster): Increment module_streaming around + the loading. + * typeck.c (structural_comptypes): Do not resolve typename types + when module_streaming. + + gcc/cp/ + * pt.c (tsubst_lambda_expr): Set extra scope after creating the + lambda struct. + +2020-03-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (template<T> uintset): New template created from ... + (pendset): ... this. Use it. Adjust all uses. + +2020-03-27 Nathan Sidwell <nathan@acm.org> + + Merge master 62ede14d30f5d083f1ab23bcab6e0e3c9c649006 + +2020-03-26 Nathan Sidwell <nathan@acm.org> + + STL headers header-unity (except C++ 20 ranges) + gcc/testsuite/ + * g++.dg/modules/xtreme-header-{,_[ab]}.[hHC]: New. + + Alias templates working (properly) + gcc/cp/ + * modules.cc (enum depset::disc_bits): Add DB_ALIAS_TMPL_INST_BIT, + Replace DB_BOTH_SPEC_BIT with DB_ALIAS_SPEC_BIT. + (enum merge_kind): Replace MK_tmpl_both_mask with + MK_tmpl_alias_mask. Add MK_alias_spec. + (merge_kind_name): Adjust. + (trees_out::core_vals): DECL_TEMPLATE_RESULT might not be visited. + (trees_{in,out}::decl_value): Cope with alias template + instantiations. + (trees_out::get_merge_kind): Add alias support. + (trees_{in,out}::ket_mergeable): Add alias support. + (check_mergeable_decl): Likewise. + (trees_in::is_matching_decl): Drop inner parm, adjust. + (depset::hash::make_dependency): Add alias suport. + (depset::hash::add_specializations): Detect and mark aliases. + gcc/testsuite/ + * g++.dg/modules/tpl-alias-1{,_[ab]}.[hHC]: New. + + gcc/cp/ + * module.cc (trees_{in,out}::decl_value): Instantiations are + merged things too. + + gcc/cp/ + * module.cc (trees_{in,out}::install_entity): New, broken out of ... + (trees_{in,out}::decl_value): ... here. Call them. + +2020-03-25 Nathan Sidwell <nathan@acm.org> + + WARNING: This breaks lots of modules tests because an inconsistent + invariant wrt alias templates is now consistently different. This + is intended. gcc/cp/ + * cp-tree.h (SET_TYPE_TEMPLATE_INFO): Not for aliases. + * pt.c (lookup_template_class_1): Type alias's template info + should already be correct. + (tsubst_template_decl): Don't reset TI_TEMPLATE of an alias. + +2020-03-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (SET_TYPE_TEMPLATE_INFO): Only expand VAL once. + * pt.c (perform_typedefs_access_check) + (append_type_to_template_for_access_check): Move G_T_N_A_C call + out of loop. + (get_types_needing_access_check): Simplify. + +2020-03-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms_fini): Determine + contextness requirement from TPI. + + Merge master a3586eeb88414e77c7cccb69362b8d04562536b6. + +2020-03-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms_fini): Flag whether + tpl-tpl-parm context is non-null. + +2020-03-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::decl_value): No need to install constraints + for duplicate. + (trees_in::is_matching_decl): Open code comparison, don't use + decls_match. + + gcc/cp/ + * module.cc (trees_{in,out}::{read,write}_function_def): Potential + cexprs have result == error_mark_node. + + gcc/cp/ + * module.cc (trees_in::decl_value): Template instantiations are + never implicit member fns. + (module_state_config::get_dialect): Check exceptions, rtti, + inheriting ctors. + gcc/testsuite/ + * g++.dg/modules/inh-tmpl-ctor-1{,_[ab]}.[hHC]: New. + + Merge master 3512dc0108afbed3bece2e9fa1719fb3ce1d73d9 + +2020-03-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::type_node): Do ptr-mem-fns after typedef + detection. + gcc/testsuite/ + * g++.dg/modules/pmf-2{,_[ab]}.[hHC]: New. + + gcc/cp/ + * module.cc (trees_out::key_mergeable): Do not perform + requirements stubstutition. + (check_mergeable_decl): Likewise. + + gcc/cp/ + * decl.c (decls_match): Use fndecl_declared_return_type for + newdecl too. + * module.cc (trees_out::key_mergeable): Use + fndecl_declared_return_type. + (check_mergeable_decl): Likewise. + gcc/testsuite/ + * g++.dg/modules/auto-1{,_[ab]}.[hHC]: New. + +2020-03-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::is_matching_decl): Propagate instantiated + noexcept specifications. + gcc/testsuite/ + * g++.dg/modules/except-3{,_[ab]}.[hHC]: New. + + gcc/cp/ + * module.cc (lazy_snum, recursive_lazy): New. + (module_state::read_language): Set lazy_snum. + (lazy_load_{binding,specializations}): Call recursive_lazy. + +2020-03-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (elf_in::defrost): Return bool. + (module_state::from): May return NULL. + (module_state::maybe_completed_reading): New, broken out of + check_read. + (pendset::lazy_load): Likewise. + (module_state::write): Do not read partitions here. + (module_state::read_initial): Do not create slurp or elf_in here. + (module_state::load_{preprocessor,language}): Return bool, add + outermost flag. Adjust check_read calls. + (module_state::load_section): Reimplement, check mc_slot, issue + errors here. + (module_state::check_read): Reimplement for use by config loaders. + (module_state::do_import): Add outermost flag, alloc slurping + here. Adjust check_read call. + (module_state::lazy_load): Thin wrapper on load_section. + (module_state::lazy_load_binding): Check error emission here and + diagnose. + (module_state::lazy_load_specializations): Likewise. + (direct_import, preprocess_module): Adjust. + gcc/testsuite/ + * g++.dg/modules/leg-merge-4_c.C: Adjust regexp matching + + gcc/cp/ + * doc/invoke.texi (C++ Modules): Clarify a couple of things. + +2020-03-13 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (lookup_field_ident): Check TYPE_LANG_SPECIFIC + before getting the member vector. + gcc/testsuite/ + * g++.dg/modules/pmf-1{,_[ab]}.[hHC]: New. + + gcc/cp/ + * pt.c (template_args_equal): Slight refactor to clarify control + flow. + * tree.c (cp_tree_equal): Use comp_template_args for TREE_VEC. + * typeck.c (structural_comptypes): Comment about exception specs. + + Ranges, you were right, have a biscuit! + gcc/testsuite/ + * g++.dg/modules/odr-1{,_[ab]}.[hHC]: Moved to .. + * g++.dg/modules/lambda-2{,_[ab]}.[hHC]: ... here. Xfailed + + gcc/cp/ + * module.cc (trees_in::decl_value): Set and reset constraints on + duplicate decl. + (trees_in::is_matching_decl): Use decls_match to compare decls. + gcc/testsuite/ + * g++.dg/modules/except-2{,_[ab]}.[hHC]: New. + * g++.dg/modules/builtin-4_[ab].[HC]: New. + + gcc/cp/ + * mangle.c (find_substitution): Cleanup for c++/94027 fix. + + gcc/cp/ + * module.cc (module_state::read_config): Allow overriding the + version check. + gcc/c-family/ + * c.opt (fmodule-version-ignore): New undocumented option. + +2020-03-11 Nathan Sidwell <nathan@acm.org> + + Bad ranges, no biscuit! + gcc/testsuite/ + * g++.dg/modules/odr-1{,_[ab]}.[hHC]: New. + +2020-03-10 Nathan Sidwell <nathan@acm.org> + + Reconstruct deferred exception spec types + gcc/cp/ + * cp-tree.h (fixup_deferred_exception_variants): Declare. + * tree.c (fixup_deferred_exception_variants): New. + * parser.c (cp_parser_member_declaration): Comment about friends. + (cp_parser_class_specifier_1): Call it, don't generate a new type. + (cp_parser_noexcept_specification_opt): Reorder if conditional. + gcc/testsuite/ + * g++.dg/modules/deferred-1{,_[ab]}.[hHC]: New. + + Merge master 3654d49d0ff651b2a78401bc2430428711e7d2eb + +2020-03-09 Nathan Sidwell <nathan@acm.org> + + Function-scope using directives + gcc/cp/ + * cp-gimplify.c (cp_genericize_r): Set DECL_CONTEXT of + IMPORTED_DECL. + * module.cc (trees_{in.out}::core_vals): Stream IMPORTED_DECL's + initial. + (trees_out::decl_node): IMPORTED_DECLs are always by value. + + Namespace aliases + gcc/cp/ + * name-lookup.c (do_namespace_alias): Set originating module. + * module.cc (trees_out::tree_node_bools): Allow namespace aliases. + (depset::hash::make_dependency): Likewise. + (depset_hash::add_namespace_entities): Likewise. + (set_instantiating_module): Likewise. + gcc/testsuite/ + * g++.dg/modules/ns-alias-1_[abc].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::vec_chained_decls): New. + (trees_{in,out}::{read,write}_class_def): Use for fields and vtables. + gcc/testsuite/ + * g++.dg/modules/vtt-2{,_[ab]}.[hHC]: New. + + gcc/cp/ + * cp-tree.h (get_mergeable_specialization_flags) + (add_mergeable_specialization): Declare. + * module.cc (trees_{in,out}::key_mergeable): Stream specialization + flags and add them as necessary. + (enum ct_decl_flags): Delete. + (module_state::{read,write}_cluster): No decl flags. + (install_specialization): Delete. + * pt.c (get_mergeable_specialization_flags): New. + (add_mergeable_specialization): New. + gcc/testsuite/ + * g++.dg/modules/partial-1{,_[ab]}.[hHC]: New. + * g++.dg/modules/tpl-spec-5_b.C: Adjust scan. + +2020-03-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * tree.c (set_array_type_canon): Add dependent parm. + (build_cplus_array_type, cp_build_qualified_type_real) + (strip_typedefs): Pass dependent_p on. + gcc/testsuite/ + * g++.dg/modules/tpl-ary-1.h: Try constifying. + + gcc/cp/ + * cp-tree.h (cplus_build_array_type): Add known-dependent default arg. + * tree.c (cplus_build_array_type): Only calculate dependent if + unknown. Set TYPE_DEPENDENT_P on dependent arys. + * module.cc (trees_{in,out}::type_node): Serialize dependentness + of array types. + gcc/testsuite/ + * g++.dg/modules/tpl-ary-1{,_[ab]}.[hHC]: New. + +2020-03-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (mergeable_class_entities): Check TYPE_LANG_SPECIFIC. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Only unscoped enum + usings from the enum itself are mutual dependencies. + (cluster_cmp): Cope with using decls for the same entity. + gcc/testsuite/ + * g++.dg/modules/using-7.C: New. + + gcc/cp/ + * module.cc (trees_out::core_vals): Adjust typedef detection. + (trees_{in,out}::decl_value): Likewise. + gcc/testsuite/ + * g++.dg/modules/tdef-7{,_[ab]}.[hHC]: New. + + gcc/cp/ + * module.cc (trees__out::key_mergeable): NULL name more often. + (enum merge_match): Delete. + (check_mergeable_decl): Use merge_kind instead. + (trees_in::key_mergeable): Adjust. + gcc/testsuite/ + * g++.dg/modules/merge-6_b.C: Adjust scan. + + gcc/cp/ + * module.cc (struct merge_key): simplify. + (trees_{in,out}::key_mergeable): Optimize merge_key streaming. + +2020-03-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum merge_kind): Add more discriminators. + (merge_kind_name): Adjust. + (trees_{in,out}::key_mergeable): Partition via new discriminators. + (trees_in::decl_value): Remove bad formatting. + (trees_out::get_merge_kind): Select new discriminators. + (mergeable_namespace_entity, mergeable_class_member): Fold into + reimplemented key_mergeable. + gcc/testsuite/ + * g++.dg/modules/merge-[56]_b.C: Adjust scans. + + gcc/cp/ + * module.cc (struct merge_key): Remove index as tree hack ... + (merge_key::{read,write}): ... here. + (trees_{in,out}::key_mergeable): Adjust. + + gcc/cp/ + * module.cc (merge_key::read): Remove req qualifier hack. + (check_mergeable_decl): Use merge_key, not explicit args. + (mergeable_namespace_entity, mergeable_class_member): Likewise. + (trees_in::key_mergeable): Adjust. + + gcc/cp/ + * module.cc (trees_{in,out}::decl_container): New. + (trees_in::key_mergeable): Reimplement, swallowing the merging + logic of ... + (trees_in::decl_value): ... this. + gcc/testsuite/ + * g++.dg/modules/builtin-[13]_a.C: Adjust scans. + * g++.dg/modules/indirect-[234]_b.C: Likewise. + * g++.dg/modules/inst-[23]_a.C: Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::fn_arg_types): Delete. + (struct merge_key): New. + (trees_out::key_mergeable): Use merge_key. + (trees_out::key_mergeable): #ifdef out. + (trees_in::decl_value): Adjust key handling. + +2020-03-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.h (mergeable_namespace_entity) + (mergeable_class_member): Don't declare. + * name-lookup.c (check_mergeable_decl, mergeable_namespace_entity) + (mergeable_class_member): Move to ... + * module.cc (check_mergeable_decl, mergeable_namespace_entity) + (mergeable_class_member): ... here. + + gcc/cp/ + * decl2.c (c_parse_final_cleanups): Revert previous change. + * name-lookup.h (mergeable_{namespace,class}_entities): Declare. + (add_mergeable_namespace_entity): Declare. + * name-lookup.c (member_vec_dedup): Link stat_hack chain. + (check_module_override): Do not use check_mergeable_decl. + (mergeable_{namespace,class}_entities): New. + (add_mergeable): Rename to ... + (add_mergeable_namespace_entitity): ... here. + (mergeable_{namespace,class}_entity): Use new accessors. + +2020-02-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (struct note_def_cache_hasher): New type. + (note_defs): Use it, set GTY((cache)). + (trees_{in,out}::assert_definition): Adjust. + (module_state::write, init_module_processing): Adjust note_defs + construction. + + gcc/cp/ + * module.cc (c_parse_final_c_cleanups): Don't complain about + unsynthesized defaulted members in a header unit, and pick a + privileged clone to complain about when we do. + gcc/testsuite/ + * g++.dg/modules/imp-member-3.H: New. + + gcc/cp/ + * module.cc (trees_(in,out)::fn_arg_types): Serialize ref + parmness. + (trees_out::key_mergeable): Adjust. + * name-lookup.c (check_mergeable_decl): Check ref parmness. + (mergeable_class_member): __as_base not found via name lookup. + gcc/testsuite/ + * g++.dg/modules/merge-15{,_[ab]}.[hHC]: New. + + Merge master 9d2d283367a407c1ba9ecdb8590f9295828e25f8 + +2020-02-27 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::decl_value): FIELD_DECLS can have + template_info. + (member_owned_by_class): Likewise. + gcc/testsuite/ + * g++.dg/modules/merge-14{,_[ab]}.[hHC]: New. + +2020-02-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl.c (build_typename_type): Refactor. + * module.cc (trees_out::decl_value): Class-scope using-decls are + like fields. + (trees_out::key_mergeable): Using-decls are like anonymous fields. + (trees_{in,out}::{read,write}_class_def): Beware of + typename_type's TYPE_DECL in the member vec. + (trees_out::mark_class_def): Mark using-decls. + (depset::hash::make_dependency): Assert not a class-scope + using-decl. + * name-lookup.c (mergeable_class_member): Using-decls can be + indexed. + ({get,lookup}_field_ident): Using-decls are like fields. + gcc/testsuite/ + * g++.dg/modules/indirect-2_c.C: Adjust scans. + * g++.dg/modules/merge-13{,_[ab]}.[hHC]: New. + +2020-02-25 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/string-1_[ab].[CH]: Enable in c++20 mode. + + gcc/testsuite/ + * g++.dg/modules/merge-12{,_[ab]}.[hHC]: New. + + gcc/cp/ + * typeck.c (structural_comptypes): Deal with TYPE_ARGUMENT_PACK. + gcc/testsuite/ + * g++.dg/concepts/pack-1.C: New. + + PR c++/93761 + gcc/cp/ + * module.cc (begin_header_unit): New, broken out of ... + (module_begin_main_file): ... here. Call it when not + preprocessed. + (init_module_processing): Call it when preprocessed. + gcc/testsuite/ + * g++.dg/modules/preproc-1.C: New. + + gcc/testsuite/ + * g++.dg/modules/atom-decl-2.C: Use dg-prune. + * g++.dg/modules/atom-pragma-3.C: Likewise. + * g++.dg/modules/mod-decl-1.C: Likewise. + * g++.dg/modules/mod-decl-3.C: Likewise. + * g++.dg/modules/indirect-1_c.C: Remove dg-bogii. + * g++.dg/modules/part-3_c.C: Likewise. + + Global module constraint merging + gcc/cp/ + * module.cc (trees_out::decl_value): Always stream constraints. + (trees_in::decl_value): Likewise, deal with requires in merge key. + (trees_{in,out}::key_mergeable): Stream requires. + * name-lookup.c (check_mergeable_decl): Add & check requires. + (check_module_override): Get requires. + (mergeable_namespace_entity): Add requires. + (mergeable_class_member): Likewise. + (make_namespace_finish): Adjust. + * name-lookup.h (mergeable_namespace_entity): Add requires. + (mergeable_class_member): Likewise. + gcc/testsuite/ + * g++.dg/modules/concept-5{,_[ab]}.[hHC]: New. + +2020-02-24 Nathan Sidwell <nathan@acm.org> + + Implement US033 + gcc/cp/ + * module.cc (import_module): Check language-linkage depth. + * parser.c (cp_parser_import_declaration): Check if direct + language linkage. + gcc/testsuite/ + * g++.dg/modules/inc-xlate-1_d.C: Delete. + * g++.dg/modules/lang-1_[abc].[HC]: New. + * g++.dg/modules/lang-2_[ab].C: New. + + Merge master 3841739c29a54c0141c3156cdd47891c258b2b88 + +2020-02-22 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cpp_directives_only): Commonize ' & " peeking, add + cpp-number vs raw-string detection. + gcc/testsuite/ + * c-c++-common/cpp/dir-only-7.c: Add test. + +2020-02-19 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cp_directive_only_process): Deal with raw strings by + backtracking. + +2020-02-14 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cpp_directive_only_process): Cope with number + punctuators. + gcc/testsuite/ + * c-c++-common/cpp/dir-only-8.c: New. + +2020-02-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * Make-lang.in (MODULE_REVISION): Add branch name. + +2020-02-11 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-opts.c (c_finish_options): Builtins & command-line starts at + 1. + (cb_file_change): Alter detection of main file start. + * c-ppoutput.c (print_line_1): Don't nadger line zero. + gcc/testsuite/ + * g++.dg/modules/dir-only-3.C: Update line nos + * g++.dg/modules/dir-only-4.C: New. + + gcc/c-family/ + * c-optsc (c_common_post_options): Set module_directives + regardless of preprocessed state. + gcc/cp/ + * parser.c (cp_parser_skip_to_pragma_eol): Don't explode on + meeting actual EOF. + gcc/testsuite/ + * g++.dg/modules/dir-only-3.C: New. + + Merge master a6ee556c7659877bb59b719f11ca2153e86ded59 + +2020-02-10 Nathan Sidwell <nathan@acm.org> + + libcpp/ + lex.c (do_peek_prev): New. + (cpp_directive_only_process): Peek backwards from 'R' to check it + is a raw literal. + gcc/testsuite/ + * c-c++-common/cpp/dir-only-7.c: Extend. + +2020-02-08 Nathan Sidwell <nathan@acm.org> + + libcpp/ + lex.c (_cpp_lex_direct): PRAGMA_EOL is never pre-padded. + (cpp_directive_only_process): Emit line marker after module + control-line. + gcc/ + * langhooks.h (struct lang_hooks): Add PT_flags enum. + gcc/c-family/ + * c-ppoutput.c (token_streamer): Add begin_pragma. + (token_streamer::stream): Remove out-of-pragma EOL procesing. + Ignore pragma_eol location. + (scan_translation_unit): Pay attention to filter return flags. + (directives_only_cb): Likewise. + gcc/cp/ + * lex.c: Inlude langhooks. + (coro::resume): Return pragma begin flag. + gcc/testsuite/ + * g++.dg/modules/dir-only-2_b.c: Add broken line check. + + gcc/ + * langhooks (struct lang_hooks): preprocess_token takes and + returns a uintptr_t. + gcc/cp/ + * cp-tree.h (module_token_{pre,cdtor,lang}): Change cookie type. + * lex.c (module_token_{pre,cdtor,lang}): Change cookie type. + * parser.c (cp_lexer_new): Likewise. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Adjust lang hook use. + (class do_streamer): Likewise. + (scan_translation_unit_directives_only): Likewise. + +2020-02-08 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cpp_directive_only_process): Relax raw string detection. + +2020-02-07 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cpp_directive_only_process): Re-reimplement. + + libcpp/ + * lex.c (cpp_maybe_module_directive): Use 'module control-line' + here ... + gcc/cp/ + * parser.c (cp_parser_diagnose_invalid_type_name): ... here ... + (cp_parser_import_declaration): ... and here. + + libcpp/ + * internal/cpplib.h (cpp_clear_if_stack): Don't declare. + * directives.c (cpp_clear_if_stack): Delete. + + Merge master 82aee6dd61e2a5b4e4b124f896c8403169688f41 + + -fdirectives-only (a bit buggy) + gcc/c-family/ + * c-ppoutput.c (token_streamer::stream): Adust PRAGMA_EOL. + (class_do_streamer): New. + (directives_only_cb): Extend for token streaming. + (scan_translation_unit_directives_only): Pay attention to + preprocess lang_hook. + (print_line_1): Ignore UNKNOWN_LOCATIONs. + libcpp/ + * include/cpplib.h (cpp_directives_only): Add cpp_reader to + callback. + * lex.c (do_peek_{backslash,next,ident,module): New. + (cpp_directive_only_preprocess): Add module peeking. + gcc/testsuite/ + * g++.dg/modules/dir-only-2_[ab].[CH]: New. + + gcc/c-family/ + * c-ppoutput.c (class token_streamer): New class, swallow guts of + ... + (scan_translation_unit): ... this. Use it. + +2020-02-06 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * include/cpplib.h (enum CPP_DO_task): New. + (cpp_directive_only_process): Adjust prototype. + * lex.c (cpp_directives_only_process): Take data pointer and + generic callback, adjust. + gcc/c-family/ + * c-ppoutput.c (print_lines_directives_only): Replace with ... + (directives_only_cb): ... this new function. + (scan_directive_only_preprocess): Adjust call. + + libcpp/ + * lex.c (cpp_directive_only_process): Simplify raw string lexing. + + libcpp/ + * lex.c (cpp_directive_only_process): Add raw string lexing. + gcc/testsuite/ + * c-c++-common/cpp/dir-only-7.c: New. + +2020-02-05 Nathan Sidwell <nathan@acm.org> + + Merge master fa0c6e297b22d5883857d0db4a6a8be0967cb16f + + libcpp/ + * directives-only.c: Delete. + * Makefile.in: Remove it. + * include/cpplib.h (cpp_directives_only_process): Declare. + * internal.h (struct _cpp_dir_only): Delete. + (_cpp_preprocess_dir_only): Delete. + * lex.c (cpp_directive_only_process): New implementation. + gcc/c-family/ + * c-ppoutput.c (print_lines_directive_only): lines is unsigned. + (scan_translation_unit_directives_only): Reimplement. + gcc/testsuite/ + * gcc.dg/cpp: Move directives-only tests to ... + * c-c++-common/cpp: ... here. + +2020-02-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_import_declaration): Be stricter about preamble. + gcc/testsuite/ + g++.dg/modules/atom-decl-2.C: Adjust diagnostics. + g++.dg/modules/atom-pragma-3.C: Likewise. + g++.dg/modules/exp-xlate-1_b.C: Likewise. + g++.dg/modules/inc-xlate-1_e.C: Likewise. + g++.dg/modules/atom-preamble-2_f.C: New. + + gcc/cp/ + * module.cc (preprocess_module): Don't load header unit if not + preprocessing. Always close and reopen the line map spans. + libcpp/ + * include/cpplib.h (cpp_get_options, cpp_get_callbacks) + (cpp_get_deps): Mark as PURE. + + gcc/cp/ + * module.cc (module_state::do_import): Drop deps handling here. + (preprocess_module): Mark interface. + (preprocessed_module): Correct dependency generation. + (finish_module_processing): Drop deps handling here. + libcpp/ + * mkdeps.c (make_write): Note Make 4.3's &: targets + + gcc/cp/ + * module.cc (MODULE_UNKNOWN_PARTITION): Delete. + (module_state::read_imports): Drop special partition detection. + (module_state::read_partitions): Drop special partition setting. + (module_translate_include): Use main_source_loc for mapper. + ({init,fini}_module_processing): Likewise. + + gcc/cp/ + * lex.c (module_token_cdtor): Call preprocessed_module on + teardown here ... + * parser.c (cp_lexer_new_main): ... not here. + * module.cc (struct module_state): Drop from_loc. Use loc in most + places. + (module_state::{maybe_create_loc,attach,is_detached): Delete. + (module_state::is_rooted): New. Use it in place of is_detached. + (module_state::imported_from): New. + (module_state::do_import): Create module loc here ... + (direct_import): ... not here ... + (preprocess_module): ... or here. + (import_module): Reparent here. + (module_cpp_undef): Check flag_header_unit. + (module_begin_main_file): Do not declare_module here ... + (preprocessed_module): ... do it here. + + gcc/cp/ + * module.cc (module_state::direct_import): Delete. + (module_state::do_import): Only ever do initial read. + (direct_import): New non-member fn. + ({import,declare}_module): Call it. + (preprocess_module): Call do_import. + + gcc/cp/ + * module.cc (struct module_state): Cleanly separate module kind + flags from module use flags. + +2020-02-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (struct module_state): Drop primary_p & + from_partition_p. Map uses to module_p and partition_direct_p. + + gcc/cp/ + * module.cc (struct module_state): Add load_state, not flags. + Remove imported_p, lazy_{preprocessor,language}_p. + (module_state::read_{imports,preprocessor,language}): Adjust. + (module_state::{check_read,{do,direct}_import}): Adjust. + ({declare,preprocess}_module): Adjust. + + gcc/cp/ + * cp-tree.h (module_normal_import_p): Delete. + * module.cc (struct module_state): Rationalize flags. + (module_normal_import_p): Delete. + (module_state::direct_import): Don't save and restore line state + here. + (import_module): Just for language. + (preprocess_module): Save line state here. + * parser.c (cp_parser_import_declaration): Adjust. + (cp_parser_declaration_seq_opt): Drop superflous pragma parsing. + + gcc/cp/ + * parser.c (cp_parser_import_declaration): Diagnose include + translation in purview. Emit not about module-directive control lines. + gcc/testsuite/ + * g++.dg/modules/inc-xlate-1_e.C: New. + +2020-02-02 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * internal.h (struct spec_nodes): Transpose n_modules array. + * init.c (post_options): Adjust n_modules array access. + * lex.c (cpp_maybe_module_directive): Remove supurfluous state and + laziness. + gcc/ + * module.cc (module_translate_include): Add __translated attribute. + * parser.c (cp_parser_translation_unit): Move translated + diagnostic to ... + (cp_parser_import_declaration): ... here. Still disabled. + (cp_parser_module_export): Check for following module directive. + gcc/testsuite/ + * g++.dg/modules/exp-xlate-1_b.C: Remove xfail, adjust errors. + * g++.dg/modules/inc-xlate-1_b.H: Adjust final scans. + * g++.dg/modules/legacy-[35]_[bcd].[CH]: Adjust final scans. + +2020-01-31 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * include/cpplib.h (NODE_MODULE): New. + (struct cpp_hashnode): Reserve another flag bit. + * internal.h (struct spec_nodes): Replace separate module spec + nodes by array. + (_cpp_setup_module_directive): Delete. + * init (post_options): Adjust module node initialization. + * directives.c (_cpp_setup_module_directive): Delete, move into ... + * lex.c (cpp_maybe_module_directive): ... here. New, absorb + peeking from ... + (_cpp_lex_token): ... here. Call it. + + Merge master b92709388b9aee52db3cd7c227818e0ecccda2e5 + + gcc/cp/ + * parser.c (cp_parser_skip_to_end_of_statement): Adjust pragma + skipping. + (cp_parser_skip_to_end_of_block_or_statement): Likewise. + + Fix PRAGMA_EOL location + libcpp/ + * lex.c (_cpp_lex_direct): Return CPP_PRAGMA_EOL at end of line. + gcc/cp/ + * lex.c (token_coro::resume): No need to handle in-pragma EOF. + * parser.c (cp_parser_skip_to_pragma_eol): Likewise. + (cp_parser_omp_declare_simd, cp_parser_omp_declare_reduction) + (cp_parser_oacc_routine, cp_parser_initial_pragma, pragma_lex): Likewise. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Ignore CPP_PRAGMA_EOL in + not a pragma. + gcc/testsuite/ + * c-c++-common/cpp/pragma-eof.c: New. + + Implement p1857, part 3 + gcc/cp/ + * cp-tree.h (module_preprocess, import_module_pre): Replace with ... + (preprocess_module): ... this. + (import_module_lang): Replace with ... + (import_module): ... this. + (preprocessed_module): Declare. + (process_deferred_imports): Delete. + * lex.c (struct token_coro): Report via preprocess_module. + (module_token_pre): Call preprocessed_module on teardown. + * module.cc (module_state::module_p): New flag. + (main_source_loc): New. + (pending_imports): Delete. + (module_state::direct_import): Do not get filename here. + (import_module_lang): Replace with ... + (import_module): Drop attach logic. + (declare_module): Adjust. + (module_preprocess, import_module_pre): Replace with ... + (preprocess_module): ... this. Do attach logic here. + (preprocessed_module): New. Do deps and module server name comms. + (process_deferred_imports): Delete. + * parser.c (cp_lexer_new_main): Call preprocessed_module when + done. + (cp_parser_translation_unit): Drop deferred imports logic. + (cp_parser_import_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/atom-preamble-2_d.C: Remove xfail. + * g++.dg/modules/bad-mapper-1.C: Adjust diagnostic loc. + * g++.dg/modules/bad-mapper-2.C: Likewise. + * g++.dg/modules/bad-mapper-3.C: Likewise. + * g++.dg/modules/map-2.C: Likewise. + +2020-01-30 Nathan Sidwell <nathan@acm.org> + + Implement p1857, part 2 + libcpp/ + * include/line-map.h (linemap_module_reparent): Declare. + * line-map.c (linemap_module_reparent): New. + gcc/cp/ + * cp-lang.c (LANG_HOOKS_PREPROCESS_TOKEN): Adjust. + * cp-tree.h (module_preprocess_token): Rename to ... + (module_token_pre): ... here. + (module_token_{cdtor,lang}): Declare. + (module_map_header): Delete. + (module_preprocess): Adjust parameters. + (import_module): Delete, replace with ... + (import_modile_{pre,lang}): ... these. + (declare_module): Return void. + * lex.c (struct token_coro): New, broken out of ... + (module_preprocess_token): ... here. Replace with ... + (module_token_{pre,lang,cdtor}): ... these. + * module.cc (module_state::read_location): Deal with early-read + partition locations. + (module_state::direct_import): Always preserve line map. Take + for_cpp arg. + (import_module): Break into ... + (import_module_{pre,lang}): ... these. Disable pending imports. + (declare_module): Adjust. + (module_map_header): Delete. + (module_preprocess): Do not change module array. Return primary + module. + * parser.c (cp_lexer_tokenize): Delete. + (cp_lexer_new_main): New, resurrected from trunk. Tokenize the + whole buffer. Call the token coro. + (cp_parser_skip_to_closing_parenthesis_1): Deal with falling into + a module pseudo-pragma. + (cp_parser_skip_to_end_of_{,block_or_}statement): Likewise. + (cp_parser_translation_unit): Drop the incremental tokenization. + (cp_parser_module_name): Drop KIND parameter. + (cp_parser_module_directive_end): New. + (cp_parser_{import,module}_declaration): Adjust. + (cp_parser_declaration): Deal with (badly placed) import or module + declarations. + (cp_parser_toplevel_declaration): Restore PRAGMA parsing. + (c_parse_file): PCHness handled in cp_lexer_new_main, use it. + gcc/testsuite/ + * g++.dg/modules/atom-decl-2.C: Adjust expected error + * g++.dg/modules/atom-pragma-3.C: Likewise. + * g++.dg/modules/exp-xlate-1_b.C: Likewise. + * g++.dg/modules/mod-decl-1.C: Likewise. + * g++.dg/modules/p0713-2.C: Likewise. + * g++.dg/modules/p0713-3.C: Likewise. + * g++.dg/modules/atom-preamble-2_d.C: Temporary XFAIL + * g++.dg/modules/unnamed-1_b.C: Adjust output scan + + gcc/cp/ + * parser.c (cp_lexer_alloc): Remove pch finalizing. + (cp_parser_skip_to_closing_parenthesis_1): Deal with falling into + a CPP_PRAGMA. + (cp_parser_skip_to_end_of_{,block_or_}statement): Likewise. + (cp_parser_skip_to_pragma_eol): Don't consume CPP_EOF. + (cp_parser_new): Take a lexer, don't create it here. + (cp_parser_declaration): Just point at peeked tokens, don't copy. + (cp_parser_block_declaration): Likewise. + (cp_parser_initial_pragma): Don't get the first token. + (c_parse_file): Do it here, and finalize pch. + + libcpp/ + * lex.c (_cpp_lex_direct): Set location of PRAGMA_EOL. + gcc/testsuite/ + * g++.dg/modules/exp-xlate-1_b.C: Add xfailed bogus-error. + * g++.dg/modules/cpp-2_c.C: Adjust output scan. + * g++.dg/modules/cpp-5_c.C: Likewise. + * g++.dg/modules/legacy-3_b.H: Likewise. + * g++.dg/modules/legacy-3_c.H: Likewise. + * g++.dg/modules/legacy-6_c.C: Likewise. + * g++.dg/modules/legacy-6_d.C: likewise. + +2020-01-27 Nathan Sidwell <nathan@acm.org> + + gcc/ + * langhooks.h (preprocess_token): Take a const cpp_token pointer. + gcc/c-family/ + * (c-ppoutput.c (scan_translation_unit): Preprocess lang hook + doesn't alter the token. + + gcc/cp/ + * cp-tree.h (module_preprocess_token): Take const cpp_token + pointer. + * lex.c (module_preprocess_token): Take const cpp_token. + +2020-01-24 Nathan Sidwell <nathan@acm.org> + + Merge master a1f6eff20e3bb32c5051e77093ee28faec2abca0 + + gcc/c-family/ + * c-common.h (enum rid): Remove non-underbarred module RIDs. + * c-common.c (c_common_reswords): Remove non-underbarred module keywords. + gcc/cp/ + * lex.c (init_reswords): Module keywords are keywords. + * parser.c (cp_lexer_tokenize): Look for keywords. + (cp_parser_translation_unit): Likewise. + gcc/testsuite/ + * g++.dg/modules/exp-xlate-1_b.C: Remove bogus xfail. + +2020-01-23 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * expr.c (parse_defined): Fixup for modules. + (parse_has_include): Remove controlling macro nonsense. + + Implement p1857, part 1 + libcpp/ + * internal.h (struct lexer_state): Add directive_file_token field. + (struct spec_nodes): Add module directive nodes. + (_cpp_setup_module_directive): Declare. + * include/cpplib.h (struct cpp_options): Add module_directives field. + * directives.c (_cpp_setup_module_directive): New. + * init.c (post_options): Provess module_directives option. + * lex.c (_cpp_lex_token): Add module directive handling. + * macro.c (cpp_get_token_1): Add directive_file_token handling. + gcc/cp/ + * lex.c (module_preprocess_token): Reimplement. + * parser.c (cp_lexer_tokenize): Module lines end in + CPP_PRAGMA_EOL. + (cp_lexer_not_macro): Delete. + (cp_parser_module_directive_end): New. + (cp_parser_diagnose_invalid_typename): Adjust. + (cp_parser_translation_unit): Adjust. + (cp_parser_{module,import}_declaration): Adjust. + gcc/c-family/ + * c-common.h (enum rid): Add RID__MODULE and co. + * c-common.c (c_common_reswords): Add __module and co. + * c-lex.c (c_lex_with_flags): Adjust CPP_HEADER_NAME handling. + * c-opts.c (c_common_post_options): Set module_directives option. + gcc/testsuite/ + * g++.dg/modules/anon-2_b.C: Adjust error/scans. + * g++.dg/modules/atom-preamble-1.C: Likewise. + * g++.dg/modules/atom-preamble-3.C: Likewise. + * g++.dg/modules/cpp-2_c.C: Likewise. + * g++.dg/modules/cpp-5_b.C: Likewise. + * g++.dg/modules/cpp-5_c.C: Likewise. + * g++.dg/modules/dep-2.C: Likewise. + * g++.dg/modules/keyword-1_b.C: Likewise. + * g++.dg/modules/legacy-3_b.H: Likewise. + * g++.dg/modules/legacy-3_c.H: Likewise. + * g++.dg/modules/legacy-6_c.C: Likewise. + * g++.dg/modules/legacy-6_d.C: Likewise. + * g++.dg/modules/mod-decl-0-2a.C: Likewise. + * g++.dg/modules/mod-decl-0.C: Likewise. + * g++.dg/modules/mod-decl-1.C: Likewise. + * g++.dg/modules/mod-decl-3.C: Likewise. + * g++.dg/modules/token-1.C: Likewise. + * g++.dg/modules/token-2_b.C: Likewise. + * g++.dg/modules/token-3.C: Likewise. + * g++.dg/modules/token-4.C: Likewise. + * g++.dg/modules/exp-xlate-1_b.C: XFAIL + * g++.dg/modules/inc-xlate-1_d.C: XFAIL + +2020-01-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (slurping::remap_module): Return unsigned, use zero + for error case. + (trees_in::tree_node): Adjust. + (module_state::read_{namespace,pendings}): Likewise. + (module_state::read_{preprocessor,language}): Likewise. + + gcc/cp/ + * modules.cc (struct module_state): Add + lazy_{preprocessor,language}_p fields. + (module_state::read): Delete, move into do_import. + (module_state::read_preprocessor): Be idempotent. Read direct + imports here. Set header bitmap bits. + (module_state::read_language): Likwise, set import/export bits. + (module_state::check_read): Adjust file closing condition. + (module_state::set_import): Do not deal with header bitmaps here. + (module_state::do_import): Do the initial read (only) here. + (module_state::direct_import): Do the preprocessor and language + reading here. + + gcc/cp/ + * modules.cc (slurping::remap_module): Encode import directness in + remap array. + (module_state::read_imports): Adjust. + (module_state::read_initial): Likewise. + +2020-01-20 Nathan Sidwell <nathan@acm.org> + + Merge master 3a43459715e239fb8043bf64b830aaf1a9802180. + Coroutines committed. + +2020-01-17 Nathan Sidwell <nathan@acm.org> + + Merge master bf09d886a4be1031f7003073115af6cbc5575353. + +2020-01-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::write_macros): Always write a set of + defs. + (module_state::read_macros): Adjust. + (module_state::read): Only read preprocessor for header unit. + (module_state::read_preprocessor): Assert am header. + + gcc/cp/ + * module.cc (module_state::{read,write}_counts): New. Broken out + of ... + (module_state::{read,write}_config): ... here. + (enum module_state_counts): New. + (module_state::write_cluster): Take lwm,hwm pair. + (module_state::read_{bindings,entities,inits}): Adjust. + (module_state::write): Write counts. + (module_state::read_{preprocessor,language}): Read counts. + + gcc/cp/ + * module.cc (slurping::slurping): Set current to ~0u. + (module_state::read_{initial,preprocessor,language}): New, broken + out of ... + (module_state::read): ... here. Call them. + +2020-01-15 Nathan Sidwell <nathan@acm.org> + + Merge master. + gcc/cp/ + * module.cc (depset::traits): Add empty_zero_p. + +2020-01-13 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * Make-lang.in (MODULE_REVISION): SVN's dead, man. + +2020-01-10 Nathan Sidwell <nathan@acm.org> + + Merge trunk r280131. + Bye bye SVN, I'm sure the farm upstate will be fine. + +2020-01-06 Nathan Sidwell <nathan@acm.org> + + Merge trunk r279868. + +2020-01-03 Nathan Sidwell <nathan@acm.org> + + Header unit deduplication milestone + gcc/testsuite/ + * g++.dg/modules/string-1_{a.H,b.C}: New. + + gcc/cp/ + * module.cc (trees_in::decl_value): Disambiguate entity_ary slots + from entuty_hash slots. + (trees_out::get_merge_kind): Check of + uninstantiated_template_friend even when there's a depset. + + gcc/cp/ + * module.cc (trees_in::tree_value): Return existing. + gcc/testsuite/ + * g++.dg/modules/merge-11{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (trees_out::get_merge_kind): Detect bitfield storage + unit. + (trees_out::key_mergeable): Deal with anonymous bitfields. + * name-lookup.c (mergeable_class_member): Likewise. + gcc/testsuite/ + * g++.dg/modules/merge-10{.h,_a.H,_b.C}: New. + + gcc/ + * tree.h (DECL_ALIGN_RAW): New, use it in accessors. + (DCL_WARN_IF_NOT_ALIGN): Likewise. + gcc/cp/ + * cp-tree.h (CPTI_CONST_TYPE_INFO_TYPE,CPTI_TYPE_INFO_PTR_TYPE): + Move to after module hwm. + * module.cc (trees_out::write_class_def): Don't write empty thunk + lists. + (trees_in::read_class_def): Merge fields from a duplicate. + gcc/testsuite/ + * g++.dg/modules/tinfo-2_{a.h,b.C}: New. + * g++.dg/modules/member-def-1_c.C: Adjust scan. + * g++.dg/modules/merge-9.h: Add another builtin. + + gcc/cp/ + * module.cc (module_state::read_cluster): Set cfun->returns_struct + approprately. + + gcc/cp/ + * module.cc (import_entity_module): Cope with exported entities. + +2020-01-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (CPTI_ALIGN_TYPE): Not a global tree. + gcc/testsuite/ + * g++.dg/modules/merge-9{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (nodel_decl_hash): Rename to ... + (duplicate_hash): ... here. Allow binfos. + (trees_{in,out}::binfo_mergeable): New. + (trees_{in,out}::tree_node): Use it for tt_binfo. + (trees_{in,out}::tree_value): Use to dedup binfos. + gcc/testsuite/ + * g++.dg/modules/merge-8{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (trees_{in,out}::tree_binfo): Delete. + (trees_{in,out}::tree_node): Use binfo chain to find binfo. + + Merge trunk r279811. + Update all the years! + + Merge trunk r279809. + That's 2019 done. + + Merge trunk r279556. + gcc/ + * diagnostic-core.h (progname): Resolve conflict. + + Merge trunk r279555. + + Merge trunk r279473. + + Apply trunk r279473. + gcc/cp/ + * constexpr.cc (check_constexpr_fundef): Clear non-potential + result before registering. + + Merge trunk r279472. + +2019-12-19 Nathan Sidwell <nathan@acm.org> + + Typeof merging + gcc/cp/ + * ptree.c (cxx_print_type): Print TYPEOF_TYPE & BASES types. + * typeck.c (structural_comptypes): Add TYPEOF_TYPE. + gcc/testsuite/ + * g++.dg/modules/merge-7{.h,_a.H,_b.C}: New. + + Anonymous templates are a thing. + gcc/cp/ + * module.cc (trees_out::key_mergeable): Deal with anon templatey + members. + * name-lookup.c (mergeable_class_member): Likewise. + gcc/testsuite/ + * g++.dg/modules/merge-6{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (trees_in::decl_value): Fix enum-context merging. + gcc/testsuite/ + * g++.dg/modules/merge-5{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (trees_out::key_mergeable): Fix indentation. + + gcc/cp/ + * name-lookup.c (mergeable_class_member): Get to class template + correctly. + gcc/testsuite/ + * g++.dg/modules/merge-4{.h,_a.H,_b.C}: New. + + gcc/cp/ + * module.cc (trees_in::install_implicit_member): Fix parm type thinko. + gcc/testsuite/ + * g++.dg/modules/imp-member-1_a.C: Fix scan. + * g++.dg/modules/imp-member-2_[abc].C: New. + +2019-12-18 Nathan Sidwell <nathan@acm.org> + + Installation of implicit member fns. + gcc/cp/ + * module.cc (trees_in::install_implicit_member): New. + (trees_in::decl_value): Implicit member functions may be dups. + Call install_implicit_member. + gcc/testsuite/ + * g++.dg/modules/imp-member-1_[abcde].C: New. + +2019-12-17 Nathan Sidwell <nathan@acm.org> + + Out-of-class member function definitions + gcc/cp/ + * decl.c (begin_function_body): RAII. + * lex.c (cxx_dup_lang_specific): Clear IMPORT_P and PARTITION_P. + * module.cc (module_state::is_matching_decl): Add inner parm. + Propagate inline & externalness. + (module_state::write): Read all partition entities. + * parser.c (cp_parser_function_definition_after_decl): Set + defining module as appropriate. + gcc/testsuite/ + * g++.dg/modules/member-def-2_[abcd].C: New. + + Out-of-class member class definitions + gcc/cp/ + * cp-tree.h (DECL_MODULE_PENDING_MEMBERS_P): New. + (lang_decl_base): Add module_pending_members_p. + (lazy_load_members): Declare. + * module.cc (depset::entity_kind): Add EK_INNER_DECL. + (depset::disc_bits): Add DB_IS_MEMBER_BIT. + (depset::is_member): New. + (module_state::write_cluster): Take ref to module_state_config. + Adjust. + (module_state::{read,write}_specializations): Rename to ... + (module_stte::{read,write}_pendings): Generalize to pending + members. + (trees_in::decl_val): Deal with pending members. + (depset::hash::make_dependency): Adjust for EK_INNER_DECL. + (depset::hash::add_class_entities): Add them. + (struct module_state_config): Rename num_specializations -> + num_pendings. Adjust throughout. + (module_state::read_entities): Shift snum another bit. + (module_sttate::lazy_load): Likewise. + (lazy_load_members): New. + * name-lookup.c (maybe_lazily_declare): Load pending members. + gcc/testsuite/ + * g++.dg/modules/member-def-1_[abcd].C: New. + + gcc/cp/ + * cp-tree.h (set_defining_module): New. + * decl.c (xref_tag_1): Check can redeclare, set instantiating + module. + (start_enum): Likewise. + * module.c: Update doc preamble. + (module_may_redeclare): Get to the template. + (set_defining_module): New, broken out of ... + (set_instantiating_module): ... here. DO NOT CALL IT. + * rtti.c (init_rtti_processing): "type_info" has exportedness. + * semantics.c (begin_class_definition): Check can redeclare. Set + defining & instantiating. + gcc/testsuite/ + * g++.dg/modules/friend-5_[ab].C: New. + * g++.dg/modules/tdef-4_[bc].C: Add comments. + +2019-12-13 Nathan Sidwell <nathan@acm.org> + + Merge trunk r279384. + + gcc/cp/ + * module.cc: Rename specset to pendset. Document. + + Pending specializations keyed by ident + gcc/cp/ + * cp-tree.h (DECL_TEMPLATE_LAZY_SPECIALIZATIONS_P): Delete. + (MODULE_VECTOR_LAZY_SPEC_P): Delete. + (MODULE_VECTOR_PENDING_{SPECIALIZATIONS,IS_HEADER,IS_PARTITION}_P): New. + (DECL_MODULE_PENDINGSPECIALIZATIONS_P): New. + (lang_decl_base): Add module_specializations_p. + (lazy_specializations_p): Declare. + * name-lookup.h (note_pending_specializations): No return value. + (load_pending_specializations): Declare. + (note_loaded_specializations): Delete. + * module.cc (specset): Key is entity ident. Adjust throughout. + (trees_in::decl_value): Deal with pending specializations. + (specset::lazy_load): Deal with indirections. + (module_state::{read,write}_specializations): Reimplement. + (lazy_specializations_p): New. + (lazy_load_specializations): Reimplement. + * name-lookup.c (mark_pending_on_{decl,binding}): Delete. + (set_module_binding): Drop lazy specialization tagging here. + (note_pending_specializations): Reimplement. + (load_pending_specializations): New. + (note_loaded_specializations): Delete. + * pt.c (lookup_template_class_1): Reimplement lazy specialization + loading. + (instantiate_template_1): Likewise. + gcc/testsuite/ + * g++.dg/modules/inst-4_[ab].C: Adjust scans. + * g++.dg/modules/tpl-spec-[12345]_[abcd].C: Likewise. + + gcc/cp/ + * cp-tree.h (DECL_MODULE_ENTITY_P): New. + (lang_decl_bas): Add module_entity_p flag. + * module.cc (trees_in::decl_value): Insert according to + DECL_MODULE_ENTITY_P. + * lex.c (cxx_dup_lang_specific): Clear DECL_MODULE_ENTITY_P. + +2019-12-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (class specset): Make ns an mc_slot. + (specset::hash::add): Adjust. + (specset::hash::lookup): Rename to ... + (specset::hash::extract): ... here. Adjust. + (specset::lazy_load): New. + (module_state::read_entities): Adjust lazy setting. + (module_state::read_specializations): Adjust hash table adding. + (lazy_load_binding): Reorder dump stacking. + (lazy_load_specializations): Likewise, call specset::lazy_load. + + gcc/cp/ + * cp-tree.h (DECL_MODULE_PARTITION_P): Update doc. + * module.cc (trees_in::decl_value): Only set + DECL_MODULE_PARTITION_P when primary interface. + + gcc/cp/ + * decl.c (lookup_and_check_tag): Refactor. + + gcc/cp/ + * module.cc (import_entity_index): Use different fail value. + (dumper::impl::nested_name): Don't explode on bad import indices. + (module_state::write): Adjust. + gcc/testsuite/ + * g++.dg/modules/part-4_[abc].C: New. + +2019-12-06 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (maybe_strip_cmi_prefix): Simplify. + + gcc/cp/ + * module.cc (trees_out::key_mergeable): Remove unreachable code. + + gcc/cp/ + * module.cc (enum tree_tag): Delete tt_friend_template. + (trees_out::decl_node): Uninstantiated template friends are not + special. + (trees_in::tree_node): Delete tt_friend_template handling. + (trees_{in,out}::{read,write}_class_def): No need to stream + template friends specially. + (trees_out::mark_class_def): No need to mark class_def members. + (depset::hash::make_dependency): Do not confuse uninstantiated + template friends with scope members. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-2_a.C: Adjust scan. + + gcc/cp/ + * module.cc (trees_out::mark_class_def): No need to mark friend + specializations. + + gcc/cp/ + * decl.c (duplicate_decls): Just zap the template's module info. + * pt.c (build_template_decl): No need to copy false module info. + (tsubst_tenplate_decl): Just zap the template's module info. + + gcc/cp/ + * module.cc (trees_out::decl_{node,value}): Remove cluster biasing. + (depset::hash::make_dependency): Likewise. + (module_state::write_{cluster,{namespace{,s}}): Likewise. + (module_state::write_{entities,specializations}): Likewise. + (module_state::write): Likewise. + + (gcc/cp/ + * module.cc (trees_out::decl_value): No need to look for dep again. + + gcc/cp/ + * module.cc (trees_out::decl_node): Get entity index & origin from + the depset. + (depset::hash::make_dependency): Stash the importing index & + origin in the depset. + (module_state::write_namespace): Get index & origin from the depset. + + Structured bindings, c++2a libstdc++ is back working + gcc/cp/ + * module.cc (trees_{in,out}::lang_decl_{bools,vals}): Handle + lds_decomp. + gcc/testsuite/ + * g++.dg/modules/decomp-1_[ab].C: New. + + Merge trunk r279023. + libstdc++ c++2a is now using structured bindings, and those don't + work :( + +2019-12-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::add_namespace_context): New. + (trees_out::decl_node): Use it for namespace. + (depset::hash::make_dependency): Likewise for discovered GMF. + (depset::hash::add_binding): Use it. + (depset::tarjan::connect): Make sure we don't wander into imports. + (depset::hash::connect): Don't add imports to the graph. + (module_state::write_namespace{,s}): Never meet global namespace. + (module_state::write_entries): Handle namespace entries + separately. + (module_state::write): Reorganize cluster traversals. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Do not depend on + imports. + (depset::tarjen::connect): Assert more. + (depset::hash::connect): Add less. + (module_state::write): Fewer cases. + gcc/testsuite/ + * g++.dg/modules/vmort-2_b.C: Invert scan test. + + gcc/cp/ + * module.cc (depset::{make,add}_dependency): Drop is_import parm, + update all callers. + (will_be_import): Delete. + (trees_out::decl_node): Determine will be import locally. + (depset::make_dependency): Likewise. + + gcc/cp/ + * cp-tree.h (DECL_MODULE_PARTITION_P): New. + (lang_decl_base): Add module_partition_p. + * decl.c (duplicate_decls): Adjust. + * pt.c (build_template_decl, tsubst_template_decl): Adjust. + * module.cc (will_be_import): Assert consistency. + (trees_in::decl_value): Set module_partition_p. + (depset::hash::make_dependency): Assert consistency. + (set_instantiating_module): Clear it. + + One Beellion Modules! + gcc/cp/ + * cp-tree.h (lang_decl_base): Replace module_origin field with + module_import_p flag. + * modules.cc (MODULE_UNKNOWN{,_PARTITION}): Adjust. + (MODULE_LIMIT): Delete. + (module_state): Make mod & remap unsigneds. + (module_state::read): No need to check module overflow. + + gcc/cp/ + * module.cc (macro_import::slot) Adjust encoding to use fewer + bits. + (macro_import::append): Add defness parm. + (macro_import::exported): Always make definition. + (maybe_add_macro): Adjust. + (module_state::{write,install}_macros): Likewise. + (module_state::deferred_macro): Likewise. + + Module index no longer on the decl itself. + gcc/cp/ + * cp-tree.h (DECL_MODULE_ORIGIN): Delete. + (DECL_MODULE_IMPORT_P): New. + (get_importing_module): Declare. + * decl.c (duplicate_decls): Replace DECL_MODULE_ORIGIN with + DECL_MODULE_IMPORT_P. + * decl2.c (no_linkage_error): Likewise. + * module.cc + (will_be_import):Move later, use import_entity_{index,module}. + (import_entity_index): Add null_ok parm. + (dumper::impl::nested_name): Use import_entity_{index,module}. + (trees_in::decl_value): Set DECL_MODULE_IMPORT_P. + (trees_out::decl_node): Use will_be_import. + (depset::hash::make_dependency): Check import_p flag. + (depset::hash::add_specializations): Delete assert. + (module_state::{read,write}_namespaces): Check DECL_MODULE_IMPORT_P. + (module_state::write_specializations): Likewise. + (get_originating_module): Use get_importing_module. + (get_importing_module): New. + (module_may_redeclare): Lookup the module index. + (set_instantiating_module): Clear DECL_MODULE_IMPORT_P. + (finish_module_processing): Leep the entity_map. + * name-lookup.c (name_lookup::search_adl): Use + get_importing_module. + (add_imported_namespace): Set DECL_MODULE_IMPORT_P. + * pt.c (build_template_decl): Copy DECL_MODULE_IMPORT_P, not + ORIGIN. + (tsubst_template_decl): Likewise. + * ptree.c (cxx_print_decl): Use get_importing_module. + + gcc/cp/ + * name-lookup.h (add_imported_namespace): Origin is unsigned. + * name-lookup.c (add_imported_namespace): Origin is unsigned and + non-zero. Elide unreachable code. + + gcc/cp/ + * cp-tree.h (get_instantiating_module_decl): Delete. + (get_instantiating_module): Delete. + * module.cc (depset::hash::add_specialization): Remove assert. + (get_instantiating_module_decl): Delete. + (get_instantiating_module): Delete. + + gcc/cp/ + * module.cc (trees_in::{enum ,get_}{dup,ord}ness): Delete. + (trees_in::{odr,is}_duplicate): New. + (trees_in::read_{function,var,class,enum}_def): Adjust. + (module_state::read_cluster): Adjust. + + gcc/cp/ + * decl.c (duplicate_decls): Pass the old decl to + module_may_redeclare. + * module.cc (module_may_redeclare): Expect the decl, not its + owner. + + gcc/cp/ + * module.cc (trees_out::decl_node): Move is_import test into + non-streaming block. Check the decl, not the instantiator. + +2019-12-04 Nathan Sidwell <nathan@acm.org> + + Elrond is dead, long live Elrond! + + gcc/cp/ + * module.cc (trees_out::decl_node): Refactor, removing duplicate + code blocks. + + Delete unreachable code + gcc/cp/ + * module.cc (enum tree_tag): Delete tt_named, + tt_implicit_template. + (trees_out::decl_node): Remove #if'd out code. + (trees_in::tree_node): Remove tt_named, tt_implicit_template + handling. + (trees_out::key_mergeable): Remove unreachable anon-type case. + (trees_out::{write,mark}_class_def) Removed #if'd out code. + (trees_in::read_class_def): Likewise. + * name-lookup.c (get_binding_or_decl): Delete. + (lookup_by_type, lookup_ident, get_lookup_ident): Delete. + * name-lookup.h (lookup_by_type, lookup_ident, get_lookup_ident): + Don't declare. + + Class members by index. + gcc/cp/ + * decl.c (duplicate_decls): Repropagate module origin & purview. + * friend.c (add_friend): Potential code, so I don't forget it. + * module.cc (depset): Delete DB_MERGEABLE_BIT. + (find_enum_member): New. + (trees_out::decl_value): Separate different mergeable matching + cases. Add new ones. + (trees_out::decl_node): Stream class members by index. Adjust + identifier streaming. + (trees_in::decl_node): Deal with conv_op_identifier. Use + find_enum_member. + (trees_out::get_merge_kind): Add DECL parm, deal with via_ctx and + local_friends. + (trees_out::key_mergeable): Swap parms, deal with new kinds. + (trees_in::key_mergeable): Deal with new kinds. + (trees_{in,out}::{read,write}_class_def): Don't stream member + definitions. + (trees_out::mark_class_def): Don't mark members. + (depset::hash::make_dependency): Don't mark as mergeable. + (cluster_cmp): Compare by stripped UID. + (get_{instantiating,originating}_module_decl): Deal with fields, + usings and local friends. + * name-lookup.c (enum merge_match): New. + (check_mergeable_decl): Add match kind parm. + (match_mergeable_decl): Rename to ... + (mergeable_namespace_entity): ... here. Deal with namespace scope + entities. + (mergeable_class_member): New. + (make_namespace_finish): Adjust. + * name-lookup.h (match_mergeable_decl): Rename to ... + (mergeable_namespace_entity): ... here. + (mergeable_class_member): Declare. + gcc/testsuite/ + * g++.dg/modules/friend-1_a.C: Adjust scans. + * g++.dg/modules/indirect-[1234]_[bc].C: Likewise. + * g++.dg/modules/inst-3_a.C: Likewise. + * g++.dg/modules/tpl-friend-[12]_a.C: Likewise. + * g++.dg/modules/tpl-spec-[45]_a.C: Likewise. + * g++.dg/modules/vmort-2_a.C: Likewise. + * g++.dg/modules/internal-1.C: Add xfailed dg-bogus + * g++.dg/modules/thunk-1_a.C: Avoid implicit member problem. + +2019-12-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (dumper::impl::nested_name): Add 'template ' + disambiguator. + (trees_out::add_indirect_tpl_parms): Check if streaming before + dumping. + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_[bc].C: Adjust scans. + * g++.dg/modules/inst-3_b.C: Likewise. + * g++.dg/modules/late-ret-[23]_[ac].[HC]: Likewise. + * g++.dg/modules/tpl-friend-[12]_a.C: Likewise. + * g++.dg/modules/tpl-spec-[1245]_[abcd].C: Likewise. + +2019-11-27 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (will_be_import): New. + (depset::hash::make_dependency): Add is_import parm, rather than + calculate. Update all callers. + (depset::hash::add_dependency): Likewise. + + gcc/cp/ + * module.cc (trees_out::decl_node): Untangle namespace-scope + emission from class-scope. + (trees_in::tree_node): Fix tt_entity ident signedness. + (depset::hash::make_dependency): Check is_import before checking + GMF reachability. + + gcc/cp/ + * module.cc (trees_out::decl_node): Refactor function scope + & specialization emission. + + gcc/cp/ + * module.cc (trees_out::decl_node): Deal with function scope + before instantiations. + +2019-11-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::decl_node): Tag and add indirects for + uninstantiated template friend. + (trees_in::tree_node): Likewise. + + gcc/cp/ + * module.cc (trees_out::decl_node): Remove a scope. + + gcc/cp/ + * module.cc (depset): Delete EK_UNNAMED, EK_MAYBE_SPEC. + (trees_out::decl_node): Use EK_DECL for those. + (depset::hash::make_dependency): Likewise. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-[12]_a.C: Adjust scans. + * g++.dg/modules/tpl-spec-5_a.C: Likewise. + * g++.dg/modules/vmort-2_a.C: Likewise. + + gcc/cp/ + * module.cc (trees_out::decl_node): Assert more. + + gcc/cp/ + * module.cc (module_state::check_read): Simplify to print once per + import. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream _EXPR operands in + forward order. + (trees_out::decl_node): Move NULL DECL_CONTEXT handling to ... + (trees_out::tree_node): ... here. + +2019-11-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (struct unnamed_entity): Delete. + + gcc/cp/ + * name-lookup.h (get_imported_namespace): Don't delare. + * name-lookup.c (get_imported_namespace): Delete. + + Namespaces are in the entity_ary + gcc/cp/ + * module.cc (trees_out::decl_node): Namespace may be imported. + (depset::hash::make_dependency): Permit imported namespaces. + (module_state::{read,write}_namespace): New. + (module_state::{read,write}_namespaces): Adjust. + (module_state::{read,write]_bindings): Adjust. + (module_state::write): Don't count imported namespaces. + * name-lookup.c (add_imported_namespace): Mark namespace as + imported, if we made it. + gcc/testsuite/ + * g++.dg/modules/indirect-[1234]_[bc].C: Adjust scans. + * g++.dg/modules/namespace-2_a.C: Likewise. + + gcc/cp/ + * module.cc (tree_tag): Delete tt_namespace. + (trees_in::tree_node): Delete tt_namespace handling. + (module_state::{read,write}_namespaces): Adjust. + (module_state::write_entities): Delete TABLE parm. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Write namespaces as tt_entity. + (module_state::write_namespaces): Adjust. + (module_state::read_namespaces): Likewise, don't return a + namespace vector. + (module_state::{read,write}_bindings): Adjust. + (module_state::{read,write}_entities): Allow namespaces. + (module_state::{read,write}): Adjust. + gcc/testsuite/ + * g++.dg/modules/indirect-[1234]_c.C: Adjust scans. + + gcc/cp/ + * module.cc (module_state::write_namespaces): Delete TABLE arg, + look at the dep[0] + (module_state::read_namespaces): Add num_spaces parm. Use it to + count iterations. + (module_State::write_bindings): Drop TABLE arg, look at dep[0]. + (struct module_state_config): Add num_namespaces field, stream it. + (module_state::{read,write}): Don't count global namespace. adjust + namespace streaming calls. + + gcc/cp/ + * module.cc (trees_out::decl_node): Add namespace dependency here. + (depset::hash::add_dependency): And here. + (space_cmp): Delete. + (module_state::write): No need to sort namespaces anymore. + + gcc/cp/ + * module.cc (depset::hash::make_dependency): Add context + dependency when discovering a new GMF binding. + (depset::hash::add_binding): Likewise when discoving a non-empty binding. + (depset::hash::finalize_dependencies): Leave binding's namespace + dependency untouched. + (module_state::write_cluster): Assert binding's namespace in in + slot zero. Adjust binding scan. + +2019-11-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc (DOT_REPLACE, COLON_REPLACE): New. + (module2bmi): Use them. + gcc/testsuite/ + * g++.dg/modues/modules.exp (dg-module-cmi): Update default mapping. + +2019-11-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::EK_FOR_BINDING): New. + (depset::hash::make_dependency): Don't look at current. Adjust. + (depset::hash::add_dependency): Current is always live. + (depset::hash::add_binding): Don't set current. Directly depend + the binding. + (depset::hash::add_namespace_entities): Use make_dependency. + (depset::hash::add_specializations): Likewise. + + gcc/cp/ + * module.cc (depset::hash::find_entity): Rename to ... + (depset::hash::find_dependency): ... here. Update callers. + (depset::hash::add_dependency): Break apart to ... + (depset::hash::make_dependency): ... this, and ... + (depset::hash::add_dependency): ... this, adder. + (depset::hash::add_dependency): Do both. + + gcc/cp/ + * module.cc (depset::DB_PSEUDO_SPEC_BIT): Delete. + (depset::is_pseudo_spec): Delete. + (depset::add_dependency): Don't set it. + + gcc/cp/ + * module.cc (trees_out::decl_node): We should not meet imported + internal namespaces. + (module_state::{read,write}): Stream entities before namespaces. + * name-lookup.c (add_imported_namespace): Module number must not + be negative. + + gcc/cp/ + * module.cc (trees_in::lang_decl_bools): Don't set module_origin + here. + (trees_out::decl_value): Stream out entity index. Install into + entity_map. + (trees_in::decl_value): Stream in entity index. Install into + entity ary, and map (if new) + (module_state::write_cluster): Do not install into map here. + (module_state::read_cluster): ... or here. And not ary either. + gcc/testsuite/ + * g++.dg/modules/builtin-[13]_b.C: Adjust scans. + * g++.dg/modules/indirect-[123]_[bc].C: Likewise. + * g++.dg/modules/inst-[1234]_b.C: Likewise. + * g++.dg/modules/late-ret-[23]_c.C: Likewise. + * g++.dg/modules/part-3_[cd].C: Likewise. + * g++.dg/modules/tdef-6_b.C: Likewise. + + gcc/cp/ + * cp-tree.h (DECL_MODULE_IMPORT_P): #ifdef out, not yet ready + * module.cc (dumper::impl::nested_name): Don't use it. + (module_state::read_cluster): Likewise. + + gcc/cp/ + * module.cc (trees_out::decl_value): Ensure we stay in the + section. + (trees_out::mark_class_def): Do not mark non-friends on + CLASSTYPE_DECL_LIST. + +2019-11-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (lookup_enum_member): Delete. + (get_binding_or_decl): Add missing return. + + gcc/cp/ + * name-lookup.c (get_binding_or_decl): Only class contexts. + * module.cc (trees_out::decl_node): Possible fixme. + + gcc/cp/ + * module.cc (depset::hash): Add sections member. + (module_state::write_cluster): Use it. + (module_state::write): Set it. + + gcc/cp/ + * module.cc (trees_out::decl_node): Don't strip_template checking + instantiation consistency. + (depset::hash::add_{dependency,specializations}): Likewise. + (get_originating_module_decl): Cope with template friends. Get to + the template_decl. + (get_instantiating_module_decl): Cope with template friends. Keep + the template_decl. + gcc/testsuite/ + * g++.dg/modules/pl-spec-[1245]_[abcd].C: Adjust scans. + + gcc/cp/ + * name-lookup.c (check_local_shadow): Bail out for clones. + + gcc/cp/ + * module.cc (dumper::impl:nested_name): Obnly show module on imports. + gcc/testsuite/ + * g++dg/modules: Anjust many scans. + +2019-11-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (tree_tag): Rename tt_enum_int, add tt_enum_decl. + (trees_out::tree_decl): Write enum consts as tt_enum_decl, not + tt_data_member. + (trees_in::tree_node): Add tt_enum_decl handling, adjust + tt_data_member handling. + + gcc/cp/ + * module.cc (module_state::lazy_load): Add diags arg, make index + unsigned. + (lazy_load_specializations): Use lazy_load. + + gcc/cp/ + * module.cc (module_state:write_cluster): Minor cleanups + gcc/testsuite/ + * g++.dg/modules/indirect-2_b.C: Adjust scans. + * g++.dg/modules/inst-3_a.C: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + + gcc/cp/ + * module.cc (depset:entity_kind): Reorder. + (depset::DB_REFS_UNNAMED_BIT): Delete. Remove accessor & setter. + (cluster_cmp): Order by entity_kind. + (module_state::write_cluster): A single write pass is sufficient. + gcc/testsuite/ + * g++.dg/modules/indirect-3_b.C: Adjust cluster order scan. + * g++.dg/modules/late-ret-[23]_a.H: Likewise. + + gcc/cp/ + * (class depset): Drop entity_num field. Adjust all users to use + cluster. + (module_state::write_cluster): Merge counting and marking loops. + + Expelliarmus! + gcc/cp/ + * module.cc (module_state): Delete unnamed_{lwm,num}. + (enum ct_decl_flags): Delete cdf_is_voldemort. + (module_state::write_cluster): Don't set cluster number. Drop + voldemort handling. + (module_state::read_cluster): Drop voldemort handling. + (module_state::write_specializations): Drop cluster consistency + check. + gcc/testsuite/ + * g++.dg/modules/indirect-2_b.C: Adjust scans. + * g++.dg/modules/inst-[23]_a.C: Likewise. + + Remove more unnamed remnants. + gcc/cp/ + * module.cc (module_state::write_cluster): Count specializations. + (module_state::{read,write}_unnamed): Rename to ... + (module_state::{read,write}_specializations): ... here. Drop + section numbers. Adjust calls. + (struct module_state_config): Rename num_unnamed to + num_specializations, adjust all uses. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-[12345]_[ab].C: Adjust scans. + + Remove unnamed ary etc. + gcc/cp/ + * module.cc (unnamed_ary, unnamed_map_t, unnamed_map): Delete. + (module_state::read_cluster): Do not insert into unnamed_ary or + map. + (module_state::read_unnamed): Do not extend unnamed_ary. + (module_state::read): Do not set unnamed_lwm. + (module_for_unnamed): Delete. + ({init,finish}_module_processing): Do not create/destroy unnamed + ary & map. + gcc/testsuite/ + * g++.dg/modules/indirect-[23]_c.C: Adjust scans. + * g++.dg/modules/inst-[124]_b.C: Likewise. + * g++.dg/modules/late-ret-2_c.C: Likewise. + + gcc/cp/ + * module.cc (module_state::{read,write}_unnamed): Specializations + store entity index. + (lazy_load_specializations): Use the entity index. + + No more horcruxes. + gcc/cp/ + * module.cc (trees_out::decl_node): Specializations are tt_entity. + (enum cluster_tag): Delete ct_horcrux. + (module_state::write_cluster): No need to create horcruxes. + (module_state::read_cluster): No need to resurrect horcruxes. + gcc/testsuite/ + * g++.dg/modules/indirect-[24]_b.C: Adjust scans. + * g++.dg/modules/inst-[123]_[ab].C: Likewise. + * g++.dg/modules/late-ret-2_c.C: Likewise. + * g++.dg/modules/tpl-friend-5_b.C: Likewise. + +2019-11-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::decl_node): Process unnamed decls directly + here. + (depset::hash::add_dependency): EK_UNNAMED doesn't reference + unnamed (really). + (module_state::write_cluster): Do not preseed horcruxes for + EK_UNNAMED. Add unnamed and specializations into the entity_map. + gcc/testsuite/ + * g++.dg/modules/vmort-2_[abc].C: Adjust scans + + gcc/cp/ + * module.cc (enum tree_tag): Kill tt_anon. No longer emitted. + (import_entity_index): Do not assert imported. + (trees_out::decl_node): Always get the import_entity_index for + tt_entity. + (trees_in::tree_node): Drop tt_anon. + (module_state::write_cluster): Add the EK_DECLs to the entity_map. + + gcc/cp/ + * cp-tree.h (lazy_load_binding): Drop final parm. + * module.cc (module_state::lazy_load): Drop ns, id & outermost + parms. + (trees_in::tree_node, module_state::read_cluster): Adjust + lazy_load calls. + (module_state::read): Inhibit GC here. + (lazy_load_binding): Deal with binding dumps here. + (lazy_load_specializations): Use lazy_load_binding. + * name-lookup.c: Adjust lazy_load_binding calls. + (get_binding_or_decl): No namespace handling here. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-5_b.C: Adjust scans + * g++.dg/modules/vmort-2_c.C: Likewise. + + Entities are numbered (part 1) + gcc/cp/ + * cp-tree.h (DECL_MODULE_IMPORT_P): New. + * module.cc (depset::entity_kind): Add EK_ENTITIES. + (depset::entity_num): New (temporary) field. + (enum tree_tag): Add tt_entity. + (module_state): Add entity_lwm & entity_num fields. + (module_state::lazy_load): Add index, use it. + (module_state::{read,write}_entities): New. + (module_state::{read,write}_cluster): Number the entities. + (entity_map_t, entity_map, entity_ary) New. + (import_entity_index, import_entity_module): New. + (trees_out::decl_node): Write tt_entity for namespace decls. + (trees_in::tree_node): Add tt_entity handling. + (struct module_state_config): Add num_entities field. + (module_state::{read,write}_config): Stream it. + (module_state::{read,write}: Adjust. + ({init,fini}_module_processing): Deal with entity map and ary. + * name-lookup.c (get_binding_or_decl): Mark NAMESPACE unreachable. + gcc/testsuite/ + * g++.dg/modules/{builtin,indirect}-1_b.C: Adjust scans. + * g++.dg/modules/indirect-[1234]_c.C: Likewise. + * g++.dg/modules/tpl-friend-5_b.C: Likewise. + * g++.dg/modules/unnamed-1_b.C: Likewise. + +2019-11-14 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (check_mergeable_specialization): Take spec_entry arg. + * module.cc (trees_out::decl_node): Allow CONCEPT_DECL. + (trees_out::key_mergeable): Use check_mergeable_specialization). + (specialization_add): Adjust check_mergeable_specialization call. + * pt.c (register_specialization): Remove casts. + (check_mergeable_specialization): Take spec_entry arg. + (match_mergeable_specialization): Add the specialization early. + gcc/testsuite/ + * g++.dg/modules/concept-4.H: New. + + gcc/cp/ + * cp-tree.h (lang_decl_base): Note 8-bits. + * error.c (dump_module_suffix): Bail on no DECL_CONTEXT. + * module.cc (trees_{in,out}::lang_decl_bools): Update for new + fields. + (has_definition): Deal with CONCEPT_DECL. + (trees_out::{mark,write}_definition): Concepts are like vars. + (trees_in::read_definition): Likewise. + ({get,set}_originating_module{,_decl}): Deal with CONCEPT_DECL. + * pt.c (finish_concept_definition): Set orginating module. + gcc/testsuite/ + * g++.dg/modules/concept-3_[ab].C: New. + + Merge trunk r278228. + +2019-11-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * rtti.c ({push,pop}_abi_namespace): Save and restore module + state. + (build_dynamic_cast_1, tinfo_base_init): Adjust. + + gcc/cp/ + * module.cc (depset::hash::find_dependencies): Reach unreached + specializations. + +2019-10-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::read_cluster): Hack around cfun. + +2019-10-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out): Clean up dead code, update instrumentation. + (class_members): New global. + (depset::hash::add_writables): Rename to ... + (depset::hash::add_namespace_entities): ... this. + (depset::hash::add_class_entities): New, incomplete. + (module_state::write): Add class entities. + (set_instantiating_module): Record on the class_member list if + necessary. + + gcc/cp/ + * module.cc (trees_out::core_vals): Audit VAR_DECL, removing fixme. + +2019-10-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream more block fields. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream template info's + typedefs needing access checks. + + gcc/cp/ + * module.cc (depset): Correct documentation. + (walk_kind_name): Delete unused. + (trees_out::get_container): Lookup for redirect. + + gcc/cp/ + * module.cc (node_template_info): Type cannot be NULL. + + gcc/cp/ + * module.cc (trees_out::{fn_parms_ini,tpl_header}): Privatize, + resolving fixme. + (trees_out::core_vals): Resolve TEMPLATE_DECL & + TEMPLATE_PARM_INDEX fixmes. + (trees_out::tpl_parm_value): Resolve template template parm fixme. + + Merge trunk r277514. + +2019-10-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::type_node): Move typedef printing after + variant printing. + (trees_in::tree_node): Simplity tt_typedef_type. + + gcc/cp/ + * module.cc (trees_out::core_vals): Check if template parm has a + canonical type before processing it. + (trees_in::tpl_parm_value): Likewise. + + gcc/cp/ + * module.cc (enum tree_tag): Delete tt_typename_decl. + (trees_out::decl_node): Do not handle TYPENAME_TYPE here ... + (trees_out::type_node): ... handle them here instead. + (trees_in::tree_node): Delete tt_typename_decl, handle + TYPENAME_TYPE as a derived_type. + + gcc/cp/ + * module.cc (trees_out::decl_node): Fixup anonymous case. + + Remove mergeable sorting code. + gcc/cp/ + * module.cc (depset::hash): Delete for_mergeable, + is_for_mergeable. + (depset::hash::add_mergeable{,_horcrux}): Delete. + (trees_out::get_merge_kind): Remove for_mergeable indirection. + (trees_out::key_mergeable): Likewise. + (depset::hash::add_dependency): Remove mergeable handling. + (depset::hash::find_dependencies): Likewise. Remove #if'd out code. + (sort_mergeables): Delete. + (module_state::write_cluster): Remove #if'd out code. + +2019-10-24 Nathan Sidwell <nathan@acm.org> + + Turn off mergeable ordering. + gcc/cp/ + * module.cc (depset::hash::find_dependencies): No need to add + specialization keys here. + (module_state::erite_cluster): Or sort mergeables here. + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_b.C: Adjust scans. + * g++.dg/modules/inst-[23]_a.C: Likewise. + * g++.dg/modules/late-ret-[23_a.H: Likewise. + * g++.dg/modules/tpl-friend-1_a.C: Likewise. + + Types always keyed by TYPE_NAME. Use TYPE_NAME not TYPE_STUB_DECL. + gcc/cp/ + * module.cc (enum merge_kind): Drop MK_linkage. + (trees_out::core_vals): Fix DECL_TEMPLATE_PARM_P thinko. + TYPE_DECLS for linkage are not regular typedefs. + (trees_{in,out}::add_indirects): Always add a TYPE_DECL's type. + (trees_{in,out}::decl_value): Write the stub_decl if it's + different. + (trees_out::{type,decl}_node): Cleanup some type_decl handling. + (trees_out::get_merge_kind): Drop MK_linkage. + (trees_{in,out}::key_mergeable): Likewise. + (trees_out::{has,write,mark}_definition): Adjust. + (trees_in::read_definition): Likewise. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust scans. + * g++.dg/modules/tdef-6_b..C: Adjust scans. + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parm_value): No need to stream + bound ttp's TI here. + (trees_out::get_merge_kind): Refactor anon type determination. + + Merge trunk r277416. + +2019-10-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum ct_decl_flags): Add cdf_is_defn. + (module_state::{read,write}_cluster): Don't stream definitions + separately. + + gcc/cp/ + * module.cc (get_clone_target): Assert more. + (trees_in::back_ref): Check the tree's not insane. + (trees_in::tree_node): Check the clone target is ok. + (module_state::lazy_load): Inhibit GC. + + gcc/ + * dumpfile.c (dump_begin): Move decls for RAII. + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parm_value): Don't stream tpi + here. + (trees_{in,out}::tree_value): Strip now-unreachable code. + + gcc/cp/ + * module.cc (enum tree_tag): Add tt_tpl_parm. + (trees_{in,out}::tpl_parm_value): New. + (trees_out::add_indirect_tpl_parms): Simpilfy. + (trees_out::tree_value): No template parms here. + (trees_{in,out}::tree_node): Deal with call tpl_parm_value. + + gcc/cp/ + * pt.c (reduce_template_parm_level): Attach TPI to the type or + decl. + (convert_generic_types_to_packs): Pass new type to + reduce_template_parm_level. + +2019-10-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms{,_fini}): Drop outer parms, + add tpl_levels. + (trees_{in,out}::tpl_header): Likewise. + (trees_{in,out}::add_indirect_tpl_parms): New. + (trees_{in,out}::add_indirects): Call them. + (trees_{in,out}:decl_value): Adjust tpl_header streaming. + (trees_{in,out}:tree_value): Adjust tpl_header streaming. + (depset::hadh::find_dependencies): Likewise. + (module_name): Don't look for current TU's parent. + +2019-10-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::back_ref): New, broken out of ... + (trees_in::tree_node): ... here. Call it multiple times. + + gcc/cp/ + * module.cc (trees_{in,out}::add_indirects): New, broken out of ... + (trees_out::decl_node, trees_in::tree_node): ... here. Call them. + (module_state::{read,write}_cluster): Call them instead of + duplicate code. + gcc/testsuite/ + * g++.dg/modules/by-name-1.C: Adjust scans. + * g++.dg/modules/class-3_[bd].C: Likewise. + * g++.dg/modules/vmort-2_c.C: Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::key_mergeable): Do not stream tpl + header of fn parms here. + (tree_{in,out}::decl_value): Stream them here ... + (depset:hash::find_dependencies): ... and here. + +2019-10-18 Nathan Sidwell <nathan@acm.org> + + Merge trunk r277167. + + gcc/cp/ + * module.cc (trees_out::decl_value): Excise template_parm + handling. + (trees_{in,out}::tree_value): Excise non-template-parm + tmpl/type/fn/var handling here. + + gcc/cp/ + * module.cc (dumper::impl::nested_name): Check template_parm_p + directly. + (trees_out::core_vals): Check DECL_TEMPLATE_PARM_P. + (trees_out::decl_value): Never get a DECL_TEMPLATE_PARM_P. + (trees_in::decl_value): Likewise. + (trees_out::decl_node): Send DECL_TEMPLATE_PARM_P to tree_value. + (trees_out::type_node): Simplify name detection. + (trees_out::tree_value): Allow DECL_TEMPLATE_PARM_P, but no other + tmpls/type/var/fns. + * tree.c (bind_template_template_parm): Set DECL_TEMPLATE_PARM_P.1 + + gcc/cp/ + * module.cc (dumper::impl::nested_name): Detect template parms. + (trees_{in,out}::core_vals): Don't write context of template + parms. Don't clobber template's type. + + gcc/cp/ + * module.cc (trees_{in,out}::start): Stream code if permitted. + Adjust callers. + +2019-10-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tpl_parms): Assert a lot. + (depset::hash::find_dependencies, module_state::write_cluster): + Mark mergeable sort-specific points. + + gcc/cp/ + * module.cc (trees_out::decl_value): Stream thunks too. + (trees_out::decl_node): Forward all potentially mergeable decls to + decl_value. + (trees_out::tree_value): Make sure we don't get any potentially + mergeable decls. + (trees_{in,out}::tree_value): Stream template parms + via tpl_parms. + (trees_{in,out}::tpl_parms): The vector can be 0 length. + (trees_out::mark_declaration): Don't mark the template parms. + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms): Cope with non-shared + parms. + (trees_{in,out}::tpl_parms_fini): Likewise, stream vec type. + + gcc/cp/ + * cp-objcp-common.c (cp_pushdecl): Set DECL_CONTEXT. + gcc/testsuite/ + * g++.dg/modules/builtin-3_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::decl_value): Refactor some ifs. + +2019-10-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl.c (cp_make_fname_decl): Set context to global namespace, + outside functions. + (builtin_function_1): Merge into ... + (cxx_builtin_function): ... here. Nadger the decl before maybe + copying it. Set the context. + (cxx_builtin_function_ext_scope): Push to top level, then call + cxx_builtin_function. + + gcc/cp/ + * rtti.c (get_tinfo_desc): Set DECL_CONTEXT. + gcc/testsuite/ + * g++.dg/modules/tinfo-1.C: New. + + gcc/cp/ + * module.cc (enum tree_tag): Add tt_parm. + (trees_out::decl_node): Emit tt_parm for parms. + (trees_in::tree_node): Add tt_parm. + (trees_out::write_function_def): Simply tag constexpr parms & + result. + (trees_in::read_function_def): Clone the originating fn's parms & + result. + (module_state::read): Add GC points, when lazy. + +2019-10-15 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::core_vals): Don't assert template + arguments visited. + (trees_{in,out}::tpl_parms): Stream TMPL_DEPTH. + (trees_{in,out}::tpl_parms_fini): New. + (trees_{in,out}::decl_value): Don't stream template parms, use + tpl_parms_fini. + + gcc/cp/ + * module.cc (trees_out::get_container): New, broken out of ... + (trees_out::key_mergeable): ... here. Add container parm. + (trees_in::key_mergeable): Container is already set. + (trees_{in,out}::decl_value): Stream container here. + (dpset::hash::find_dependencies): Adjust mergeable walk. + gcc/testsuite/ + * g++.dg/modules/builtin-1_a.C: Adjust scan. + + Merge trunk r277002. + + Revert TYPE_LAMBDA_P, it's unnecessary churn. + gcc/cp/ + * cp-tree.h (LAMBDA_TYPE_P): Subsume TYPE_LAMBDA_P. + (TYPE_LAMBDA_P): Delete. Update all uses. + + gcc/cp/ + * module.cc (merge_kind): Add MK_local_friend. + (trees_{in,out}::tpl_parms): New. + (trees_{in,out}::tpl_header): Adjust parm streaming + (trees_{in,out}::key_mergeable): Find containing template. + +2019-10-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r276888. + Pull in c++20 concepts. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Don't stream function + parms here. + (trees_out::decl_value): Stream has_defn. + (trees_in::decl_value): Stream has_defn, adjust fn_parms_fini. + (trees_in::tree_value): Likewise. + (trees_{in,out}::fn_parms_init): Stream entire parms. + (trees::fn_parms_fini): Do nothing. + (trees_in::fn_parms_fini): Add has_defn, adjust. + + gcc/cp/ + * module.cc (enum walk_kind): Remove WK_merge. + (enum trees_out::tags): Remove tag_merging. + (trees_out::mark_merged): Delete. + (trees_out::{insert,ref_node}): Adjust. + (trees_out::decl_value): Insert by value immediately. + + gcc/cp/ + * optimize.c (maybe_clone_body): Allow aliasing with modules. + + gcc/cp/ + * module.cc (enum depset::entity_kind): Remove EK_CLONE. + (depset::add_clone): Delete. + (enum merge_kind): Remove MK_clone. + (depset::entity_kind_name): Adjust. + (trees_in::decl_value): No merging for clones. + (trees_out::decl_node): Remove clone dependency. + (trees_out::get_merge_kind): No clone merging. + (trees_{in,out}::key_mergeable): Likewise. + (module_state::write_cluster): Never see a clone. + + Reconstruct clones on stream in + gcc/cp/ + * module.cc (trees_out::{decl,tree}_value): Write clone info. + (trees_in::{decl,tree}_value): Reconstruct clone. + (trees_out::decl_node): Do not depend on clones. + (module_state::read_cluster): Clone bodies. + +2019-10-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (DECL_NEEDS_VTT_PARM_P): Delete. + (build_clones): Declare. + (ctor_omit_inherited_parms): Add exact_name default parm. + * class.c (build_clone): Add need_vtt & omit_inherited parms, do + not calculate here. + (build_clones): New function. Add need_vtt & + omit_inherited_parms. Broken out of ... + (clone_function_decl): Call build_clones. Add to method vec here. + * method.c (ctor_omit_inherited_parms): Add exact_name parm. + Detect any ctor or specific base ctor as specified. + +2019-10-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * class.c (maybe_add_class_template_decl_list): Don't check + template-id-expr friends. + * module.cc (friend_from_decl_list): Don't stray into primary + templates. + (trees_out::{write,mark}_class_def): Adjust local friend + detection. + (trees_in::read_class_def): Likewise. + + gcc/cp/ + * cp-tree.h (DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P): New. + * module.cc (trees_{in,out}::core_vals): Stream local template + friend's DECL_CHAIN. + (trees_out::decl_node): Use DECL_UNINSTANITATED_TEMPLATE_FRIEND_P. + (trees_out::{read,write,mark}_class_def): Adjust local template + friend streaming. + * pt.c (push_template_decl_real): Set + DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P. + (tsubst_friend_function): Clear D_U_T_F_P. + + gcc/cp/ + * pt.c (push_template_decl_real): Always set DECL_CHAIN for + non-pushed friends. + +2019-10-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::decl_value): Check streaming before dump. + (module_name): Protect from not modules. + + gcc/cp/ + * module.cc (enum merge_kind): Rename non->unique. + (trees_out::key_mergeable): Add decl parm. Return MK_unique for + non-dep decls. + (trees_{out,out}::decl_value): Adjust. + + gcc/cp/ + * module.cc (struct nodel_decl_hash): New. + (duplicate_hash_map): New. + (trees_in::duplicates): New. + (trees_in::mergeables): Delete. + (trees_in::{,~}trees_in): Adjust. + (trees_in::{find,register,unmatched}_duplicate): New. + (trees_in::{reserve,register,unmcted}_mergeable): Delete. + (enum trees_in::dupness): Delete DUP_unique. + (trees_in::decl_value): Adjust duplicate registration. + (trees_in::get_dupness): Adjust. + (module_state::{read,write}_cluster): Don't stream mergeable count. + + gcc/cp/ + * module.cc (enum walk_kind): Rename body->value, + mergeable->merge. Delete clone, merging. + (trees_in::decl_value): Drop walk_kind parm, read merge kind + early. + (trees_in::key_mergeable): Add merge_kind parm, return bool. + (trees_out::mark_node): Rename to ... + (trees_out::mark_by_value): ... here. + (trees_out::get_merge_kind): New, broken out of ... + (trees_out::key_mergeable): ... here. Add merge_kind parm. + (trees_out::decl_value): Replace walk_kind parm with depset. + Adjust. + gcc/testsuite/ + * g++.dg/modules/scc-1.C: Adjust scan. + * g++.dg/modules/builtin-1_a.C: Adjust scan. + +2019-10-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum trees_out::tags): Delete tag_mergeable, + tag_cloned. + (trees_out::mark_mergeable): Delete. + (trees_out::{insert,ref_node}): Adjust. + (trees_out::decl_node): Look at depset to determine mergeability. + (trees_out::key_mergeable): Adjust. + (trees_in::register_mergeable): Always reserve space. + (module_state::write_cluster): Don't mark mergeable here. + + gcc/cp/ + * module.cc (trees_in::get_odrness): Check if overrun. + (trees_in::read_class_def): Add overrun protection. + * name-lookup.c (name_search::search_adl): Tweak. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream + decl_non_common.result for using decls. + (trees_out::decl_node): USING_DECLS are done by value. + * name-lookup.c (finish_nonmember_using_decl): Set DECL_CONTEXT. + gcc/testsuite/ + * g++.dg/modules/using-6_[ab].C: New. + + gcc/cp/ + * module.cc (enum tree_tag): Add tt_decl. + (trees_{in,out}::decl_value): Broken out of ... + (trees_{in,out}::tree_value): ... here. Deal with non mergeble + cases only. + (trees_in::tree_node): Add tt_decl. + (trees_out::decl_node): Call decl_value. + + gcc/cp/ + * module.cc (trees_out::decl_node): Refactor some instantiation + discovery. + +2019-10-04 Nathan Sidwell <nathan@acm.org> + + Merge trunk r276597. + + gcc/cp/ + * module.c (trees_out:decl_node): More switchification and code + movement. + + gcc/cp/ + * module.c (trees_out:decl_node): Switchify, and move some checks + before template detection. + + gcc/cp/ + * module.cc (trees_in::tree_value): Rework merge_kind switching. + (trees_{in,out}::key_mergeable): Likewise. + + gcc/cp/ + * module.cc (enum merge_kind): Reorder. + +2019-10-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::decl_node): Merge and reorder tinfo + streaming. + (trees_in::tree_node): Merge tinfo streaming. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Separate EK_REDIRECT + handling from EK_MAYBE_SPEC. + (get_instantiating_module_decl): Reorder checks, remove fixme. + + gcc/cp/ + * module.cc (trees_out::decl_node): Check DECL_LANG_SPECIFIC. + (depset::hash::add_dependency): Likewise. + (get_originating_module_decl): Return global_namespace for null. + (get_originating_module): Correctly handle lack of + DECL_LANG_SPECIFIC. + (set_instantiating_module): Lazily allocate lang specific. + (set_originating_module): Call set_instantiating_module. + * pt.c (build_template_decl, tsubst_template_decl): Check + DECL_LANG_SPECIFIC. + * rtti.c (tinfo_base_init): Likewise. + + gcc/cp/ + * module.cc (elf_in::{defrost,begin}): Advise random seeking. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Drop is_import arg, + update callers. Calculate it here. + + gcc/cp/ + * cp-tree.h (MODULE_SLOT_*): Move to ... + * name-lookup.c (MODULE_SLOT_*): ... here. + * module.cc (depset::hash::add_dependency): More asserts. + * pt.c (build_template_decl, tsubst_template_decl): Always + propagate from result. + +2019-10-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_ctx): Delete, forward all callers to + tree_node. + (trees_out::tree_namespace): Delete, move into tree_decl. + (trees_out::tree_decl): Rename to ... + (trees_out::decl_node): ... this. Update caller. + + gcc/cp/ + * module.cc (trees_out::tree_type): Rename to ... + (trees_out::type_node): Drop walk_kind arg, return void. Update + callers. + + gcc/cp/ + * module.cc (trees_out::tree_ctx): Drop need_contents parm. + Update callers. + (trees_out::tree_{type,decl}: Likewise. + + gcc/cp/ + * module.cc (trees_out::tree_ctx): Drop inner_decl parm. Update + callers. + (trees_out::tree_namespace): Likewise. + + gcc/cp/ + * cp-tree.h (MK_*): Document better. + + gcc/cp/ + * cp-tree.h (MODULE_CURRENT, MODULE_IMPORT_BASE): Delete. + * module.cc: Replace with zero/one + * name-lookup.c: Likewise. + * decl2.c (no_linkage_error): Likewise. + * ptree.c (cxx_print_decl): Likewise. + + Don't equivocate GMF with module + gcc/cp/ + * cp-tree.h (MODULE_NONE, MODULE_PURVIEW): Delete. + (MODULE_CURRENT): New. + (MODULE_IMPORT_BASE): Reduce. + (DECL_MODULE_OWNER): Rename to ... + (DECL_MODULE_ORIGIN): ... this. + (DECL_MODULE_PURVIEW_P): New. + (MODULE_BITS): Reduce. + (lang_decl_base::module_purview_p): New bit. + (module_may_redeclare): Take decl. + * module.cc (MODULE_UNKNOWN_PARTITION): New. + (MODULE_LIMIT): Adjust. + (slurping::remap_module): Return int. + (trees_in::assert_definition): Adjust. + (dumper::impl::nested_name): Adjust. + (trees_{in,out}::lang_decl_bits): Stream module_purview_p. + (trees_out::tree_{namespace,decl,value}): Adjust. + (trees_in::tree_node): Adjust. + (depset::hash::add_{dependency,binding,specializations}): Adjust. + (module_state::check_not_purview): Adjust. + (module_state::read_{imports,partitions}): Adjust. + (module_state::write_{cluster,namespaces,unnamed}): Adjust. + (module_state::read_unnamed): Adjust. + (module_state::{write,read}): Adjust. + (module_visible_instantiation_path): Adjust. + (get_originating_module): Return int. + (get_instantiating_module): Adjust. + (module_may_redeclare): Reimplement. + (set_{instantating,originating}_module): Adjust. + (module_state::{do,direct}_import): Adjust. + (declare_module, module_preprocess, process_deferred_imports): Adjust. + ({init,finish}_module_processing): Adjust. + * name-lookup.c (get_fixed_binding_slot): Adjust. + (name_lookup::{search_namespace_only,adl_namespace_fns,search_adl): + Adjust. + (check_module_override, extract_module_binding): Adjust. + (note_pending_specializations): Adjust. + (get_imported_namespaxe, finish_nonmember_using_decl) + (lookup_type_scope_1): Adjust. + (add_imported_namespace): Take int. + * name-lookup.h ({add,get}_imported_namespace): Module is int. + * class.c (build_self_ref): Set instantiating module. + * decl.c (duplicate_decls): Adjust. + * decl2.c (no_linkage_error): Adjust. + * mangle.c (maybe_write_module): Adjust. + * pt.c (build_template_decl): Propagate purview flag. + (tsubst_template_decl): Likewise. + (tsubst_decl): Set instantiating_module as necessary. + * ptree.c (cxx_print_decl): Adjust, print purview flag. + * rtti.c (tinfo_base_init): Clear purview flag. + gcc/testsuite/ + * g++.dg/modules/*: Update lang dump scans. + +2019-10-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (set_originating_module): Add friend_p. + * decl.c (grokdeclarator): Set it. + * module.cc (get_originating_module): Always look through template + info. + (set_originating_module): Add friend_p. Assert. + (set_instantiating_module): Assert. + +2019-09-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (set_module_owner): Delete. + * decl.c (duplicate_decls): Propagate module owner. Set module + export for builtins, no need to set owner. + * module.cc (set_module_owner): Delete. + gcc/testsuite/ + * g++.dg/modules/isalnum.H: New. + +2019-09-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r276201. + + gcc/cp/ + * decl.c (fixup_anonymous_aggr): Partially revert recent change. + (grokfndecl): Call set_originating_module before determining + specialization. + (grokdeclarator): Likewise. + + gcc/cp/ + * cp-tree.h (set_{originating,instantiating}_module): Declare. + * class.c (layout_class_type): Use set_instantiating_module. + * pt.c (lookup_template_class_1): Likewise. + (tsubst_function_decl, instantiate_template_1): Likewise. + (tsubst_friend): Not here. + * decl.c (grokfndecl): Use set_originating_module. + (grokvardecl,grokdeclarator): Likewise. + * name-lookup.c (do_pushtag): Likewise. + * friend.c (do_friend): Not here. + * module.cc (set_implicit_module_origin): Rename to ... + (set_instantiating_module): ... here. + (set_originating_module): New. + gcc/testsuite/ + * g++.dg/modules/friend-3.C: New. + * g++.dg/modules/friend-4_[ab].C: New. + + gcc/cp/ + * cp-tree.h (get_module_owner): Delete. + (get_instantiating_module_decl, get_instantiating_module): Declare. + * module.cc (get_instantiating_module_decl) + (get_instantiating_module): New. + (dumper::impl::nested_name, trees_out::tree_node) + (trees_out::tree_decl, depset::hash::add_specializations) + (set_module_owner): Use them. + (get_module_owner): Delete. + + gcc/cp/ + * cp-tree.h (get_declared_module_origin): Delete. + (get_originating_module, get_originating_module_decl): Declare. + * module.cc (get_originating_module_decl): New. + (get_originating_module): New. + (module_state::write_cluster, module_visible_instantiation_path): Use + get_originating_module. + * module.cc (module_state::write_unnamed) + (lazy_load_specializations): Use get_originating_module_decl. + * error.c (dump_module_suffix): Use get_originating_module. + * mangle.c (maybe_write_module): Likewise. + * name-lookup.c (init_global_partition): Use + get_originating_module. + (name_lookup::search_adl): Use get_originating_module_decl. + * pt.c (lookup_template_class_1): Propagate DECL_MODULE_EXPORT_P. + +2019-09-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (DECL_MODULE_OWNER): Restrict to + var/fn/type/template/namespace. + (MAYBE_DECL_MODULE_EXPORT_P): Delete. + ({set,get}_{declared,implicit}_module_origin): Declare. + (module_name): Delete and adjust. + * modules.cc: Adjust throughout for loss of + MAYBE_DECL_MODULE_EXPORT_P. Use get_module_owner more. + (fixup_unscoped_enum_owner): Delete. + * class.c (layout_class_type): Use set_implicit_module_origin. + * decl.c (duplicate_decls): Use get_module_owner. + (finish_enum_value_list): Set DECL_MODULE_EXPORT_P directly. + * decl2.c (no_linkage_error): Use DECL_MODULE_OWNER. + * error.c (dump_module_suffix): Reimplement. + * mangle.c (maybe_write_module): Adjust. + * name-lookup.c (init_global_partition): Adjust. + (name_lookup::search_adl): Owner always has module. + (do_pushdecl): Adjust namespace exporting. + (do_nonmember_using_decl): Adjust exporting check. + * pt.c (build_template_decl): Only propagate module info when + needed. + (lookup_template_class_1): Use set_implicit_module_origin. + (tsubst_friend_function): Propagate to outer template. + (tsubst_function_decl): Use set_implicit_module_origin. + (tsubst_template_decl): Simplify tsubst if cascade. Propagate + inner module info. + (instantiate_template_1): Use set_module_owner. + * ptree.c (cxx_print_decl): Protect module info display. + gcc/testsuite/ + * g++.dg/modules/friend-1_a.C: Adjust scans. + * g++.dg/modules/indirect-[13]_[bc].C: Likewise. + * g++.dg/modules/indirect-4_b.C: Likewise. + * g++.dg/modules/late-ret-3_a.H: Likewise. + * g++.dg/modules/scc-1.C: Likewise. + * g++.dg/modules/vmort-2_[abc].C: Likewise. + +2019-09-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (enum merge_kind): Rearrange. + (merge_kind_name): Adjust. + gcc/testsuite/ + * g++.dg/modules/inst_-[234]-[ab].C: Adjust scans. + * g++.dg/modules/indirect-[234]_b.C: Likewise. + +2019-09-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (trees_out::tree_decl): RESULT and LABEL decls + written by value. Assert only expected things remain by name. + + gcc/cp/ + * modules.cc (enum tree_tag): Add tt_data_member. + (trees_out::tree_decl): Use it for consts and fields. + (trees_in::tree_node): Read it. + (set_implicit_module_owner): Delete. + * name-lookup.c (get_field_ident, lookup_field_ident): New. + * name-lookup.h (get_field_ident, lookup_field_ident): Declare. + * cp-tree.h (set_implicit_module_owner): Delete. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust scans. + * g++.dg/modules/indirect-1_c.C: Likewise. + +2019-09-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset): Add DB_BOTH_SPEC_BIT. + (specialization_add): Accept template aliases for !decl_p. + (depset::hash::add_specializations): Notice duplicate + specialization paths. + +2019-09-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl.c (fixup_anonymous_aggr): Clear LAZY flags, no need to + strip out fns. + * module.cc (module_state::lazy_load): Distinguish out of order + from failure to set slot. + * name-lookup.c (get_binding_or_decl): Fixme :( + gcc/testsuite/ + * g++.dg/modules/anon-2{,_[ab]}.[hHC]: New. + +2019-09-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum merge_kind): Add MK_{decl,type}_tmpl_spec, + MK_type_partual_spec. + (tree_in::tree_value): Process them. + (trees_{in,out}::key_mergeable): Stream them. + * pt.c (match_mergeable_specialization): Only store if spec != + NULL. + gcc/testsuite/ + * g++.dg/modules/tpl-tpl-merge-[12]{,_[ab].[hHC]: New. + + gcc/cp/ + * module.cc (slurping::slurping): Init current to mostpos - 1. + (module_state::read): Increment slurp->current when done. + + gcc/cp/ + * module.cc (trees_in::tree_node): Check overrun more. + +2019-09-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::is_matching_decl): Copy + DECL_TEMPLATE_INSTANTIATED. + gcc/testsuite/ + * g++.dg/modules/inst-5_[ab].[CH]: New. + + gcc/cp/ + * module.cc (trees_in::mergeables): Vec of intptr_t. + (trees_in::register_mergeable): Return index. + (trees_in::unmatched_mergeable): New. + (trees_in::get_dupness): Drop last parm. Return DUP_bad as + necessary. Adjust callers. + (trees_in::tree_value): Call unmatched_mergeable as necessary. + + gcc/cp/ + * module.cc (trees_in): Delete skip_defns & handling. Add + any_deduping field. + (trees_in::register_mergeable): Outline. + (trees_in::{enum dupness,get_dupness}): New. + (trees_in::{enum odrness,get_odrness}): New. + (trees_in::lookup_mergeable): Delete. + (trees_in::is_existing_mergeable): Delete, use get_dupness. + (trees_in::is_skippable_defn): Delete, ise get_odrness. + (trees_in::assert_definition): Adjust. + (trees_in::read_{function,class,var,enum}_def): Adjust. + (topmost_decl): Delete. + gcc/testsuite/ + * g++.dg/modules/part-3_c.C: Adjust scans. + * g++.dg/modules/tdef-6_b.C: Adjust scans. + +2019-09-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::is_skippable_defns): Defns always complete + incomplete. + gcc/testsuite/ + * g++.dg/modules/merge-3_[ab].[CH]: New. + +2019-09-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::DB_TYPE_SPEC_BIT): New. + (depset::is_type_spec): New. + (enum merge_kind): Replace MK_spec with MK_decl_spec, MK_type_spec. + (merge_kind_name): Update. + (trees_in::tree_value): Partition MK_spec handling. + (trees_{in,out}::key_mergeable): Likewise. + (depset::hash::add_specialization): Set DB_TYPE_SPEC_BIT. + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_b.C: Update lang dump scans. + * g++.dg/modules/inst-[234]_[ab].C: Update lang dump scans. + + gcc/cp/ + * module.cc (spec_tuple): Delete type. + (specialization_add): Adjust data type. + (depset::hash::add_specializations): Drop PARTITIONS parm. Adjust. + (module_state::write): Adjust. + + gcc/cp/ + * cp-tree.h (check_mergeable_specialization): Declare. + (match_mergeable_specialization): Add DECL_P parm, drop INSERT_P parm. + * module.cc (trees_in::tree_value): Adjust + match_mergeable_spcialization calls. + (specialization_add): Use check_mergeable_specializatio. + * pt.c (check_mergeable_specialization): New. + (match_mergeable_specialization): Always insert, reorder parms. + + gcc/cp/ + * module.cc (enum merge_kind): Add MK_linkage. + (merge_kind_name): ... and here. + (trees_in::tree_value): Add it. + (trees_{in,out}::key_mergeable): Use it. + * name-lookup.c (match_mergeable_decl): Don't add anon-enum. + gcc/testsuite/ + * g++.dg/modules/builtin-1_a.C: Adjust scan. + * g++.dg/modules/indirect-[234]_b.C: Likewise. + * g++.dg/modules/inst-[23]_a.C: Likewise. + * g++.dg/modules/tdef-6_[ab].[HC]: New. + +2019-09-15 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::chained_decls): No need to deal with clones here. + (trees_{in::read,out::write}_class_def): Don't chain + fields until we know we're the definition. + + Merge trunk r275727. + +2019-09-13 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (get_namespace_binding): Fish out global binding, + if it's a vector. + gcc/testsuite/ + * g++.dg/modules/binding-2.H: New. + + gcc/cp/ + * cp-tree.h (MODULE_VECTOR_LAZY_SPEC_P): Use TREE_THIS_VOLATILE. + gcc/testsuite/ + * g++.dg/modules/binding-1_[abc].[HC]: New. + +2019-09-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.def (UNBOUND_CLASS_TEMPLATE): Correct docs. + * cp-tree.h (make_unbound_class_template_raw): Declare. + * decl.c (make_unbound_class_template_raw): New, break out of ... + (make_unbound_class_template): ... this, call it. + * module.cc (trees_out::tree_type): Handle UNBOUND_CLASS_TEMPLATE. + (trees_in::tree_node): Likewise. + gcc/testsuite/ + * g++.dg/modules/tpl-tpl-parm-1_[ab].[HC]: New. + + gcc/cp/ + * module.cc (trees_out::core_vals): Never write template_decl's + type ... + (trees_in::tree_value): .. resurrect it here instead. + + gcc/cp/ + * module.cc: Sort many switch stmts. + +2019-09-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r275641. + +2019-09-09 Nathan Sidwell <nathan@acm.org> + + Merge trunk r275518 + + gcc/cp/ + * module.cc (enum depset::disc_bits): Delete DB_REACHED_ONCE_BIT. + (depset::is_reached_once, depset::clear_mergeable): Delete + (trees_in::tree_value): Set template typedef type. + (depset::hash::add_dependency): No reached once stuff. + (sort_mergeables): Just live with tight clusters. + gcc/testsuite/ + * g++.dg/modules/late-ret-2_a.H: Adjust scans. + * g++.dg/modules/late-ret-3_[abc].[CH]: New. + +2019-09-06 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum depset::disc_bits): Add DB_REACHED_ONCE_BIT. + (depset::is_reached_once, depset::clear_mergeable): New. + (depset::hash::add_dependency): Set and clear DB_REACHED_ONCE_BIT. + (sort_mergeables): Deal with internal entities. + (module_state::read_cluster): A voldemort might have been merged. + gcc/testsuite/ + * g++.dg/modules/late-ret-2_[abc].[HC]: New. + + Merge trunk r275458. + +2019-09-05 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/concept-2_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream constraint_info. + (trees_{in,out}::tree_value): Stream constrain node. + {trees_{in,out}::tpl_header): Stream parm(s) constraints. + * pt.c (set_constraints): Don't do spurious lookup. + gcc/testsuite/ + * g++.dg/modules/concept-1_[ab].C: New. + + gcc/cp/ + * module.cc (module_state::write_location): Check streaming here. + Adjust many callers. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Move some node handling + into the new switch. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 7. + * decl.c (cp_tree_node_structure): Alphabetize. + gcc/ + * tree.c (tree_node_structure_for_code): Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 6. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 5. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 4. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 3. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 2. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Reorder part 1. + + gcc/cp/ + * module.cc (trees_out::tree_type): There are no indescribable types. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Redo enum underlying type + streaming. + + Merge trunk r275404. + +2019-08-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_type): Stream ptrmemfuncs at the + appropriate point. + + gcc/cp/ + * module.cc (trees_in::finish{,_type}): Delete. Move into + trees_in::tree_value, removing type remapping etc, + (trees_out::start): Check not streaming an unexpected type. + (trees_{in,out}::core_vals): Pointers are not streamed. + (trees_in::tree_value): Move remnants of finish{,_type} here & + simplify handling. + + gcc/cp/ + * module.cc (trees_out::tree_type): Write non-standard integer + types here. + (trees_in::tree_node): Read them here. + (trees_out::tree_value): We never see a naked type. + gcc/testsuite/ + * g++.dg/modules/bfield-2_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::start): Refactor switch. + (trees_{in,out}::core_vals): Remove first switch. + + gcc/cp/ + * module.cc (enum streamed_extensions): New. + (module_state::extensions): New. + (module_state::write_readme): Adjust. + (trees_{in,out}::start): Note or check openmp extension. + (module_state::{read,write}_config): Adjust. + gcc/testsuite/ + * g++.dg/modules/omp-1_c.C: New. + * g++.dg/modules/omp-2_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::start): Deal with OMP_CLAUSE. + (trees_{in,out}::core_vals): Likewise. + gcc/testsuite/ + * g++.dg/modules/omp-1_[ab].C: New. + + gcc/cp/ + * module.cc (friend_from_decl_list): Reimplement. + (trees_out::tree_decl): When streaming a local template friend + reference, make sure we find one. + + gcc/cp/ + * module.cc (enum tree_tag): Drop tt_mergeable, tt_clone. + (trees_out::tree_value): Emit tt_node & kind separately. + (trees_in::tree_node): Read tt_node kind explicitly. + +2019-08-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_decl): VTTs are just vtables. + gcc/testsuite/ + * g++.dg/modules/vtt-1_[abc].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): We never see + TS_CP_ARGUMENT_PACK_SELECT nodes. + + Merge trunk r275034. + +2019-08-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (struct location_map_info): New. + (module_state::prepare_locations): Rename to ... + (module_state::prepare_maps): ... here. Return a + location_map_info. + (module_state::{read,write}_locations): Split to ... + (module_state::{read,write}_{ordinary,macro}_maps): ... here. Adjust. + (module_state::{read,write}): Split location map streaming. + gcc/testsuite/ + * g++.dg/modules/macro-7_[abc].C: New. + + Merge trunk r274992. + +2019-08-27 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c.opt (fnote-include-translate): Renamed from finclude-translate. + gcc/ + * doc/invok.texi: Update. + gcc/cp/ + * module.cc (module_translate_include): Tweak. + +2019-08-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (note_includes): Renamed from inform_includes. + (module_translate_include): Emit note, not warning. + (init_module_processing, handle_module_option): Adjust. + gcc/c-family + * c.opt (finclude-translate): Renamed from -Winclude-translate. + gcc/ + * doc/invoke.texi (finclude-translate): Document. + +2019-08-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::finish): Don't clear PENDING_TEMPLATE here. + Set IDENTIFIER_VIRTUAL_P if t is a vfunc. + (trees_out::core_bools): Write PENDING_TEMPLATE as false. + gcc/testsuite/ + * g++.dg/modules/virt-1_[ab].C: New. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Vtables are distinguished by + DECL_VIRTUAL_P. + +2019-08-23 Nathan Sidwell <nathan@acm.org> + + Merge trunk r274867. + + gcc/cp/ + * module.cc (trees_out::core_bools): Don't propagate asm_written + for types. + (trees_{in,out}::lang_type_bools): Don't stream debug_requested. + (trees_in::read_{enum,class}_def): Register for debug. + (finish_module_processing): Don't write module when syntax only. + gcc/testsuite/ + * g++.dg/modules/debug-1_[ab].C: New. + +2019-08-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::add_dependency): We should never find a + redirect. + (depset::hash::add_redirect): Rename to ... + (depset::hash::add_partial_redirect): ... here. Mark the redirect + as unreachable. + + gcc/cp/ + * module.cc (MOD_SNAME_PFX): Resurrect initial dot. + (elf_out::strtab_write): Elide global namespace. + +2019-08-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::assert_definition): Relax already-present + assert. + + gcc/cp/ + * module.cc (finish_module_processing): Protect against null + filename. + + gcc/cp/ + * module.cc (elf_in::release): Reset size too. + (enum ct_bind_flags): Correct cbf_wrapped value. + (module_state::read_cluster): Usings may be unwrapped. + + gcc/c-family/ + * c.opt (Winclude-translate*): New family of options. + gcc/cp/ + * module.cc (inform_includes): New var. + (module_translate_include): Inform of translations. + (init_module_processing): Canonicalize inform list. + (handle_module_option): Process inform options. + + gcc/cp/ + * module.cc (set_cmi_repo): NULL means default init. + (module_mapper::module_mapper): Default init repo. + (module_mapper::translate_include): Add LEN parm, create STRING. + (canonicalize_header_name): Correctly prepend './'. + gcc/testsuite/ + * g++.dg/modules/ben-1.map: Add $root. + * g++.dg/modules/gc-2.map: Add $root. + * g++.dg/modules/map-1.map: Add $root. + * g++.dg/modules/map-1_b.map: Add $root. + +2019-08-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::module_state): Header must be + .-relative if not absolute. + (get_module): Validate module name more. + gcc/testsuite/ + * g++.dg/modules/map-2.{C,map}: New. + + Merge trunk r274747. + + Merge trunk r273943 (Jason's TEMPLATE_INFO changes). + + Merge trunk r273906 (Martin's function_decl.decl_type changes). + +2019-08-19 Nathan Sidwell <nathan@acm.org> + + Merge trunk r273771. + +2019-08-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (get_cxx_dialect_name): Make extern. + * name-lookup.h (get_cxx_dialect_name): Declare. + * module.cc (module_state_config::get_opts): Just determine C++ + dialect. + gcc/testsuite/ + * g++.dg/modules/flag-1_[ab].C: Adjust. + +2019-08-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::deferred_macro): Emit warning if at end + of TU. + (finish_module_processing): Adjust. + gcc/ + * doc/invoke.texi (fforce-module-macros): Replace documentation + with ... + (Winvalid-imported-macros): ... this. + gcc/c-family/ + * c.opt (fforce-module-macros): Replace with ... + (Winvalid-imported-macros): ... this. + gcc/testsuite/ + * g++.dg/modules/macro-4_[abcdeg].C: Update. + * g++.dg/modules/macro-5_c.C: Update. + +2019-07-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (node_template_info): Enums may be function-local. + gcc/testsuite/ + * g++.dg/modules/enum-7.C: New. + +2019-07-27 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): Update. + +2019-07-24 Nathan Sidwell <nathan@acm.org> + + Default to gcm.cache directory. + gcc/cp/ + * cxx-mapper.c (flag_root): Change default. + (module2bmi): Headers have same suffix. + (client::action): Prefix root dir to look for bmi. + gcc/ + * doc/invoke.texi (C++ Module Mapper): Update docs. + gcc/testsuite/ + * g++.dg/modules/dep-1_[ab].C: Update scans. + * g++.dg/modules/dep-2.C: Update scans. + * g++.dg/modules/modules.exp (DEFAULT_REPO): New. + (dg-module-cmi): Adjust. + + Drop import alias detection, via controlling macros. + gcc/cp/ + * module.cc (bytes_in::no_more): Delete. + (module_state::{read,write}_config): Drop controlling macro. + (module_state::write_readme): Likewise. + (module_state::read): Drop alias return. + (module_state::slurp): Delete. Replace all uses with field + access. + (module_state::resolve_alias): Delete. + (module_state::is_alias): Delete. + (module_state::read_imports): Drop alias detection. + gcc/testsuite/ + * g++.dg/modules/alias-[12]_b.C: Drop controlling macro scans. + * g++.dg/modules/macro-2_c.H: Likewise. + * g++.dg/modules/macro-3_[abc].[CH]: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + * g++.dg/modules/alias-3_*: Delete. + * g++.dg/modules/sys/alias-3_a.H: Delete. + + Merge trunk r273764. + + gcc/testsuite/ + * g++.dg/modules/alias-2_a.H: Add dg-module-header. + * g++.dg/modules/alias-3_a.H: Likewise. + * g++.dg/modules/mod-decl-0-2a.C: std=c++2a. + * g++.dg/modules/mod-decl-0.C: std=c++17. + * g++.dg/modules/modules.exp: Add dg-module-header, iterate over + different c++ stds. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Cope with using decls in the + binding list. + gcc/testsuite/ + * g++.dg/modules/enum-6_[ab].[HC]: New. + + gcc/cp/ + * module.cc (enum merge_kind): Add MK_enum. + (trees_out::tree_decl): Deal with anon enums. + (trees_in::tree_value): Adjust for MK_enum. + (trees_{in,out}::tree_node): Adjust tt_enum_int streaming. + (trees_{in,out}::key_mergeable): Add MK_enum key. + (depset::hash::add_dependency): Enum values are like using decls. + (depset::hash::add_binding): Likewise. + (depset_cmp): Reorder for new requirements. + (enum ct_bind_flags): Add cbf_wrapped. + (sort_mergeables): Presume sorted by depset_cmp. + (module_state::{read,write}_cluster): Adjust. + * name-lookup.c (check_mergeable_decl): Deal with anon-enum + proxies. + gcc/testsuite/ + * g++.dg/modules/enum-1_a.C: Adjust scan. + +2019-07-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset): Rename MARKED to SPECIAL, update all users. + +2019-07-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_class_specifier_1): Fixup a template's type + with a late exception specifier. + gcc/testsuite/ + * g++.dg/modules/except-1.C: New. + +2019-07-22 Boris Kolpackov <boris@codesynthesis.com> + + gcc/cp/ + * Make-lang.in (MODULE_REVISION): Add git rev, if it's git. + +2019-07-16 Nathan Sidwell <nathan@acm.org>r + + gcc/cp/ + * module.cc (module_state::read_{bindings,namespaces}): Use plain + vec + (module_state::read): Adjust. + (module_state::write_macros): Use plain vec. + (module_state::deferred_macro): Use plain vec. + + gcc/cp/ + * module.cc (depset::hash::add_writables): Use plain vec. + (typedef spec_tuple): Use plain vec. + (depset::hash::add_speciailizations): Correctly init vec. + (module_state::{read,write}_namespaces): Use plain vec. + (module_state::{read,write}): Adjust. + + Fix it better. + gcc/cp/ + * mangle.c (mangle_module_substitution): Offset overflow. + gcc/testsuite/ + * g++.dg/modules/sym-subst-3_[ab].C: Fix + * g++.dg/modules/sym-subst-[456].C: New. + + Fix module backref subst. + gcc/cp/ + * cp-tree.h (mangle_substitution): Rename to ... + (mangle_module_substitution): ... here. Drop genecity. + * mangle.c: Likewise. Fix mangling. + * module.cc (module_state::mangle): Adjust. + gcc/testsuite/ + * g++.dg/modules/sym-subst-1.C: Adjust scan. + * g++.dg/modules/sym-subst-2_[ab].C: Adjust scan. + * g++.dg/modules/sym-subst-3_[ab].C: New. + +2019-07-09 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-opts.c (c_common_handle_option): Remove {user,system}_search. + * c.opt ({user,system}-search): Delete. + (fmodule-header): Undeprecate. + gcc/cp/ + * module.cc (module_state_config::get_opts): Drop + OPT_fmodule_header_. + (handle_module_option): Handle fmodule-header=. + gcc/ + * gcc.c (cpp_unique_options): Drop {user,system}-search. + +2019-07-08 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-common.c (try_to_locate_new_include): Use strcmp and ignore + zero-line maps. + gcc/cp/ + * module.cc (finish_module_processing): Inhibit module stats if + not moduling. + +2019-07-07 Nathan Sidwell <nathan@acm.org> + + Merge trunk r273185. + + libcpp/ + * files.c (cpp_find_failed): Replace with ... + (cpp_found_name): ... this. + (_cpp_stack_file): Check main_search option. + * include/cpplib.h (cpp_options): Add main_search. + * internal.h (cpp_find_failed): Replace with ... + (cpp_found_name): ... this. + * init.c (cpp_read_main_file): Examine main_search option. + gcc/c-family/ + * c-opts.c (c_common_handle_options): Add OPT_{user,system}_search. + * c.opt (user-search, system-search): New. + gcc/ + * gcc.c (cpp_unique_options): Add {user,system}-search. + + gcc/ + * module.cc (module_state::write_cluster): Return cluster size. + (avalable_clusters, loaded_clusters): New static vars. + (module_state::{read,write}): Adjust. + (finish_module_processing): Dump more stats. + gcc/testsuite/ + * g++.dg/module/part-3_c.C: Adjust scan. + + gcc/ + * timevar.def (TV_MODULE_{IMPORT,EXPORT,MAPPER}): Define. + gcc/cp/ + * module.cc: Include timvar.h. Sprinkle timevar accounting throughout. + +2019-07-05 Nathan Sidwell <nathan@acm.org> + + Merge trunk r273146. + + Victory! + gcc/cp/ + * decl2.c (c_parse_final_cleanups): Don't do static init things + for a header module. + * module.cc (trees_in::start): Drop unused second parm. + (module_state::{read,write}_inits): New. + (trees_out::core_bools): Restrict static->extern hack. + (module_state::{read,write}_config): Note inits. + (module_state::{read,write}): Stream inits. + gcc/testsuite/ + * g++.dg/modules/iostream-1_b.C: Remove ioinit workaround. + + gcc/testsuite/ + * g++.dg/modules/iostream-1_[ab].[HC]: New. + + gcc/cp/ + * module.cc (module_state_config::get_opts): Drop -g* switches. + + gcc/cp/ + * cp-tree.h (get_tinfo_decl_direct): Declare. + * module.cc (trees_out::tree_decl): Stream more tinfo_var info. + (trees_in::tree_value): Use get_tinfo_decl_direct for tinfo vars. + * rtti.c (get_tinfo_decl_direct): Break out of ... + (get_tinfo_decl): ... here. Call it. + +2019-07-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::read_cluster): finalize_function may + not GC. + + gcc/cp/ + * module.cc (enum cluster_tag): Add ct_defn. + (enum ct_decl_flags): Rmove cdf_has_definition. + (module_state::{read,write}_cluster): Stream definitions after + declarations.. + + gcc/cp/ + * module.cc (trees_{in,out}::key_mergeable): Always stream context. + gcc/testsuite/ + * g++.dg/modules/merge-1_[ab].[HC]: New. + + gcc/cp/ + * module.cc (trees_out::key_mergeable): Return merge kind. + (trees_out::tree_value): Note key writing. + (trees_in::tree_value): Adjust key dump. + gcc/testsuite/ +` * g++.dg/modules/builtin-1_b.C: Adjust scans. + * g++.dg/modules/inst-[1234]_b.C: Likewise. + * g++.dg/modules/part-3_[cd].C: Likewise. + +2019-07-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_type): Add TYPEOF_TYPE, UNDERLYING_TYPE. + (trees_in::tree_node): Likewise. + + gcc/cp/ + * module.cc (struct unnamed_entity): GTY it. + (unnamed_map): Not a GTY object. + + gcc/cp/ + * module.cc (trees_{in,out}::fn_parms): Rename to ... + (trees_{in,out}::fn_arg_types): ... this. + (trees_{in,out}::fn_parms_{init,fini}): New. + (trees_{in,out}::tree_value): Call fn_parms_fini. + (trees_{in,out}::key_mergeable): Call fn_parms_init. + gcc/testsuite/ + * g++.dg/modules/late-ret-1.H: New. + * g++.dg/modules/scc-1.C: Adjust scan. + + gcc/cp/ + * module.cc (trees_out::tree_type): Add DECLTYPE_TYPE. + (trees_in::tree_node): Likewise. + +2019-07-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::core_vals): Protect binfo base reading. + (module_state::{read,write}_cluster): Insert types for horcrucifexes. + gcc/testsuite/ + * g++.dg/modules/horcrux-1_[ab].C: New. + + gcc/testsuite/ + Rename bmi->cmi everywhere. + + gcc/cp/ + * cp-tree.h (module_has_cmi_p): Renamed. + * name-lookup.c (do_nonmember_using_decl): Adjust. + * module.cc (cmi_*): Renamed. Adjust all users. + + gcc/cp/ + * module.cc (trees_out::fn_parms): Don't use canonical type any + more. + gcc/testsuite/ + * g++.dg/modules/merge-1_[ab].C: New. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Write types for typedefs. + (trees_in::tree_node): Adjust. + gcc/testsuite/ + * g++.dg/modules/tdef-5_[ab].C: New. + + gcc/cp/ + * module.cc (trees_out::tree_type): Add pack types. + (trees_{in,out}::tree_value): Tweak type streaming flags + (trees_in::tree_node): Add pack types. + + gcc/cp/ + * module.cc (trees_out::tree_type): Detect bound template template + parm. + (trees_{in,out}::tree_value): Stream type on any TYPE_DECL that + its TYPE_STUB_DECL. + + gcc/cp/ + * module.cc (trees_out::tree_type): Add COMPLEX and VECTOR types. + (trees_in::tree_node): ... and here. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Deal with tinfo vars and + vtables here ... + (trees_out::tree_node): ... not here. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Deal with tinfo type_decls + here. + (trees_out::tree_type): Dectect tinfo types here ... + (trees_out::tree_node): ... not here. + (trees_in::tree_node): Add tinfo type too. + +2019-07-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_decl): Fix dump typo. + (trees_in::tree_value): Likewise. + (module_state::read_cluster): Show end. + + gcc/cp/ + * module.cc (module_state::write): Don't stream env. + + gcc/cp/ + * module.cc (trees_in:::read_function_def): Push the template for + post processing. + (module_state::read_cluster): Deal with abstract post processing. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-7_[ab].C: New. + + gcc/cp/ + * module.cc (depset::hash::add_binding): Return added flag. Deal + with orphaned using decls. + (depset::hash::add_writables): Return added flag. + gcc/testsuite/ + * g++.dg/modules/using-5_[ab].C: New. + + Clones + gcc/cp/ + * module.cc (enum tree_tag): Add tt_clone_ref. + (get_clone_target): Replace get_clone_orig. + (FOR_EVERY_CLONE): New. + (trees_out::mark_mergeable): Add tag parm. Adjust. + (trees_in::chained_decls): Cope with already-linked clones. + (trees_out::tree_decl): Support clone walking. + (trees_{in,out}::tree_value): Likewise. + (trees_in::tree_node): Support tt_clone_ref. + (trees_{in,out}::key_mergeable): Key clones. + (trees_out::{mark,write}_definition): No clones here. + (trees_in::read_definition): Likewise. + (depset::hash::add_clone): Reimplement. + (module_state::write_cluster): Deal with clones. + gcc/testsuite/ + * g++.dg/modules/clone-1_[ab].C: New. + * g++.dg/modules/friend-1_a.C: Adjust scan. + * g++.dg/modules/indirect-[1234]_[bc].C: Likewise. + * g++.dg/modules/inst-3_a.C: Likewise. + +2019-06-27 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::entity_kind): Add EK_CLONE. + (depset::hash::add_clone): New. + (enum walk_kind): Move to global scope. + (enum merge_kind): New. + (trees_{in,out}::tree_value): Use new enums. + (trees_{in,out}::tree_mergeable): Likewise. + (get_clone): New. + (member_owned_by_class): Clones are never owned. + (trees_out::mark_declaration): Walk clones. + (trees_in::read_definition): Likewise. + (trees_out::write_definition): Likewise. + gcc/testsuite/ + * g++.dg/modules/builtin-1_b.C: Adjust dump scans. + * g++.dg/modules/inst-1_b.C: Adjust dump scans. + * g++.dg/modules/part-3_[cd].C: Adjust dump scans. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream abstract_origin. + + gcc/cp/ + * class.c (build_clone): Neaten and assert. + * cp-tree.h (lang_decl_u5.cloned_function): Fix comment. + * name-lookup.c (get_lookup_ident): Don't fall off end of overload. + + Add -Mno-modules. + gcc/c-family/ + * c-opts.c (c_common_init_options): Default module deps on. + (c_common_handle_option): Handle M{no-}modules. + * c.opt (Mmodules, Mno-modules): New options. + gcc/ + * doc/cppopts.texi (Mno-modules): Document it. + * doc/invoke.texi: Likewise. + * gcc.c (cpp_unique_options): Add it. + gcc/testsuite/ + * g++.dg/modules/dep-3.C: New. + libcpp/ + * include/cpplib.h (struct cpp_options): Add dep.modules. + * include/mkdeps.h: Include cpplib.h + (deps_write): Take a cpp_reader. + * init.c (cpp_finish): Adjust deps_write call. + * mkdeps.c: Include internal.h + (make_write): Adjust. Conditionally inhibit module output. + (deps_write): Adjust. + +2019-06-26 Nathan Sidwell <nathan@acm.org> + + Don't elide primary from partition names. + gcc/cp/ + * cp-tree.h (module_name): Drop maybe_primary parm. + * modules (module_state::get_flatname): Just get the flatname. + (get_primary): New. + (get_module): Expect fully qualified name. Drop parent arg. + Adjust callers. + (module_stae:set_flatname): Create fully qualified name. + (module_state::read_{imports,partitions}): Check partitions have + expected primary. + (module_state::{read,write}_config): Adjust. + (module_state::do_import, module_preprocess) + (finish_module_procesing): Adjust deps_add_module calls. + * name-lookup.c (make_namespace): Adjust anon namespace name + creation. + * ptree.c (cxx_print_decl): Adjust module_name call. + gcc/testsuite/ + * g++.dg/modules/part-2_d.c: Adjust regexp. + * g++.dg/modules/part-3_c.c: Adjust scans. + libcpp/ + * include/mkdeps.h (deps_add_module): Drop primary arg. + * mkdeps.c (deps_add_module): Drop primary arg. + + Merge trunk r272714. + + gcc/cp/ + * decl.c (duplicate_decls): Non-modules are ok for builtins. + gcc/testsuite/ + * g++.dg/modules/builtin-2.C: New. + + gcc/cp/ + * module.cc (depset::hash::add_mergeable_horcrux): Add redirect as + necessary. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-7.C: New. + + gcc/cp/ + * module.cc (depset::hash::add_redirect): New. + (depset::hash::add_specialization): Use it. + (depset::hash::add_mergeable): Use it. + (depset::hash::add_dependency): Never add a redirect here. + + gcc/cp/ + * module.cc (finish_module_processing): Adjust failed to write error. + gcc/testsuite/ + * g++.dg/modules/internal-1.C: Adjust. + + gcc/cp/ + * module.cc (depset::entity_kind): Add EK_REDIRECT. + (tree_out::tree_decl): Cope with redirects. + (depset::hash::add_dependency): Likewise. + (depset::hash::add_specialization): Add redirect for partials. + (depset::hash::add_mergeable): Likewise. + (module_state::write_cluster): Assert no redirects here. + (module_state::write): Check redirects here. + gcc/testsuite/ + * g++.dg/modules/global-3_a.C: Disable. + * g++.dg/modules/tpl-spec-6_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::note_definition): Rename to ... + (trees_{in,out}::assert_definition): ... here. Update callers. + + gcc/cp/ + * cp-tree.h (match_mergeable_specialization): Add insert parm. + * pt.c (match_mergeable_specialization): Add insert parm. + * module.cc (depset::entity_kind): Add EK_MAYBE_SPEC. + (depset::disc_bits): Delete DB_FRIEND_BIT, ADD DB_PSEUDO_SPEC_BIT. + (depset::is_friend): Delete. + (depset::is_pseudo_spec): Add. + (trees_out::tree_decl): Some specializations are findable by name. + (trees_in::tree_value): Mergeables have an explicit kind. + (trees_in::tree_node): Protect more. + (trees_{in,out{::key_mergeable): Explicitly encode key kind. + (depset::hash::add_dependency): Support EK_MAYBE_SPEC. + (specialization_add): Add some consistency checking. + (depset::hash::add_specialization): Specialization might be an + import. + (depset::hash::add_mergeable_horcrux): New. + (sort_mergeables): Add horcrux deps. + (module_state::write_cluster): Don't mark cdf_is_friend. + gcc/testsuite/ + * g++.dg/modules/indirect-3_[ab].C: Reenable. Adjust scans. + +2019-06-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state:note_cmi_name): New. + (module_state::read_config): Use it. + (module_state::check_read): Likewise. + gcc/testsuite/ + * g++.dg/modules/atom-decl-3.C: Adjust diags. + * g++.dg/modules/atom-preamble-3.C: Likewise. + * g++.dg/modules/bad-mapper-1.C: Likewise. + * g++.dg/modules/bad-mapper-3.C: Likewise. + * g++.dg/modules/circ-1_c.C: Likewise. + * g++.dg/modules/flag-1_b.C: Likewise. + * g++.dg/modules/import-2.C: Likewise. + * g++.dg/modules/mod-stamp-1_d.C: Likewise. + * g++.dg/modules/p0713-3.C: Likewise. + +2019-06-24 Nathan Sidwell <nathan@acm.org> + + Revert late specialization insertion. + gcc/cp + * module.cc (depset): Delete DB_OOT_SPEC_BIT. + (depset::~depset): Remove deletion. + (trees_out::key_mergeable): Assert specialization is marked. + (depset::hash::add_dependency): Assert no late specializations. + gcc/testsuite + * g++.dg/modules/modules.exp: Expand dg-module-do capabilities. + * g++.dg/modules/indirect-3_a.C: Disable. + +2019-06-23 Nathan Sidwell <nathan@acm.org> + + Merge trunk r272583. + +2019-06-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (depset): Add DB_OOT_SPEC_BIT. + (depset::~depset): Free the spec entry if we own it. + (trees_{in,out}::note_definition): Check template result isn't + there. + (depset::hash::add_dependency): Correctly insert discovered + non-member template instantiations. + + gcc/cp/ + * modules.cc (note_defs): New checking hash table. + (trees_{in,out}::note_definition): New checkers + (trees_in::read_{function,class,var,enum}_def): Add maybe_template + arg, use it. Note definitions. + (member_owned_by_class): New, extracted from ... + (trees_out::mark_class_member): ... here. Call it. + (trees_out::write_class_def): Only write the owned definitions. + (trees_out::write_definition): Note definition. + (trees_in::read_definition): Pass maybe_template to readers. + (module_state::write): Reset note_defs hash. + (init_module_processing): Init it. + (finish_module_processing): Delete it. + + gcc/cp/ + * modules.cc (dumper::operator ()): Print indentation level. + gcc/testsuite/ + * g++.dg/modules/scc-1.C: Adjust dump scan. + + gcc/cp/ + * modules.cc (node_template_info): Enums are awkwarder. + gcc/testsuite/ + * g++.dg/modules/enum-4_[ab].C: New. + +2019-06-20 Nathan Sidwell <nathan@acm.org> + + Bitfields. + gcc/cp/ + * module.cc (tree_out::mark_class_def): Mark bitfield's + representative field. + gcc/testsuite/ + * g++.dg/modules/bfield-1_[ab].C: New. + + Thunks. + gcc/cp/ + * module.cc (enum tree_tag): Add tt_thunk. + (trees_out::tree_decl): Emit it. + (trees_out::tree_value): Assert we don't accidentally meet a + thunk. + (trees_in::tree_node): Read it. + (trees_out::{mark,write}_class_def): Emit thunks by value. + (trees_in::read_class_def): Install thunks. + gcc/testsuite/ + * g++.dg/modules/thunk-1_[ab].C: New. + + gcc/cp/ + * parser.c (cp_lexer_tokenize): Skip pragmas. + * lex.c (module_preprocess_token): Likewise. + gcc/testsuite/ + * g++.dg/modules/pragma-1_[ab].[HC]: New. + * g++.dg/modules/tname-spec-1_b.C: Move include earlier. + + Deconstruct types. + gcc/cp/ + * module.cc (enum tree_tag): Add tt_typename_decl, + tt_derived_type, tt_variant_type. + (trees_out::tree_decl): Stream typename types. + (trees_out::tree_type): Emit tt_{derived,variant}_type records. + (trees_in::tree_node): Add tt_typename_decl, tt_derived_type, + tt_variant_type handling. + gcc/testsuite/ + * g++.dg/modules/class-3_b.C: Adjust dump scan. + * g++.dg/modules/tname-spec-1_[ab].[HC]: New. + * g++.dg/modules/typename-1_[ab].C: New. + +2019-06-19 Nathan Sidwell <nathan@acm.org> + + Stream mergeables inline. + gcc/cp/ + * module.cc (depset): Add DB_MERGEABLE_BIT. + (depset::is_mergeable): New. + (depset::hash::set_for_mergeable): Delete. + (trees_{in,out}::tree_mergeable): Delete. + (tress_{in,out}::key_mergeable): New. + (trees_out::tags): New enum. + (trees_out::mark_{mergeable,merged}): New. + (trees_out::reserve_mergeable,unset_for_mergeable): Delete. + (trees_out::{insert,ref_node}): Adjust. + (trees_out::core_vals): Don't stream tpl-tpl-parm contexts. + (trees_out::tree_decl): tpl-tpl-parms not found by name. + (trees_{in,out}::tree_value): Stream merging info inline. + (trees_{in,out}::tpl_header): Take template, not parms. + (trees_out::mark_declaration): Mark the template parms. + (depset::hash::find_dependencies): Adjust mergeable walk. + (depset::hash::add_mergeable): Adjust. + (module_state::sort_mergeables): Replace with ... + (sort_mergeables): ... this. + (enum cluster_tag): Delete ct_mergeable. + (module_state::write_cluster): Determine mergable ordering + earlier. Don't write a mergeable table. + (module_state::read_cluster): No mergeables to deal with here. + (module_state::write): Move cluster member dumping to write_cluster. + * name-lookup.h (match_mergeable_decl): Drop tpl_args parm. + * name-lookup.c (check_mergeable_decl): Likewise. Update callers. + gcc/testsuite/ + * g++.dg/modules/builtin-1_a.C: Adjust dump scans. + * g++.dg/modules/friend-1_a.C: Likewise. + * g++.dg/modules/indirect-[234]_[bc].C: Likewise. + * g++.dg/modules/inst-[23]_[ab].C: Likewise. + * g++.dg/modules/part-3_[cd].C: Likewise. + * g++.dg/modules/scc-1.C: Likewise. + * g++.dg/modules/tpl-friend-[12]_a.C: Likewise. + * g++.dg/modules/tpl-spec-[12345]_[ab].C: Likewise. + * g++.dg/modules/vmort-2_b.C: Likewise. + +2019-06-18 Nathan Sidwell <nathan@acm.org> + + Merge trunk r272419. + + gcc/cp/ + * module.cc (specialization_cmp): Deal with more equivalencies. + (depset_cmp): New, cloned and adjusted from cluster_cmp. + (depset::hash::connect): Use it. + +2019-06-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::fn_parms): Stream canonical type. + (depset::hash::add_dependency): Adjust static inline check. + gcc/testsuite/ + * g++.dg/modules/mutual-friend.ii: New. + +2019-06-14 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Don't register + internal entities when in a header module. + (depset::hash::add_binding): Add internal entities in header modules. + gcc/testsuite/ + * g++.dg/modules/stat-tpl-1_a.H: New. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Inhibit internal + linkage setting on functions. + (cluster_cmp): We can meet matching using decls. + + gcc/cp/ + * module.cc (depset::hash::add_dependency): Unnamed elaborated + types have no linkage. + gcc/testsuite/ + * g++.dg/modules/enum-5_[ab].[HC]: New. + + gcc/cp/ + * module.cc (module_state::{read,write}_cluster): Check stat hack + is for implicit typedefs. + + gcc/cp/ + * module.cc (trees_out::tree_type): Simplify if-tree. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream original_type of type of + typedefs, not their type. + (trees_out::tree_type): Stream type_name of typedefs. + (trees_out::tree_value): Insert the type of a typedef. + (trees_in::tree_value): Reconstruct the type of a typedef. + gcc/testsuite/ + * g++.dg/modules/tdef-4_[abc].C: New. + * g++.dg/modules/class-3_b.C: Adjust scan. + + gcc/cp/ + * module.cc (binding_cmp): There can be an implicit and + non-implicit type_decl. + * name-lookup.c (check_mergeable_decl): Check implicitness of + type_decl. + +2019-06-13 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::add_specializations): Partial + instantiations need their template. + gcc/testsuite/ + * g++.dg/modules/tpl-tpl-mem-1_[ab].C: New. + +2019-06-11 Nathan Sidwell <nathan@acm.org> + + Update Revision number + +2019-06-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r272149. + +2019-06-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::read_location): Don't map + UNKNOWN_LOCATION to loc. + (module_state::read_locations): Don't rely on that. + gcc/testsuite/ + * g++.dg/modules/predef-2{.h,_[ab].C}: New. + + gcc/cp/ + * module.cc (loc_spans::init): Correct macro range ordering. + (module_state::write_locations): Fix more off-by-ones. + gcc/testsuite/ + * g++.dg/modules/predef-1.[hC]: New. + +2019-06-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::write_env): New. + (module_state::write): Call it. + + gcc/cp/ + * Make-lang.in (REVISION_c): Don't test it. + * module.cc (module_state::write_locations): Fix off-by-one thinko. + + gcc/cp/ + * module.cc (loc_spans::init): Add lmaps parm, separate main from + forced header locs. + (loc_spans::SPAN_FIRST): New, use it for first span. + (loc_spans::SPAN_MAIN): Just after the first span. + gcc/testsuite/ + * g++.dg/modules/macro-5_[abc].[CH]: Adjust. + + gcc/cp/ + * module.cc (dumper::MACRO): New flag. + (module_state::{write,install}_macros): Use it. + (module_state::{undef,deferred}_macro): Likewise. + gcc/ + * doc.invoke (-fdump-lang): Document. + gcc/testsuite/ + * g++.dg/modules/macro-[35]_[abc].[CH]: Update. + + gcc/cp/ + * module.cc (bytes_out::print_time): New. + (module_state::write_readme): Dump some environmental data. + +2019-06-06 Nathan Sidwell <nathan@acm.org> + + Update Revision number + +2019-06-06 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * Make-lang.in (MODULE_REVISION): Read from Changelog.modules. + +2019-06-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (dumper::MAPPER): New flag. Use it on mapper things. + (dumper::push): Only do blank line when starting a new module + nest. + + gcc/cp/ + * module.cc (trees_out::tree_type): We can meet ttps here. + (trees_{in,out}::tree_mergeable): Stream skeleton before locating info. + gcc/testsuite/ + * g++.dg/modules/ttp-3_[ab].C: New. + * g++.dg/modules/builtin-1_[ab].C: Adjust module scan. + * g++.dg/modules/indirect-[234]_b.C: Likewise. + * g++.dg/modules/inst-[1234]_[ab].C: Likewise. + + gcc/cp/ + * module.cc (trees_out::core_vals): Template type parms are their + own canonical. + (trees_in::finish_type): Never subst a canonical type parm for the type. + gcc/testsuite/ + * g++.dg/modules/ttp-2_[ab].C: New. + + gcc/cp/ + * module.cc (global_tree_arys): Add c_global_trees. + gcc/c-family/ + * c-common.h (enum c_tree_index): Add CTI_MODULE_HWM, move voltale + entries below it. + + Merge trunk r271953. + + gcc/ + * tree-core.h (enum tree_index): Add TI_MODULE_HWM. + gcc/cp/ + * cp-tree.h (enum cp_tree_index): Add CPTI_MODULE_HWM, move + volatile CPTI's below it. + (CPTI_STD_IDENTIFIER, std_identifier): Delete. + (DECL_NAMESPACE_STD): Simplify. + * decl.c (initialize_predefined_identifiers): Drop std_identifier. + (cxx_init_decl_processing): Adjust std_node creation. Use push/pop + nested namespace for std. + (cxx_builtin_function, cxx_builtin_function_ext_scope): Use + push/pop nested namespace for std. + * except.c (init_exception_processing): Likewise. + * rtti (init_rtti_processing): Likewise. + * module.cc (global_tree_arys): Restrict C & C++ trees. + * name-lookup.c (push_namespace): Set location if it was a + builtin. + gcc/testsuite/ + * g++.dg/modules/std-1_[ab].C: New. + +2019-06-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * class.c (maybe_add_class_template_decl): Mark (some) local + templates. + * module.cc (friend_from_decl_list): Some friends are overloads. + (trees_{in,out}::core_vals): Stream TREE_VEC CHAIN. + (trees_out::mark_class_def): Directly mark friend decls. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-6_[ab].C: New. + + gcc/testsuite/ + * g++.dg/modules/tpl-friend-5_[ab].C: New. + + gcc/cp/ + * name-lookup.c (lookup_type_scope_1): Look in imported slots too. + gcc/testsuite/ + * g++.dg/modules/class-8_[ab].C: New. + + gcc/cp/ + * name-lookup.c (lookup_type_scope_1): Reimplement, handle local + and namespace scopes separately. + +2019-06-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (friend_from_decl_list): New. + (trees_out::{tree_decl,{write,mark}_class_def}): Use it. + (trees_in::{tree_node,read_class_def}): Likewise. + + Template friends of templates. + gcc/testsuite/ + * g++.dg/modules/tpl-tpl-friend-1_[ab].C: New. + + Non-template friends of templates. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-4_[ab].C: New. + + Non-template friends of templates. + gcc/cp/ + * module.cc (has_definition): Use DECL_SAVED_TREE. + (trees_{in,out}::{read,write}_class_def): Stream definitions of + local friends. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-3_[ab].C: New. + + Merge trunk r271874. + + Non-template friends of templates. + gcc/cp/ + * module.cc (depset::disc_bits): Add DB_FRIEND. + (depset::is_friend): New. + (enum tree_tag): Add tt_friend_template. + (trees_out): Add section field, init it. + (trees_out::tree_decl): Deal with template friends. Assert lazy + ordering. + (trees_in::tree_node): Add tt_friend_template support. + (trees_{in,out}::{read,write,mark}_class_def): Deal with friend + templates. + (depset::hash::add_dependency): Notice friend templates. + (depset::hash::add_specializations): Add non-specializations. + (depset::hash::find_dependencies): Specializations depend on their + template & args. + (enum ct_decl_flags): Add cdf_is_friend. + (module_state::write_cluster): Set it. + (module_state::write): Add specializations before bindings. + Expand cluster dump. + * pt.c (push_template_decl_real): Friend template's DECL_CHAIN + points at the befriending class. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-2_[ab].C: New. + * g++.dg/modules/tpl-friend-1_a.C: Adjust scans. + +2019-05-31 Nathan Sidwell <nathan@acm.org> + + Non-template friends of templates. + gcc/cp/ + * module.cc (trees_{in,out}::{read,write}_class_def): Stream + friend lists and decl lists specially. + (trees_out::mark_class_def): Mark local friend decls. + (depset::hash::add_specializations): Don't add non-specializations + that are in the table. + * pt.c (push_template_decl_real): Mark non-pushed friend templates. + gcc/testsuite/ + * g++.dg/modules/tpl-friend-1_[ab].C: New. + +2019-05-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl.c (duplicate_decls): Remove duplicate assert. + * pt.c (build_template_decl): Set RESULT & TYPE of the template + here ... + (process_partial_specialization): ... not here ... + (add_inherited_template_parms): ... nor here ... + (push_template_decl_Real): ... nor here. Refactor. + gcc/ + * doc/invoke.texi (C++ Modules): Document atomicity. + gcc/fortran/ + * cpp.c (gfc_cpp_add_dep, gfc_cpp_add_target, gfc_cpp_init): + Rename mrules to mkdeps. + + gcc/cp/ + * module.cc (maybe_add_bmi_prefix): Replace FORCE with LEN_P. + Set it. + (create_dirs): Input is guarantueed unique. + (module_state::check_read): Show full BMI filename in errors. + (finish_module_processing): Likewise. Rename output atomically. + gcc/testsuite/ + * g++.dg/modules/atom-decl-3.C: Adjust diagnostics. + * g++.dg/modules/atom-preamble-3.C: Likewise. + * g++.dg/modules/bad-mapper-[13].C: Likewise. + * g++.dg/modules/circ-1_c.C: Likewise. + * g++.dg/modules/flag-1_b.C: Likewise. + * g++.dg/modules/import-2.C: Likewise. + * g++.dg/modules/internal-1.C: Likewise. + * g++.dg/modules/mod-stamp-1_d.C: Likewise. + * g++.dg/modules/p0713-3.C: Likewise. + +2019-05-28 Nathan Sidwell <nathan@acm.org> + + * decl.c (duplicate_decls): Assert a template newdecl has no + specializations. + + Revert inadvertent commits. + gcc/cp/ + * pt.c (push_template_decl_real): Here. + * decl.c (duplicate_decls): Here. + + Merge trunk r271702. + +2019-05-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (loc_spans): Make spans a vec. + (module_state::{read,write}_locations): Use vec. + + gcc/cp/ + * module.cc (trees_in): Replace auto_vec with vec. + + Template template parms, and a bunch of other stuff + gcc/cp/ + * cp-tree.h (DECL_TEMPLATE_INFO): Augment docs. + * module.cc (depset::clear_flag_bit): New. + (depset::is_unreached): Replace is_implicit_specialization. + (depset::is_marked): Replace is_first_dep_repurposed. + (dumper::impl::nested_name): Template args may be NULL. + (trees_{in,out}::core_vals): Template decl result & args streamed + with decl. + (trees_out::tree_decl): TTPs by value. + (trees_{in,out}::tree_value): Reorder body streaming, stream more + template bits. + (trees_out::tree_mergeable): Redo specialization tagging. + (trees_out::mark_class_def): Only mark decls on decl list. + (trees_out::mark_declaration): Simplify. + (depset::hash::add_dependency): Deal with reaching unreached. + (specialization_add): Grab all instantiations from this TU. + (depset::hash::add_specialiazations): Determing is_unreached. + (depset::hash::find_dependencies): Iterate until no more unreached + reached. + (module_state::write_unnamed): Adjust. + * pt.c (tsubst_function_decl): Set DECL_MODULE_OWNER. + gcc/testsuite/ + * g++.dg/modules/ttp-1_[ab].C: New. + * g++.dg/modules/indirect-[234]_[bc].C: Adjust scans. + * g++.dg/modules/inst-[24]_ab.C: Likewise. + + gcc/cp/ + * module.cc (dumper::impl::nested_name): Cope with TTPs. + (depset:hash::connect): Return the vec. + (depset::tarjan): Create and return the vec. + (module_state::write_{bindings,unnamed}): SCCS are in a vec. + (module_state::write): Likewise. + +2019-05-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::hash): Create worklist. + (depset::tarjan::tarjan): Create stack. + (depset::depset): Create deps. + + Stream binfos properly (again). + gcc/cp/ + * module.cc (trees_out::mark_node): Binfos may be marked. + (trees_{in,out}::start): Binfos may be streamed. + (trees_{in,out}::core_vals): Likewise. + (trees_{in,out}::tree_node): Reachable binfos may always be + inserted. + (trees_{in,out}::{read,write}_binfos): Delete. + (trees_out::mark_class_def): Mark the binfo heirarchy. + (trees_{in,out}::{read,write}_class_def): Stream binfos here. + +2019-05-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::mark_declaration): Add do_defn parm, mark + definition if set. Adjust callers. + (trees_out::mark_definition): Merge into mark_declaration. + + Merge trunk r271478. + + Merge trunk r271467. + +2019-05-20 Nathan Sidwell <nathan@acm.org> + + Merge trunk r271420. + +2019-05-17 Nathan Sidwell <nathan@acm.org> + + Merge trunk r271338. + + gcc/cp/ + * module.cc (trees_out::mark_class_member): Add do_defn parm. + Mark the definition. + (trees_out::mark_class_def): Adjust. + (depset::hash::find_dependencies, module_state::write_cluster): + Use mark_declaration. + + gcc/cp/ + * module.cc (trees_out::mark_node): Drop OUTERMOST parm. Don't + consider templateness. + (trees_out::mark_declaration): New. + (trees_out::mark_class_member): New. + (trees_out::mark_class_def): Use mark_class_member. + (depset::hash::find_dependencies): Adjust. + (module_state::write_cluster): Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms): Rename to ... + (trees_{in,out}::tpl_headr): ... here. Stream the whole parms. + (trees_out::tree_type): Assert no surprising + TEMPLATE_TEMPLATE_PARM. + (trees_{in,out}::tree_value): Stream template template parms. + +2019-05-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (dumper::operator ()): Add null check. + (trees_out::mark_node): Permit fixed nodes. + (trees_out::tree_decl, trees_in::tree_node): More anon. + * name-lookup.c (mark_pending_on_decl): Fix field marking thinko. + (lookup_by_ident): Lookup anon. + (get_lookup_ident): Likewise. + gcc/testsuite/ + * g++.dg/modules/anon-1_[abc].C: New. + +2019-05-15 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::DB_HIDDEN_BIT): New, add accessors. + (depset::hash::add_binding): Set hidden binding bit. + (binding_cmp): Adjust hidden. + (enum ct_bind_flags): New. + (module_state::{read,write}_cluster): Reimplement binding flag + streaming. + * name-lookup.c (name_lookup::adl_namespace_fns): Skip hidden. + gcc/testsuite/ + * g++.dg/modules/friend-2_[ab].C: New. + +2019-05-14 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_in::tree_value): New, broken out of ... + (trees_in::tree_node): ... here. Call it. + (trees_{in,out}::lang_type_vals): Don't stream befriending classes. + gcc/testsuite/ + * g++.dg/modules/friend-1_[abc].C: New. + + Cleanup merging, friend streaming. + gcc/cp/ + * module.cc (trees_{in,out}::tree_mergeable): Reimplement. + (trees_out::tree_value): Significant adjustment. + (trees_in::tree_node): Likewise. + (trees_{in,out}::tree_node_specific): Move into ... + (trees_{in,out}::tree_node_bools): ... here. + (trees_out::mark_mergeable): Delete. + (trees_{in,out}::insert): Adjust. + (trees_{in,out}::lang_vals): New, broken out of ... + (trees_node_vals): ... here. Call them. + (trees_out::ref_node): Process mergeable cases. + (trees_{in,out}::tpl_parms): Adjust. + (trees_{in,out}::{read,write}_class_def): Stream and connect + friend lists. + (binding_cmp): Order hidden decls. + (module_state::write_cluster): Adjust mergeable streaming. + (module_State::read_cluster): Hide hidden overloads. + * name-lookup.c (extract_module_binding): Don't skip hidden. + gcc/testsuite/ + * g++.dg/modules/builtin-1_a.C: Adjust scans. + * g++.dg/modules/class-3_b.C: Likewise. + * g++.dg/modules/indirect-[24]_[bc].C: Likewise. + * g++.dg/modules/inst-[123]_[bcd].C: Likewise. + +2019-05-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl.c (duplicate_decls): Don't check moduleness on friend decl. + * pt.c (tsubst_friend_function): Set module ownership. + + gcc/cp/ + * module.cc (trees_{in,out}::{read,write}_function_def): Serialize + FRIEND_CONTEXT. + (trees_{in,out}::{read,write}_class_def): Reattach befriending classes. + + gcc/cp/ + * decl.c (duplicate_decls): Check and adjust anticipated builtin + decls. + * friend.c (do_friend): Set module ownership. + * module.cc (trees_{in,out}::lang_decl_vals): Conditionally stream + context and befriending classes. + * name-lookup.c (init_global_partition): Header unit uses global + slot. + * parser.c (cp_parser_template_declaration): Conditionalize export + warning. + + Partial specializations! + gcc/cp/ + * module.cc (trees_out::tree_mergeable): Correct finding of + general template. + (trees_in::tree_mergeable): Recover a merged partial + specialization. + (depset::hash::add_specializations): Deal with partial + specializations. + (enum ct_decl_flags): New. + (module_state::write_cluster): Set specialization flags. + (module_state::read_cluster): Install specializations. + (install_specialization): New. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-5_[ab].C: New. + +2019-05-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_[bc].C: Adjust module dump scans. + * g++.dg/modules/inst-[1234]_[ab].C: Likewise. + * g++.dg/modules/vmort-2_c.C: Likewise. + + Atomically mark template's DECL_TEMPLATE_RESULT, IMPLICIT_TYPEDEF's type + gcc/cp/ + * module.cc (enum tree_tag): Replace + tt_{primary,secondary}_type with tt_typedef. + (trees_out::mark_node): Mark the template_decl. + (trees_out::maybe_insert_typeof): Delete. + (trees_out::tree_decl): Stream the template_decl, name implicit + templates. Always mark result & type. + (trees_out::tree_type): Simplify implicit_typedef streaming. + (trees_out::tree_value): Assert correct ordering. + (trees_in::tree_node): Adjust tt switch. Insert result & type. + (module_state::{read,write}_cluster): Always add voldemort's type. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust module dump scans. + * g++.dg/modules/indirect-[234]_[bc].C: Likewise. + * g++.dg/modules/inst-[234]_[ab].C: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + * g++.dg/modules/using-4_a.C: Likewise. + +2019-05-07 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/template/pr39425.C: Adjust errors. + * g++.old-deja/g++.pt/spec20.C: Adjust errors. + + Merge trunk r270943. + +2019-05-06 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * include/mkdeps.h: Rename struct mrules to struct mkdeps. + * mkdeps.c: Likewise. + * include/cpplib.h (cpp_get_deps): Rename return type.. + * directives.c (cpp_get_deps): Likewise. + * internal.h (struct cpp_reader): Rename deps field type. + gcc/cp/ + * cp-tree.h (module_preprocess): Adjust first arg type. + * module.cc: Rename mrules to mkdeps. + * lex.c (module_preprocess_token): Rename mrules->mkdeps. + gcc/c-family/ + * c-opts.c (handle_defered_opts): Rename struct deps to struc mkdeps. + + gcc/cp/ + * module.cc (enum tree_tag): Delete tt_builtin. + (trees_out::tree_decl): Builtins are merely GMF entities. + (tree_in::tree_node): Delete tt_builtin handling. + * name-lookup.c (init_global_partition): New. + (get_fixed_binding_slot): Populate global & partition slots. + gcc/testsuite/ + * g++.dg/modules/builtin-1_[ab].C: Adjust scans. + * g++.dg/modules/by-name-1.C: Likewise. + + gcc/cp/ + * cp-tree.h (global_purview_p): New. + (module_header_p): Rename to ... + (header_module_p): ... this. + (named_module_p): New. Replace ... + (module_not_header_p): ... this. + (module_global_p): ... delete. + * module.cc (trees_out::tree_mergeable, module_state::write) + (module_cpp_undef, finish_module_processing): Adjust. + * name-lookup.c (get_fixed_binding_slot, record_mergeable_decl) + (check_module_override, make_namespace): Adjust. + * parser.c (cp_parser_translation_unit, cp_parser_module_name): Adjust. + +2019-05-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (spec_entry): Moved from pt.c. + (walk_specializations): Declare. + (get_specializations_for_module): Delete. + * module.cc (depset): Add DB_FIRST_BIT. + (depset::{is,set}_first_dep_repurposed): New. + (depset::{,tarjan::}connect): Drop for_mergeable parm, use + is_first_dep_repurposed instead. + (spec_tuple): New. + (specialization_add): New. + (specialization_cmp): Adjust. + (depset::hash::add_specializations): Reimplement. + (depset::hash::add_mergable): Set set_first_dep_repurposed. + (module_state::sort_mergeables): Adjust. + (module_state::write): Likewise. + * pt.c (spec_entry): Move to cp-tree.h + (get_specializations, get_specializations_for_module): Replace + with ... + (walk_specializations): ... this. + gcc/testsuite/ + * g++.dg/modules/inst-1_b.C: Adjust scans. + +2019-05-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset): Add DB_PARTIAL_BIT, + is_partial_specialization, set_implicit_specialization. + (depset::hash::add_dependency): Drop is_implicit parm. Return the + depset. + (trees_out::tree_decl): Set the implicit bit myself. + (depset::hash::add_specializations): Preliminary tweak. + + gcc/cp/ + * pt.c (get_specializations): Adjust type template checking. + (get_specializations_for_module): Get the type specializations + too. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-4_[ab].C: New. + + gcc/cp/ + * module.cc (set_module_owner): Deal with specializations. + * name-lookup.c (mark_pending_on_decl): Walk class members. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-3_[ab].C: New. + + gcc/cp/ + * parser.c (cp_parser_explicit_specialization): Correctl unwind state. + * decl.c (grokfndecl): Set module ownership after specializationness + is known. + + libcpp/ + * macro.c (_cpp_new_macro): memset before initing. + + gcc/cp/ + * module.cc (module_state::write_bindings): Iterate over sccs + array, not hash table. + (module_state::write): Adjust. + + libcpp/ + * macro.c (_cpp_new_macro): Initialize imported field. + + Merge trunk r270765. + +2019-04-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (module_normal_import_p): Declare. + * module.cc (module_normal_import_p): New. + * name-lookup.c (note_pending_specializations): Note already + loaded normal imports. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-2_d.C: New + + gcc/testsuite/ + * tpl-spec-2_[abc].C: New. + + Namespace-scope function specializations. + gcc/cp/ + * cp-tree.h (MODULE_VECTOR_LAZY_{PARTITION,GLOBAL}_SPEC_P): + Delete. + * module.cc (struct specset): New. + (module_for_unnamed): New. + (lazy_load_specializations): New. + (module_state::{read,write}_unnamed): Register the + specializations. + ({init,finish}_module_processing): Adjust. + * name-lookup.c (mark_pending_on_decl, mark_pending_on_binding): + New. + (set_module_binding): If pending, mark the new decls. + (note_pending_specializations, note_loaded_specializations): New + * name-lookup.h (note_pending_specializations) + (note_loaded_specializations): Declare. + gcc/testsuite/ + * g++.dg/modules/tpl-spec-1_[ab].C: New. + +2019-04-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (MODULE_VECTOR_LAZY_SPEC_P) + (MODULE_VECTOR_LAZY_GLOBAL_SPEC_P) + (MODULE_VECTOR_LAZY_PARTITION_SPEC_P): New. + * module.cc (struct unnamed_entity): New. + (unnamed_ary): Array of unnamed_entity. + (module_state::write_cluster): Return void. + (module_state::{read,write}_unnamed): Deal with specializations. + (module_State::{read,write}_specializations): Delete. + (module_state::read_cluster): Adjust. + (module_state_config): Drop specialization count. + (module_state::{read,write}_config): Adjust. + (module_state::{read,write}): Drop specialization streaming. + + Merge trunk r270644. (GCC 10) + + gcc/cp/ + * modules.cc (depset::hash::add_depednency): More STRIP_TEMPLATE. + +2019-04-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (get_specializations_for_module): Declare. + * module.cc (depset): Add DB_IMPLICIT_BIT, + is_implicit_specialization. + (depset::hash::add_dependency): Add is_implicit arg. Allow NULL + current. Set is_imolicit_specialization. + (module_state::write_specializations): Implement. + (trees_out::tree_decl): Stream specializations. + (specialization_cmp): New. + (depset::hash::add_specializations): New. + (module_state::write_cluster): Count specializations. + (module_state::write): Add and stream specializations. + * pt.c (spec_hash_table): New typedef. Use it. + (get_specializations): New. + (get_specializations_for_module): New. + +2019-04-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (DECL_TEMPLATE_LAZY_SPECIALIZATIONS_P): New. + (lazy_load_specializations): Declare. + * module.cc (module_state::{read,write}_specializations): New. + (module_state::write_cluster) Return template count. + (module_state_config): Add num_specializations. + (module_state::{read,write}_config): Stream it. + (module_state::{read,write}): Stream spcializizations. + (lazy_load_specializations): New. + * pt.c (lookup_template_class_1, instantiate_template_1): Lazy + load specializations. + + Merge trunk r270543. + + Instantiations now streamed. + gcc/cp/ + * module.cc (tree_tag): Delete tt_inst. + (trees_out::tree_decl): All instantiations are depended. Never + tt_inst. + (trees_in::tree_node): Delete tt_inst handling. + (trees_in::tree_mergeable): Deal with type specializations. + * pt.c (lookup_template_class_1): Set instatiation owner to + current TU. + (match_mergable): Accept type. + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_[bc].C: Adjust scans. + * g++.dg/modules/inst-[34]_[bc].C: New. + +2019-04-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (module_name): New overload. + * module.cc (dumper::impl::nested_name): Adjust module dump. + (module_name): New. + * error.c (dump_module_suffix): Dump for namespace-scope decl. + (dump_aggr_type): Dump module suffix. + gcc/testsuite/ + * g++.dg/modules/adhoc-1_b.C: Adjust regexps. + * g++.dg/modules/err-1_[cd].C: Likewise. + * g++.dg/modules/macloc-1_[cd].C: Likewise + * g++.dg/modules/by-name-1.C: Adjust scans. + * g++.dg/modules/class-3_[bd].C: Likewise. + * g++.dg/modules/enum-1_a.C: Likewise. + * g++.dg/modules/global-[23]_a.C: Likewise. + * g++.dg/modules/indirect-[1234]_[bc].C: Likewise. + * g++.dg/modules/inst-[12]_[ab].C: Likewise. + * g++.dg/modules/part-3_c.C: Likewise. + * g++.dg/modules/scc-1.C: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + * g++.dg/modules/using-4_a.C: Likewise. + * g++.dg/modules/vmort-2_[abc].C: Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::tree_mergeable): Stream more for + specializations. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Don't stream template + instantiations. + (trees_{in,out}::tree_mergeable): Refactor. + (module_state::prepare_locations): Fix dumper. + + gcc/cp/ + * Make-lang.in: Wedge revision number into REVISISON_s. + + Function instantiation merging + gcc/cp/ + * cp-tree.h (get_module_owner): Add tpl_owner parm. + (match_mergeable_specialization): New. + * mangle.c (maybe_write_module): Look through template + instantiations. + * method.c (implicitly_declare_fn): Do not set owner here. + * module.cc (trees_out::tree_decl): Namespace-scope function + instantiations are merged. + (trees_in::tree_node): Likewise. + (trees_{in,out}::tree_mergeable): Allow instantiation merging. + (depset::hash::add_dependency): Specializations are unnameable. + (module_state::write_cluster): Seed specializations too. + (module_state::read_define): Fix size_t/unsigned mismatch. + (module_visible_instantiation_path): Use TYPE_STUB_DECL. + (get_module_owner): Add inst_owner_p arg. Look through + instantiation, or don't. + * pt.c (instantiate_template_1): Set module owner here. + (instantiate_decl): ... not here. + (match_mergeable_decl): New. + gcc/testsuite/ + * lib/scanlang.exp (scan-lang-dump-times): New. Cut-paste fu! + * g++.dg/modules/inst-[12]_[ab].C: New. + * g++.dg/modules/adl-1_c.C: Comment. + * g++.dg/modules/indirect[234]_[bc].C: Adjust. + +2019-04-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * Make-lang.in (MODULE_REVISION): New. + * module.cc (dumper::impl::nested_name): Print module number. + (module_state::write_readme): Write revision. + gcc/testsuite/ + * g++.dg/modules/by-name-1.C: Adjust scans. + * g++.dg/modules/class-3_[bd].C: Likewise. + * g++.dg/modules/enum-1_a.C: Likewise. + * g++.dg/modules/global-[23]_a.C: Likewise. + * g++.dg/modules/indirect-[1234]_[bc].C: Likewise. + * g++.dg/modules/part-3_c.C: Likewise. + * g++.dg/modules/scc-1.C: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + * g++.dg/modules/using-4_a.C: Likewise. + * g++.dg/modules/vmort-2_[abc].C: Likewise. + + gcc/cp/ + * module.cc (dumper::impl::nested_name): Remove namespace owner + fiddling. + * name-lookup.c (make_namespace): Don't set owner. Adjust callers. + + Ownership only on namespace-scope. + gcc/cp/ + * module.cc (dumper::impl::nested_name): Show decl's ownership. + (trees_out::tree_decl): Remove unnecessary unnameable code. + (depset::hash::add_dependency): Add is_import parm. + (module_state::write_clister): Get owner decl of unnamed. + (get_module_owner): Always look at the namespace-scope entity. + (set_module_owner): Only set namespace-scope entity. + (set_implicit_module_owner): Likewise. + gcc/testsuite/ + * g++.dg/modules/by-name-1.C: Adjust scans. + * g++.dg/modules/class-3_[bd].C: Likewise. + * g++.dg/modules/enum-1_a.C: Likewise. + * g++.dg/modules/global-[23]_a.C: Likewise. + * g++.dg/modules/indirect-[1234]_[bc].C: Likewise. + * g++.dg/modules/part-3_c.C: Likewise. + * g++.dg/modules/scc-1.C: Likewise. + * g++.dg/modules/stdio-1_a.H: Likewise. + * g++.dg/modules/using-4_a.C: Likewise. + * g++.dg/modules/vmort-2_[abc].C: Likewise. + +2019-04-11 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * mangle.c (decl_is_template_id): Rename to ... + (maybe_template_info): ... here. Simplify API. + (mangle_return_type, write_encoding, write_name) + (write_nested_name, write_prefix, write_template_prefix) + (write_unqualified_name): Update all callers. + + gcc/cp/ + * module.cc (module_for_{ordinary,macro}_loc): New. + (module_state::{read,write}_location): Deal with imported locations. + + gcc/cp/ + * module.cc (depset::entity_kind_name): Tweak. + (trees_{in,out}::tree_mergeable): Frob context. + * name-lookup.h (match_mergeable_decl): Pass context explicitly. + * name-lookup.c (match_mergeable_decl): Pass context explicitly. + gcc/testsuite/ + * g++.dg/modules/global-[23]_a.C: Adjust scans. + * g++.dg/modules/stdio-1_a.H: Likewise. + + gcc/cp/ + * module.cc (loc_kind): New. + (module_state::{read,write}_location): Use tagging, compress macro + & adhoc better. + + gcc/cp/ + * module.cc (loc_spans): Main span is all but reserved. + (slurping): Drop pre_early_ok. + (loc_spans::init): Don't push command line and forced header + spans. + (loc_spans::macro): Fix comparison thinko. + (module_state::read_location): No such thing as early. + (module_state::prepare_locations): Drop command line and forced + header handling. + (maybe_add_macro): Ignore lazy macros. + (canonicalize_header_name): Return the buffer. + gcc/testsuite/ + * g++.dg/modules/macro-5_c.C: Adjust regexp. + +2019-04-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_preprocess): Module partitions always produce + a BMI. + gcc/testsuite/ + * g++.dg/modules/dep-2.C: New. + + gcc/cp/ + * module.cc (module_state::write_cluster): Remove unnecessary + check & FIXME. + + gcc/cp/ + * module.cc (trees_out::depending_p): Delete. + (trees_out::tree_decl): Refactor asserts. + (module_state::write_cluster): Refactor initial scan. + + libcpp/ + * mkdeps.c (deps_add_module): Swap primary & module args. Too + confusing. + gcc/cp/ + * module.cc (module_state::do_import, module_preprocess) + (finish_module_processing): Adjust. + +2019-04-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (slurping): Move {ordinary,macro}_locs to .. + (module_state): ... here. + (module_state::read_location): Adjust. + (module_state::read_locations): Adjust, recorded locations are for + current TU. + + gcc/cp/ + * module.cc (get_module): Add parent option, use it. + (module_state::read_{imports,partitions}): Adjust. + (finish_module_processing): Show full module name on error. + gcc/testsuite/ + * g++.dg/modules/ben-1{_[ab].C,.map}: New. + * g++.dg/modules/alias-1_f.C: Use [srcdir]. + * g++.dg/modules/gc-2_a.C: Likewise. + * g++.dg/modules/inc-xlate-1_d.C: Likewise. + * g++.dg/modules/legacy-6_[cdef].C: Likewise. + * g++.dg/modules/map-1_[ab].C: Likewise. + + gcc/cp/ + * module.cc (depset::is_imported_entity): New. + (module_for_unnamed): Delete. + (depset::hash::add_dependency): Note imported dependencies. + (module_state::{read,write}_cluster): Deal with imported unnamed. + (module_state::write): Skip imported dependencies. + gcc/testsuite/ + * g++.dg/modules/vmort-2_[abc].C: New. + + libcpp/ + * mkdeps (munge): Quote ':'. + (deps_add_module): Correct partion/module order. + (make_write): Add .c++m suffix to module name. + gcc/testsuite/ + * g++.dg/modules/dep-1_[ab].C: New. + + libcpp/ + * mkdeps (mkrules::~mkrules): Use free appropriately. + + gcc/ + * doc/invoke.texi (C++ Module Mapper): Fix markup. + + gcc/cp/ + * cp-tree.h (language_function): Remove x_auto_return_pattern. + (current_function_auto_return_pattern): Delete. + (FNDECL_USED_AUTO): Correct documentation. + * decl.c (save_function_data): Delete. + (fndecl_declared_return_type): Don't look at language_function. + (start_preparsed_function): Replace + current_function_auto_return_pattern with + DECL_SAVED_AUTO_RETURN_TYPE. + (finish_function): Likewise. + * mangle.c (write_unqualified_name): Likewise. + * parser.c (cp_parser_jump_statement): Likewise. + * typeck.c (check_return_expr): Likewise. + +2019-04-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (unnamed_ary, unnamed_map_t, unnamed_map): New. + (struct slurping): Delete unnamed, alloc_unnamed, & deletion of + same. + (struct moduls_state): Add unnamed_lwm, unnamed_num. + (module_for_unnamed): New. + (dumper::impl::nested_name): More informative unnamedness. + (module_state::read_cluster): Use the unnamed_ary. + (module_state::read_unnamed): Populate unnamed_ary. + ({init,finish}_module_processing): Adjust. + gcc/testsuite/ + * g++.dg/modules/indirect-4_[bc].C: Adjust scans. + + gcc/cp + * cp-tree.h (struc mc_slot): Move to ... + * name-lookup.h: ... here. + * module.c (depset::hash::{add_mergeable,connect}): Use depsets + not decls. + (depset::tarjan::connect): Add for_mergeables parm. + (tree_node::{mark,tree}_mergeable): Likewise. + (module_state::sort_mergeables): Likewise, + (module_state::{read,write}_bindings): Return/expect number of + bindings. + (module_state::write_macros): Return number of macros. + (module_state::write_cluster): Adjust. + (module_state::{read,write}_config): Adjust. + (module_state::{read,write}): Adjust. + +2019-04-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (dumper): Add CLUSTER. + (module_state::write): Dump cluster information. + + gcc/cp/ + * module.cc (node_template_info): Move earlier, protect from + partial read in. + (dumper::impl::nested_name): Dump template args. + gcc/testsuite/ + * g++.dg/modules/indirect-[234]_[abc].C: Adjust scans. + + gcc/cp/ + * module.cc (module_state::write_cluster): Refactor. + + gcc/cp/ + * module.cc (cluster_tag): Remove ct_defn. + (module_state::{read,write}_cluster): Definitions marked via flag. + + gcc/cp/ + * module.cc (depset::hash): Rename mergeables flag to mergeable_dep. + +2019-04-02 Nathan Sidwell <nathan@acm.org> + + Allow mapper protocol of file descriptors. + gcc/ + * doc/invoke.texi (C++ Module Mapper): Document <> form. + gcc/cp/ + * module.cc (module_mapper::module_mapper): Parse <> option. + + Write bmi /after/ deferred instantiations. + gcc/cp/ + * cp-tree.h (finish_module_processing): Add cpp arg. + (finish_module_parse): Delete. + * name-lookup.h (lookup_by_type): Declare. + * decl2.c (c_parse_final_cleanups): Adjust. + * module.c (tree_tag): Add tt_builtin. + (trees_out::tree_decl): Use tt_builtin for builtins. + (trees_in::tree_node): Likewise. + (finish_module_parse): Move processing into ... + (finish_module_processing): ... here. + * name-lookup.c (lookup_by_type): New. + gcc/testsuite/ + * g++.dg/modules/builtin-1_[ab].C: New. + + gcc/cp/ + * module.cc (depset): Add EK_UNNAMED. Delete DB_IS_UNNAMED_BIT, + is_unnamed accessor. + (depset::hash::add_dependency): Add entity_kind arg, simplify + logic. Update callers. + gcc/testsuite/ + * g++.dg/modules/using-4_a.C: Adjust scan. + +2019-04-02 Ben Boeckel <ben.boeckel@kitware.com> + Nathan Sidwell <nathan@acm.org> + + libcpp/ + * mkdeps.c (mrules): Rename is_legacy to is_header_init, adjust uses. + (deps_add_module): Correctly duplicate and use strings. + +2019-04-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::add_dependency): Drop maybe_using arg. + Adjust callers. + (dumper::operator()): Overloads have a name. + (has_definition): Adjust. + +2019-04-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset): Move flags into discriminator field. Adjust uses. + + gcc/cp/ + * module.cc (depset): Replace key wih entity/discriminator tuple. + Add entity_kind and disc_bits enums. Adjust hashing & + construction routines. + + gcc/cp/ + * module.cc (depset): Entity keying uses unique entity. Set + entity kind later. + (depset::hash): Adjust hashing. + (depset::hash::add_dependency): Set kind after insertion. + (depset::hash::add_mergeable): Adjust. + gcc/ + * doc/invoke.texi: Fix module mapper thinko. + +2019-03-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (saved_scope): Remove this_module field. + (current_module): Delete. + (module_import_bitmap): Rename to ... + (get_import_bitmap): ... here. Lose arg. + * module.cc (module_import_bitmap): Rename to ... + (get_import_bitmap): ... here. Lose arg. + * name-lookup.c (name_lookup::search_namespace_only): Adjust. + (check_module_override, finish_nonmember_using_decl): Likewise. + (do_push_to_top_level): Drop this_module field init. + +2019-03-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * pt.c: Comment some structures. + + gcc/ + * doc/invoke.texi (C++ Modules): Update. + + Merge trunk r269975. + +2019-03-27 Nathan Sidwell <nathan@acm.org> + + Header unit compilations retrofit includeness. + gcc/cp/ + * cxx-mapper.c (module2bmi): Don't use PCH suffix. + * module.cc (module_header_macro, controlling_node): Delete. + (module_state::write_macros): Rely on cpp to determine controlling + macro. + (module_state::{write,read}): Likewise. + (module_begin_main_file): Retrofit as a header. + (finish_module_parse): Delete header_macro stuff. + libcpp/ + * files.c (_cpp_stack_file): Set main_file. + (_cpp_find_header_unit): Close the file. + (cpp_retrofit_as_include): New. + (cpp_main_controlling_macro): New. + * include/cpplib.h (cpp_retrofit_as_include): Declare. + (cpp_main_controlling_macro): Declare. + * internal.h (struct cpp_buffer): Add main_file flag. + (cpp_in_primary_file): Use it. + gcc/testsuite/ + * g++.dg/modules/{,sys/}inext-1.H: New. + * g++.dg/modules/macro-[23]_[abc].[CH]: Adjust. + * g++.dg/modules/modules.exp (dg-module-bmi): Adjust. + * g++.dg/modules/stdio-1_a.H: Asjust. + + Expunge header name quoting in mapper + gcc/cp/ + * cxx-mapper.cc (IS_HEADER_NAME): New. + (module2bmi): Adjust. + * module.cc (module_mapper::imex_query): Drop quotes. + (module_mapper::translate_include): Likewise. + gcc/testsuite/ + * g++.dg/modules/modules.exp (dg-module-bmi): Adjust mapping. + + Header unit names lack quotes + gcc/c-family/ + * c.opt (fmodule-header): Set a var. + * cp-tree.h (module_map_header): Pass string as ptr/len tuple. + * lex.c (module_map_header): Move to module.cc. + (module_process_token): Remove gratuitous representation frobbing. + * module.cc (module_state::module_state): Assert no quotes. + (module_header_name): Delete. + (get_module): Detect header via pathism. + (module_mapper::imex_query): Add quotes. + (module_mapper::translate_include): Drop reader parms, don't push + buffer here. + (canonicalize_header_name): New, from lex.c. + (module_map_header): Wrapper for canonicalize_header_name. + (module_translate_include): Do buffer pushing here. Canonicalize + name. + (set_module_header_name): Delete. + (module_begin_main_file): Simplify header name setting. + (handle_module_option): Adjust header name flag setting. + * parser.c (cp_lexer_tokenize): Adjust header name mapping. + libcpp/ + * lex.c (cpp_output_token): Add quotes back onto CPP_HEADER_NAME. + gcc/testsuite/ + * g++.dg/modules/alias-3_[bc].C: Adjust. + * g++.dg/modules/leg-merge-4_c.C: Adjust. + * g++.dg/modules/macro-[2456]_[bcde].C: Adjust. + * g++.dg/modules/stdio-1_b.C: : Adjust. + * g++.dg/modules/sys: Add. + + Header unit names are strings + gcc/cp/ + * lex.c (module_map_header): Build string_cst. + (module_preprocess_token): Adjust. + * module.cc (module_state::module_state): Header names are + strings. + (module_name_hash): New. + (module_state_hash::{hash,equal}): Adjust. + (dumper::impl::nested_name): Fix string_cst. + (get_module): Tweak. + (module_state::set_flatname): Tweak. + (module_begin_main_file): Build string. + +2019-03-26 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-opts.c (c_common_post_options): Invert sense of + cpp_read_main_file arg. + * parser.c (cp_parser_translation_unit): Reject include + translation in module purview. + libcpp/ + * files.c (_cpp_stack_file): Take include type parm. Drop line + parm. Do line-table adjusting here ... + (_cpp_stack_include): ... not here. + * include/cpplib.h (cpp_read_main_file): Invert final parm. + * init.c (cpp_read_main_file): Adjust. + * internal.h (include_type): Add more enumerations, and document. + (_cpp_stack_file): Adjust prototype. + gcc/testsuite/ + * g++.dg/modules/alias-2_[ab].[CH]: New. + * g++.dg/modules/exp-xlate-1_[ab].[CH]: New. + * g++.dg/modules/legacy-3_c.H: Robustify testing. + + Header units disambiguated by originating header path + libcpp/ + gcc/ + * doc/invoke.texi (-fmodule-header): Adjust. + * langhooks.h (struct lang_hooks): Adjust preprocess hook. + gcc/cp/ + * cp-tree.h (module_preprocess_token): Adjust. + (module_map_header): Declare. + (module_translate_include): Adjust. + * cxx-mapper.cc (module2bmi): Header units map to relative path. + (client::action): Look for header bmi. + * lex.c (module_map_header): New. + (module_preprocess_token): Remap header unit names. + * module.cc (create_dirs): Fix. + (module_mapper::translate_include): Adjust. + (module_translate_include): Likewise. + (finish_module_parse): Fix directory creation. + (handle_module_option): Remove fmodule-header=FOO handling. + * parser.c (cp_lexer_tokenize): Remap header unit names. + gcc/c-family/ + * c-lex.c (c_lex_with_flags): Build a string for header names. + * c-ppoutput.c (scan_translation_unit): Allow preprocess hook to + nadger token. + * c.opt (fmodule-header=): Deprecate. + libcpp/ + * directives.c (do_include_common): Move include translation to ... + * files.c (_cpp_file): Add header_unit field. + (should_stack_file): Break into ... + (is_known_idempotent_file): ... this, and ... + (has_unique_contents): ... this. + (_cpp_stack_file): ... do include translation. + (cpp_find_header_unit): New. + * include/cpplib.h (cpp_callbacks): Adjust translate_include hook. + (cpp_find_header_unit): Declare. + gcc/testsuite/ + * g++.dg/modules/: Many changes. + +2019-03-21 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * files.c (struct _cpp_file): Make bools bitfields, add + header_unit flag. + (_cpp_find_file): Don't write for (; !fake;) to mean if (!fake) + for (;;). + (_cpp_stack_file): Refactor. + + Merge trunk r269839. + + gcc/ + * gcc.c (execute): Use . not (.). + * params.def (PARAM_LAZY_MODULES): Add trailing . + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Adjust collect regexp. + + gcc/ + * gcc.c (execute): Frob argv[0] to show spawning from driver. + (process_command): Don't check input file exists here. + +2019-03-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::mark_class_def): Skip friends in decl_list. + + gcc/cp/ + * module.cc (module_state::read_namespaces): Module-linkage + namespaces are visible in the module itself. + * name-lookup.h (add_imported_namespace): Rename parm. + * name-lookup.c (add_imported_namespace): Export_p becomes visible_p. + gcc/testsuite/ + * g++.dg/modules/enum-3_[ab].C: New. + + Enum members of templates part 2. + gcc/cp/ + * module.cc (trees_out::tree_node): Any enum can be tt_enum_int. + (trees_out::mark_enum_def): Only mark integer_cst inits. + gcc/testsuite/ + * g++.dg/modues/enum-2_[ab].C: Add. + + Enum members of templates part 1. + gcc/cp/ + * class.c (maybe_add_class_template_decl): No need to add + CONST_DECLs. + * pt.c (instantiate_class_template_1): CONST_DECLs are not on the + template decl list no more. + * module.cc (node_template_info): Cope with enum members of + templates. + (trees_in::insert): Allow null when failing. + (trees_{in,out}::core_vals): Uninstantiated enums have no + underlying type. + (trees_out::tree_decl): Enums can be members too. + (trees_out::write_class_def): Only announce when streaming. + (trees_out::mark_class_def): Don't mark const_decl fields. + (trees_out::mark_enum_def): Always mark the enum here. + gcc/testsuite. + * g++.dg/modules/enum-2_[ab].C: New. + +2019-03-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::find_dependencies): It might be a fixed + tree. + gcc/testsuite/ + * g++.dg/modules/stdns_[ab].C: New. + + Using decls part 3. + gcc/cp/ + * cp-tree.h (ovl_iterator::exporting_p): Simplify. + * name-lookup.c (do_nonmember_using_decl): Upgrade export in place. + gcc/testsuite/ + * g++.dg/modules/using-4_[ab].C: New. + + gcc/testsuite/ + * g++.dg/modules/using-3.C: New. + + Using decls part 2. + gcc/cp/ + * cp-tree.h (OVL_EXPORT_P): New. + (ovl_iterator::exporting_p): New. + (ovl_insert): Change using_p arg type. + * tree.c (ovl_insert): USINGNESS parm conveys exporting too. + * name-lookup.c (do_nonmember_using_decl): Deal with exports. + * module.cc (binding_cmp): Sort usings too. + (module_state::{read,write}_cluster): Using decls too. + gcc/testsuite/ + * g++.dg/modules/using-2_[abc].C: New. + + gcc/cp/ + * name-lookup.c (do_nonmember_using_decl): Cleanups. + (finish_nonmember_using_decl): Likewise. + +2019-03-18 Nathan Sidwell <nathan@acm.org> + + Using decls part 1. + gcc/cp/ + * name-lookup.c (do_nonmember_using_decl): Unnest if. + (finish_nonmember_using_decl): Deal with module vector. + gcc/testsuite/ + * g++.dg/modules/global-3_[ab].C: New. + + gcc/cp/ + * module.cc (module_state::{read,write}_locations): Cope with + trailing empty expansions. + + gcc/cp/ + * module.cc (module_state::{read,write}_locations): Macro maps can + have embedded zeroes. + + gcc/cp/ + * name-lookup.c (do_nonmember_using_decl): Add install & fn_scope + args. + (finish_nonmember_using_decl): Adjust, prep for modules. + gcc/testsuite/ + * g++.dg/lookup/using53.C: Restore & extend DR36 errors. + +2019-03-15 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (do_nonmember_using_decl): Have lookup passed in. + (validate_nonmember_using_decl): Delete. Absorb + into ... + (finish_nonmember_using_decl): ... here. Do lookup once. + lookup_enum_member): New. Broken out of ... + (get_binding_or_decl): ... here. Call it. + (finish_nonmember_using_decl): Drop LOOKUP parm. Do lookup here. + gcc/testsuite/ + * g++.dg/cpp0x/using-enum-2.C: Adjust diagnostics. + * g++.dg/cpp0x/using-enum-3.C: Likewise. + * g++.dg/lookup/hidden-class9.C: Likewise. + * g++.dg/lookup/hidden-temp-class11.C: Likewise. + libstdc++-v3/ + * testsuite/18_support/byte/global_neg.cc: Adjust diagnostics. + * testsuite/20_util/headers/type_traits/types_std_c++0x_neg.cc: Likewise. + * testsuite/26_numerics/headers/cmath/types_std_c++0x_neg.cc: Likewise. + * testsuite/27_io/headers/cstdio/functions_neg.cc: Likewise. + * testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc: Likewise. + * testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc: Likewise. + + gcc/cp/ + * name-lookup.h (finish_nonmember_using_decl): Drop LOOKUP parm. + * name-lookup.c (lookup_enum_member): New. Broken out of ... + (get_binding_or_decl): ... here. Call it. + (finish_nonmember_using_decl): Drop LOOKUP parm. Do lookup here. + * parser.c (cp_parser_using_declaration): Adjust. + * pt.c (tsubst_expr): Likewise. + gcc/testsuite/ + * g++.dg/lookup/hidden-class9.C: Adjust diagnostics. + * g++.dg/lookup/hidden-temp-class11.C: Likewise. + libcc1/ + * libcp1plugin.cc (plugin_add_using_decl): Adjust + finish_nonmember_using_decl call. + libstdc++-v3/ + * testsuite/18_support/byte/global_neg.cc: Adjust diagnostics. + * testsuite/20_util/headers/type_traits/types_std_c++0x_neg.cc: Likewise. + * testsuite/26_numerics/headers/cmath/types_std_c++0x_neg.cc: Likewise. + * testsuite/27_io/headers/cstdio/functions_neg.cc: Likewise. + * testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc: Likewise. + * testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc: Likewise. + + Merge using directive fields & fns. + gcc/cp/ + * cp-tree.h (lang_decl_ns): Drop usings field. + (DECL_NAMESPACE_USING): Delete. + * name-lookup.h (finish_using_directive): Declare. + (finish_namespace_using_directive) + (finish_local_using_directive): Delete. + * name-lookup.c (name_lookup::search_usings) + (name_lookup::queue_namespace): Adjust. + (has_using_namespace_std_directive_p): No need to search + namespaces separately. + (finish_using_directive): New. Merged from ... + (finish_namespace_using_directive, finish_local_using_directive): ... + here. Delete. + (push_namespace): Adjust. + * parser.c (cp_parser_using_directive): Call finish_using_directive. + * pt.c (tsubst_expr): Likewise, + libcc1/ + * libcp1plugin.cc (plugin_add_using_namespace): Call + finish_using_directive. + +2019-03-14 Nathan Sidwell <nathan@acm.org> + + Merge finish using decl fns + gcc/cp/ + * name-lookup.c (finish_nonmember_using_decl): New, merged from ... + (finish_namespace_using_decl, finish_local_using_decl): ... here. + Delete. + * name-lookup.h (finish_nonmember_using_decl): Declare + (finish_namespace_using_decl, finish_local_using_decl): Delete. + * parser.c (cp_parser_using_declaration): Adjust. + * pt.c (tsubst_expr): Likewise. + libcc1/ + * libcp1plugin.cc (plugin_add_using_decl): Likewise. + + Drop cp_binding_level::usings + gcc/cp/ + * name-lookup.h (cp_binding_level): Remove usings field. + * name-lookup.c (push_using_decl, push_using_decl_1): Delete. + (validate_nonmember_using_decl): Make using decl here. + + gcc/cp/ + * name-lookup.c (validate_nonmember_using_decl): Drop DR 36 case. + gcc/testsuite/ + * g++.dg/lookup/using53.C: Permit DR 36 case. + + Merge trunk r269682. + +2019-03-13 Nathan Sidwell <nathan@acm.org> + + Start doing something with using decls + gcc/cp/ + * cp-tree.h (ovl_iterator): Add get_using accessor. + * module.cc (depset::is_using): New. + (depset::hash::add_dependency): Add maybe_using parm. Use it. + (depset::hash::add_binding): Deal with using decls. + (depset::hash::find_dependencies): Likewise. + (cluster_cmp): Likewise. + (module_state::{read,write}_cluster): Likewise. + gcc/testsuite/ + * g++.dg/modules/using-1_[abc].C: New. + + stdio.h can be a legacy unit! + gcc/testsuite/ + * g++.dg/modules/stdio-1_[ab].[CH]: New. + * g++.dg/modules/global-2_[ab].C: New. + + typedef struct {} foo; part 2 + gcc/cp/ + * module.cc (tt_anon_decl): New. + (trees_out::tree_decl): Deal with anonymous decls. + (trees_out::tree_type): Use TYPE_STUB_DECL. + (trees_in::tree_node): Deal with tt_anon_decl. + * name-lookup.c (get_lookup_ident): Assert not anonymous. + gcc/testsuite/ + * g++.dg/modules/tdef-3_[ab].C: Extend. + * g++.dg/modules/tdef-3_c.C: New. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Refactor named decl streaming. + (trees_in::tree_node): Remove as_base special casing. + * name-lookup.c (lookup_by_ident, get_lookup_ident): Handle + as_base here. + +2019-03-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::tree_node): Refactor. + (module_state::write_cluster): Prefer non-anonymous name. + + typedef struct {} foo; part 1 + gcc/cp/ + * module.cc (trees_out::tree_value): Cope with name-for-linkage. + (trees_out::write_class_def): Likewise. + (depset::hash::add_dependency): Likewise. + gcc/testsuite/ + * g++.dg/modules/tdef-3_[ab].C: New. + + gcc/cp/ + * decl.c (fndecl_declared_return_type): Remove BMI FIXME. + * module.cc (trees_{in,out}::lang_decl_vals): Stream + saved_auto_return_type. + + gcc/cp/ + * tree.c (ovl_splice): Delete. + + Kill DECL_SAVED_FUNCTION_DATA part 1 + gcc/cp/ + * cp-tree.h (lang_decl_fn): Replace saved_language_function with + saved_auto_return type. + (DECL_SAVED_FUNCTION_DATA): Delete. + (DECL_SAVED_AUTO_RETURN_TYPE): New. + * decl.c (duplicate_decls, start_preparsed_function): Adjust. + (save_function_data): Only save auto return type. + (finish_function): Drop DECL_SAVED_FUNCTION_DATA member zapping. + (fndecl_declared_return_type): Adjust. + * method.c (make_thunk, make_alias_for): Adjust. + + gcc/cp/ + * module.cc (writable_cmp): New. + (depset::hash::add_writables): Sort the hash before inserting. + + gcc/cp/ + * decl.c (fndecl_declared_return_type): Extend BMI hack. + * module.cc (tt_anon_id, tt_lambda_id): New. + (trees_{in,out}::tree_node): Stream them. + gcc/ + * tree.c (make_anon_name): Drop format #. + +2019-03-11 Nathan Sidwell <nathan@acm.org> + + Anon entities never placed in symbol tables. + gcc/cp/ + * module.cc (depset::hash::add_binding): Assert not anonymous. + * name-lookup.c (pop_local_binding): Popping anonymous is a NOP. + (do_pushdecl): Pushing anonymous doesn't push to symbol table. + gcc/testsuite/ + * g++.dg/other/pr28114.C: Adjust errors. + + gcc/ + * tree.h (make_anon_name): Drop optional parm. + * tree.c (make_anon_name): Drop 'extra' parm. + gcc/cp/ + * cp-tree.h (TYPE_LAMBDA_P): New, require a type. + (LAMBDA_TYPE_P): Refactor. + (TYPE_ANON_P): New. + (TYPE_UNNAMED_P): Use it, reject lambdas. + * class.c (add_implicitly_declared_members): Replace LAMDBA_TYPE_P + with TYPE_LAMBDA_P. + (finalize_literal_type_property, explain_non_literal_class) + (check_bases_and_members, finish_struct) + (current_nonlambda_class_type, maybe_note_name_used_in_class): Likewise. + * constexpr.c (check_constexpr_bind_expr_vars): Likewise. + * decl.c (cp_finith_decomp, grokdeclarator): Likewise. + * lambda.c (begin_lambda_type): Don't clear IDENTIFIER_ANON_P. + (lambda_function): Replace LAMBDA_TYPE_P with TYPE_LAMBDA_P. + (current_lambda_expr, resolvable_dummy_lambda) + (nonlambda_method_basetype): Likewise. + * mangle.c (decl_mandling_context, write_unqualified_name): Likewise. + (write_local_name): Simplify anon check. + * method.c (synthesized_method_walk): Replace LAMBDA_TYPE_P with + TYPE_LAMBDA_P. + (maybe_explain_explicit_delete): Likewise. + * parser.c (cp_parser_simple_type_specifier) + (cp_parser_parameter_declaration_clause) + (cp_parser_parameter_declaration) + (synthesize_immplicit_template_parm): Likewise. + * pt.c (template_class_depth, check_for_bare_parameter_packes) + (push_templated_decl_real, lookup_template_class_1) + (instantiate_class_template_1, tsubst_expr) + (tsubst_copy_and_build): Likewise. + * semantics.c (finish_this_expr, finish_member_declaration): Likewise. + * error.c (dump_aggr_type): Check for lambda before anonymous. + * cp-lang.c (cxx_dwarf_name): Treat all anonymous names anonymously. + +2019-03-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.h (extract_module_binding): Return binding, not name. + * name-lookup.c (extract_module_binding): Return binding, not name. + * module.cc (depset::set_binding_name): New. + (depset::hash::add_binding): Drop name parm, check anon names + here. + (depset::hash::add_writables): Adjust extract_module_binding use. + + gcc/cp/ + * cp-tree.h (ovl_sort): Delete. + * name-lookup.h (extract_module_binding): Drop type_r parm. + * module.cc (depset::hash::add_binding): Drop type parm. + (depset::hash::add_writables): Adjust extract_module_binding API. + * name-lookup.c (extract_module_binding): Return name, valye by + reference. Don't sort. + * tree.c (ovl_sort): Delete. + + Base lambda names off anonymous names. + gcc/cp/ + * cp-tree.h (IDENTIFIER_LAMBDA_P): New. + (LAMBDA_TyPE_P): Key off name. + (TYPE_UNNAMED_P): Simplify. + (LAMBDANAME_PREFIX, LAMBDANAME_FORMAT): Delete. + (make_lambda_name): Delete. + * lambda.c (begin_lambda_type): Use make_anon_name. + * name-lookup.c (lambda_cnt, make_lambda_name): Delete. + +2019-03-07 Nathan Sidwell <nathan@acm.org> + + Commonize anonymous name generation. + gcc/ + * tree.h (IDENTIFIER_ANON_P): New. + (anon_aggrname_p, anon_aggrname_format): Delete. + (make_anon_name): Declare. + * tree.c (anon_aggrname_p, anon_aggrname_format): Delete. + (make_anon_name): New. + * lto-streamer-out.c (DFS::DFS_write_tree_body): Use IDENTIFIER_ANON_P. + (hash_tree): Likewise. + * tree-streamer-out.c (write_ts_decl_minimal_tree_pointers): Likewise. + gcc/cp/ + * cp-tree.h (TYPE_UNNAMED_P): Use IDENTIFIER_ANON_P. + (make_anon_name): Delete. + * class.c (find_flexarrays): Use IDENTIFIER_ANON_P. + * cp-lang.c (cxx_dwarf_name): Likewise. + * decl.c (name_unnamed_type, xref_tag_1): Likewise. + * error.c (dump_aggr_type): Likewise. + * name-lookup.c (anon_cnt, make_anon_name): Delete. + (consider_binding_level): Use IDENTIFIER_ANON_P. + * pt.c (push_template_decl_real): Likewise. + gcc/d/ + * types.cc (fixup_anonymous_offset): Use IDENTIFIER_ANON_P. + (layout_aggregate_members): Use make_anon_name. + +2019-03-06 Nathan Sidwell <nathan@acm.org> + + Refactor all the things! + gcc/cp/ + * module.cc: Tighten up access. + + Refactor. + gcc/cp/ + * module.cc (module_state): Reorder member fn definitions. + + Refactor. + gcc/cp/ + * module.cc (module_state::is_matching_decl): Moved to ... + (trees_in::is_matching_decl): ... here. + (trees_{in,out}::{mark,write,read}_*): Move earlier. + + Refactor. + gcc/cp/ + * module.cc (module_state::read_definition): Moved to ... + (trees_in::read_definition): ... here. + (module_state::is_skippable_defn): Move to ... + (trees_in::is_skippable_defn): ... here. + (module_state::read_{function,var,class,enum}_def): Move to ... + (trees_in::read_{function,var,class,enum}_def): ... here. + (module_state::read_binfos): Move to ... + (trees_in::read_binfos): ... here. + + Refactor. + gcc/cp/ + * module.cc (module_state::{write,mark}_definition): Move to ... + (trees_out::{write,mark}_definition): ... here. + (module_state::{write,mark}_{function,var,class,enum}_def): Move to ... + (trees_out::{write,mark}_{function,var,class,enum}_def): ... here. + (module_state::write_binfos): Move to ... + (trees_out::write_binfos): ... here. + (depset::hash::find_dependencies): Drop module_state parm. + + Refactor. + gcc/cp/ + * module.cc (module_state::{add_writables,find_dependencies}): Move + to ... + (depset::hash::{add_writables,find_dependencies}): ... here. + (depset::hash::get_work): Delete. + + GMF pruning, Part 2 + gcc/cp/ + * module.cc (depset::hash): Rename flags fields. + (trees_out::tree_decl): Self references by dependency binding. + (depset::hash::add_dependency): Fix thinko. + (binding_cmp): New. + (depset::hash::finalize_dependencies): New. + (module_state::write): Adjust. + * name-lookup.c (extract_module_binding): The FIXMEs have become + irrelevant. + (get_binding_or_decl): Only imports for namespaces. + gcc/testsuite/ + * g++.dg/modules/internal-1.C: Prune output. + * g++.dg/modules/mod-sym-2.C: Check GMF not discarded. + + gcc/cp/ + * module.cc (trees_out::trees_out): Add depset::hash parm. + (trees_out::depending_p): Invert streaming_p. + (module_state::write_cluster): Add depset::hash parm, adjust. + (trees_out::begin): Single ctor for both uses. + (trees_out::end): Don't clear dep_hash. + (module_state::find_dependencies): Adjust. + (module_state::write): Adjust. + + Linkage promotion ban + GMF pruning, Part 1 + gcc/cp/ + * module.cc (depset::is_internal): New field. + (depset::hash): Add gmfs, & internals fields. + (depset::hash::add_dependency): Deal with gmf & internal. + (depset::hash::add_binding): Ignore GMF & internals here. + (module_state::write): Errors for referenced internals. + * name-lookup.c (get_binding_or_decl): Get globals. + gcc/testsuite/ + * g++.dg/modules/internal-1.C: New. + * g++.dg/modules/namespace-[34]_[abc].C: Adjust. + +2019-03-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (depset::hash::add_binding): Ignore internal-linkage + entities. + (module_state::add_writables): Don't walk anonymous namespaces. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_a.C: Adjust scan. + * g++.dg/modules/unnamed-2.C: Adjust scan. + + gcc/cp/ + * module.cc (depset::add_dependency): Drop kind arg, return void. + (depset::hash::add_binding): Set current during addition. + (module_state::add_writables): Tweak. + + gcc/cp/ + * module.cc (depset): Add refs_internal field. Replace decl_key + and defn_key with entity_key. Remove is_decl, add is_namespace. + Replace get_decl with get_entity. + +2019-03-04 Nathan Sidwell <nathan@acm.org> + + Merge trunk r269375. + + GMF content locations + gcc/cp/ + * parser.h (cp_token): Remove C compatibility macros. Add + main_source_p field. + * parser.c (cp_lexer_get_preprocessor_token): Set main_source_p + field. + (cp_lexer_before_phase_4): Rename to ... + (cp_lexer_not_macro): ... here. Drop main-file check. + (cp_parser_translation_unit): Emit main-file errors. + (cp_parser_{module,import}_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/global-1_a.C: Adjust. + * g++.dg/modules/mod-decl-3.C: Adjust. + * g++.dg/modules/mod-decl-5_b.C: Adjust. + * g++.dg/modules/mod-exp-1_b.C: Adjust. + * g++.dg/modules/mod-sym-2.C: Adjust. + * g++.dg/modules/namespace-2_a.C: Adjust. + * g++.dg/modules/static-1_a.C: Adjust. + * g++.dg/modules/token-1.C: Adjust. + * g++.dg/modules/token-2_b.C: Adjust. + * g++.dg/modules/token-3.C: Adjust. + * g++.dg/modules/token-4.C: Adjust. + * g++.dg/modules/token-5.C: New. + + New # semantics for popping to "" name. + libcpp/ + * directives.c (do_linemarker): Popping to "" name means fill in + the name. + gcc/testsuite/ + * c-c++-common/cpp/line-1.c: New. + + Cleanups. + libcpp/ + * include/cpplib.h (struct cpp_hashnode): Drop C compatibility + macros. Correct bit calculation. + * include/line-map.h: Formatting. + * line-map.c (get_pure_location): Formatting. + + gcc/cp/ + * module.cc (declare_module): Deal with de-GMFing here, get name + of implicit header module. + * parser.c (enum module_preamble): New enum. + (cp_parser_translation_unit): Use it. + (cp_parser_{module,import}_declaration): Use it. + gcc/testsuite/ + * g++.dg/modules/p0713-3.C: Adjust diags. + +2019-03-01 Nathan Sidwell <nathan@acm.org> + + Merge trunk r269321. + + Merge trunk r269078 (metadata update). + + Apply trunk r269078. + gcc/cp/ + * module.cc (module_state::{read,write}_function_def): Adjust. + + gcc/cp/ + * cp-tree.h (struct constexpr_fundef): Moved from constexpr.c. + (register_constexpr_fundef): Adjust. + (find_constexpr_fundef): Replace with ... + (retrieve_constexpr_fundef): ... this. + * constexpr.c (struct constexpr_fundef): Moved to cp-tree.h + (constexpr_fundef_hasher): Constify. + (retrieve_constexpr_fundef): Make extern. + (find_constexpr_fundef): Delete. + (check_constexpr_fundef): Adjust. + (register_constexpr_fundef): Adjust API. + * module.cc (module_state::{read,write}_function_def): Adjust. + + Merge trunk r269077. + + gcc/cp/ + * parser.c (cp_lexer_set_source_position_from_token): Revert. + +2019-02-28 Nathan Sidwell <nathan@acm.org> + + module & import-semi lexing rules + gcc/cp/ + * parser.c (cp_lexer_tokenize): Fix EOF push. + (cp_lexer_before_phase_4): New. + (cp_lexer_set_source_position_from_token): Simplify. + (cp_parser_{module,import}_declaration): Check phase-4 requirements. + gcc/testsuite/ + * g++.dg/modules/class-2_a.C: Do not #include + * g++.dg/modules/token-[123]*.C: New. + + Remove eof_token + gcc/cp/ + * parser.h (cp_token): Add tree_check_p, adjust GTY tagging. + (cp_lexer): Add saved_type, saved_keyword fields. + * parser.c (eof_token): Delete. + (cp_lexer_new_from_tokens): Overwrite EOF here. + (cp_lexer_destroy): Restore overwritten token here. + (cp_lexer_token_position, cp_lexer_previous_token_position): Simplify. + (cp_lexer_tokenize): Likewise. + (cp_lexer_peek_nth_token, cp_lexer_consume_token): Likewise. + (cp_lexer_purge_token, cp_lexer_purge_tokens_after): Likewise. + (cp_parser_nested_name_specifier, cp_parser_decltype) + (cp_parser_template_id): Set tree_check_p. + +2019-02-27 Nathan Sidwell <nathan@acm.org> + + __import in extern "C" + gcc/cp/ + * parser.c (cp_lexer_tokenize): Add extern_c_depth arg, tokenize + through extern "C". + (cp_parser_translation_unit): Handle top-level extern "C". + (cp_parser_module_name): Force header unit. + (cp_parser_{module,import}_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/inc-xlate-1_[cd].C: New. + + gcc/cp/ + * cp-tree.h (import_module): Return bool. + * module.cc (import_module): Return is_header flag. + * parser.c (cp_parser_tokenize): Rename to ... + (cp_lexer_tokenize): ... this. Reimplement. + (cp_parser_import_declaration): Return is_header flag. + (cp_parser_translation_unit): Adjust lexer tokenization interaction. + +2019-02-26 Nathan Sidwell <nathan@acm.org> + + Flag_modules is strictly boolean. + gcc/c-family/ + * c.opt (fmodules-ts): Allow negation. + gcc/cp/ + * decl.c (duplicate_decls): Use modules_p. + * lex.c (module_preprocess_token): Use modules_p. + * parser.c (cp_parser_diagnose_invalid_type) + (cp_parser_translation_unit, cp_parser_tokenize): Likewise. + * module.cc (module_begin_main_file): Likewise. + (handle_module_option): Adjust. + gcc/ + * doc/invoke.texi (fmodules-ts): Adjust. + + Preprocess __import. + gcc/cp/ + * cp-tree.h (import_module): Add extern C flag. + * lex.c (module_preprocess_token): Allow __import in extern-c + * module.c (import_module): Add extern C flag. + * parser.c (cp_parser_import_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/inc-xlate-1{.map,_[ab].H}: New. + + Distinguished __import spelling. + gcc/c-family/ + * c-common.c (c_common_reswords): Add __import spelling. + gcc/cp/ + * module.cc (module_mapper::translate_include): Use __import. + gcc/testsuite/ + * g++.dg/modules/legacy-[3456]*: Adjust. + * g++.dg/modules/map-2.C: Likewise. + + Fix preprocessor tokenizing rules. + gcc/cp/ + * lex.c (module_preprocess_token): Detect extern "C" {, tokenize + trailing attributes before importing header unit. + gcc/testsuite/ + * g++.dg/modules/cpp-2_[abc].[CH]: Extend testing. + + Fix interface partition export rules. + gcc/cp/ + * module.cc (module_state::read_imports): Don't check partition + import/export here ... + (module_state::direct_import): ... or here ... + (module_state::write): ... but do it here. + gcc/testsuite/ + * g++.dg/modules/part-2_[cd].C: Adjust. + * g++.dg/modules/part-2_e.C: New. + +2019-02-22 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi: Update modules documentation. + + libcpp/ + * mkdeps.h (deps_write): Add phony arg. + (deps_phony_targets): Delete. + * init.c (cpp_finish): Adjust deps_write call. + * mkdeps.c (mrules): Add quote_lwm member. + (munge): Just return static buffer. + (deps_add_target, deps_add_dep, deps_add_module): Store unmunged. + (write_name): Rename ... + (make_write_name): ... here. Maybe munge here. + (write_vec, deps_write): Rename to ... + (make_write_vec, make_write): ... here. Adjust. + (deps_write): New wrapper. + + gcc/cp/ + * cp-tree.h (init_module_processing): Add arg. + * decl.c (cxx_init_decl_processing): Adjust. + * module.cc (init_module_processing): Check preprocess sanity. + + libcpp/ + * mkdeps.c (deps_add_module): Allow empty bmi name. + (deps_write): Refactor. Add PHONY. + gcc/cp/ + * cp-tree.h (module_preprocess): Declare. + * lex.c (module_preprocess_token): Have a proper state object, + register imports with dependency machinery. + * module.cc (module_preprocess_token): New. + (module_begin_main_file): Cope with just preprocessing. + +2019-02-21 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c.opt: Rename fmodule-legacy to fmodule-header + gcc/ + * doc/invoke.texi: Update. + gcc/cp/ + * cp-tree.h, module.cc, lang-specs.h, name-lookup.c, parser.c: + Rename. + gcc/testsuite/ + * g++.dg/modules/: Likewise. + + gcc/ + * langhooks.h (struct lang_hooks): Adjust preprocess_token API. + gcc/cp/ + * lex.c (module_preprocess_token): Adjust API. + * cp-tree.h (module_preprocess_token): Adjust API. + * module.cc (module_state::direct_import): Not fatal if preprocessing. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Adjust preprocess_token + hook API. + +2019-02-20 Nathan Sidwell <nathan@acm.org> + + gcc/ + * REVISION: Add []. + gcc/cp/ + * Make-lang.in (MODULE_VERSION): Replace ... + (MODULE_STAMP): ... this. Adjust + * cxx-mapper.cc: Update. + * module.cc: Update version behaviour. + (module_state::do_import): Add dependency. + libcpp/ + * mkdeps.c (mrules): Add dtor properly. Add modules. + (deps_write): Spew module deps. + +2019-02-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r268782. + + Make dependencies + libcpp/ + * include/cpplib.h (cpp_get_deps): Change type. + * include/mkdeps.h (struct deps): Rename to ... + (struct mrules): ... this. Adjust accessors. + (deps_add_module): Declare. + * internal.h (sttuct cpp_reader): Likewise. + * mkdeps.c (struct mrules): Rename from deps. Add module fields. + (munge): Allow concatenation. + (deps_add_module): New. + (write_name, write_vec): New, broken out of ... + (deps_write): ... this. Add module pieces. + gcc/ + * module.cc: #include mkdeps.h. + (module_state::direct_import): Add module to dependencies. + (finish_module_parse): Set target dependency info. + gcc/c-family/ + * c-opts.c (handle_deferred_opts): Adjust dep accessors. + gcc/fortran/ + * cpp.c (gfc_cpp_add_dep, gfc_cpp_add_target, gfc_cpp_init): Adjust + dep accessors. + +2019-02-08 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * mkdeps.c (struct deps): Make more C++y. Update all uses. + +2019-02-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_mapper::module_mapper): Fix local socket creation. + + gcc/cp/ + * c++-mapper.cc (module2bmi): Do not map dir separators. + gcc/testsuite/ + * g+.dg/modules/modules.exp (decode_mod_spec): Likewise. + + gcc/cp/ + * module.cc (create_dirs): New. + (maybe_add_bmi_prefix): Add FORCE parm, adjust. + (finish_module_parse): Try and create intermediate dirs. + +2019-02-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (finish_namespace_using_decl): Add assert + FIXME. + + gcc/cp/ + * cxx-mapper.cc (client::action): Add mapper agent. + * module.cc (module_mapper::handshake): Add mapper agent slot. + gcc/ + * doc/invoke.texi (C++ Module Mapper): Update handshake. + + gcc/cp/ + * module.cc (module_state::read_locations): Make warning + development-only. + + gcc/cp/ + * module.cc (get_module_slot): New broken out of ... + (get_module): ... here. Call it. + (module_mapper::translate_include): Cope with file mapper. + gcc/testsuite/ + * g++.dg/modules/map-2.{C,map}: New. + +2019-02-01 Nathan Sidwell <nathan@acm.org> + + Merge trunk r268456. + + gcc/cp/ + * decl.c (duplicate_decls): Accomodate anticipated fns. + * module.cc (set_module_owner): Adjust. + gcc/testsuite/ + * g++.dg/modules/printf-1_[ab].[HC]: New. + +2019-01-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (try_increase_lazy): Fix setrlimit call. + (init_module_processing): Fix getrlimit call. + + gcc/cp/ + * module.cc (init_module_processing): Dump even more config. + Tweak lazy limit. + + Rework lazy limit handling. + gcc/cp/ + * module.cc (lazy_limit, lazy_hard_limit, LAZY_HEADROOM): New. + (lazy_open): Invert sense, make unsigned. Adjust all uses. + (try_increase_lazy): New. + (module_state::freeze_an_elf): Call it first. + (init_module_processing): Adjust lazy_limit setting. + +2019-01-30 Nathan Sidwell <nathan@acm.org> + + ADL part 2 + gcc/cp/ + * cp-tree.h (LOOKUP_FOUND_P): Allow enumeral type. + * module.cc (module_visible_instantiation_path): Protect against + not modules. + * name-lookup.c (name_lookup::adl_enum): New. + (name_lookup::adl_type): Use it. + (name_lookup::adl_namespace): INST_PATH may be null. + (name_lookup::search_adl): Add partitions of types. + gcc/testsuite/ + * g++.dg/modules/adl-[23]_[abc].C: New. + + ADL part 1 + gcc/cp/ + * cp-tree.h (module_visible_instantiation_path): Declare. + * module.cc (module_visible_instantiation_path): Implement. + * name-lookup.c (name_lookup::add_module_fns): Delete. + (name_lookup::add_namespace_fns): Add visible bitmaps, + reimplement. + (name_lookup::search_adl): Get path of instantiation. + gcc/testsuite/ + * g++.dg/modules/adl-1_[abc].C: New. + + gcc/cp/ + * name-lookup.c (name_lookup::adl_namespace_only): Delete. + (name_lookip::adl_{namespace,class}_fns): New. + (name_lookup::adl_{namespace,class}): Adjust. + (name_lookup::search_adl): Refactor. + +2019-01-30 Iain Sandoe <iain@sandoe.co.uk> + + gcc/cp/ + * module.cc: Reorder includes. + * cxx-mapper.cc: Likewise. + + gcc/testsuite/ + * g++.dg/modules/fn-inline-1_{bc}.C: Adjust weak scan. + +2019-01-30 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): Add submenu. + +2019-01-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (init_module_processing): Dump more config. + + gcc/cp/ + * module.cc (MAPPED_READING, MAPPED_WRITING): 0 or 1 + (init_module_processing): Dump mapping behaviour. + +2019-01-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_mapper::make): Drop options arg, look at + CXX_MODULE_MAPPER. + gcc/ + * doc/invoke.texi (fmodule-mapper): Document env var. + (C++ Module Mapper): Likewise. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Lambda location. + * cp-objcp-common.c (cp_common_init_ts): Fix LAMBDA_EXPR marking. + * cp-tree.h (tree_lambda_expr): Save 8 bytes. + + Merge trunk r268337. + +2019-01-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream expression locii. + + gcc/cp/ + * cp-objcp-common.c (cp_common_init_ts): MARK_TS_EXP for tcc_statement. + + gcc/cp/ + * cp-objcp-common.c (cp_common_init_ts): MARK_TS_EXP for scope_ref + & noexcept_expr. + * module.cc (trees_{in,out}::core_vals): Rely on TS_EXP. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Adjust expression streaming. + + Fix TS_CONTAINS_STRUCT for tcc_expression. + gcc/ + (MARK_TS_EXP): New. + gcc/c-family/ + * c-common.c (c_common_init_ts): Use MARK_TS_EXP. Mark + SIZEOF_EXPR. + gcc/cp/ + * cp-objcp-common.c (cp_common_init_ts): MARK_TS_EXP for + tcc_expression nodes. Call c_common_init_ts. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Clean up enumeral type + handling. + (trees_out:tree_node, module_state::mark_enum_def): Use + SCOPED_ENUM_P. + + gcc/cp/ + * module.cc (tree_tag): Add tt_enum_int. + (trees_out::mark_node): Allow marking non-decls. + (trees_{in,out}::tree_node): Serialize enum values. + (module_state::mark_enum_def): Mark enum int_csts. + gcc/testsuite/ + * g++.dg/modules/enum_1_[ab].C: Test serialization. + + gcc/cp/ + * module.cc (trees_in::finish_type): Don't speciual case + TYPE_PACKs. + * pt.c (template_parm_to_arg, coerce_template_parameter_pack) + (make_argument_pack, tsubst_template_args, tsubst) + (type_unification_real, unify_pack_expansion): Set + TYPE_STRUCTURAL_EQUALITY for type packs. + +2019-01-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-objcp-common.c (cp_common_init_ts): Set TYPE_PACK_EXPANSION + and TYPE_ARGUMENT_PACK correctly. + * module.c (trees_in::finish_type): Special case pack types and + bound parms. + gcc/testsuite/ + * g++.dg/modules/var-tpl-1_[ab].C: New. + + gcc/cp/ + * module.cc (tree_tag): Add tt_ptrmem_type. + (trees_{in,out}::core_vals): Don't scrog pointer's ptrmem cache. + (trees_out::tree_type): Stream pointers to member functions. + (trees_in::tree_node): Likewise. + gcc/testsuite/ + * g++.dg/modules/nodes-1_[ab].C: More. + +2019-01-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Stream tcc_reference, + baselink, static_assert, trait_expr. + gcc/testsuite/ + * g++.dg/modules/nodes-1_[ab].C: New. + + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): Fix TYPE_CACHED_VALUES + handling. Stream ptrmem_cst. Note userdef_literals unreachable. + gcc/testsuite/ + * g++.dg/modules/nodes-1_[ab].C: Add prememdata + + gcc/cp/ + * module.cc (module_state::{read,write}_locations): Fix macro + expansion compression. + +2019-01-17 Nathan Sidwell <nathan@acm.org> + + Enable partition entity merging. + gcc/cp/ + * module.cc (depset::hash): Add mergeable flag. + (trees_out::{tpl_parms,tree_mergeable}): Protect from not + streaming. + (depset::hash::add_dependency): Deal with mergeablility. + (depset::hash::add_mergeable): New. + (depset::hash::connect): Adjust dump. + (module_state::write_cluster): Sort mergeables. + (module_state::find_dependencies): Deal with mergeability. + (module_state::sort_mergeables): New. + gcc/testsuite/ + * g++.dg/modules/scc-1.C: Adjust scans. + * g++.dg/modules/part-3_[cd].C: Remove xfails. + + gcc/cp/ + * module.cc (trees_{in,out}::fn_parms): New. + (trees_{in,out}::tree_mergeable): Call them. + (cluster_cmp): Move earlier. + (depset::hash::connect): New, broken out of ... + (module_state::write): ... here. Call it. + +2019-01-16 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_{in,out}::tree_mergeable): Allow non-implicit + typedefs. + gcc/testsuite/ + * g++.dg/modules/leg-merge-9_[abc].[HC]: New. + + Merge partition entities (disabled). + gcc/cp/ + * module.cc (trees_{in,out}::tree_mergeable): Fold partitions. + (module_state::{read,write}_cluster): Register module entities. + gcc/testsuite/ + * g++.dg/modules/part-3_[abcd].C: New. + + gcc/cp/ + * module.cc (dumper::GM): Rename to MERGE. Update uses. + + gcc/cp/ + * cp-tree.h (module_name): Replace FULL parm with primary pointer. + * error.c (dump_module_suffix): Adjust. + * module.cc (module_state::fullname): Rename to flatname. + (module_state::{get,set}_flatname): New. Use get_flatname. + (module_state::attach): Conditionally call set_flatname. + (get_module): Likewise. + (module_mapper::imex_query): Adjust. + (module_mapper::bmi_response): Likewise. + (module_state::write_readme): Adjust. + (module_state::{read,write}_config): Adjust name checking. + * name-lookup.c (make_namespace): Adjust anonymous name creation. + * ptree.c (cxx_print_decl): Adjust. + gcc/testsuite/ + * g++.dg/modules/part-2_[cd].C: Adjust regex. + + gcc/cp/ + * cp-tree.h (module_name): Add FULL parm. + * module.cc (module_name): Check it and strip partitions if not. + * error.c (dump_module_suffix): Don't want full name. + +2019-01-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk r267946. + + Partition BMI folding, but not entity merging. + gcc/cp/ + * cp-tree.h (get_module_owner): Mark PURE. + * module.cc (loc_spans::open): Add location parm. + (trees_out::{lang_decl_bools,tree_node_specific,tree_decl}): Account + for remapping. + (depset::hash::add_binding): Account for partitions. + (module_state::write_locations): Account for partitions. + (module_state::read_locations): Add partition spans to primary + interface. + (module_state::add_writables): Add partition bitmap arg. Adjust + extraction. + (module_state::write): Generate partition bitmap. + (module_state::read): Only read partitions on primary. + * name-lookup.h (extract_module_binding): Adjust parms. + * name-lookup.c (add_mergeable_decl): Break out from ... + (record_mergeable_decl): ... here. Call it. + (match_mergeable_decl): Likewise. + (check_mergeable_decl): Tweak. + (extract_module_binding): Examine partitions and merge. + * tree.c (ovl_sort): Simplify. + gcc/testsuite/ + * g++.dg/modules/part-1_a.C: Adjust. + * g++.dg/modules/part-1_c.C: New. + +2019-01-14 Nathan Sidwell <nathan@acm.org> + + gcc/ + * tree.h (cache_integer_cst): Add defaulted small parm. + * tree.c (cache_integer_cst): Add small parm, adjust. + gcc/cp/ + * module.cc (trees_out::start): FIXED_CST are C only. + (trees_in::finish): Merge small INTEGER_CSTs. + (trees_{in,out}::core_bools): Don't write base.public_flag of types. + + gcc/cp/ + * module.cc (trees_out::start): Catch POLY_INT_CST, adjust + VECTOR_CST. + (trees_{in,out}::core_vals): Do TS_VECTOR. + * g++.dg/modules/literals-1_[ab].C: Add vector cst. + +2019-01-11 Nathan Sidwell <nathan@acm.org> + + String literals. + gcc/cp/ + * module.cc (trees_{in,out}::core_vals): String literals (a NOP). + gcc/testsuite/ + * g++.dg/modules/literals-1_[ab].C: Add string lit. + + Real & complex literals. + gcc/cp/ + * module.cc (bytes_{in,out}::buf): Void pointer + (trees_{in,out}::core_vals): Stream REAL_CST & COMPLEX. + gcc/testsuite/ + * g++.dg/modules/literals-1_[ab].C: New. + + gcc/cp/ + * module.cc (get_module): Fix partition parsing. + (module_state::read_imports): Check interface import requirements. + (module_state::{read,write}_partitions): No need for exported. + (module_state::write_config): Write is_interface. + (module_state::direct_import): Check interface import + requirements. + (declare_module): Set interface_p, not exported_p. + * parser.c (cp_parser_module_name): Partitions only in non-legacy + module purview. + gcc/testsuite/ + * g++.dg/modules/part-2_[abcd].C: New. + +2019-01-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (module_not_legacy_p): New. + * module.cc (trees_out::tree_namespace): Rema namespace owner. + (tree_in::tree_node): Protect bogus tt_namespace. + * name-lookup.c (record_mergeable_decl): New. + (check_mergeable_decl): Namespaces are never overloaded. + (check_module_override): Add to mergeable list. + (do_pushdecl): Record mergeable. + (make_namespace_finish): Use check_mergeable_decl. Never add to level + (push_namespace): Add to level here. + gcc/testsuite/ + * g++.dg/modules/indirect-1_b.C: Adjust dump scan. + + gcc/cp/ + * module.cc (finish_module_parse): Better location info on errors. + * name-lookup.c (name_lookup::search_namespace_only): Skip + partition slot too. + (check_module_override): Likewise. + (check_mergeable_decl): New broken out of ... + (match_mergeable_decl): ... here. Call it. + (reuse_namespace): Iterate over global slot. + * ptree.c (cxx_print_xnode): More cluster info. + +2019-01-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::read_partitions): New. + (module_state::read_imports): Deal with elided partitions. + (module_state::write_partitions): Write more. + (module_state::read): Read partitions. + (module_state::direct_import): Deal with elided partitions. + (process_deferred_imports): Don't request known filenames. Avoid + double request. + gcc/testsuite/ + * g++.dg/modules/atom-preamble-2_d.C: Check no duplicate. + gcc/ + * doc/invoke.texi (C++ Modules): Update. + + gcc/cp/ + * module.cc (module_state::from_partition_p): New field. + (module_state::maybe_partition_name): New. + (module_state::{read,write}_imports): Adjust. + (module_state::write_partitions): New. + (module_state::remap_partitions): Delete. + (trees_out::tree_decl): Remap owner. + (module_state::write_readme): Adjust. + (module_state_config): Add imports and partitions fields. + (module_state::{read,write}_config): Adjust. + (module_state::write): Separate out hidden partitions. Adjust + import & partition writing. + (module_state::read): Adjust import reading. + gcc/testsuite/ + * g++.dg/modules/import-1_c.C: Adjust scan. + * g++.dg/modules/mod-imp-1_c.C: Likewise. + +2019-01-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc (module2bmi): Update mapping + * module.cc (module_state::{maybe_defrost,freeze_an_elf}): Quote + filename.. + gcc/testsuite/ + * g++.dg/modules/modules.exp (decode_mod_spec): Update mapping. + * g++.dg/modules/freeze-1_d.C: Adjust scan-final. + * g++.dg/modules/import-2.C: Likewise. + * g++.dg/modules/mod-stamp-1_d.C: Likewise. + + gcc/cp/ + * module.cc (module_state::{interface_p,is_interface}): New. + (module_state::resolve_alias): Don't propagate exported_p here. + (module_state::write_readme): Show exportedness of imports. + (module_state::read_imports): Use resolve_alias. + (module_state::read_config): Set interface_p. + (module_state::read): Reformat. + (module_state::set_import): Correctly set imports. + (module_state::direct_import): Not here. + (declare_module): Set interface_p. + gcc/testsuite/ + * g++.dg/modules/import-1_e.C: Adjust scan. + + gcc/cp/ + * module.cc (bytes_out::set_crc): Only set if crc_ptr != 0. + (module_state::write_readme): Update for partitions. + (module_state::{read,write}_config): Write exported_p for + partitions. + (finish_module_parse): Write partitions. + gcc/testsuite/ + * g++.dg/modules/atom-decl-2.C: Adjust. + * g++.dg/modules/atom-pragma-3.C: Adjust. + * g++.dg/modules/mod-decl-1.C: Adjust. + * g++.dg/modules/mod-decl-3.C: Adjust. + + gcc/cp/ + * module.cc (module_state::direct_import): Add LAZY parm, use it + rather than legacy_p. Never expect a has_bmi file. + (declare_module): Always add to pending imports. + * parser.c (cp_parser_translation_unit): Expect a deferred import + for a legacy module. + + gcc/cp/ + * cp-tree.h (module_has_bmi_p): New. + * module.cc (module_state::{is_interface,interface_p}): Rename to ... + (module_state::{is_primary,primary_p}): ... here. Adjust users. + (module_state::read_cluster): Partitions need deduping too. + (declare_module): Set primary_p, partition_p. + (process_pending_imports): Adjust. + + gcc/cp + * cp-tree.h (module_export_depth, module_purview): Replace with ... + (module_kind): ... this. + (MK_MODULE, MK_GLOBAL, MK_INTERFACE, MK_PARTITION, MK_EXPORTING): New. + (module_purview_p, not_module_p, module_legacy_p) + (module_interface_p, module_partition_p, module_global_p) + (module_exporting_p): Adjust. + (declare_module): Return bool. + * module.cc (module_export_depth, module_purview): Replace with ... + (module_kind): ... this. + (module_maybe_interface_p): Delete. + (module_state::direct_import, declare_module) + (module_begin_main_file, process_deferred_imports) + (finish_module_parse): Adjust. + * name-lookup.c (make_namespae): Use module_global_p. + * parser.c (cp_parser_module_declaration): Return bool. Deal with + GMF introducer. + (cp_parser_translation_unit, cp_parser_module_export): Adjust. + gcc/testsuite/ + * g++.dg/modules/circ-1_d.C: Adjust. + * g++.dg/modules/mod-decl-1.C: Adjust. + * g++.dg/modules/mod-decl-5_b.C: Adjust. + * g++.dg/modules/p0713-3.C: Adjust. + +2019-01-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc (module2bmi): Don't map ':'. + * module.cc: Update design description. + gcc/testsuite/ + * g++.dg/modules/modules.exp (decode_mod_spec): Don't map ':' + +2019-01-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.h (match_global_decl): Rename to ... + (match_mergeable_decl): ... this. Add global/partition flag. + * name-lookup.c (match_global_decl): Rename to ... + (match_mergeable_decl): ... this. Adjust. + * module.cc: Rename mme to mergeable. + (trees_{in,out}::tree_mergeable): Stream global/partition + indicator. Call match_mergeable_decl. + + gcc/cp/ + * name-lookup.c (module_binding_slot): Break apart to ... + (search_imported_binding_slot, get_fixed_binding_slot) + (append_imported_binding_slot): ... these. + (fixed_module_binding_slot): Delete. + (do_pushdecl, match_global_decl, import_module_binding) + (set_module_binding, get_binding_or_decl, get_imported_namespace) + (reuse_namespace, make_namespace_finish) + (add_imported_namespace): Update for new API. + +2019-01-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (module_binding_slot): Use FIXED parm. + + gcc/cp/ + * name-lookup.c (module_binding_slot): Add FIXED parm, adjust all + callers. + + gcc/cp/ + * module.cc: Rename gme -> mme, because partitions. + + gcc/cp/ + * cp-tree.h (DECL_MODULE_PURVIEW_P): Delete. + (MAYBE_DECL_MODULE_PURVIEW_P): Delete. + * mangle.c (maybe_write_module): Adjust. + + gcc/testsuite/ + * g++.dg/modules/legacy-8_[abcde].[CH]: New. + + gcc/cp/ + * cxx-mapper.cc (server): Workaround PR c++/88664. + + Merge trunk r267509. + * module.cc, cxx-mapper.cc: Update copyright years. + +2018-12-20 Nathan Sidwell <nathan@acm.org> + + MODULE_VEC has alloc field too. + gcc/cp/ + * cp-tree.h (MODULE_VECTOR_ALLOC_CLUSTERS): New. + (MODULE_VECTOR_NUM_CLUSTERS): Adjust. + (struct tree_module_vec): Adjust. + * tree.c (make_module_vec): Adjust. + * name-lookup.c (module_binding_slot): Extend vector if it fits. + * ptree.c (cxx_print_xnode): Cope with lazy module-vector slots. + + gcc/cp/ + * module.cc (module_state::check_read): Fix bogus note. + gcc/testsuite/ + * g++.dg/modules/indirect-1_c.C: Add bogus note test. + + gcc/cp/ + * module.cc (module_state::remap): New member var. + (module_state::remap_partitions): New. + (module_state::write_imports): Skip partitions. + (module_state::write): Remap partitions. + +2018-12-19 Nathan Sidwell <nathan@acm.org> + + Partition parsing. Don't get excited! + gcc/cp/ + * module.cc (get_module): Attach current module for null + partition. + * parser.c (cp_parser_module_name): Parse partitions + gcc/testsuite/ + * g++.dg/modules/part-1_[ab].C: New. + +2018-12-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (get_module): Add partition arg. + * module.cc (module_state): Add partition flag. + (module_state_hash): Hash & compare partition flag. + (module_state::mangle, get_module, attach): Add partition awareness. + + gcc/cp/ + * cp-tree.h (get_module): Default NULL parent. + * lex.c (module_preprocess_token): Adjust get_module call. + * module.cc (get_module, module_begin_main_file): Likewise. + * parser.c (cp_parser_module_name): Likewise. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Remove some remaining + non-atomic template hacks. + + gcc/cp/ + * module.cc (module_state::write): Sort dependency table. + + gcc/cp + * module.cc (module_cpp_undef): Don't zap undef hook if we don't + own it. + gcc/c-family/ + * c-opts.c (c_common_init): Don't unilaterally clobber undef + callback. + * c-ppoutput.c (cb_undef): Call lang_hook if non-null. + gcc/testsuite/ + * g++.dg/modules/dir-only-1.C: New. + + Merge trunk r267229. + +2018-12-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::{write,mark}_template_def): Delete. + (trees_out::{write,mark}_definition): Adjust. + (trees_in::read_template_def): Delete. + (trees_in::read_definition): Adjust. + + Kill old broken global module merge code. + gcc/cp/ + * module.cc (trees_in::finish): Remove DECL merging. + * name-lookup.c (merge_global_decl): Delete. + * name-lookup.h (merge_global_decl): Delete decl. + + Atomic TEMPLATE_DECL + DECL_TEMPLATE_RESULT. + gcc/cp/ + * module.cc (trees_out::mark_node): Remove temp tpl hack. + (trees_out::tree_decl): Remove tt_template remarking. + (trees_out::tree_value): Atomic TEMPLATE_DECL. + (trees_in::tree_node): Likewise. + (trees_out::{mark,read,write}_template_def): Move DECL_LIST to ... + (trees_out::{mark,read,write}_class_def): ... here. + (trees_{in,out}::tree_gme): Don't mark inner decl. + gcc/testsuite/ + * leg-merge-8_[abc].[CH]: New. + + Intermediate step to atomic TEMPLATE_DECL + DECL_TEMPLATE_RESULT. + Breaks leg-merge-7_c.C, + gcc/cp/ + * module.cc (tree_tag): Add tt_template, tt_implicit_template. + (node_template_info): Not a member fn. + (trees_out::{mark_node,mark_gme}): Mark the template. + (trees_{in,out}::tree_decl): Do implicit_template. + +2018-12-14 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (trees_out::node_template_info): New, broken out of + ... + (trees_out::tree_decl): ... here. Use it. + + gcc/cp/ + * module.cc (trees_out::tree_decl): Adjust TEMPLATE_INFO access. + +2018-12-13 Nathan Sidwell <nathan@acm.org> + + Function template deduping + gcc/cp/ + * module.cc (trees_{in,out}::tpl_parms): New. + (trees_out::mark_gme): Mark template result too. + (trees_{in,out}::tree_gme): Do templates. + (module_state::write_cluster): Any decl can be a GME. + * name-lookup.c (match_global_decl): Do template matching. + gcc/testsuite/ + * g++.dg/modules/leg-merge-7_[abc].[HC]: New. + +2018-12-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (slurping::remap): Heap allocate. + (gt_pch_nx): Delete hacks. + + gcc/cp/ + * module.cc (tree_tag): Replace tt_named_type with + tt_{primary,secondary}_type. + (trees_out::tree_type): Not recursive. + (trees_in::tree_node): Adjust tt_named_type case. + + Class deduping + gcc/cp/ + * module.cc (trees_in::tree_node): Record defn to skip. + (trees_in::is_skip{,pable}_defn): Fix int/long ptr const. + (module_state::read_{function,var,class}_def): Add skip checking. + gcc/testsuite/ + * g++.dg/modules/leg-merge-6_[abc].[HC]: New. + + TYPE streamed with its implicit typedef. + gcc/cp/ + * module.cc (trees_in::reserve_gmes): Only 2 per. + (trees_in::{set,get}_backref_gme): Delete. + (trees_in::existing_gme): Rename to ... + (trees_in::is_existing_gme): ... this. Return bool. + (trees_out::mark_gme): Adjust assert. + (trees_in::insert): Add assert. + (trees_out::tree_type): Always look at typedef. + (trees_out::tree_value): Stream type with its decl. + (trees_in::tree_node): Likewise. + (trees_{in,out}::tree_gme): Adjust. + + gcc/cp/ + * module.c (module_state::{read,write,mark}_enum): Take DECL. + (module_state::{read,write,mark}_definition): Adjust. + + gcc/cp/ + * class.c (layout_class_type): Base type has same module as owner. + * module.c (module_state::{read,write,mark}_class): Take DECL. + (module_state::{read,write,mark}_definition): Adjust. + (topmost_decl, get_module_owner): Don't look at TYPE_CONTEXT. + + gcc/cp/ + * class.c (build_base_field_1): Refactor. + (layout_class_type): Give as_base type a name. + * decl.c (initialize_predefined_identifiers): Make as_base name + unpronouncable. + * module.cc (tree_tag): Delete tt_as_base. + (trees_out::mark_node): Don't expect fake base here. + (trees_out::tree_decl): Write fake base as pseudo-named. + (trees_out::tree_type): Don't handle fake base specially here. + (trees_in::tree_node): Read fake base as pseudo-named. Delete + tt_as_base handling. + (module_state::mark_class_def): Adjust. + + gcc/cp/ + * module.cc (trees_in): Rename bad_decls to skip_defns. + (trees_in::{record,is}_bad_decl): Delete. + (trees_in::{record,is,any}_skip_defn): New. + (module_state::is_ignorable_defn): Rename to ... + (module_state::is_skippable_defn): Key off namespace-scope decl. + (topmost_decl): New. + (module_state::read_function_def): Adjust. + +2018-11-30 Nathan Sidwell <nathan@acm.org> + + Merge trunk r266680. + + gcc/cp/ + * module.cc: Fix enums with trailing commas. + * name-lookup.c (match_global_decl): Avoid unused arg warning. + + gcc/cp/ + * module.cc (module_state::write_binfos): Binfo was not visited. + + gcc/cp/ + * module.cc (module_state::write_binfos): Always write number of + vbases. + (module_state::read_binfos): Don't smash the type here. + (module_state:{read,write}_class_def): Adjust binfo serializing. + + gcc/cp/ + * class.c (fixup_type_variants): Copy TYPE_SIZE & TYPE_SIZE_UNIT. + (finish_struct): Use fixup_type_variants for template. + * module.cc (trees_{in.out}::core_vals): Don't serialize TYPE_SIZE + and TYPE_SIZE_UNIT for classes. + (trees_in::finish_type): Don't layout clesses here. + (module_state::{read,write}_class_def): Do it here. + + gcc/cp/ + * module.cc (trees_in): Add bad_decls and post_decls. + (trees_in::{record,is}_bad_decl): New. + (trees_in::post_process): New. + (module_state::is_{matching_decl,ignorable_defn}): New. + (trees_in::tree_node): Use former. + (module_state::read_function_def): Use latter. Register for + post-processig. + (module_state::read_cluster): Post process. + +2018-11-29 Nathan Sidwell <nathan@acm.org> + + Merge global module function definitions. + gcc/cp/ + * modules.cc (module_state::write_function_def): Don't rely on + decl's form. + (module_state::read_function_def): Allow multiple decls. + gcc/testsuite/ + * g++.dg/modules/leg-merge-5_[abc].[CH]: New. + + gcc/cp/ + * modules.cc (module_state::check_read): Adjust, print inform of + outer location. + (module_state::write_cluster): defns are decls too. + (lazy_load_binding): Don't inform here. + gcc/testsuite/ + * g++.dg/modules/leg-merge-4_c.C: Adjust regexps. + + Fixing GME classes + gcc/cp + * module.cc (trees_in::tree_node_vals): Add specific bool arg, + adjust. + (trees_in::existing_gme): Return cookie. + (trees_in::{get,set}_backref_gme): New. + (trees_out::mark_gme): Mark typedef target. + (trees_out::tree_type): Don't be fooled by GME TYPE_NAME. + (trees_out::tree_value): Write GME type code. + (trees_in::tree_node): Use backref channel for typedefs. + gcc/testsuite/ + * g++.dg/modules/leg-merge-4_c.C: Adjust. + + Some ODR checking of GMEs + gcc/cp/ + * module.cc (trees_in::tree_node): Check type of matched GME. + (lazy_load_binding): Add note if diagnostics emitted. + * name-lookup.c (name_lookup::search_namespace_only): Forward + iterate over slots. + (match_global_decl): Return close matches. + gcc/testsuite/ + * g++.dg/modules/leg-merge-4_[abc].[CH]: New. + + Global module var declaration merging. + gcc/cp/ + * module.cc (trees_in::reserve_gmes): Add headroom. + (trees_{in,out}::tree_gme): Deal with VAR_DECLs. + (module_state::write_cluster): Likewise. + * name-lookup.c (match_global_decl): Likewise. + gcc/testsuite/ + * g++.dg/modules/leg-merge-3_[abcd].[CH]: New. + + Global module class declaration merging. + gcc/cp/ + * module.cc (trees_in::start): Check code & category. + (trees_in::tree_node): Allow gme types. Refactor gme/node + reading. + (trees_{in,out}::tree_gme): Allow implicit typedefs. + (module_state::write_cluster): GME Implicit typedefs too. + * name-lookup.c (match_global_decl): Match TYPE_DECLs too. + gcc/testsuite/ + * g++.dg/modules/leg-merge-2_[abc].[CH]: New. + +2018-11-28 Nathan Sidwell <nathan@acm.org> + + Global module function declaration merging. + gcc/cp + * module.cc (tree_tag): Add tt_gme. + (trees_in::gmes): New data member. + (trees_in::tree_node_specific): Add no-alloc flag. + (trees_in::{tree_gme,reserve_gmes,existing_gme}): New. + (trees_out::walk_kind): Add WK_gme. + (trees_out::{mark,tree}_gme): New. + (trees_out::{ref_node,insert}): Deal with WK_gme walk. + (trees_out::tree_{decl,value}): Likewise. + (trees_in::tree_node): Add tt_gme support. + (cluster_tag): Add ct_gme. + (module_state::{read,write}_cluster): Add gme support. + * name-lookup.h (match_global_decl): Declare. + (add_module_decl): Declare. + * name-lookup.c (match_global_decl): New. + (set_module_binding): Don't dedup here. + (add_module_decl): New. + gcc/testsuite/ + * g++.dg/modules/leg-merge-1_[abcd].[CH]: New. + + gcc/cp/ + * modules.cc (trees_{in,out}::tree_node_bools): Break out + tree_node_specific. + (trees_out::ref_force_{lwm.hwm}): Delete. + (trees_out::gme_lwm): New. + (trees_out::insert): Change force to walk_kind. + (trees_out::mark_node): Drop walk_kind arg. + (trees_out::{,un}mark_trees): Adjust. + (trees_out::{mark_node,insert}): Adjust. + (trees_out::start): Drop CODE parm. + (trees_out::{ref_node,tree_ctx}): Adjust. + (trees_out::tree_value): Adjust. + (trees_{in,out}::tree_node): Likewise. + (module_state::write_binfos): Likewise. + (module_state::mark_{class,enum}_def): Adjust. + (module_state::{read,write}_cluster): Adjust. + (module_state::find_dependencies): Adjust. + +2018-11-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (trees_{in,out}::tree_node_raw): Bifurcate to ... + (trees_{in,out}::tree_node_{bools,vals}): ... these. + (trees_out::tree_value): Adjust. + (trees_in::tree_node): Likewise. + + gcc/cp/ + * modules.cc (trees_out::tree_ref): Rename to ... + (trees_out::ref_node): ... this. + (trees_out::tree{value,decl,type,namespace}): Replace FORCE + paramenter with walk_kind. + (trees_out::tree_node): Adjust. + (module_state::mark_{class,enum,template}_def): Adjust. + (module_state::write_cluster): Adjust. + (module_state::find_dependencies): Adjust. + + gcc/cp/ + * modules.cc (trees_out::walk_kind): New enum. + (trees_out::tree_ref): Return it. + (trees_out::tree_{ctx,decl,node}): Use it. + + gcc/cp/ + * modules.cc (trees_out::ref_force_{lwm.hwm}): New ref values. + (trees_out::{,un}mark_trees): Use them. + (trees_out::{mark_node,tree_ref}): Likewise. + +2018-11-20 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.cc (dumper): Rename dump flags. Adjust throughout. + +2018-11-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (handle_module_option): Handle OPT_fmodule_legacy. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Insert /./ in legacy names. + * g++.dg/modules/*.H: Adjust as necessary. + + Merge trunk r266271. + +2018-11-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk r266161. + + gcc/ + * doc/invoke.texi: Rename cookie->ident, people read too much into + 'cookie'. + +2018-11-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Refactor. + + Implement d0924r1 (to be written). + gcc/cp/ + * lex.c (init_reswords): Set D_CXX_MODULES mask. + * module.cc (declare_module): Check purview state. + * parser.c (cp_parser_translation_unit): Module and import are + always conditional. + (cp_parser_tokenize): Likewise. + gcc/ + * doc/invoke.texi (fno-module-keywords): Delete. + gcc/c-family/ + * c-common.c (c_common_reswords): Don't mark import, module for CXXWARN. + * c.opt (fmodule-keywords): Delete. + gcc/testsuite/ + * g++.dg/modules/atom-decl-1.C: Delete. + * g++.dg/modules/keyword-1_[ab].C: Adjust. + g++.dg/modules/mod-decl-[13].C: Adjust. + g++.dg/modules/p0713-3.C: Adjust. + + gcc/cp/ + * cp-tree.h (module_gmf_p): Adjust. + (not_module_p): New. + * module.cc (declare_module): Don't deal with starting GMF. + * parser.c (cp_parser_translation_unit): Adjust module_purview + values. + +2018-11-04 Nathan Sidwell <nathan@acm.org> + + Implement Bjarne's suggested solution. + gcc/cp/ + * parser.cc (cp_parser_translation_unit): No tentative parsing. + Look for following ::. + (cp_parser_module_{name,declaration,import}): Adjust. + (cp_parser_tokenize): Adjust, tokenize more. + gcc/ + * doc/invoke.texi (C++ Modules): Update. + gcc/testsuite/ + * g++.dg/modules/cpp-5_b.C: Update. + * g++.dg/modules/keyword-1_[ab].C: Likewise. + +2018-11-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules.c (module_state::read): Interface can be lazy too. + + gcc/cp/ + * name-lookup.c (STAT_EXPORTS): Rename to ... + (STAT_VISIBLE): ... this. + (name_lookup::search_namespace_only, name_lookup::add_module_fns) + (check_module_override, set_module_binding): Adjust. + * module.cc (module_state::read_cluster): Likewise. + + gcc/cp/ + * cp-tree.h (module_may_redeclare): Declare. + * decl.c (duplicate_decls): Check moduleness. + * module.cc (module_state::read_cluster): Adjust export tail. + (module_may_redeclare): New. + * name-lookup.c (name_lookup::search_namespace_only): Check + STAT_TYPE_VISIBLE_P. + (update_binding): Allow NULL LEVEL. + (check_module_override): New. + (do_pushdecl): Deal with module overrides. + (set_module_binding): Adjust. Don't push interface bindings. + gcc/testsuite/ + * g++.dg/modules/ambig-1_[ab].C: New. + * g++.dg/modules/macro-4_e.C: Avoid error. + * g++.dg/modules/namespace-2_b.C: Remove xfail. + + gcc/cp/ + * module.cc (module_state::read_cluster): Preserve export_tail. + * name-lookup.c (STAT_HACK_TYPE_VISIBILE_P): New. + (name_lookup::process_module_binding): Reimplement. + (name_lookp::search_namespace_only): Likewise. + (set_module_binding): Adjust when STAT_HACK_EXPORTS is set. + + gcc/cp/ + * decl.c (duplicate_decls): Refactor export check. + gcc/testsuite/ + * g++.dg/modules/export-1.C: New. + + gcc/cp/ + * decl.c (duplicate_decls): Refactor checks. + * name-lookup.c (name_lookup::process_module_binding): Only pubic + namespaces are shared. + gcc/testsuite/ + * g++.dg/lookup/crash6.C: Adjust error + * g++.dg/parse/crash38.C: Likewise. + +2018-11-01 Nathan Sidwell <nathan@acm.org> + + Merge trunk r265714. + Move to autoconf 2.69. + + gcc/cp/ + * module.cc (module_state::read): Don't read macros for + preprocessed innput. + (module_state::set_import): Adjust legacy test. + +2018-10-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::check_not_purview): Check name. + (mangle_module, module_name): Likewise. + (declare_module): Set parent, not alias. + + Merge trunk r265692. + + Merge trunk r265679. + + gcc/cp/ + * cp-tree.h (OVL_EXPORT_P): Delete. + (OVL_DEDUP_P): Move to lang flag 0. + * module.cc (module_state::read_cluster): Don't set OVL_EXPORT_P. + * tree.c (ovl_copy): Don't copy OVL_EXPORT_P. + +2018-10-30 Nathan Sidwell <nathan@acm.org> + + Module interface gets own mod number + gcc/cp/ + * cp-tree.g (ovl_iterator::set_dedup): New. + * module.cc (module_state::{interface_p,is_interface}): New. + (module_state::check_not_purview): Adjust. + (mangle_module, module_name): Likewise. + (module_state::read_cluster): Adjust. + (module_state::read): Adjust. + (module_state::{set_import,direct_import}): Adjust import setting. + (declare_module): Module interface gets number. + * name-lookup.h (set_module_binding): Add iface parameter. + * name-lookup.c (name_lookup::search_namespace): Fix indexing. + (set_module_binding): Insert interface decls. + gcc/testsuite/ + * g++.dg/modules/namespace-4_b.C: Remove xfails. + * g++.dg/modules/static-1_b.C: Remove xfails. + + gcc/cp/ + * cp-tree.h (OVL_HAS_USING_P): Rename to ... + (OVL_DEDUP_P): ... here. + * name-lookup.c (name_lookup::add_overload) + (get_class_binding_direct): Adjust. + * tree.c (ovl_make, ovl_copy, ovl_insert, lookup_maybe_add): Adjust. + + Less ordered overloads + gcc/cp/ + * cp-tree.h (ovl_sort): Declare. + * name-lookup.h (extract_module_binding): Binding is reference. + * tree.c (ovl_insert): Don't sort non-hidden members. + (ovl_splice, ovl_sort): New. + * name-lookup.c (extract_module_binding): Binding is reference. + Sort the binding. + * ptree.c (cxx_print_xnode): Print MODULE_VEC name. + * module.cc (module_state::add_writables): Binding is reference. + gcc/testsuite/ + * g++.dg/lookup/friend21.C: New. + +2018-10-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (ovl_insert): Drop export_tail parm. + * name-lookup.c (update_binding): No need to track export_tail. + * tree.c (ovl_insert): Drop export_tail parm. + * ptree.c (cxx_print_xnode): Output formatting. + + gcc/cp/ + * module.cc (module_state::read_imports): Do in one pass. + + gcc/cp/ + * module.cc (module_state::direct_import): Drop DEFERRABLE arg. + ({import,declare}_module): Deal with deferring here. + (process_deferred_imports): Adjust direct_import call. + +2018-10-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r265554. + +2018-10-26 Nathan Sidwell <nathan@acm.org> + + Anon namespaces + gcc/cp/ + * module.cc (elf_out::strtab_write): Fallback to assembler name. + (elf_out::name): Allow 0 name. + (dumper::impl::nested_name): Fallback to assembler name. + (module_state::{read,write}_namespaces): Write assembler name for + anons. + * name-lookup.h (add_imported_namespace): add anon-name arg. + * name-lookup.c (get_imported_namespace): Look in current slot + too. + (make_namespace): Add anon-name arg, calculate as necessary. + (add_imported_namespace): add anon-name arg. + gcc/testsuite/ + * gcc/testsuite/g++.dg/modules/namespace-4_[abc].C: New. + + Statics on bindings + gcc/cp/ + * module.cc (depset::hash::add_binding): Take overload and type + values, do pruning here. + (module_state::write_cluster): Reorder binding emission. + (module_state::read_cluster): Determine export_tail here. + (module_state::add_writables): Adjust. + * cp-tree.h (ovl_iterator::export_tail): Delete. + * name-lookup.h (extract_module_decls): Rename to ... + (extract_module_binding): ... here. Return overload set. + * name-lookup.c ( (extract_module_decls): Rename to ... + (extract_module_binding): ... here. Don't prune here. + (set_module_binding): Simplify. + (lookup_by_ident, get_lookup_ident): Simplify. + gcc/testsuite/ + * g++.dg/modules/static-1_b.C: XFAIL error + * gcc/testsuite/g++.dg/modules/unnamed-1_[ab].C: Adjust scans. + * gcc/testsuite/g++.dg/modules/unnamed-2.C: Likewise. + + gcc/cp/ + * cp-tree.h (module_purview): Declare. + (module_purview_p, module_interface_p, module_gmf_p): Inline + predicates. + * module.cc (module_purview): Extern. + (module_purview_p, module_interface_p): Delete. + + p1103 no implicit namespace export + gcc/cp/ + * module.cc (trees_out::mark_node): Allow namespace marking. + (trees_out::tree_ctx): Namespaces may be forced. + (trees_out::tree_namespace): Reimplement. + (trees_out::tree_{type,decl}): Adjust tree_ctx calls. + (module_state::write_cluster): Likewise. + (module_state::{read,write}_namespace): Adjust. + (module_state::find_dependencies): Also walk namespaces. + * name-lookup.c (name_lookup::process_binding): Fixup hidden + namespaces. + (implicitly_export_namespace): New. + (do_pushdecl, push_namespace): Call it. + (add_imported_namespace): Add export_p arg, adjust. + * name-lookup.h (add_imported_namespace): Add export_p arg. + * ptree.c (cxx_print_node): Adjust MODULE_VEC printing. + gcc/testsuite/ + * g++.dg/modules/indirect-1_b.C: Adjust scans. + * g++.dg/modules/namespace-[23].C: Split to ... + * g++.dg/modules/namespace-[23]_[ab].C: ... these. + +2018-10-25 Nathan Sidwell <nathan@acm.org> + + Rationalize bool ok == true + gcc/cp/ + * module.cc (elf::has_error): Rename to ... + (elf::get_error): ... this. Update all callers. + (elf::end): Return true == ok. Update (indirect) callers. + (module_state::check_read): Likewise. Update callers. + (module_state::lazy_load): Zap slot on failure. + * name-lookup.c (get_binding_or_decl): No need to assert here. + + gcc/cp/ + * module.cc (module_state::write_readme): Tidy. + (module_state::{add_writables,find_dependencies): Dump + DEPENDENCIES. + (module_state::direct_import): Always pop dump. + * ptree.c (cxx_print_decl): Print DECL_MODULE_EXPORT_P. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Remove unused var. + +2018-10-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (enum tree_tag): Add tt_namespace. + (trees_out::tree_namespace): Use it. + (trees_in::tree_node): Grok it. + * name-lookup.h (get_imported_namespace): Declare. + * name-lookup.c (get_imported_namespace): New. + gcc/testsuite/ + * g++.dg/modules/indirect-1_c.C: Adjust. + + gcc/cp/ + * module.cc (trees_out::{tree_{decl,type}): Drop owner arg. + (trees_out::tree_namespace): New. + (trees_out::ctx): Take owning-decl arg, use tree_namespace. + (trees_out::{core_vals,tree_binfo}): Adjust. + (trees_out::{read,write}_cluster): Adjust. + +2018-10-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc: Add dumper::TREES to tree streamers. + gcc/testsuite/ + * g++.dg/modules/: Add -uid to several lang dumps. + + gcc/cp/ + * module.cc (slurping::remap_module): New. + (depset::hash::add_binding): Don't deal with namespaces here. + (module_state::write_namespaces): No longer static. Write + locations. + (module_state::read_namespaces): Read locations. + (module_state::add_writables): Deal with namespaces here. + (module_state::find_dependencies): Don't walk namespaces. + * name-lookup.h (get_lookup_ident, find_by_ident): Reorder args, + update callers. + (add_imported_namespace): Add location arg. + * name-lookup.c (module_binding_slot): Fix initial alloc. + (extract_module_decls): Return namespace. + (get_binding_or_decl, lookup_by_ident, get_lookup_ident): Reorder + args. + (make_namespace): Add loc & module args. + (push_namespace): Adjust. + (add_imported_namespace): Adjust. + * ptree.c (cxx_print_decl): Avoid final linefeed. + (cxx_print_xnode): Adjust MODULE_VEC + gcc/ + * doc/invoke.texi: Document -fdump-lang-module options. + gcc/testsuite/ + * g++.dg/modules/namespace-2.C: Adjust. + +2018-10-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (module_exporting_level): Delete. + (module_export_depth): Declare. + (module_exporting_p): New. + ({push,pop}_module_export): Adjust, make inline. + * module.cc (export_depth): Replace with ... + (module_exporting_level): ... this. + ({push,pop}_module_export): Delete. + (set_module_owner, import_module, module_begin_main_file) + (finish_module_parse): Adjust. + * parser.cc (cp_parser_module_export): Adjust. + + gcc/cp/ + * lex.c (module_preprocess_token): Fix padding/comment states. + * parser.c (cp_parser_tokenize): Reduce is_decl states. + +2018-10-21 Nathan Sidwell <nathan@acm.org> + + Merge trunk r265362. + + Add -fno-module-keywords. + gcc/ + * doc/invoke.text (fmodule-keywords): Document. + gcc/cp/ + * lex.c (init_reswords): Don't add module keywords if + fno-module-keywords. + *module_preprocess_token): Adjust. + * module.cc (module_State_config:get_opts): Drop fmodule-keywords. + * parser.c (cp_parser_import_declaration): Allow to be tentative. + (cp_parser_translation_unit): Allow module & import to not be + keywords. Tentatively parse import declaration. + (cp_parser_module_keyword): Commit to tentative parse. + (cp_parser_tokenize): Allow import to not be a keyword. + gcc/testsuite/ + * g++.dg/modules/keywords-1_[ab].C: New. + + gcc/cp/ + * lex.c (module_preprocessing_token): Pay attention to braces. + * parser.c (cp_parser_tokenize): Return ptr to stopping import. + Pay attention to CPP_HEADER tokenization. + (cp_parser_translation_unit): Adjust. + + gcc/cp/ + * parser.c (cp_parser_diagnose_invalid_type_name): Use C_RID_CODE + more. + +2018-10-19 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_tokenize): Don't stop after nested + module/import decl. + +2018-10-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Adjust GMF deferred + imports. + (cp_parser_tokenize): Only pay attention to module/export at start + of decl. + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Process deferred imports + here ... + (cp_parser_tokenize): ... not here. + gcc/testsuite/ + * g++.dg/modules/macloc-1_d.C: Correct regexp. + + Expunge -fmodules-atom as a thing. + gcc/ + * doc/invoke.texi (fmodules-atom): Delete. + gcc/cp/ + * cp-tree.h (modules_legacy_p): Adjust. + * module.cc: Expunge OPT_fmodules-atom. + gcc/c-family/ + * c.opt (fmodules-ts): Adjust. + (fmodules-atom): Alias fmodules-ts + (fmodule-legacy*): Adjust. + + gcc/testuite/ + * g++.dg/modules/modules.exp (mode-list): Delete. + (main): Don't use mode-list. + * g++.dg/modules/: Add -fmodules-ts to many tests. + + Remove ATOM as a distinction. + gcc/c-family/ + * c-cppbuiltin.c (c_cpp_builtins): Remove __cpp_modules_{atom,ts}. + * c.opt (fmodules-ts): Adjust. + gcc/cp/ + * cp-tree.h (modules_atom_p): Delete. + * module.cc (module_state::write_readme): Drop ATOM distinction. + (module_state::{read,write}_config): Likewise. + (init_module_processing): Drop atom distinction. + (handle_module_option): Adjust. + gcc/testsuite/ + * g++.dg/modules/: Drop -fmodules-atom from all tests. + + Simplify translate-include hook. + libcpp/ + include/cpplib.h (cpp_translate_include_t): Delete. + (struct cpp_calbacks): Adjust translate_include decl. + gcc/ + * langhooks.h (struct lang_hooks): Adjust preprocess_translate_include. + gcc/c-family + * c-opts.c (c_common_post_options): Adjust. + gcc/cp/ + * cp-tree.h (maybe_import_include): Replace by ... + (module_translate_include): ... this. + * cp-lang.c (LANG_HOOKS_PREPROCESS_TRANSLATE_INCLUDE): Adjust. + * module.c (module_state::do_import): Check read on all top level + imports. + (do_translate_include): Rename to ... + (module_translate_include): ... this. Explicitly turn off. + (maybe_import_include): Delete. + + Preamble on module + gcc/cp/ + * parser.c (cp_parser_import_declaration): Always check past_preamble. + gcc/testsuite/ + * g++.dg/modules/atom-norescan-1.C: Delete. + * g++.dg/modules/atom-pragma-1.C: Not atom-specific. + * g++.dg/modules/atom-pragma-3.C: Likewise. + * g++.dg/modules/atom-preamble-1.C: Likewise. + * g++.dg/modules/atom-preamble-2_a.C: Likewise. + * g++.dg/modules/atom-preamble-2_b.C: Likewise. + * g++.dg/modules/atom-preamble-2_c.C: Likewise. + * g++.dg/modules/atom-preamble-2_d.C: Likewise. + * g++.dg/modules/atom-preamble-2_e.C: Likewise. + * g++.dg/modules/atom-preamble-3.C: Likewise. + * g++.dg/modules/atom-preamble-4.C: Likewise. + * g++.dg/modules/mod-indirect-1_b.C: Adjust. + + No export { import x; } + gcc/cp/ + * parser.c (cp_parser_tokenize): Drop nested arg, adjust. + (cp_parser_translation_unit): Don't deal with outermost export { block. + gcc/testsuite/ + * g++.dg/modules/err-1_a.C: Adjust. + * g++.dg/modules/err-1_c.C: Adjust. + * g++.dg/modules/import-1_c.C: Adjust. + * g++.dg/modules/mod-decl-1.C: Adjust. + + + No atom preamble in non-module + gcc/cp/ + * parser.c (cp_parser_translation_unit): Preamble is tristate. + (cp_parser_module_name): Add FOR_MODULE arg, issue error. + (cp_parser_module_declaration): Adjust. + (cp_parser_import_declaration): Adjust twice. + gcc/testsuite/ + * g++.dg/modules/atom-decl-[23].C: Adjust. + * g++.dg/modules/legacy-6_f.C: Remove XFAIL. + +2018-10-17 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/err-2_[ab].*: Move to ... + * g++.dg/modules/cpp-5_[ab].*: ... here. + * g++.dg/modules/cpp5_c.C: New. + + Robustify parse errors on module/import decls. + gcc/cp/ + * parser.c (cp_parser_consume_semicolon_at_end_of_statement): + Return void. + (cp_parser_translation_unit): Adjust. + (cp_parser_{module,import}_declaration): Don't try and resync + here. + (cp_parser_tokenize): Deal with unprocessed incoming tokens. + gcc/testsuite/ + * g++.dg/modules/err-2_[ab].*: New. + +2018-10-16 Nathan Sidwell <nathan@acm.org> + + Remove some atom/ts differences. + gcc/cp/ + * module.cc (declare_module): Copy always. + * parser.c (cp_parser_translation_unit): Allo GMF under atom. + (cp_parser_module_name): Allow legacy name under ts + (cp_parser_initial_pragma): Fix from trunk. + gcc/testsuite/ + * g++.dg/modules: Many changes. + + gcc/cp/ + * module.cc (module_purview): New. + (module_purview_p, module_interface_p): Use it. + (module_maybe_interface_p): New. + (module_state::direct_import): Use it. + (process_deferred_imports): Likewise. + (declare_module): Set it. + * parser.c (cp_parser_translation_unit): Inform modules of GMF. + + gcc/testsuite/ + * g++.dg/modules/macloc-1_[abcd].C: No longer atom-specific. + + Locations for everyone! + gcc/cp/ + * module.cc (loc_spans::{init,open,close}): Dump info. + (module_state::{read,write}_location): No longer atom-specific. + (module_state::{read,write}): Locations for everyone. + (process_deferred_imports): Open and close spans correctly. + gcc/testsuite/ + * g++.dg/modules/adhoc-1_[ab].C: No longer atom-specific. + * g++.dg/modules/loc-1_[abc].C: Likewise. + * g++.dg/modules/loc-2_[abcdef].C: Likewise. + + gcc/ + * dumpfile.c (dump_switch_p_1): Don't let a '-' filename fool the + option machinery. + + Legacy importing during -E + gcc/c-family/ + * c-lex.c (init_c_lex): Don't use lang_hooks here. + * c-opts.c (c_common_init): Set them here. + gcc/cp/ + * lex.c (module_preprocess_token): Enable legacy importing. + * module.cc (module_state::read): Skip items when preprocessing + only. + (module_cpp_undef): Adjust unsetting. + gcc/testsuite/ + * g++.dg/modules/cpp-2_c.C: Adjust. + + Remove token peeking & preamble related infrastructure. + libcpp/ + * include/cpplib.h (cpp_relocate_peeked_tokens): Delete. + (cpp_peek_token_with_location): Delete. + (cpp_in_macro_expansion_p): Delete. + * directives-only.c (_cpp_preprocess_dir_only): Adjust + _cpp_handle_directive call. + * directives.c (struct if_stack): Drop hash_loc. + (PEEK_INVISIBLE): Delete. + (linemarker_dir): Adjust. + (_cpp_handle_directive): Drop hash_loc arg. dont set it. + (push_conditional): Drop hash_loc. + * init.c (read_original_filename): Adjust _cpp_handle_directive + call. + * internal.h (struct cpp_reader): Delete peeked_directive field. + (_cpp_handl_directive): Drop hash_loc arg. + * lex.c (cpp_relocate_peeked_tokens): Delete. + (cpp_peek_token): Swallow ... + (cpp_peek_token_with_location): ... this. Delete. + (_cpp_lex_token): Adjust _cpp_handle_directive call. + * macro.c (cpp_in_macro_expansion_p): Rename to ... + (cpp_in_macro_expansion): ... this. Make static. + * traditional.c (_cpp_scan_out_logical_line): Adjust + _cpp_handle_directive call. + + gcc/testsuite/ + * g++.dg/modules/*.H: Drop unnecessary -fmodules-atom option. + + Reimplement preamble peeking + gcc/ + * doc/invoke.texi (fmodule-preamble): Delete. + * langhooks-def.h (LANG_HOOKS_PREPROCESS_PREAMBLE): Replace with ... + (LANG_HOOKS_PREPROCESS_TOKEN): ... this. + * langhooks.h (struct lang_hooks): Replace preprocess_preamble + with preprocess_token. + c-family/ + * c-ppoutput.c (scan_translation_unit): Adjust preprocess lang + hook. + * c.opt (fmodule-preamble, fmodule-preamble=): Delete. + gcc/cp/ + * cp-lang.c (module_preamble_fsm): Delete. + (LANG_HOOKS_PREPROCESS_PREAMBLE): Delete. + (LANG_HOOKS_PREPROCESS_TOKEN): Override. + * cp-tree.h (enum module_preamble_state): Delete. + (module_preamble_prefix_{peek,next}): Delete. + (module_preprocess_token): Declare. + * lex.c (module_preamble_prefix_{peek,next}): Delete. + (module_preprocess_token): New. + * module.c (init_module_processing, handle_module_option): Drop + preamble option handling. + gcc/testsuite/ + * g++.dg/modules/*: Many changes. + + Remove preamble repeating. + gcc/cp/ + * cp-tree.h (maybe_repeat_preamble): Delete. + * module.c (maybe_repeat_preamble): Delete. + * parser.c (cp_parser_initial_pragma): Revert to trunk. + * lex.c (modle_preamble_prefix_peek): Don't repeat preamble. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-1.C: Adjust. + * g++.dg/modules/atom-preamble-1.C: Is now well formed. + + Remove preamble peeking + gcc/cp/ + * cp-tree.h ({import,declare}_module): return void. + (process_deferred_imports): Return void. + (module_state::direct_import): Return void, deferrable is + tristate. Push onto pending_import vector if permitted. + ({import,declare}_module): Don't return adjustment, use + direct_import always. + (process_deferred_imports): Don't return adjustment. + * parser.c (cp_parser_module_declaration): Return void, drop first + arg. + (cp_parser_import_declaration): Return void. + (cp_parser_module_export): Don't deal with module declaration + here. + (cp_parser_get_module_preamble_tokens) + (cp_parser_parse_module_preamble): Delete. + (cp_parser_tokenize): Delete #ifdef'd adjustment code. + (c_parse_file): Don't peek preamble. + libcpp/ + * line-map.c (linemap_module_restore): Don't calculate adjustment. + * include/line-map.h (linemap_module_restore): Return void. + + Common tokenizer for atom & ts + gcc/cp/ + * module.cc ({import,declare}_module): Don't defer legacy modules. + * parser.c (cp_parser_translation_unit): Deal with atom preamble. + (cp_parser_module_declaration): No need to check if first. + (cp_parser_tokenize): Enable filename token as needed. + (c_parse_file): Disable preamble scan. + gcc/testsuite/ + * g++.dg/modules/alias-1_b.C: Adjust. + * g++.dg/modules/atom-pragma-1.C: Adjust + * g++.dg/modules/atom-pragma-2.C: Delete. + * g++.dg/modules/atom-preamble-2_e.C: Copy from 2_f.C + * g++.dg/modules/atom-preamble-2_f.C: Delete. + * g++.dg/modules/atom-preamble-[34].C: Adjust. + * g++.dg/modules/atom-rescan-1.C: Delete. + * g++.dg/modules/ice-1.C: Adjust + * g++.dg/modules/macro-2_c.H: Adjust + * g++.dg/modules/macro-3_b.H: Adjust + * g++.dg/modules/macro-3_c.C: Adjust + * g++.dg/modules/macro-6_b.C: Adjust + + gcc/cp/ + * cp-tree.h (process_deferred_imports): Drop location arg. + * modules.cc ({import,declare}_module): Disable eager imports. + (process_deferred_imports): Drop location arg, take it from the + deferred imports. + * parser.c (cp_parser_translation_unit): Process deferred imports. + (cp_parser_tokenize): Correct close-brace handling. Process + deferred imports. + (c_parse_file): Adjust prcess_deferred_imports call. + gcc/testsuite/ + * g++.dg/modules/atom-preamble-1.C: More workarounds + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Detect GMF here ... + (cp_parser_module_declaration): ... not here. + +2018-10-15 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h ({import,declare}_module): Return adjustment. + * module.c (module_state::direct_import): Preserve line table, + return adjustment. + * parser.c (cp_parser_fill_main): Delete. + (cp_parser_tokenize): Take cp_token pointer, reorder check & push. + (cp_parser_translation_unit): Take cp_token pointer, call + cp_parser_tokenize. + (c_parse_file): Don't tokenize here. + + gcc/cp/ + * lang-specs.h: Fix .s elision with legacy modules. + + gcc/ + * langhooks.h (struct lang_hooks): Adjust preprocess_main_file + signature. + gcc/c-family/ + * c-opts.c (push_command_line_include): Adjust + preprocess_main_file hook call. + (cb_file_change): Likewise. + gcc/cp/ + * cp-lang.c (LANG_HOOKS_PREPROCESS_MAIN_FILE): Adjust. + * cp-tree.h (module_note_main_file): Rename to ... + (module_begin_main_file): ... here. + (maybe_begin_legacy_module): Delete. + * module.cc (declare_module): Remove legacy handling here. + (module_note_main_file): Rename to ... + (module_begin_main_file): ... here. Swallow ... + (maybe_begin_legacy_module): ... this. + (process_deferred_imports): We're already exporting for legacy + headers. + * parser.c (c_parse_file): Don't call maybe_begin_legacy_module. + + gcc/cp/ + * cp-tree.h (process_deferred_imports): New. + (module_preamble_load): Delete. + * module.cc (module_state::direct_import): Fatal error here. + (module_state::preamble_load): Delete, move into ... + (process_deferred_imports): ... here. Subsume ... + (module_preamble_load): ... this. + * parser.c (c_parse_file): Adjust. + gcc/testsuite/ + * g++.dg/modules/atom-inc-1.C: Delete. + * g++.dg/modules/atom-inc-1_[abc].*: New. + * g++.dg/modules/import-2.C: Adjust. + + gcc/cp/ + * module.cc (module_state::direct_import): New. + ({import,declare}_module): Call it. + (module_state::preamble_load): Likewise. + +2018-10-12 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * lex.c (cpp_peek_token_with_location): Fix pragma rewinding. + gcc/cp/ + * parser.c (cp_parser_initial_pragma): Peek at first token. + + Merge trunk r265127. + + gcc/cp/ + * parser.c (cp_parser_{module,import}_declaration): Remove temp hacks. + (cp_parser_translation_unit, cp_parser_parse_module_preamble): Adjust. + gcc/testsuite/ + * g++.dg/modules/atom-decl-1.C: Adjust errors. + * g++.dg/modules/atom-preamble-1.C: Likewise. XFAIL. + * g++.dg/modules/mod-decl-1.C: Likewise, + * g++.dg/modules/p0713-[23].C: Likewise. + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Deal with one level of + export block here. + (check_module_outermost): Delete. + (cp_parser_{module,import}_declaration): Don't call it. + (cp_parser_declaration): Don't deal with module or import decls. + gcc/testsuite/ + * g++.dg/modules/mod-decl-[13].C: Adjust errors. + + gcc/cp/ + * parser.c (cp_parser_translation_unit): Detect module and import + declarations here. + + Start breaking out toplevel parsing. + gcc/c-family/ + * c.opt (Wlegacy-header): Delete. + gcc/ + * doc/invoke.texi (Wlegacy-header): Delete. + gcc/cp/ + * cp-lang.c (module_preamble_fsm): Don't call atom_preamble_end. + * cp-tree.h (atom_preamble_end): Delete. + * lex.c (module_preamble_prefix_peek): Drop Wlegacy_header check. + * module.cc (module_preamble_end_loc): Delete. + (do_translate_include): Always translate. + (maybe_import_include): Drop Wlegacy_header check. + (atom_preamble_end): Delete. + * parser.h (cp_parser): Drop implicit_extern_c. + * parser.c (cp_parser_tokenize): New. + (cp_debug_parser): Drop implicit_extern_c. + (cp_parser_new): Likewise. + (cp_parser_translation_unit): Move global module detectin here. + (module_preamble_end_loc): Delete declaration. + (in_preamble): Temp hack. + (cp_parser_{import,module}_declaration): A couple of temp hacks. + (cp_parser_parse_module_preamble): Manipulate in_preamble. + (cp_parser_toplevel_declaration): New, broken out of ... + (cp_parser_declaration_seq_opt): ... here, call it. Drop top_level arg. + (c_parse_file): Adjust. + gcc/testsuite/ + * g++.dg/modules/atom-decl-[23].C: Adjust diags. + * g++.dg/modules/atom-preamble-[13].C: Likewise. + * g++.dg/modules/legacy-6_[df].C: Likewise. + +2018-10-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r265055. + + Kill proclaiming decls + gcc/cp/ + * cp-tree.h (push_module_export): Drop proclaiming arg. + * module.c (proclaimer): Delete. + ({push,pop}_module_export): Adjust. + (maybe_begin_legacy_module, module_preamble_load): Adjust. + * parser.c (cp_parser_module_export): Adjust error. + (cp_parser_module_proclamation): Delete. + (cp_parser_declaration): Don't call it. + gcc/testsuite/ + * g++.dg/modules/proclaim-1.C: Delete. + + Macro locations! (ATOM only) + libcpp/ + * internal.h (linemap_enter_macro): Move declaration to ... + * include/cpplib.h (linemap_enter_macro): ... here. + (linemap_lookup_macro_index): Declare. + * line-map.c (linemap_lookup_macro_index): Break out of ... + (linemap_macro_map_lookup): ... this. Use it. + gcc/cp/ + * module.cc (loc_spans): Record macro spans. + (module_state::write_readme): Record controlling macro. + (module_state::{read,write}_location{s,}): Stream macro locations. + (module_state::write_readme): Move later. + gcc/testsuite/ + * g++.dg/modules/macloc-1_[abcd].C: New. + + Merge trunk r265037. + +2018-10-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (loc_spans::close): Close the current last map. + (module_state::prepare_locations): Adjust. + (module_state::preamble_load): Adjust span closing. + (finish_module_parse): Likewise. + + gcc/cp/ + * module.cc (pending_imports): New. + ({import,declare}_module): Use it. + (module_from_cmp): Delete. + (module_state::preamble_load): Use pending_imports array. + + gcc/ + * doc/invoke.texi (fmodule-legacy): Augment syntax. + gcc/cp/ + * module.cc (module_controlling_macro): Replace with ... + (module_legacy_macro): ... this. + (module_state::{read,write}_config): Controlling macros only for + legacy mode. + (set_module_legacy_name): New. + (maybe_begin_legacy_module, handle_module_option): Use it. + (init_module_processing, finish_module_parse): Adjust. + gcc/c-family/ + * c.opt (fmodule-macro): Delete. + gcc/testsuite/ + * g++.dg/modules/alias-1_a.H: Fix. + * g++.dg/modules/legacy=0[ab].H: Adjust. + * g++.dg/modules/alias-2_*: New. + + gcc/cp/ + * module.cc (module_state::controlling_macro): Delete. + (module_state_config): New struct. + (module_state::{read,write}_config): Wrap args in a struct. + (get_option_string): Move into module_state_config. + (module_state::write_macros): Adjust. + (module_state::{read,write}): Adjust. + + gcc/cp/ + * module.cc (module_state::{read,write}_defines): Rename to ... + (module_state::{read,write}_macros): ... here. + (module_state::{read,write}): Cope with legacy aliases. + (finish_module_parse): Install initialized controlling macro. + gcc/testsuite/ + * g++.dg/modules/alias-1_[cdef].C: New. + +2018-10-09 Nathan Sidwell <nathan@acm.org> + + Lazy macro table loading + gcc/cp/ + * module.cc (struct slurping): Add macro_tbl, rename macros to + macros_def. + (slurping::~slurping): Release macro_tbl. + (module_state::{read,write}_config): Replace macro count with + boolean. + (module_state::{import,install}_defines): New. + (module_state::read_defines): Map in the table, don't read it. + (module_state::{check_read,freeze_an_elf}): Adjust. + (import_module, module_state::preamble_load): Use install_defines. + gcc/testsuite/ + * g++.dg/modules/macro-6_[abc].*: New. + + Controlling macros & alias detection + gcc/cp/ + * module.cc (cpp_node, identifier): Conversions between + cpp_hashnode and IDENTIFIER. Use them. + (data_in::no_more): Seek end. + (module_state::{resolve,is}_alias): New. + (module_state::read): Return alias. + (module_state::read_config): Initialize controlling macro, + determine alias. + (module_state::{read,write}_define): Allow unlocated macros. + (module_controlling_macro): New switch. + (module_state::{read_imports,do_import}): Deal with aliases. + (module_state::write_config): Write controlling macro. + (module_state::write_defines): Deal with controlling macro. + (module_state::preamble_load): Deal with aliases. + (finish_module_parse): Process explicit controlling macro. + gcc/testsuite/ + * g++.dg/modules/alias-1*: New. + * g++.dg/modules/macro-[234]*: Adjust. + * g++.dg/modules/only-[23].C: Adjust. + libcpp/ + * include/cpplib.h (HT_NODE,NODE_LEN,NODE_NAME): Adjust. + (cpp_set_deferred_macro): Add defaulted forced arg. + +2018-10-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.cc (module_state::deferred_macro): Print macro + definition. + gcc/testsuite/ + * g++.dg/modules/macro-2_d.C: Adjust regexps. + * g++.dg/modules/macro-4_[de].C: Likewise. + * g++.dg/modules/macro-5_c.C: Likewise. + libcpp/ + * include/cpplib.h (cpp_macro_definition): Add overload. + (cpp_macro_definition_location): Make inline, adjust. + * macro.c (get_deferred_or_lazy_macro): New, broken out of ... + (_cpp_notify_macro_use): ... here. Call it. + (warn_of_redefinition): Call it. + (cpp_macro_definition): Split into two overloads. Deal with + deferred macros. + (cpp_macro_definition_location): Delete. + + gcc/cp/ + * module.cc (module_state): Add controlling_macro, unionize slurp + with alias. Add accessors. Use them. + (module_state::{read,do_import,read_config}): Drop check_crc arg. + (module_state::read_imports): Zap direct_p before importing. + + Use 'include translation' terminology. + gcc/c-family/ + * c-opts.c (c_common_post_options): Adjust. + gcc/cp/ + * cp-lang.c (LANG_HOOKS_PREPROCESS_TRANSLATE_INCLUDE): Override. + * cp-tree.h (maybe_import_include): Adjust return type. + * module.cc (module_mapper::translate_include): Replace ... + (module_mapper::divert_include): ... this. + (do_translate_include): Replace ... + (do_divert_include): ... this. + (maybe_import_include, atom_preamble_end): Adjust. + gcc/ + * langhooks-def.h (LANG_HOOKS_PREPROCESS_DIVERT_INCLUDE): Replace + with ... + (LANG_HOOKS_PREPROCESS_TRANSLATE_INCLUDE): ... this. + * langhooks.h (struct lang_hooks): Replace + preprocess_divert_include with preprocess_translate_include. + libcpp/ + * directives.c (do_include_common): Adjust. + * include/cpplib.h (cpp_divert_include_t): Rename to ... + (cpp_translate_include_t): ... this. + (struct cpp_callbacks): Replace divert_include with translate_include. + + Mainfile loc has no line number. + libcpp/ + * internal.h (_cpp_stack_file): Add line_one_p arg. + * files.c (_cpp_stack_file): Likewise. Use it. + * include/cpplib.h (cpp_read_main_file): Add line_one_p arg. + * init.c (cpp_read_main_file): Likewise, use it. + gcc/c-family/ + * c-opts.c (c_common_post_options): Start main file on line zero. + (push_command_line_include): Call preprocess_main_file hook here ... + (cb_file_change): ... except when reading preprocessed source. + * c.opt: Add full stops. + gcc/cp/ + * module.cc (module_note_main_file): Remove fixmes fixed yesterday. + gcc/testsuite/ + * g++.dg/modules/macro-4_[de].C: Adjust regexp. + * g++.dg/modules/macro-5_c.C: Likewise. + * lib/options.exp (check_for_options): Fix comment typos. + +2018-10-04 Nathan Sidwell <nathan@acm.org> + + Dump command line macros, better command line locs + libcpp/ + * include/cpplib.h (cpp_force_token_locations): Take location, not + pointer. + * internal.h (cpp_reader): Replace forced_token_location_p with + forced_token_location. + * init.c (cpp_create_reader): Adjust. + * lex.c (_cpp_lex_direct, cpp_force_token_locations): Adjust. + (cpp_stop_forcing_token_locations): Adjust. + gcc/c-family/ + * c-opts.c (c_finish_options): Force command line locations. + gcc/cp/ + * module.cc (loc_spans::init): Add fixed and cmd line locs. + (loc_spans::SPAN_*): New. + (loc_spans::cmd_line): New. + (module_state::read_location): Adjust, return module loc for + UNKNOWN. + (module_state::{prepare,read,write}_locations): Adjust. + (maybe_add_macro): Write cmd_line macros. + (load_macros): Location is main source file. + gcc/fortran/ + * cpp.c (gfc_cpp_init): Adjust token forcing. + gcc/testsuite/ + * g++.dg/modules/macro-4_[de].C: Adjust regexp. + * g++.dg/modules/macro-5_*: New. + +2018-10-01 Nathan Sidwell <nathan@acm.org> + + Merge trunk r264769. + Slip in module.c -> module.cc rename + + Merge trunk r264765. + + gcc/cp/ + * lang-specs.h: Error out on -fcoroutines. + + From c++-coroutines branch: + 2018-10-01 Iain Sandoe <iain@sandoe.co.uk> + gcc/c-family/ + * c-common.h (RID_CO_AWAIT, RID_CO_YIELD, RID_CO_RETURN, + D_CXX_COROUTINES, D_CXX_COROUTINES_FLAGS): New. + * c-common.c (c_common_reswords): co_await, co_yield, + co_return New keywords. + gcc/cp/ + * lex.c (init_reswords): Handle flag_coroutines. + gcc/c-family/ + * c.opt (fcoroutines, fcoroutines-ts): New. + + Avoid UB type punning union shenanigans + gcc/cp/ + * module.c (macro_import::slot): Explicitly code bit + manipulation. Update all users. + gcc/testsuite/ + * g++.dg/modules/adhoc-1_b.C: Adjust regexp for wierd dejagnu/TCL bug. + + AdHoc locations + gcc/cp/ + * modules.c (dumper): Add LOCATIONS, flags. + (dumper::operator()): Add default arg. + (dumper::push): Set flags. + (module_state::{read,write}_location): Serialize adhoc locs. + (module_state::deferred_macro): Optimize current TU undef case. + gcc/testsuite/ + * g++.dg/modules/adhoc-1_[ab].C: New. + +2018-09-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_state::deferred_macro): Fix undef hiding logic. + gcc/testsuite/ + * g++.dg/modules/macro-4*: New. + +2018-09-27 Nathan Sidwell <nathan@acm.org> + + No speculative undefs. + gcc/cp/ + * module.c (maybe_add_macro): Simplify. + (module_state::undef_macro): Only add undef for a deferred macro. + + Add -fforce-module-macros + libcpp/ + * include/cpplib.h (get_deferred_macro): Declare. + * macro.c (undefer_macro): Rename to ... + (get_deferred_macro): ... here. Adjust callers. + gcc/ + * doc/invoke.texi (fforce-module-macros): Document. + gcc/c-family/ + * c.opt (fforce-module-macros): New. + gcc/cp/ + * module.c (get_option_string): Prune more options. + (load_macros): New. + (finish_module_parse): Walk identifiers, if forcing macros. + +2018-09-26 Nathan Sidwell <nathan@acm.org> + + Add deferred cpp_hashnode field. Replace macro_imports hash table + with vector and refactor. + libcpp/ + * include/cpplib.h (NODE_DEFERRED_MACRO): Delete. + (cpp_hashnode): Reduce flags width. Add deferred field. + (cpp_deferred_macro_p): Delete. + (cpp_set_deferred_macro): Don't set flag. + * directives.c (do_undef): Adjust deferred check. + * macro.c (undefer_macro): Adjust. + gcc/cp/ + * module.c (macro_export): Drop node field. Add ctor. + (macro_import): Rename one to struct slot. Add ctors, type + erase. Delete struct traits. + (macro_imports): Change to vec type. + (macro_import::{append,exported}): Adjust. + (get_macro_{imports,exports}): Allocate node deferred index, + adjust. + (maybe_add_macro): Add to macros vector, check unexported undefs + here. + (macro_loc_cmp): Reimplement. + (module_state::{read,write}_macros): Adjust. + (module_state::{undef,deferred}_macro): Likewise. + (finish_module_parse): Adjust deallocation. + + Macro import and export (corrected). + libcpp/ + * include/cpplib.h (cpp_callbacks): Add user_deferred_macro. + (NODE_DEFERRED_MACRO): New. + (cpp_hashnode): Increase flags size. + (cpp_deferred_macro_p, cpp_set_deferred_macro): New. + (cpp_compare_macros): Take two macros. + * internal.h (_cpp_notify_macro_use): Take source location, return bool. + (_cpp_maybe_notify_macro_use): Likewise. + * directives.c (do_undef): Don't warn about unresolved deferred + macros. + (do_ifdef, do_ifndef): Cope with deferred macros evaporating. + * expr.c (parse_defined): Likewise. + * macro.c (undefer_macro): New. + (enter_macro_context): Adjust notify call. + (cpp_get_token_1): Deal with deferred nodes. + (warn_of_redefinition): Node extraction of compare, call ... + (cpp_compare_macros): ... this to compare two macros. + (cpp_create_definition): Adjust compare call. + (_cpp_notify_macro_use): Deal with deferred macros. + gcc/ + * langhooks-def.h (LANG_HOOKS_PREPROCESS_DEFERRED_MACRO): New. + * langhooks.h (struct langhooks): Add preprocess_deferred_macro. + gcc/c-family/ + * c-lex.c (init_c_lex): Register deferred_macro hook. + gcc/cp/ + * cp-tree.h (module_cpp_deferred_macro): Declare. + * cp-lang.c (LANG_HOOKS_PREPROCESS_DEFERRED_MACRO): Override. + * module.c (bytes_in::random_access): New. + (elf_in::{preserve,release}): New. + (slurping::{legacies,macros}): New fields. + (slurping::close): New. + (module_state::legacies): Remove field. + (module_state::slurper): Delete. + (module_state::{read,write}_config): Add number of macros. + (module_state::{read,write}_define{,s}): Reimplement. + (module_state::{undef,deferred}_macro): New. + (cpp_undefs): Delete. + (struct macro_export, struct macro_import): New. + (get_macro_{export,import}): New. + (maybe_add_macro,macro_loc_cmp): Adjust. + (module_state::{read,write}): Adjust. + (module_state::check_read): Adjust. + (module_state::set_import): Adjust. + (module_state::freeze_an_elf): Preserve macros. + (import_module): Update legacies bitmap. + (module_cpp_undef): Call module_state::undef_macro. + (module_cpp_deferred_macro): New. + (finish_module_parse): Free macro state. + gcc/testsuite/ + * g++.dg/modules/macro-2_*: Adjust tests. + * g++.dg/modules/macro-3_*: Likewise. + +2018-09-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * modules (module_state): Add legacies bitmap. + (module_state::write): Write README later. + (module_state::read): Set legacies bit. + (module_state::set_import): Update legacies. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_b.C: Update. + +2018-09-16 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): Update mapper protocol. + * cxx-mapper.c (client): Remove bewait, forget members. + (client::action): Remove BYIMPORT, BEWAIT & RESET. + + Remove BYIMPORT, BEWAIT. + gcc/cp/ + * module.c (module_mapper::uncork): Send blank command. + (module_mapper::imex_query): Take exported_p bool. + (module_mapper::bewait_{cmd,response}): Delete. + (module_mapper::send_command): Don't shortcut blank format. + (module_state::preamble_load): Avoid async commands. + +2018-09-14 Nathan Sidwell <nathan@acm.org> + + gcc/ + * langhooks.h (preprocess_main_file): Drop index arg. + gcc/c-family/ + * c-opts.c (cb_file_change): Adjust preprocess_main_file hook. + gcc/cp/ + * cp-tree.h (module_node_main_file): Drop index parm. + * module.c (loc_spans::init_p, ): New. + (loc_spans::init_once): Rename to ... + (loc_spans::init): ... here. + (loc_spans::main_start): New. + (prefix_line_maps_hwm, prefix_locations_hwm): Delete. + (maybe_add_macro, declare_module, do_divert_include) + (module_note_main_file, maybe_begin_legacy_module): Adjust. + + A grand renaming + gcc/cp/ + * cp-tree.h (atom_preamble_state, atom_preamble_prefix_peek) + (atom_preamble_prefix_next): Rename to ... + (atom_preamble_state, atom_preamble_prefix_peek) + (atom_preamble_prefix_next): ... here. + (atom_cpp_undef, atom_module_preamble, atom_main_file) + (atom_divert_include, maybe_atom_legacy_module): Rename to ... + (module_cpp_undef, module_preamble_load, module_note_main_file) + (maybe_import_include, maybe_begin_legacy_module): ... here. + * cp-lang.c (LANG_HOOKS_PREPROCESS_MAIN_FILE) + (LANG_HOOKS_PREPROCESS_DIVERT_INCLUDE) + (LANG_HOOKS_PREPROCESS_UNDEF, LANG_HOOKS_PREPROCESS_PREAMBLE): Adjust. + (module_preamble_fsm): Adjust. + * lex.c (atom_preamble_prefix_peek, atom_preamble_prefix_next): + Rename to ... + (atom_preamble_prefix_peek, atom_preamble_prefix_next): ... here. + Adjust. + * module.c (atom_cpp_undef, atom_module_preamble, atom_main_file) + (atom_divert_include, maybe_atom_legacy_module): Rename to ... + (module_cpp_undef, module_preamble_load, module_note_main_file) + (maybe_import_include, maybe_begin_legacy_module): Here ... Adust. + * parser.c (cp_parser_get_module_preamble_tokens, c_parse_file): + Adjust. + + Expunge the spewer + gcc/cp/ + * module.c (struct slurping): No need to tag. + (struct spewing): Delete. + (declare_module, module_state::atom_preamble) + (finish_module_parse): Don't deal with it. + + Expunge old location scheme + gcc/cp/ + * module.c (struct slurper): Remove early_locs, late_locs, + loc_offset, filenames. + (module_state::{prepare,read,write}_locations): Delete + (module_state::{read,write}): Adjust. + + New locations working + gcc/cp/ + * module.c (module_state::prepare_locations): New, broken out of ... + (module_state::write_locations): Adjust. + (module_state::read_locations): Fix. + +2018-09-13 Nathan Sidwell <nathan@acm.org> + + Read & write new locations (buggy, disabled). + gcc/cp/ + * module.c (module_state::{read,write}_location): Add new-loc + scheme. + (module_state::{read,write}_locations): Adjust. + (module_state::read): Select location scheme. + gcc/testsuite/ + * g++.dg/modules/loc-1_c.C: Use regexp for note loc. + + Reading location spans (but not using them). + gcc/cp/ + * module.c (loc_range_t): Global typedef. + (loc_spans::release): Delete. + (slurping): Add new range locs. + (module_state::write_locations): Adjust. + (module_state::read_locations): New. + (module_state::read): Call it. + + Stop passing line_map around. There is only one. + gcc/cp/ + * cp-tree.h (import_module, declare_module, atom_module_preamble) + (finish_module_parse, maybe_atom_legacy_module): Drop line_map + arg. + * decl2.c (c_parse_final_cleanups): Adjust. + * parser.c (cp_parser_module_declaration) + (cp_parser_import_declaration, c_parse_file): Adjust. + * module.c (loc_spans): Drop lmaps member & adjust. + (module_state): Drop line_maps from some but not all members. + + Refactor location spans + gcc/cp/ + * module.c (class loc_spans): New. Absorb ... + ({open,close,ordinary,macro}_interval): ... these. Update all uses. + +2018-09-12 Nathan Sidwell <nathan@acm.org> + + Adding location spans + gcc/cp/ + * module.c (loc_range_t): New range. + (struct lmap_interval): New. + (lmap_spans): New. + (open_interval, close_interval, ordinary_interval) + (macro_interval): New. + (module_state::write_locations): Write spans. + (module_state::write): Write spans. + (module_state::atom_preamble): Update spans. + (atom_main_file): Initialize spans. + (finish_module_parse): Close out span. + + gcc/cp/ + * parser.c (cp_parser_get_module_preamble_tokens): Don't read past + EOF. + gcc/testsuite/ + * g++.dg/modules/ice-1.C: New. + * g++.dg/modules/modules.exp: Remove old pruning. + + Implement p1103r0 19.3/2 not-a-keyword. + gcc/cp/ + * module (module_state::write_define): Don't export keywords. + gcc/testsuite/ + * g++.dg/modules/legacy-7_{a.H,b.C}: New. + +2018-09-10 Nathan Sidwell <nathan@acm.org> + + gcc/ + * diagnostic.c (diagnostic_report_current_module): Do not line + break after module name. + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Adjust module loc regexp. + * g++.dg/modules/loc-2_[def].C: Adjust dg-regexp. + * g++.dg/modules/macro-2_d.C: Likewise. + +2018-09-06 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c.opt (fmodule-only): Set flag. + gcc/cp/ + * decl2.c (c_parse_final_cleanups): Always call finish_module_parse. + * module.c (finish_module_parse): Warn on incorrect -fmodule-only. + gcc/testsuite/ + * g++.dg/modules/only-[123].C: New. + + Add -fmodule-only, rename -fmodules-legacy + gcc/c-family/ + * c.opt (fmodules-legacy*): Rename to ... + (fmodule-legacy*): ... here. + (fmodule-only): New. + gcc/cp/ + * lang-specs.h: Incorporate -fmodule-only. + * module.c (get_option_string, handle_module_option): Adjust. + gcc/ + * doc.invoke.texi: Update module options. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Adjust. + * g++.dg/modules/*: Adjust options. + +2018-08-31 Nathan Sidwell <nathan@acm.org> + + libiberty/ + * configure.ac (checkfuncs, AC_CHECK_FUNCS): Add pipe2. + * configure, config.in: Regenerated. + * pex-unix.c (pex_unix_execute): Use pipe to transfer child failure. + +2018-08-30 Nathan Sidwell <nathan@acm.org> + + AIXify tests + fcc/testsuite/ + * fn-inline-1_[abc].C: Adjust regexps. + * sym-subst-2_a.C: Don't add -fat-lto option, use scan-assembler instead. + + Fix AIX + gcc/cp/ + * cxx-mapper.cc (buffer::get_request): Reinit pos. + + Fix --enable-checking=release. + gcc/cp/ + * name-lookup.c (set_module_binding): Add static cast. + + Fix more GC + gcc/cp/ + * module.c (module_state): Tag for_user. + (module_state_hash): Defive from ggc_ptr_hash. + (init_module_processing): GGC alloc hash table. get mapper when + not lazy, add ggc_collect. + (finish_module_parse): Don't zap hash table here ... + (finish_module_processing): ... do it here instead. + gcc/testsuite/ + * g++.dg/modules/gc-2_a.C: New. + * g++.dg/modules/gc-2.map: New. + + AIX build + gcc/ + * configure.ac: Check sighandler_t, memrchr. + * config.in, configure: Rebuilt. + gcc/cp/ + * Make-lang.in (MODULE_STAMP): Protect against non--r capable + date. + (cxx-mapper): Add LIBINTL, not LIBBACKTRACE. + * module.c (memrchr, sighandler_t): Provide fallback. + * cxx-mapper.cc (memrchr, sighandler_t): Provide fallback. + + * Merge trunk r263974. + +2018-08-29 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (atom_cpp_undef): location_t arg is unused. + + gcc/cp/ + * module.c (module_state::{read,write}_define): Add NUL + terminators to CPP_TOKEN_FLD_STR elements. + + libcpp/ + * lex.c (cpp_alloc_token_string): Don't clobber ending NUL. + +2018-08-28 Nathan Sidwell <nathan@acm.org> + + Undefs + gcc/cp/ + * cp-lang.c (LANG_HOOKS_PREPROCESS_UNDEF): Override. + * cp-tree.h (atom_cpp_undef): Declare. + * module.c: Include langhooks.h. + (cpp_undefs): New global. + (module_state::{read,write}_defines): Stream undefs. + (atom_cpp_undef): Define. + gcc/ + * langhooks-def.h (LANG_HOOKS_PREPROCESS_UNDEF): Default. + (LANG_HOOKS_INITIALIZER): Add it. + * langhooks.h (struct lang_hooks): Add preprocess_undef hook. + gcc/c-family/ + * c-lex.c: Include langhooks.h + (init_c_lex, cb_undef): Look at lang hook. + gcc/testsuite/ + * g++.dg/modules/macro-3_[ab].H: New. + * g++.dg/modules/macro-3_c.C: New. + + Sorted macros + gcc/cp/ + * module.c (module_state::{read,write}_define): New, single-macro + streamers. + (module_state::write_define_cb): Delete. + (maybe_add_macro, macro_loc_cmp): New. + (module_state::write_defines): Write in source order. + (module_state::read_defines): Adjust. + + Macro define locations + libcpp/ + * include/cpplib.h (cpp_macro): Add imported field. + gcc/cp/ + * module.c (module_state::write_define_cb): Ignore imported, write + location. + (module_state::read_defines): Read location. + gcc/testsuite/ + * g++.dg/modules/macro-2_[abc].H: New. + * g++.dg/modules/macro-2_d.C New. + + Reading macros. + gcc/cp/ + * module.c (bytes_{in,out}::cpp_node): New. + (bytes_out::buf): New. + (bytes_{in,out}::str): Treat zero-length strings specially. + (module_state::write_define_cb): Concatenate strings. + (module_state::write_defines): Write padding byte. + (module_state::read_defines): New. + (module_state::read): Call it. + libcpp/ + * include/cpplib.h (cpp_alloc_token_string): New. + (cpp_compare_macros): Declare. + * lex.c (cpp_alloc_token_string): New, broken out of ... + (create_literal): ... here. Call it. + * macro.c (warn_of_redefinition): Rename to ... + (cpp_compare_macros): ... this, and make it extern. + (_cpp_create_definition): Adjust. + gcc/testsuite/ + * g++.dg/modules/macro-1_a.H: Adjust. + * g++.dg/modules/macro-1_b.C: New. + + Writing macros. + gcc/cp/ + * cp-tree.h (import_module, declare_module, atom_module_preamble, + finish_module_parse, maybe_atom_legacy_module): Add cpp_reader + arg. + * decl2.c (c_parse_final_cleanups): Adjust finish_module_parse. + * module.c (bytes_out::str): Overload for cpp_hashnode. + (module_state::read_imports,write_imports,do_import): Add + cpp_reader arg. + (module_state::atom_preamble): Likwise. + (import_module, declare_module, atom_module_preamble) + (finish_module_parse, maybe_atom_legacy_module): Likewise. + (module_state::write_{define_cb,defines}): New. + (module_state::write): Write defines when in legacy mode. + * parser.c (cp_parser_module_declaration) + (cp_parser_import_declaration, c_parse_file): Pass parse_in. + gcc/testsuite/ + * g++.dg/modules/macro-1_a.H: New. + +2018-08-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r263897. + + gcc/cp/ + * module.c (module_state): Remove depth. + (module_state::maybe_create_loc): Replace ... + (module_state::set_loc): ... this. + (module_state::read_imports): Check CRC of indirect imports too. + (module_state::attach): Simplify logic. + libcpp/ + * include/linemaph (linemap_module_loc): Drop CURRENT parm. + * line-map.c (linemap_module_loc): Drop reseating capability. + + gcc/cp/ + * module.c (module_state::check_not_purview): New. + (module_state::read_imports,import_module): Use it. + + Remove %M formatter, it is not worth complexity. + gcc/c-family/ + * c-format.c (local_module_ptr_node): Remove + (gcc_cxxdiag_char_table): Remove 'M' + (init_dynamic_diag_info): Remove module_state lookup + * c-format.h (T89_M): Remove + gcc/cp/ + * cp-tree.h (class module_state): Move to module.c section. + (pp_module_name): Delete. + * error.c (cp_printer): Remove %M. + * module.c: Remove %M error printing. + (pp_module_name): Delete. + * ptree.c (cxx_print_decl): Print module number too. + +2018-08-27 Nathan Sidwell <nathan@acm.org> + + Mangling substitutions! + gcc/cp/ + * cp-tree.h (module_vec_name): Delete. + * mangle.c (mangle_substitution): Fix name typo. + * module.c (class module_state): Drop vec_name field. Make mod + short. Add subst field. + (module_state::mangle): New. + (mangle_module): Deal with substitutions. + (mangle_module_fini): Undeal with substitutions. + (module_vec_name): Delete. + (module_state::attach): Don't set vec_name. + gcc/testsuite/ + * g++.dg/modules/sym-subst-1.C: New. + * g++.dg/modules/sym-subst-2_[ab].C: New. + + Fix module-state lifetime issue. + gcc/cp/ + * cp-tree.h (finish_module): Break into ... + (finish_modle_{parse,procesing}): ... these two. + * decl2.c (c_parse_final_cleanups): Adjust modules finalization. + * modules.c (finish_modules): Break into ... + (finish_module_{parse,procesing}): ... these two. + (module_state::release): Break out ... + (module_state::slurped): ... this. + (module_state::{init,fini}): Fold into callers. + + Refactor mangling interface. + gcc/cp/ + * cp-tree.h (mangle_module, mangle_module_fini): Declare. + (mangle_substitution, mangle_identifer): Declare. + * mangle.c (mangle_substitution, mangle_identifer): Define. + (struct globals): Add mod field. + (maybe_write_module): Call mangle_module. + (finish_mangling_internal): Call mangle_module_fini. + * module.c (mangle_module, mangle_module_fini): Define. + +2018-08-23 Nathan Sidwell <nathan@acm.org> + + Module state gains parent. + gcc/cp/ + * cp-tree.h (get_module): Add parent argument. + (module_name): Return string. + * error.c (dump_module_suffix): Adjust module_name use. + * module.c (module_state_hash): Adjust for having a parent. + (module_state: Add parent & fullname fields. + (module_state::set_name): Delete. + (get_module): Add parent. + (get_module): Split string. + (module_mapper::{export_done,imex_query}): Adjust module name access. + (module_state::write_readme): Adjust. + (module_state::{read,write}_{imports,config}): Adjust. + (module_state::set_loc): Use fullename. + (module_state::attach): Create fullname. + * parser.c (cp_parser_module_name): Generate parental name. + * ptree.c (cxx_print_decl): Adjust. + gcc/testsuite/ + * g++.dg/modules/mod-decl-1.C: Adjust diags. + + Kill N: prefix notation + gcc/cp/ + * module.c (enum module_kind): Delete. + (module_state): Replace kind with legacy, adjust is_legacy. + (module_state::set_name): Adjust. + (module_state_hash): Adjust hasher & comparator. + (module_legacy_system_p): Delete. + (make_flat_name): Move into ... + (get_module): ... here. Adjust. + (get_module): Add string variant. + (module_mapper::module_mapper): Adjust. + (module_mapper::{module_name_kind,response_name}): Delete. + (module_mapper::{imex_query,bewait_response,divert_include}): Adjust. + (module_state::{read_imports,attach}): Adjust. + (pp_module_name): Adjust. + (maybe_atom_legacy_module, init_module_processing) + (handle_module_option): Adjust. + * cxx-mapper.cc (module2bmi): Remove encoding. + (encode_module_name): Remove encoding. + gcc/c-family/ + * c-lex.c (c_lex_with_flags): CPP_HEADER include quoting. + gcc/ + * doc/invoke.texi (C++ Modules): Adjust protocol doc. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Adjust BMI mapping. + * g++.dg/modules/legacy-0[ab].H: New. + * g++.dg/modules/legacy-*: Adjust. + +2018-08-22 Nathan Sidwell <nathan@acm.org> + + %M formatter + gcc/c-family/ + * c-format.c (local_module_ptr_node): New. + (gcc_cxxdiag_char_table): Add 'M'. + (argument_parser::handle_conversions): Allow wanted type to be + NULL. + (init_dynamic_diag_info): Simplify lookup, add module_state. + * c-format.h (T89_M): New. + gcc/cp/ + * cp-tree.h (class module_state): Declare before diagnostics. + * error.c (cp_printer): Add %M. + * module.c: Use %M error printing. + + Use modules as handles themselves. + gcc/cp/ + * cp-tree.h (class module_state): Forward declare. + (get_module, pp_module_name): Declare. + (import_module, declare_module, push_module_export): Take + module_state. + * module.c (proclaimer): A module. + (get_module, pp_module_name): Define. + (push_module_export, import_module, declare_module): Adjust. + * parser.c (cp_parser_module_name): Return module_state. + (cp_parser_module_declaration, cp_parser_import_declaration) + (cp_parser_module_proclamation): Adjust. + + Fix GTY + gcc/cp/ + * cp-tree.h (struct mc_index): Don't mark. + (struct mc_slot): Converted from union. Adjust. + (struct module_cluster): Skip mc_index. + * module.c (struct slurping,spewing): Skip range_t members. + (class module_state): Remove static data members. + (global_tree_arys, fixed_trees, global_crc, our_opts, lazy_lru) + (lazy_open, modules, modules_hash): New static vars. Adjust uses. + (finish_module): Add gc point. + gcc/testsuite/ + * g++.dg/modules/gc-1_[abcd].C: New. + +2018-08-21 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (declare_module, import_module): Separate name from + location. + * module.c (module_state::attach): Drop maybe_vec_name arg. + (module_state::get_module): Flatten here. + (declare_module, import_module): Separate name and from loc. + (maybe_atom_legacy_module): Adjust. + * parser.c (cp_parser_module_name): Return tree only. + (cp_parser_module_declaration, cp_parser_import_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/legacy-4.H: Adjust error. + + gcc/cp/ + * module.c (module_mapper::divert_include): Don't append export attrib. + (import_module): Don't scan attribs. + (maybe_atom_legacy_module): Push exporting. + gcc/testsuite/ + * g++.dg/modules/legacy-3_[bc].H: Adjust. + * g++.dg/modules/legacy-5_b.C: Adjust. + * g++.dg/modules/legacy-6_[cd].C: Adjust. + + gcc/cp/ + * module.c (module_state::get_module): Lose dflt & insert args. + (module_state::insert_mapping): Move directly into ... + (module_mapper::module_mapper): ... here. + (module_mapper::bewait_response, module_state::read_imports): Adjust. + (import_module, declare_module): Adjust. + + gcc/cp/ + * module.c (module_state::is_mapping): Rename to ... + (module_state::is_detached): ... here. Use from_loc. + (module_state::attach): New broken out of ... + (module_state::find_module): ... here. Delete, fold into ... + (module_state::read_imports, import_module, declare_module): ... + these callers. + (module_state::read): Adjust module index setting. + + libiberty/ + * pex-unix.c (IS_FAKE_VFORK): Rename to VFORK_IS_FORK. + (pex_unix_exec_child): Avoid spuros clobber warning, use stdio + when forking. + +2018-08-20 Nathan Sidwell <nathan@acm.org> + + Merge trunk r263679. + + Merge trunk r263673. + + Revert r263619 2018-08-17 Nathan Sidwell <nathan@acm.org> + Revert r263597 2018-08-16 Nathan Sidwell <nathan@acm.org> + They break GTY strangely. + +2018-08-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_state::is_detached): New. + (module_state::attach): New, broken out of ... + (module_state::find_module): ... here. Call it. + (declare_modules): Do module-specific attaching here. + +2018-08-16 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/modules.exp (dg-module-pre-prune): Delete + (g++-dg-prune): Don't override. + * g++.dg/modules/legacy-4.H: Use dg-regexp. + * g++.dg/modules/loc-2_[def].C: Likewise. + + gcc/cp/ + * cp-tree.h (class module_state): Forward declare. + (get_module, pp_module_name): Declare. + (push_module_export, declare_module, import_module): Take + module_state. + * error.c (cp_printer): Accept %M. + * module.c (module_state::find_module): Take module_state. + (module_state::get_module): Drop default & insert args. + (module_state::insert_mapping): Delete. + (module_mapper::{module_mapper,bewait_response): Adjust. + (module_mapper::divert_include): Drop indentation. + (module_state::read_imports): Adjust. + (proclaimer): Is a module_state pointer. + (push_module_state, declare_module, import_module): Adjust. + (pp_module_name): New. + (get_module): New. + (maybe_atom_legacy_module): Adjust. + * parser.c (cp_parser_module_name): Return module_state, adjust. + (cp_parser_module_declaration, cp_parser_import_declaration): + Adjust. + gcc/testsuite/ + * g++.dg/modules/legacy-4.H: Adjust regexp. + +2018-08-08 Nathan Sidwell <nathan@acm.org> + + Merge trunk r263429. + +2018-08-02 Nathan Sidwell <nathan@acm.org> + + Merge trunk r263272. + +2018-07-12 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * include/cpplib.h (cpp_clear_if_stack): Renamed from + cpp_pop_directives. + * directives.c (cpp_clear_if_stack): Likewise, drop all arg. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Fixup. + + gcc/c-family/ + * c.opt (fmodule-preamble): Alias fmodule-preamble= + (fmodule-preamble): Fix type. + * module.c: Add i18n markers. + (init_module_processing): Detect unsupported option combos. + (handle_module_option): Don't zap explicit modules-ts. + gcc/ + * diagnostic.c (diagnostic_report_current_module): Add i18n + markers. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-9.C: New. + * g++.dg/modules/modules.exp (mode_list): Preamble is atom. + libcpp/ + * directives.c (cpp_pop_directives): Buffer could be NULL.le + + gcc/cp/ + * lex.c (atom_preamble_prefix_peek): Use cpp_macro_p. + + Hide NT_MACRO + libcpp/ + * include/cpplib.h (cpp_macro_p): New. + * macro.c (cpp_fun_like_macro_p): Use it. + gcc/c-family/ + * c-ada-spec.c (count_ada_macro, store_ada_macro): Use + cpp_macro_p. + * c-ppoutput.c (dump_macro): Likewise. + * c-spellcheck.cc (should_suggest_as_macro_p): Likewise. + gcc/ + * config/rs6000/rs6000-c.c (rs6000_macro_to_expand): Use cpp_macro_p. + * config/powerpcspe/powerpcspe-c.c (rs6000_macro_to_expand): Likewise. + gcc/fortran/ + * cpp.c (dump_macro): Use cpp_macro_p. + +2018-07-06 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/modules.exp: Restore g++-dg-prune after test. + * g++.dg/modules/legacy-5_c.C: Fix scan-lang-dump. + +2018-07-05 Nathan Sidwell <nathan@acm.org> + + No ALIASes for IMPORTS + gcc/cp/ + * cxx-mapper.cc (module2bmi): No aliases here. + (client::imex_response): Adjust. + gcc/ + * doc/invoke.texi (C++ Modules): Remove ALIAS from IMPORT response + set. + + Legacy header warning + gcc/ + * invoke.texi (Wlegacy-header): New warning. + gcc/c-family/ + * c.opt (Wlegacy-header): New. + gcc/cp/ + * cp-tree.h (atom_preamble_end): Declare. + * cp-lang.c (atom_preamble_fsm): Use it. + * lex.c (atom_preamble_prefix_peek): Check OPT_Wlegacy_header. + * module.c (do_divert_include): Likewise. + (atom_divert_include): Default -Wlegacy-header. + (atom_preamble_end): New. + * parser.c (c_parse_file): Use it. + gcc/testsuite/ + * g++.dg/modules/legacy-6*: New. + + Legacy header aliasing + gcc/ + * doc/invoke.texi (C++ Modules): Update protocol docs + gcc/cp/ + * cxx-module.cc (module2bmi): Deal with aliasing. + (encode_module_name): New. + (read_mapping_file): Use it. Deal with aliasing. + (client::imex_response): Likewise. + (client::action): Likewise, + * module.c (module_mapper::module_name_kind): New. + (module_mapper::response_name): Use it. + (module_mapper::divert_include): Allow aliasing. + gcc/testsuite/ + * g++.dg/modules/legacy-5*: New. + +2018-07-03 Nathan Sidwell <nathan@acm.org> + + Merge legacy header options to -fmodules- + gcc/ + * doc/invoke.texi (C++ Modules): Adjust. + gcc/c-family/ + c.opt (fmodules_legacy, fmodules_legacy=): New. + (fmodule-{user,system}-header{,=}): Delete. + gcc/cp/ + * cp-tree.h (modules_legacy_p): Renamed from modules_header_p. + * lang-specs.h (@c++-header): Update. + * lex.c (atom_preamble_prefix_peek): Adjust. + * module.c (module_legacy_name): Do not force to empty string. + (module_state::get_option_string): Adjust. + (declare_module, maybe_atom_legacy_module, init_module_processing) + (handle_module_option): Likewise. + gcc/testsuite/ + * g++.dg/modules/legacy-[1234]*: update. + * g++.dg/modules/atom-inc-1.C: Update. + + Explicit user/system legacy headers + gcc/c-family/ + * c-lex.c (c_lex_with_flags): Encode header names in tree lists. + * c.opt (fmodule-{user,system}-header): New. + gcc/cp/ + * cxx-mapper.cc (module2bmi): Adjust. + (read_mapping_file): Encode legacy header names. + * lang-specs.h (@c++-header): Update. + * module.c (module_state_hash::hash): Update hashers. + (enum module_kind): New. + (module_state::set_name): Adjust. + (module_state_hash::equal): Adjust. + (module_header_is_system): New. + (make_legacy_name): Delete. + (module_state::get_module): Adjust. + (module_mapper::response_name): New. + (module_mapper::imex_query): Adjust. + (module_mapper::bewait_response): Adjust. + (module_mapper::divert_include): Adjust. + (declare_module, maybe_atom_legacy_module): Likewise. + (handle_module_option): Check new options. + gcc/testsuite/ + * g++.dg/modules/modules.exp: update BMI encodings. + * g++.dg/modules/legacy-[1234]*: update. + * g++.dg/modules/atom-inc-1.C: Update. + gcc/ + * doc/invoke.texi (C++ Modules): Document new options. + +2018-06-29 Nathan Sidwell <nathan@acm.org> + + Diverted header column preservation + libcpp/ + * directives.c (do_include_common): Adjust divert callback. + * include/cpplib.h (cpp_divert_include_t): Likewise. + gcc/cp/ + * module.c (module_mapper::divert_include): Add line_maps. + Preserve column number. + (import_module): Look at attribs. + (do_divert_include): Adjust. + * parser.c (cp_parser_module_declaration): Return loc of name. + (cp_parser_import_declaration): Likewise. + (cp_parser_parse_module_preamble): Adjust. + gcc/ + * langhooks.h (lang_hooks): Adjust preprocess_divert_include. + gcc/testsuite/ + * g++.dg/modules/legacy-3_b.H: Adjust. + * g++.dg/modules/legacy-3_c.H: Adjust. + * g++.dg/modules/legacy-4.H: Adjust. + + Diverted include line numbering + libcpp/ + * directives.c (do_include_common): Fixup diversion line + numbering. + (_cpp_pop_buffer): Free to_free even if not a file. + gcc/c-family/ + * c-ppoutput.c (print_line_1): More C++y. + gcc/cp/ + * module.c (module_mapper::divert_include): Two \n's. + gcc/testsuite/ + * g++.dg/modules/legacy-4: New. + * g++.dg/modules/legacy-3_b.H + + gcc/testsuite/ + * g++.dg/modules/modules.exp (dg-module-pre-prunes): Renamed. + + libcpp/ + * directives.c (do_include_common): Include diverter will push + buffer. + * include/cpplib.h (cpp_divert_include_t): Adjust signature. + gcc/ + * langhooks.h (lang_hooks): Adjust preprocess_divert_include + signature. + gcc/cp/ + * module.c (module_mapper::divert_include): Push buffer here. + (do_divert_include): Adjust. + +2018-06-28 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/legacy-3*: New. + + gcc/testsuite/ + * g++.dg/modules/modules.exp: Fix execution tests. Add dg-module-literal + * g++.dg/modules/legacy-2_d.C: Fix expected line number. + * g++.dg/modules/loc-2_[def].C: Use dg-module-literal. + + (Beginnings of) Include diversion. + gcc/c-family/ + * c-opts.c (c_common_post_options): Set divert_include hook. + (cb_file_change): Fixup precedence. + gcc/cp/ + * cp-lang.c (LANG_HOOKS_PREPROCESS_DIVERT_INCLUDE): Override. + * cp-tree.h (modules_header_p): New. + (atom_divert_include): Declare. + * cxx-mapper.cc (flag_fallback): New flag. + (module2bmi): Deal with NULL names. + (buffer::get_request): Fix off-by-one error. + (read_mapping_file): Can be multiply called. Target file name can + be null. + (client::action): Deal with INCLUDE. + (main): There can be may files after connection. Fixup networking + errors. + * lex.c (atom_preamble_prefix_peek): Don't rescan legacy header + module. + * module.c (module_preamble_end_loc): Declare here. + (module_mapper::module_mapper): Prepend path for anything looking + defaulty. + (module_mapper::divert_include): New. + (do_divert_include): New. + (atom_divert_include): New. + (init_module_processing): Set header mode here. + * parser.c (module_preamble_end_loc): Extern. + gcc/ + * doc/invoke.text (C++ Modules): Document -fmodule-header. + * langhooks-def.h (LANG_HOOKS_PREPROCESS_DIVERT_INCLUDE): Provide + default. + * langhooks.h (lang_hooks): Add preprocess_divert_include. + libcpp/ + * directives.c (do_include_common): Add diversion smarts. + * include/cpplib.h (cpp_divert_include_t): New. + (struct cpp_callbacks): Add divert_include. + * line-map.c (linemap_module_loc): Missed commit. + gcc/testsuite/ + * g++.dg/modules/legacy-2.*: New. + * g++.dg/modules/modules.exp: Fixup header compilation. + +2018-06-27 Nathan Sidwell <nathan@acm.org> + + (Beginnings of) Legacy importing + gcc/cp/ + * cxx-mapper.cc (module2bmi): Map legacy header names. + * module.c (module_state::legacy): New field. + (module_state::{is_legacy,set_name}): New. + (make_legacy_name): New. + (module_state::get_module): Canonicalize legacy name. + (module_state::get_option_string): Strip -fmodule-header. + (declare_module): Check correct kind. + (maybe_atom_legacy_module): Use make_legacy_name. + * parser.c (cp_parser_module_name): Parse legacy names. + (cp_parser_import_declaration): Don't special case legacy names + here. + gcc/testsuite/ + * g++.dg/modules/atom-inc-1.C: Add expected errors. + * g++.dg/modules/legacy-1_[abc].[CH]: New. + * g++.dg/modules/modules.exp: Support legacy header compilation. + + (Beginnings of) Legacy header modules + libcpp/ + * line-map.c (linemap_module_loc): Expect ordinary loc. + gcc/ + * langhooks-def.h (LANG_HOOKS_PREPROCESS_MAIN_FILE): Provide + default. + * langhooks.h (lang_hooks): Add preprocess_main_file hook. + gcc/c-family/ + * c-opts.c (cb_file_change): Call new hook. + gcc/cp/ + * cp-tree.h (enum atom_preamble_state): Define. + (atom_preamble_prefix_{peek,next}): Use enum. + (atom_main_file, maybe_atom_legacy_module): Declare. + * cxx-mapper.cc (module2bmi): Munge legacy module chars. + * lang-specs.h (@c++-header): Fix -fmodule-header use. + * lex.c (atom_preamble_prefix_{peek,next}): Adjust for enum. + * module.c (prefix_line_maps_hwm, prefix_locations_hwm): New. + (module_state::{read,write,prepare}_locations): Adjust prefix checking. + (ordinary_loc_of): New. + (import_module): Use it. + (declare_module): Set preamble prefix if needed. + (atom_main_file, maybe_atom_legacy_module): New. + (init_module_processing): Don't default module_header_name here. + (atom_module_preamble, finish_module): Push & pop exporting state in + legacy mode. + * parser.c (cp_parser_get_module_preamble_tokens): Adjust for + preamble state. Return indicator of preamble contents. + (c_parse_file): Maybe inject legacy module decl. + * cp-lang.c (LANG_HOOKS_PREPROCESS_MAIN_FILE): Override hook. + (atom_preamble_fsm): Adjust for state enum. + +2018-06-26 Nathan Sidwell <nathan@acm.org> + + Merge trunk r262148. + + gcc/ + * configure.ac: Fix AF_INET6 & accept4 tests. + * configure, config.in: Rebuilt. + gcc/cp/ + * module.c: Update some comments. + (module_mapper::module_mapper): Fix up conditional code. + (module_state::read_imports): Replace local class with std::pair, + because C++98. + * cxx-mapper.cc (accept_from): Fixup conditional code. + +2018-06-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc (kill_signal): New. + (server): Fixup inet_ntop use. + + gcc/ + * configure.ac: Check for inet_ntop. + * configure, config.in: Rebuilt. + gcc/cp/ + * cxx-mapper.cc (server): Use inet_ntop when available. + +2018-06-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc: BMI->GCC + * module.c: Likewise. + gcc/ + * doc/invoke.texi: Likewise. + +2018-06-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-mapper.cc (struct netmask): New. + (server): Validate connection addresses. + (accept_from): New. + (process_args): Add -a arg. + + Simplify protocol. + gcc/cp/ + * cxx-mapper.c (buffer::empty): New. + (buffer::send_response): Fixup buffer management. + (client::imex_response): New. + (client::action): Reimplement. + * module.c (module_mapper): Update. + gcc/ + * doc/invoke.texi (C++ Modules): Update protocol. + gcc/testsuite/ + * g++.dg/modules/indirect-1_c.C: Tweak scan. + + A proper server + gcc/cp/ + * cxx-module-mapper.sh: Delete. + * cxx-mapper.cc: New. + * Make-lang.in: Adjust. + * module.c (module_mapper:get_response): Fixup errors. + (module_mapper::import_query): Drop filename. + +2018-06-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_mapper::send_command): Fix off-by-one. + (module_mapper::get_response): Cleanup batch splitting. + (module_mapper::handshake): Adjust. + * cxx-module-mapper.sh (cmd): Adjust HELLO. + gcc/ + * doc/invoke.texi (C++ Modules): Tweak mapper protocol. + + gcc/ + * configure.ac: Check select, accept4. + * config.in, configure: Rebuilt. + +2018-06-21 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c.opt: Add -fmodule-header. + gcc/cp/ + * lang-specs.h: Add legacy import options. + * module.c (module_header_name): New. + (init_module_processing): Default it. + (handle_module_option): Set it. + + Use getaddrinfo, not gethostbyname2 + gcc/ + * configure.ac (HAVE_AF_INET6): Test for getaddrinfo. + * configure: Rebuilt. + * doc/invoke.text (C++ Modules): Default is loopback. + gcc/cp/ + * module.c (module_mapper::module_mapper): Reorganize network startup. + gcc/testsuite/ + * g++.dg/modules/bad-mapper-[23].C: Adjust diagnostics. + +2018-06-19 Nathan Sidwell <nathan@acm.org> + + Early & late location maps. + gcc/cp/ + * modules.c (slurping, spewing): Rearrange. + (module_state::{prepare,read,write}_locations): Reimplement. + (module_state::{read,write}): Adjust. + (module_state::atom_preamble): Adjust. + +2018-06-18 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/loc-2_[a-f].C: New. + +2018-06-17 Nathan Sidwell <nathan@acm.org> + + gcc/ + * configure.ac: Detect epoll & pselect. + * configure, config.in: Rebuilt. + + gcc/cp/ + * module.c (module_mapper::module_mapper): Fixup length errors. + + gcc/cp/ + * cxx-module-mapper.sh: Remove recompilation capability. + gcc/testsuite/ + * g++.dg/modules/import-2.C: Adjust messages. + * g++.dg/modules/main-aux.cc: Delete. + * g++.dg/modules/main_1.C: Delete. + +2018-06-15 Nathan Sidwell <nathan@acm.org> + + gcc/ + * diagnostic.c (diagnostic_report_current_module): Starting + location could be a module. + gcc/cp/ + * module.c (trees_{in,out}::loc): Move to ... + (module_state::{read,write}_location}): ... here. + (trees_{in,out}::core_vals): Adjust. + (module_state::{read,write}_imports): Serialize import location. + (module_state::set_loc): Add floc parm, adjust. + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Adjust regexp. + + gcc/cp/ + * cp-tree.h (make_module_loc): Delete. + * lex.c (make_module_loc): Delete. + * module.c (module_state): Add depth field. + (module_state::set_loc): Deal with reseating. Add line_maps parm. + (module_state::read_imports): Do two passes. + (module_state::write_imports): Write length. + gcc/testsuite/ + * g++.dg/modules/import-1_e.C Adjust lang dump scan. + * g++.dg/modules/mod-imp-1_d.C: Likewise. + libcpp/ + * include/line-map.h (linemap_module_loc): Add incomping loc parm. + * line-map.c (linemap_module_loc): Do reseating. + + Location! Location! Location! + gcc/cp/ + * module.c (module_state::slurper): New. + (trees_{in,out}::loc): Implement. + (trees_in::core_vals): Set locus. + (spewing::linemaps): Fixup offset calculation. + (module_state::read_locations): Set ord_locs. + gcc/testsuite/ + * g++.dg/module/loc-1_[abc].C: New. + + libcpp/ + * include/line-map.h (IS_ORDINARY_LOC, IS_MACRO_LOC): New. + (IS_ADHOC_LOC): Simplify. + (MAP_ORDINARY_P): Use IS_ORDINARY_LOC. + * line-map.c (linemap_module_restore): Fixup included_at. + + gcc/ + * diagnostic.c (diagnostic_report_current_module): Fixup include + stack messages. + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Adjust include stack regexps. + + gcc/cp/ + * module.c (spewer::linemaps): Return mask. + (module_state::{find,write}_locations): Use mask. + (module_state::read_locations): Implement. + + Line_maps args everywhere! + gcc/cp/ + * cp-tree.h (declare_module, import_module, atom_module_preamble): + Add line_maps arg. + * module.c (module_state::{read_imports,do_import}): Add line_maps. + (module_state::set_loc): New. + (module_state::atom_preamble): Deal with restoring line_maps. + (module_state::read): Add line_maps. Call read_locations. + * parser.c (cp_parser_module_declaration) + (cp_parser_import_declaration): Adjust. + (c_parse_file): Line_maps restoration is moved. + libcpp/ + * include/line-map.h (linemap_save_pre_module): Delete. + (linemap_restore_pre_module): Rename to ... + (linemap_module_restore): ... here. + * line-map.c (linemap_save_pre_module): Delete. + (linemap_restore_pre_module): Rename to ... + (linemap_module_restore): ... here. + + gcc/cp/ + * module.c (bytes_{in,out}::align): New. + (bytes_{in,out}::buf): Use it. + + libcpp/ + * line-map.c (linemap_init): Set default allocator here. + (line_map_new_raw): Break out of ... + (new_linemap): ... here. Call it. + * include/line-map.h (line_map_new_raw): Declare + +2018-06-14 Nathan Sidwell <nathan@acm.org> + + Break out import section. + gcc/cp/ + * module.c (module_state::{read,write}_imports): New. + (module_state::{read,write}_config): Don't do imports here ... + (module_state::{read,write}): ... do them here. + + Fix section alignment. + gcc/cp/ + * module.c (elf_out::grow): Fix padding calc. + (elf_out::add): Assert aligned. + + Write out line maps. + gcc/cp/ + * cp-tree.g (atom_module_preamble, finish_module): Add line_maps. + * decl2.c (c_parse_final_cleanups): Pass line_table. + * parser.c (c_parse_file): Adjst. + * module.c (struct spewing): New. + (struct slurping): Add GTY tagging. + (module_state::spewer): New. + (module_state::{write,atom_preamble}): Add linemaps. + (module_state::{find,write,read}_locations): New. + + gcc/cp/ + * module.c (struct slurping): New, broken out of ... + (struct module_state): ... here. Move loading data there and + adjust all users. + +2018-06-13 Nathan Sidwell <nathan@acm.org> + + Reorg line_map data structures. + libcpp/ + * include/line-map.h (LINE_MAP_MAX_LOCATION): Define here. + (struct line_map): Move reason field to line_map_ordinary. Adjust + GTY tagging. + (struct line_map_ordinary): Reorder fields for less padding. + (struct line_map_macro): Likewise. + (MAP_ORDINARY_P): New. + (linemap_check_ordinary, linemap_check_macro): Adjust. + (MAP_MODULE_P): Adjust. + * line-map.c (LINE_MAP_MAX_SOURCE_LOCATION): Delete. + (new_linemap): Take start_location, not reason. Adjust. + (linemap_add, linemap_enter_macro): Adjust. + (linemap_line_start): Likewise. + (linemap_macro_expansion_map_p): Use MAP_ORDINARY_P. + (linemap_macro_loc_to_spelling_point): Likewise. + (linemap_macro_loc_to_def_point): Likewise. + (linemap_dump): Likewise. + +2018-06-12 Nathan Sidwell <nathan@acm.org> + + Better socket handling. Kill mapping from fd + gcc/cp/ + * module.c (class module_mapper): Add from & to fds. + (module_mapper::{module_mapper,kill}): Adjust. + (module_mapper::{send_command,get_response}): Likewise. + (module_from_cmp): New. + (module_state::atom_preamble): Reimplement. + gcc/ + * doc/invoke.texi (C++ Modules): Remove fd mapper options. + gcc/testsuite/ + * g++.dg/modules/import-2.C: Adjust messages. + * g++.dg/modules/flag-1_b.C: Likewise. + * g++.dg/modules/mod-stamp-1_d.C: Likewise. + + gcc/ + * configure.ac: Rename HOST_HAS_AF_$FOO to HAVE_AF_$FOO. + * configure, config.in: Rebuilt. + gcc/cp/ + * module.c: Adjust. + +2018-06-11 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c + (elf_out::grow): Always define, always align. + (elf_out::write): Streaming buffers must be using our + allocator. No need to align here. + + MMAP writing + gcc/ + * configure.ac: Check for posix_fallocate. + * configure, config.in: Rebuilt. + gcc/cp/ + * module.c (MAPPED_WRITING): New. + (data::allocator::{grow,shrink}): New overloads. + (data::use): Check available. + (data::allocator::grow): Deal with allocator failure. + (bytes_in::read): Set overflow on fail. + (bytes_{in,out}::{u32,c,i,u,wi,buf}): Adjust. + (bytes_out::printf): Likewise. + (bytes_out::bytes_out): Allocator is non-optional. + (elf_out): Derive from data::allocator. + (elf_out::{grow,shrink}): New overriders. + (elf_out::elf_out): Find page size. + (elf_out::{create,remove}_mapping): New. + (elf_out::write): New overload. + (elf_out::add): Take bytes_out. Adjust users. + (elf_out::{begin,end}): Add mapping support. + (trees_out::trees_out): Add allocator parm. + (trees_{in::out}::fixed_refs): Delete, adjust uses. + (module_state::write_{readme,config,namespaces,bindings}): Adjust. + (module_state::write_{unnamed,cluster}): Adjust. + + Prep for MMAP exporting. + gcc/cp/ + * module.c (MODULE_MMAP_IO): Rename to ... + (MAPPED_READING): This. + (data): Add allocator class with default instance. + (data::{write,printf}): Move to bytes_out. + (data::read): Move to bytes_in. + (data::{extend,release}): Delete. Adjust uses. + (bytes_out): Add allocator pointer, alter ctor. + (bytes_out::begin): Add need_crc parm. + (elf::section_vec): Delete. + (elf): Add sectab, strtab data members. + (get_num_sections): Delete. + (elf_{in,out}::strings): Delete here. + (elf_in::{grow,shrink}): New. + (elf_in::{get_section{,_limit}): New, adjust uses. + (elf_in::{keep_sections,forget_section}): Delete. + +2018-06-09 Nathan Sidwell <nathan@acm.org> + + MMAP importing! + gcc/cp/ + * module.c (MODULE_MMAP_IO): New define. + (bytes::{begin,end}): Delete. + (elf_in::{freeze,defrost}): Adjust. + (elf_in::{begin,end}): Adjust. + (elf_in::{keep,forget}_section): Adjust. + (elf_in::read): Adjust. + (module_state::our_opts): New static member. Adjust uses. + gcc/ + * doc/invoke.texi (C++ Modules): Document lazy limit change. + +2018-06-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (elf): Replace FILE *stream with int fd. Update uses. + + gcc/cp/ + * module.c (bytes::begin): Add CRC parm. + (elf_in): Read buffers, adjust. + + gcc/cp/ + * module.c (elf_out): Track file position directly. + (elf_out::pad): Remove, fold into ... + (elf_out::write): ... here. Take a buffer. + (elf_out::{add,begin,end}): Adjust. + + gcc/cp/ + * module.c (elf): Add hdr member. + (elf_in::begin): Adjust. + (elf_out::{begin,end}): Adjust. + + gcc/cp/ + * module.c (data::printf): Moved from ... + (bytes_out::printf): ... here. + (elf): Replace sections pointer with section_vec local class. + Adjust all uses. + (elf_out): Remove strtab member class. + (elf_out::end): Adjust. + +2018-06-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (bytes::calc_crc): Take length parm. Adjust callers. + (elf_out::strtab): Reimplement. + (elf_out::add): Use buffer pos for length. + + gcc/cp/ + * module.c (struct data): Resurrect. Move buffer extension here. + Update users. + (class bytes): Derive from data. + + gcc/cp/ + * module.c (struct data): Delete. Move into ... + (struct bytes): ... here. Update uses. + + gcc/cp/ + * module.c (struct data): Make buffer a pointer. Redo interface. + + Change integer on-disk format. + gcc/cp/ + * module.c (bytes_{in,out}::{i,u,wi}): Reimplement. + (make_bmi_path): Don't prefix absolute paths. + + BMI repo directory + libiberty/ + * pex-unix.c: Fixup optimization issues. + gcc/cp/ + * cxx-module-mapper.sh: Add repo to HELLO. + * module.c (bmi_repo, bmi_repo_length, bmi_path, bmi_path_alloc): New. + (set_bmi_repo, make_bmi_path, drop_bmi_prefix): New. + (module_mapper::{handshake,module_mapper}): Repo location from file. + (relativize_import): Delete. + (module_state::{write_readme,maybe_defrost,do_import,finish_module): + Adjust. + gcc/ + * doc/invoke.texi (C++ Modules): Document bmi repo. + +2018-06-06 Nathan Sidwell <nathan@acm.org> + + Better pex-unix. + libiberty/ + * pex-unix.c (VFORK_STRING): Replace with ... + (IS_FAKE_VFORK): ... this. + (pex_child_error): Delete, fold into ... + (pex_unix_exec_child): ... here. Inform parent, when really vforking. + gcc/cp/ + * module.c (module_mapper::module_mapper): Merge error message. + gcc/testsuite/ + * g++.dg/modules/bad-mapper-1.C: Adjust. + * g++.dg/modules/bad-mapper-{2,3}.C: New. + + gcc/cp/ + * module.c (module_mapper::module_mapper): Ignore sigpipe. + (module_mapper::kill): Restore sigpipe. + (module_mapper::{response_unexpected,get_response}): Cope with EOF. + gcc/testsuite/ + * g++.dg/modules/bad-mapper-1.C: New. + +2018-06-05 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): Clarify and extend. + +2018-06-04 Nathan Sidwell <nathan@acm.org> + + Self relative direct import pathnames. + gcc/cp/ + * module.c (relativize_import): New. + (module_state::write_readme): Call it. + (module_state::read_imports): Make import relative to importer, + query mapper if needed. + + Cookies for mapping files + gcc/cp/ + * module.c (module_mapper::response_eol): Add ignore arg. + (module_mapper::module_mapper): Cookie on file mapper. + gcc/ + * invoke.texi (C++ Modules): Document file mapper cookie. + gcc/testsuite/ + * g++.dg/modules/map-1_b.C: Use specific mapper. + * g++.dg/modules/map-1_b.map: New. + +2018-06-03 Nathan Sidwell <nathan@acm.org> + + gcc/ + * diagnostic.c (diagnostic_report_current_module): Don't claim + module was imported. + * doc/invoke.texi (C++ Modules): Update module-mapper docs. + gcc/cp/ + * module.c (module_mapper::module_mapper): Change syntax for + option. + (module_mapper::response_token): Add all parm. + (module_mapper::bmi_response): Use it. + (module_state::check_read): Fix error reporting. + (finish_module): Warn if not exporting due to errors. + gcc/testsuite/ + * lib/prune.exp (prune_gcc_output): Adjust module import regexp/ + * g++.dg/modules/map-1_[ab].C: Adjust module-mapper arg. + * g++.dg/modules/atom-decl-2.C: Add expected warning + * g++.dg/modules/mod-decl-1.C: Likewise. + * g++.dg/modules/mod-decl-3.C: Likewise. + * g++.dg/modules/proclaim-1.C: Likewise. + +2018-06-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_mapper): Robustify. + + gcc/fortran/ + * cpp.c (cb_file_change): Adjust for line map inclusion changes. + + Module mapping file is back + gcc/ + * doc/invoke.text (C++ Modules): Document mapping file. + gcc/cp/ + * cxx-module-mapper.sh: Strip -fmodule-preamble=. + * module.c (elf::get_error): Detect no file name. + (module_state): Add imported field. + (module_state::is_{imported,mapping}): New. + (module_mapper::module_mapper): Read mapping file. + (module_mapper::get_response): Distingish empty from end. + (module_state::get_module): Copy a mapping. + (module_state::insert_mapping): New. + (module_state::read_imports): Adjust. + (module_state::do_import): Set imported. + (import_module, declare_module): Adjust. + (module_state::atom_preamble): Adjust. + gcc/testsuite/ + * g++.dg/modules/map-1{_a.C,_b.C,.map}: New. + +2018-05-31 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): Show mapper cookie. + gcc/cp/ + * module.c (module_mapper::fini): Assert. + (module_mapper::module_mapper): Remove dup2. + (module_mapper::reset): Delete. + + gcc/ + * doc/invoke.texi (C++ Modules): Rename -fmodule-server to + -fmodule-mapper. + gcc/c-family/ + * c.opt (fmodule-mapper): Renamed from fmodule-server. + gcc/cp/ + * cxx-module-mapper.sh: Renamed from cxx-module-server.sh. + * Make-lang.in: Update. + * module.c (struct module_mapper): Renamed from module_server. + + Merge trunk r261033. + + gcc/cp/ + * module.c (bytes_in::begin): Add location_t arg. + (elf_in::begin): Add location args. + (trees_in::{tree_node,finish}): Use error_at. + (module_server::module_server): Likewise. + (module_state::read*): Adjust. + (module_state::{do_import,lazy_load}): Don't set input_location. + (finish_module): Likewise. + + ASYNC loading & server cookie. + gcc/cp/ + * cp-tree.h (reseat_module_loc, module_from_loc): Delete. + (atom_module_preamble): Declare. + * cxx-module-server.sh (cmd): Fix ASYNC response. + * lex.c (reseat_module_loc, module_from_loc): Delete. + * module.c (module_state::from_loc): Is a field. + (module_server): Require locations throughout. Redesign + interface. Add cookie. + (module_state::read_config): Use from_loc. + (module_state::read): Don't set module_purview here ... + (module_state::find_module): ... do it here. + (module_state::do_import): Add check_crc flag. Don't query server + here. + (import_module, declare_module): Query server here (ts). + (module_state::atom_preamble): New. + (atom_module_preamble): Call it. + (finish_module): Adjust. + * parser.c (cp_parser_peek_module_name): Fold into ... + (cp_parser_module_name): ... here. + (cp_parser_module_declaration): No injected atom end marker. + (cp_parser_module_preamble): Rename to ... + (cp_parser_get_module_preamble_tokens): ... this. Don't append + end marker. Return end loc. + (cp_parser_parse_module_preamble): New. + (cp_parser_declaration_seq_opt): Adjust. + (cp_parser_fill_main): Skip preamble. + (c_parse_file): Do preamble tokenization and parsing here. + gcc/ + * doc/invoke.texi (C++ Modules): Document server cookie. + libcpp/ + * include/cpplib.h (cpp_relocate_peeked_tokens): Declare. + * include/line-map.h (linemap_save_pre_module) + (linemap_restore_pre_module): Declare. + (LINEMAP_MODULE_SET_FROM): Delete. + * lex.c (cpp_relocate_peeked_tokens): New. + * line-map.c (linemap_module_loc): Set from direcly. + (linemap_save_pre_module, linemap_restore_pre_module): New. + gcc/testsuite/ + * g++.dg/modules/flag-1_b.C + * g++.dg/modules/freeze-1_d.C + * g++.dg/modules/import-2.C + * g++.dg/modules/indirect-1_c.C + * g++.dg/modules/mod-stamp-1_d.C + +2018-05-30 Nathan Sidwell <nathan@acm.org> + + Module location + libcpp/ + * include/cpplib.h (cpp_module_file): Delete. + * include/line-map.h (MAP_MODULE_P, LINEMAP_MODULE_SET_FROM): New. + (linemap_module_loc): Declare. + * files.c (cpp_module_file): Delete. + * line-map.c (linemap_module_loc): New. + gcc/cp/ + * cp-tree.h (module_file_nest): Delete. + (make_module_loc, reseat_module_loc, module_from_loc): Declare. + * lex.c (module_file_nest): Delete. + (make_module_loc, reseat_module_loc, module_from_loc): New. + * module.c (struct module_state): Replace imp_loc and self_loc + with plain loc. + (module_state::{push,pop}_location): Delete. + (module_state::from_loc): New. + (module_state::find_module): Set module loc here. + (module_state::do_import): Adjust loc setting. + (module_state::lazy_load): Likewise. + (finish_module): Likewise. + gcc/ + * diagnostic.c (diagnostic_report_current_module): Show module imports. + gcc/testsuite/ + * lib/prune.exp: Prune 'module imported at'. + * g++.dg/modules/atom-check-1_b.C: Adjust. + * g++.dg/modules/circ-1_c.C: Adjust. + * g++.dg/modules/flag-1_b.C: Adjust. + * g++.dg/modules/import-2.C: Adjust. + * g++.dg/modules/mod-decl-1.C: Adjust. + * g++.dg/modules/mod-decl-2_b.C: Adjust. + * g++.dg/modules/mod-stamp-1_d.C: Adjust. + + gcc/cp/ + * module.c (struct module_state): Replace loc with imp_loc & + self_loc. Rename imported to direct. + (module_state::occupied): Delete. + (module_state::read{_,config}): Replace crc_ptr with bool flag. + (module_state::do_import): ... here. Break out ... + (module_state::find_module): ... this part. Absorb ... + (module_state::occupy): ... this. Delete. + (module_state::get_module): Change default insert. Check vec_name + for occupation. + (module_state::write_imports): Adjust. + (import_module, declare_module): Adjust. + +2018-05-29 Nathan Sidwell <nathan@acm.org> + + Included from index becomes included_at location + libcpp/ + * include/line-map.h (line_map_ordinary): Replace included_from + index with included_at source_location. + (ORDINARY_MAP_INCLUDER_FILE_INDEX, LAST_SOURCE_LINE_LOCATION) + (LAST_SOURCE_LINE, LAST_SOURCE_COLUMN): Delete. + (INCUDED_FROM): Delete. + (INCLUDED_AT, linemap_included_at): New. + (MAIN_FILE_P): Adjust. + * directives.c (do_linemarker): Use linemap_included_at. + * line-map.c (include_at_map): New. + (line_check_files_exited): Use it. + (LAST_SOURCE_LINE_LOCATION): New (moved from header). + (linemap_add, linemap_dump, linemap_dump_location): Adjust. + gcc/ + * diagnostic.c (diagnostic_report_current_module): Use + linemap_included_at. Adjust line & col discovery. + gcc/c-family/ + * c-common.c (try_to_locate_new_include_insertion_point): Use + linemap_included_at. + * c-lex.c (fe_file_change): Use INCLUDED_AT. + * c-ppoutput.c (pp_file_change): Likewise. + + libcpp/ + * include/line-map.h (enum lc_reason): Add LC_HWM, LC_CXX_MODULE. + * line-map.c (linemap_dump): Adjust. + gcc/ + * diagnostic.c (diagnostic_report_current_module): Reroll loop. + + gcc/cp/ + * cxx-module-server.sh: Add batching and ASYNC support. + gcc/ + * doc/invoke.texi (C++ Modules): More protocol explanation + +2018-05-25 Nathan Sidwell <nathan@acm.org> + + Server protocol batching + gcc/ + * doc/invoke.texi (C++ Modules): Document protocol batching. + gcc/cp/ + * cp-tree.h (maybe_peek_import): Delete. + * lex.c (atom_preamble_prefix_peek): Drop import peeking. + * parser.c (cp_parser_module_preamble): Likewise. + * module.c (module_server::{send_command,get_response}): Deal with + batching. + (module_state::peek_import_query, maybe_peek_import): Delete. + (module_state::next_line): New. + gcc/tesutsuite/ + * g++.dg/modules/atom-peek-1_[abc].C: Delete. + + Merge trunk r260753. + + Direct import lambda returns! + gcc/cp/ + * module.c (depset::decl_key): Remove assert. + (trees_{in,out}::core_vals): Serialize type context, lambda expr and + decl size & value. + (trees_out::tree_decl): Spot voldemort returns. Ident by index. + (trees_in::tree_node): Ident by index. + (trees_in::finish_type): Don't set type context here. + (depset::hash::add_dependency): Namespaces are also ok. + * decl.c (fndecl_declared_return_type): Default to auto. + * decl2.c (no_linkage_error): Ignore imported decls. + * name-lookup.h (lookup_by_ident): Ident is index. + (get_lookup_ident): Declare. + * name-lookup.c (get_binding_or_decl): New. + (lookup_by_ident): Use it. Ident is index. + (get_lookup_ident): New. + gcc/testsuite/ + * g++.dg/modules/vmort-1_[ab].C: New. + * g++.dg/modules/lambda-1_[ab].C: New. + +2018-05-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (extract_module_decls): Don't strip template of + result. + gcc/ + * doc/invoke.texi (C++ Modules): Consider batching. + + gcc/ + * doc/invoke.texi (C++ ModuleS): Update server docs. + gcc/cp/ + * cxx-module-server.sh: Add INCLUDE. + * semantics.c (deferred_access): Move GTY. + * module.c (module_state::global_vec): Move GTY. + (module_state::modules): Likewise. + * parser.c (cp_parser_peek_module_name): Remove incomplete + partition work. + + DECL_DISCRIMINATOR for local classes, merge local var disc. + gcc/cp/ + * cp-tree.h (language_function): Remove x_local_names. + (DECL_DISCRIMINATOR_P): Allow IMPLICIT_TyPEDEF too. + (DECL_DISCRIMINATOR_SET_P): Delete. + (local_classes): Delete declaration. + (determine_local_discriminator): Declare. + * class.c (local_classes): Delete. + (init_class_processing): Don't init it. + * decl.c (local_names): Delete. + (local_entities): New. + (push_local_name): Replace with ... + (determine_local_discriminator): ... this. + (cp_finish_decl): Adjust. + (save_function_data, finish_function): Remove local_name handling. + * decl2.c (finish_anon_union): Set discriminator. + * mangle.c (write_unnamed_type_name): Use discriminator_for_local_entity. + (local_class_index): Delete. + (discriminator_for_local_entity): Use DECL_DISCRIMINATOR for both + cases. + (write_local_name): Adjust. + * name-lookup.c (do_pushtag): Use determine_local_discriminator. + gcc/testsuite/ + * g++.dg/abi/anon5.C: New. + +2018-05-23 Nathan Sidwell <nathan@acm.org> + + gcc/ + * diagnostic-code.h (fullname): Delete. + * diagnostic.c (fullname): Delete. + * toplev.c (general_init): Don't set it. + gcc/cp/ + * module.c: Include opts.h. + (module_state::get_option_string): New. + (module_state::write_{readme,config}): Write option string. + (module_state::read_config): Check it. + (module_state::write): Adjust. + (module_server::module_server): Adjust. + gcc/testsuite/ + * g++.dg/modules/flag-1_[ab].C: New. + + Now with a Sneakoscope! + gcc/cp/ + * module.c (depset::hash): Add a sneakoscope. + (module_state::find_dependencies): Turn it on. + (trees_out::tree_decl): Check it. + gcc/testsuite/ + * g++.dg/modules/local-1_[ab}.C: New. + + gcc/cp/ + * cxx-module-server.sh: Remove --no-default. + * module.c (module_server::send_command): New. + (module_server::{reset,handshake,import_export_query,export_done}): + Use it. + gcc/testsuite/ + * g++.dg/modules/atom-peek-1_[bc].C: Adjust scans. + * g++.dg/modules/indirect-1_c.C: Likewise. + +2018-05-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-module-server.sh: Add --no-compile, --no-default and + --mapping options. + + gcc/cp/ + * module.c (depset::defn_key): Add is_def parm. + (depset::hash::add_definition): Delete. + (depset::hash::add_dependency): Add either decl or defn. + (depset::hash::add_binding): Use add_dependency. + (cluster_cmp): Swap defns and decls. + (cluster_tag): Delete ct_voldemort, ct_no_decl. + (module_state::{read,write}_cluster): Voldemorts are implicit. + (module_state::write): Adjust. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_b.C: Adjust module scan. + + Revert lazy definition patches. Once one gets into template land + it's all very brittle. We end up with an unmaintained difference + betweek 'we need the definition right now', and 'we need the + definition at some point'. I end up not being able to maintin the + SCC dependency graph, and my head melted, looking a the rat hole + that was appearing. Until proved otherwise, there are other + things to get on with. + gcc/cp/ + * cp-tree.h (DECL_MODULE_LAZY_DEFN, HAS_DECL_MODULE_LAZY_DEFN_P) + (MAYBE_DECL_MODULE_LAZY_DEFN): Delete. + (struct lang_decl_min): Remove lazy_module_defn field. + (lazy_load_defn): Delete decl. + * constexpr.c (cxx_eval_call_expression): Remove lazy loading. + * decl2.c (decl_defined_p, mark_used): Likewise. + * module.c (depset::hash::add_definition): Remove DEFERRED parm. + (trees_in::{pre,}seed): Delete. + (trees_out::seeding{,_p}): Delete. + (trees_out::unmark_trees): Seeding not needed. + (trees_out::{begin,end}): Delete seeding variants. + (trees_out::seed): Remove. + (trees_out::insert): Return val, remove seeding. + (trees_{in,out}::lang_decl_vals): Remove seeding. + (has_definition): Return bool. + (ct_seed_decl, ct_self_used): Delete. + + (module_state::{read,write}_cluster): Remove lazy handling. + (module_state::{find_dependencies,write}): Adjust. + (module_state::check_read): Adjust. + (module_state::lazy_load, lazy_load_defn): Delete. + * ptree.c (cxx_print_decl): Remove lazy defn index. + + Almost lazy function definitions. + gcc/cp/ + * constexpr.c (cxx_eval_call_expression): Maybe lazy load. + * decl2.c (decl_defined_p): Lazy definitions are ok. + (mark_used): Try and lazy load. + * module.c (module_state::lazy_load): Lazy load a definition. + (trees_out::seed): Mark template result. + (trees_in::tree_node): Adjust mark_used. + (module_state::write_cluster): Adjust. + (module_state::read_cluster): Accept ct_self_used. + (lazy_load_defn): New. + + gcc/cp/ + * module.c (trees_out::seed): Reimplement mechanim. + (trees_out::{begin,end}): Don't turn seeding on/off here. + (trees_out::unmark_trees): Add logging. + (trees_in::preseed): Fix addition calculation. + (module_state::write_cluster): Adjust lazy defn seeding. + (module_state::read_cluster): Add lazy defn seeding. + (module_State::find_dependencies): Adjust. + +2018-05-21 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * directives.c (struct if_stack): Add hash_loc field. + (PEEKED): Replace with ... + (PEEK_INVISIBLE): ... this. Inverted sense. + (DIRECTIVE_TABLE): Update. + (linemarker_dir): Add PEEK_INVISIBLE. + (_cpp_handle_directive): Correctly handle if nests. + + gcc/testsuite/ + * g++.dg/modules/atom-preamble-2_[def].C: New. + + gcc/cp/ + * cp-tree.h (HAS_DECL_MODULE_LAZY_DEFN_P): New. + (MAYBE_DECL_MODULE_LAZY_DEFN): Use it. + * module.c (trees_in::{pre,}seed): Adjust. + (trees_out::{begin,end}): New overloads. + (trees_out::unmark_trees): Adjust. + (trees_out::{preseed,insert}): Correct force marking. + (trees_in::tree_node): Robustify. + (module_state::write_cluster): Fix name, better messages, + (module_state::read_cluster): Use ct_no_decl. + (module_state::write): Use HAS_DECL_MODULE_LAZY_DEFN_P. + (module_state::check_read): Use decl if it makes sense. + + Write lazy decls (no reading yet) + gcc/cp/ + * module.c (elf_out::strtab::named_decl): Add IS_DEFN parm. + (elf_out::named_decl): Likewise. + (elf_out::strtab::write): Adjust. + (FIXED_LIMIT): New. + (trees_out::set_seed): Delete. + (trees_out::{pre,un,}seed): New. + (trees_out::insert): Adjust for seeding. + (trees_out::tree_ref): Likewise. + (cluster_tag): Add ct_lazy. + (module_state::write_cluster): Preseed decls of lazy defns. + (module_state::find_dependencies): Adjust seeding changes. + (module_state::write): Determine lazy defn section numbers. + +2018-05-20 Nathan Sidwell <nathan@acm.org> + + libcpp/ + * internal.h (_cpp_handle_directive): Add HASH_LOC arg. + * directives.c (_cpp_handle_directive): Add HASH_LOC arg, store it. + * init.c (read_original_filename): Adjust _cpp_handle_directive call. + * lex.c (_cpp_lex_token): Likewise. + * traditional.c (_cpp_scan_out_logical_line): Likewise. + * directives-only.c (_cpp_preprocess_dir_only): Likewise. + + Import peeking + gcc/c-family/ + * c-lex.c (c_lex_with_flags) <case CPP_STRING>: Check + C_LEX_STRING_IS_HEADER. + * c-pragma.h (C_LEX_STRING_IS_HEADER): New flag. + gcc/cp/ + * cp-tree.h (HEADER_STRING_LITERAL_P): Delete. + (maybe_peek_import): Declare. + * cxx-module-server.sh: Adjust. + * lex.c (atom_preamble_prefix_peek): Add peeking state. + * module.c (module_server::peek_import_query): New. + (make_flat_name): New. Broken out of ... + (module_state::do_import): ... here. Call it. + (maybe_peek_import): New. + * parser.c (cp_parser_peek_module_name): New. + (cp_parser_module_name): Use it. + (cp_parser_import_declaration): Adjust. + (cp_parser_module_preamble): Do peeking. + gcc/ + * doc/invoke.texi (C++ Modules): Tweak server protocol + gcc/testsuite/ + * g++.dg/modules/atom-peek-1_[abc].C: New. + * g++.dg/modules/mod-decl-1.C: Adjust diags. + * g++.dg/modules/p0713-2.C: Likewise. + * g++.dg/modules/proclaim-1.C: Likewise. + + Diagnose pragmas ending preamble. + libcpp/ + * lex.c (cpp_peek_token_with_location): Set peeked_location to + incoming location. Fix pragma unwind. + gcc/cp/ + * cxx-module-server.sh: Add new commands. + * lex.c (atom_preamble_prefix_peek): Note trailing pragma. + gcc/ + * doc/invoke.text (C++ Modules): More server commands. + gcc/testsuite/ + * g++.dg/modules/atom-pragma-[123].C: New. + +2018-05-19 Nathan Sidwell <nathan@acm.org> + + Parse after tokenizing + libcpp/ + * lex.c (cpp_peek_token_with_location): Adjust for compiler warning. + gcc/cp/ + * parser.c (module_preamble_end_loc): Rename to ... + (module_marker_loc): ... here. + (cp_parser_module_declaration): Reimplement. + (cp_parser_import_declaration): Adjust. + (cp_parser_module_preamble): Don't parse here. Add artificial end + marker. + (cp_parser_declaration_seq_opt): Adjust for atom. + (cp_parser_fill_main): Whole buffer is to be parsed. + (c_parse_file): Don't set end_loc here. + gcc/testsuite/ + * g++.dg/modules/atom-decl-1.C: Adjust diagnostics. + * g++.dg/modules/atom-preamble-1.C: Likewise. + * g++.dg/modules/mod-decl-1.C: Likewise. + * g++.dg/modules/p0713-[23].C: Likewise. + +2018-05-18 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::maybe_insert_typeof): New. + (trees_out::{force_,maybe_,}insert): Merge, adjust callers. + (trees_out::tree_decl): Use maybe_insert_typeof. + (module_state::write_cluster): Likewise. + gcc/testsuite/ + * g++.dg/modules/indirect-3_c.C: Adjust scans. + + gcc/cp/ + * module.c (module_state::write_cluster): Break apart unnamed + numbering from marking. + (module_state::write): Break apart cluster sizing from section + numbering. + + gcc/cp/ + * module.c (trees_out::mark_node): Lose walk_into parm. Adjust + all callers. + (module_state::write_cluster): Assert binding already marked. + + gcc/cp/ + * module.c (module_state::mark_definition): Remove include_decl + parm. + (module_state::mark_{template,function,var,class,enum}_def): Likewise. + + gcc/cp/ + * module.c (trees_in::{preseed,seed}): New. + (trees_out::seeding): New member. + (trees_out::seeding_p): New predicate. + (trees_out::unmark_trees): Add trees_in parm to preseed. + (trees_out::end): Add trees_in parm. + (trees_out::set_seed): New. + (trees_out::tree_decl): Check seeding_p. + (module_state::find_dependencies): Preseed the decl of a defn. + gcc/testsuite/ + * g++.dg/modules/defer-1.C :New. + + gcc/cp/ + * module.c (depset::hash::add_definition): Add DEFERRABLE parm. + (has_definition): Return tristate. + (depset::hash::add_{dependency,binding}): Adjust. + (module_state::find_dependencies): Refactor. + + Add lazy_module_defn cookie. + * cp-tree.h (DECL_MODULE_LAXY_DEGN, MAYBE_DECL_MODULE_LAZY_DEFN): New. + (struct lang_decl_min): Add lazy_module_defn field. + * module.c (trees_{in,out}::lang_decl_vals): Serialize it. + * ptree.c (cxx_print_decl): Print it. + + gcc/cp/ + * cp-tree.h (ovl_op_flags, ovl_op_code): Reindent. + * lex.c (atom_preamble_prefix_peek): FIXME. + * parser.c (cp_parser_module_preamble): FIXME. + * module.c (bytes_out::streaming_p (): New. + (trees_out::streaming_p): Delete. + (tt_backref): Delete. Update uses to know -ve == backref + (module_state::write_cluster): Some refactoring. + +2018-05-16 Nathan Sidwell <nathan@acm.org> + + Preamble rescanning! + gcc/ + * configure.ac: Look for execv. + * config.in, configure: Rebuilt. + * toplev.h (original_argc, original_argv): Declare. + * toplev.c (original_argc, original_argv): Declare. + (toplev::main): Set them. + doc/invoke.texi (EE) Rename to ... + (fmodule-preamble): ... this. + (C++ Modules): Document RESET message. Document N,N. + gcc/c-family/ + * c.opt (EE): Rename to ... + (fmodule-preamble) ... here. + (fmodule-preamble=): New hidden option. + * c-ppoutput.c (scan_translation_unit): Use cpp_pop_directives. + gcc/cp/ + * cp-tree.h (atom_preamble_prefix_peek): Add from-parser parm. + (maybe_repeat_preamble): Declare. + * cp-lang.c (atom_preamble_fsm): Adjust. + * cxx-module-server.sh (RESET): New command. + * lang-specs.h (@c++): Adjust EE->fmodule-preamble. + * lex.c (atom_preamble_prefix_peek): Add from-parser parm. Check + flag_module_preamble. Call maybe_repeat_preamble. + * module.c: #include "toplev.h" + (module_server_name): Is const. + (module_server::module_server): Copy command. Support N,N for two + pipes. + (module_server::make): Adjust. + (module_server::reset): New. + (module_server::fini): Add reset arg. Reset. + (maybe_repeat_preamble): New. + (handle_module_option): Adjust. + * parser.c (cp_parser_module_preamble): Adjust. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-[1-8].C: Adjust options. + * g++.dg/modules/atom-rescan-1.C: New. + * g++.dg/modules/atom-no-rescan-1.C: New. + +2018-05-15 Nathan Sidwell <nathan@acm.org> + + Detect cpp directives at end of preamble + libcpp/ + * include/cpplib.h (cpp_peek_token_with_location): Declare. + (cpp_pop_directives): Declare. + * internal.h (struct cpp_reader): Add peeked_directive field. + * directives.c (PEEKED): New. + (DIRECTIVE_TABLE): Add it. + (_cpp_handle_directive): Set peeked_directive. + (cpp_pop_directives): New. + * lex.c (cpp_peek_token): Wrapper around ... + (cpp_peek_token_with_location): ... this. + gcc/cp/ + * cp-lang.c (atom_preamble_fsm): Update for new state transitions. + * lex.c (atom_preamble_prefix_peek): Check peeked directives. + * parser.c (cp_parser_module_preamble): Update. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-1.C: Add diag + * g++.dg/modules/cpp-preamble-[678].C: New. + + libcpp/ + * include/cpplib.h (cpp_in_macro_expansion_p): Declare. + * macro.c (in_macro_expansion_p): Rename to ... + (cpp_in_macro_expansion_p): ... here. Externalize. + (cpp_get_token_1): Adjust. + * internal.h: Update docs. + gcc/ + * langhooks.h (struct lang_hooks): Adjust preprocess_preamble. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Pass token location to + preamble hook. + gcc/cp/ + * cp-lang.c (atom_preamble_fsm): Pass token loc through. + * cp-tree.h (atom_preamble_prefix_next): Take token loc. + * lex.c (atom_preamble_prefix_next): Take token loc. Warn if + ending inside macro. + * parser.c (cp_parser_module_preamble): Adjust. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-5.C: New. + + gcc/ + * langhooks.h (struct lang_hooks): Adjust preprocess_preamble. + gcc/cp/ + * cp-tree.h (atom_preamble_prefix_{peek,next}): Declare. + * cp-lang.c (atom_preambls_fsm): Adjust args. Use + atom_preamble_prefix_{peek,next}. + * lex.c (atom_preamble_prefix_len): Turn into ... + (atom_preamble_prefix_peek): ... this. + (atom_preamble_prefx_next): New. + * parser.c (cp_parser_module_preamble): Adjust. + gcc/c-family/ + * c-ppoutput.c (scan_translation_unit): Adjust + gcc/testsuite/ + * g++.dg/modules/atom-preamble-2_c.C: New. + * g++.dg/modules/cpp-preamble-4.C: New. + + gcc/cp/ + * Make-lang.in: Dont sed server version + * module.c: Use fixed server version. + * cxx-module-server.sh: Likewise. + + gcc/cp/ + * module.c (trees_out::dep_walk_p): Replace with ... + (trees_out::{streaming,depending}_p): ... these. Update callers. + +2018-05-14 Nathan Sidwell <nathan@acm.org> + + Objectify module server. + gcc/cp/ + * module.c (class module_server): New. + (server_read, server_write, server_pex, server_size) + (server_buffer, server_pos, server_end) + (server_response, server_token, server_word, server_unexpected) + (server_error, server_init, server_fini): Move into module_server class. + (server_module_filename): Delete. + (module_state::do_import): Use module_server::import_query. + (finish_module): Use module_server::export_{query,done}. + gcc/testsuite/ + * g++.dg/modules/indirect-1_c.C: Tweak. + + gcc/ + * doc/invoke.texi (C++ Modules): Clarify server docs. + gcc/cp/ + * cxx-module-server.sh: Robustify. + * module.c (server_module_filename): Send from location. + gcc/testsuite/ + * g++.dg/modules/import-2.C: Tweak. + +2018-05-13 Nathan Sidwell <nathan@acm.org> + + Redo the server protocol. + gcc/cp/ + *cxx-module-server.sh: Update protocol. + * module.c (elf_out::end): Protect from NULL stream. + (server_size, server_buffer, server_pos, server_end): New. + (server_response, server_token, server_word): New. + (server_end_p): New. + (server_malformed): Delete. + (server_init, server_module_filename, server_done): Adjust. + (module_state::do_import): Adjust. + gcc/ + * doc/invoke (C++ Modules): Update server protocol. + +2018-05-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_server): Make pointer to non-const. + (server_fini, handle_module_option): Add const_cast. + (server_init): Write into module_server. strdup if it came from + environment. + + Rename oracle->server, thanks Richard Smith + gcc/ + * doc/invoke.texi (fmodule-oracle): Rename. + gcc/c-family/ + * c.opt (fmodule-oracle): Rename. + gcc/cp/ + * Make-lang.in (cxx-module-oracle): Rename. + * cxx-module-oracle.sh: Rename. + * module.c (ORACLE_VERSION, module_oracle, oracle_read) + (oracle_write, oracle_pex): Rename. + (oracle_fini, oracle_init, oracle_response, oracle_unexpected) + (oracle_malformed, oracle_module_filename, oracle_done): Rename. + + Direct import filenames are stored. + gcc/cp/ + * module.c (bytes_out::str): Add overload. + (bytes_in::str): Robustify. + (module_state::{read,write}_imports): New. + (noisy_p): New. + (module_state::announce, oracle_init): Use noisy_p. + (oracle_module_file): Rename to ... + (oracle_module_filename): ... here. Adjust parms, return + filename. + (module_state::write_readme): Write import filename. + (module_state::{read,write}_config): Use {read,write}_imports. + (module_state::do_import): Add FILENAME arg, adjust. + (finish_module): Adjust. + gcc/testsuite/ + * g++.dg/modules/import-1_e.C: Adjust scan. + * g++.dg/modules/indirect-1_c.C: Verify no query on indirect import. + +2018-05-11 Nathan Sidwell <nathan@acm.org> + + Remove remaining knowledge of module file names. + gcc/cp/ + * module.c (MOD_FNAME_SFX, MOD_FNAME_DOT): Delete. + (module_state): Remove srcname. + (module_state::print_map): Delete. + (oracle_query_module, oracle_stream, find_module_file): Merge to ... + (oracle_module_file): ... this. + (make_module_file, find_file): Delete. + (module_state::do_import): Adjust. + (finish_module): Likewise. + + (Kill -fmodule-output -- use the oracle. + gcc/c-family/ + * c.opt (fmodule-output): Delete. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Delete -fmodule-output. + (C++ Modules): Likewise. + gcc/cp + * module.c (module_output): Delete. + (module_state::do_import): Don't check it. + (finish_module): Likewise. + (handle_module_options): Likewise. + gcc/testsuite/ + * g++.dg/modules/fmod-out-1_[ab].C: Delete. + + Kill -fmodule-file -- use the oracle. + gcc/c-family/ + * c.opt (fmodule-map-dump): Delete. + (fmodule-file): Delete. + gcc/cp/ + * module.c (module_file_args, module_map_dump): Delete. + (parse_module_mapping): Delete. + (add_module_mapping): Delete. + (init_module_processing): Delete module map init. + (handle_module_option): Delete module map options. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Delete -fmodule-file. + (C++ Modules): Likewise. + gcc/testsuite/ + * g++.dg/modules/fmod-file-1_[ab].C: Delete. + * g++.dg/modules/fmod-out-1_[ab].C: Adjust. + + Kill -fmodule-path and CXX_MODULE_PATH -- use the oracle. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Remove -fmodule-path. + (C++ Modules): Likewise. + * incpath.h (INC_CXX_MPATH): Delete. + (clean_cxx_module_path): Delete. + * incpath.c (clean_cxx_module_path): Delete. + gcc/c-family/ + * c-opts.c (c_common_post_options): Don't clean_cxx_module_path. + * c.opt (fmodule-path): Delete. + gcc/cp/ + * module.c (module_path, module_path_max): Drop. + (find_file): Adjust. + (init_module_processing): Drop module path init. + (handle_module_option): Drop module_path. + + gcc/cp/ + * Make-lang.in (cxx-module-oracle): Sed version. + (cxx_module-wrapper): Delete. + * cxx-module-oracle: Allow dev versions. + * cxx_module-wrapper: Delete. + * module.c (ORACLE_VERSION): New. + (oracle_init): Use MODULE_STAMP if available. + + A more conventional protocol + gcc/ + * doc/invoke.texi (C++ Modules): Update oracle protocol. + gcc/cp/ + * cxx-module-oracle.sh: Update protocol. + * module.c (oracle_response): Parse response. + (oracle_unexpected, oracle_malformed): New. + (oracle_init): Check version. + (oracle_query_module): Update. + + Kill module wrapper -- you should use the oracle. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Remove -fmodule-wrapper. + * gcc.h (driver::maybe_putenv_CXX_MODULE_WRAPPER): Delete decl. + * gcc.c (maybe_putenv_CXX_MODULE_WRAPPER): Delete. + (driver::main): Don't call it. + gcc/cp/ + * module.c (module_wrapper): Delete. + (find_module_file): Drop wrapper spawning. + (init_module_processing): Drop wrapper initialization. + (handle_module_option): Drop wrapper option. + gcc/c-family/ + * c.opt (fmodule-wrapper=): Delete. + gcc/testsuite/ + * g++.dg/modules/modules.exp (DEFAULT_MODFLAGS): Drop -fmodule-wrapper. + * g++.dg/modules/main-[123]-aux.cc: Delete. + * g++.dg/modules/main-[123]-map: Delete. + * g++.dg/modules/main-[123]_a.C: Delete. + + gcc/c + * config.in: Rebuilt too. + + gcc/ + * diagnostic-core.h (fullname): Declare. + * diagnostic.c (fullname): Define. + * toplev.c (general_init): Set it. + gcc/cp/ + * cxx-module-oracle.sh: More messages. + * module.c (oracle_init): When defaulting, expect to be next to + cc1plus. + (oracle_stream): Always try and init the oracle. + gcc/testsuite/ + * g++.dg/modules/main_a.C: Adjust for oracle use. + + gcc/ + * configure.ac: Check for AF_UNIX and AF_INET6. + * configure: Rebuilt. + * doc/invoke.texi (C++ Modules): Update oracle. + gcc/cp/ + * module.c: Check HOST_HAS_AF_{UNIX,INET6}. + +2018-05-10 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c: Include socket headers. + (oracle_init): Create and connect local or ipv6 socket. + gcc/ + * doc/invoke.texi (C++ Modules): Document oracle socket options. + + gcc/cp/ + * module.c (module_prefix): Delete. + (make_module_filename): Don't handle it. + (handle_module_option): Nor here. + gcc/c-family/ + * c.opt (fmodule-prefix): Delete. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Remove -fmodule-prefix. + (C++ Modules): Remove -fmodule-prefix + + Oracle! + gcc/cp/ + * Make-lang.in (cxx-module-oracle): New rule. + * cxx-module-oracle.sh: New. + * module.c (module_oracle): New flag. + (oracle_read, oracle_write, oracle_pex): New vars. + (oracle_init, oracle_fini, oracle_response, oracle_query_module) + (oracle_done, oracle_stream): New. + (find_module_file, finish_module): Use oracle. + (handle_module_option): Store oracle option. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Add -fmodule-oracle. + (C++ Modules): Document oracle. + gcc/c-family/ + * c.opt (fmodule-oracle=): New. + +2018-05-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_state::get_module): Add insert arg. + (module_state::{read,write}_config): Stream direct imports first. + gcc/testsuite/ + * g++.dg/modules/import-1_[ce].C: Adjust. + * g++.dg/modules/mod-imp-1_[cd].C: Adjust. + + Add -EE + gcc/cp/ + * cp-lang.c (atom_preamble_fsm): New. + (LANG_HOOKS_PREPROCESS_PREAMBLE): Override. + * cp-tree.h (atom_preamble_prefix_len): Declare. + * lang-specs.h (@c++): Pass -EE when preprocessing. + * lex.c (atom_preamble_prefix): New. Broken out of ... + * parser.c (cp_parser_module_preamble): ... here. Use it. + * module.c (handle_module_option): EE implies atom. + gcc/c-family/ + * c-ppoutput.c: Include langhook.h. + (scan_translation_unit): Use lang_hooks.preprocess_preamble. + * c.opt (EE): New. + gcc/ + * langhooks-def.h (LANG_HOOKS_PREPROCESS_PREAMBLE): Define. + (LANG_HOOKS_INITIALIZER): Add it. + * langhooks.h (struct lang_hooks): Add preprocess_preamble. + * doc/cppopts.texi (EE): Document. + * doc/invoke.texi (Preprocessor Options): Add -EE. + (C++ Modules): Document -EE. + gcc/testsuite/ + * g++.dg/modules/cpp-preamble-[123].C: New. + + gcc/cp/ + * cp/parser.c (module_preamble_end_loc): New var. + (cp_parser_module_declaration): Check it. + (cp_parser_import_declaration): Likewise. + (cp_parser_module_preamble): Deal with FILENAME enabling. + (cp_parser_declaration_seq_op): Set it. + (cp_parser_declaration): Parse out-of-preamble module & import + decls. + (cp_parser_initial_pragma): Don't check modules here. + (c_parse_file): Set module_preamble_end_loc. + gcc/c-family/ + * c-lex.c (c_lex_with_flags): Remove C_LEX_FILENAME handling. + * c-pragma.h (C_LEX_FILENAME): Delete. + gcc/testsuite/ + * g++.dg/modules/atom-decl-[123].C: Adjust. + * g++.dg/modules/atom-preamble-3.C + * g++.dg/modules/atom-preamble-4.C: New. + * g++.dg/modules/mod-decl-1.C: Adjust. + * g++.dg/modules/p0713-[23].C: Adjust. + +2018-05-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_parser_module_preamble): Check for macros + gcc/testsuite/ + * g++.dg/modules/atom-preamble-3.C: New. + + gcc/cp/ + * parser.c (cp_parser_module_preamble): New. + (cp_parser_fill_main): Remove atom parsing here. + (c_parse_file): Adjust. + gcc/testsuite/ + * g++.dg/modules/atom-preamble-1.C: New. + * g++.dg/modules/atom-preamble-2_[ab].C: New. + +2018-05-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (depset): Add is_unnamed and refs_unnamed flags. + (depset::hash::add_dependency): Set them here. + (cluster_cmp): Change order again. + (module_state::write_cluster): Check refs_unnamed here. + gcc/testsuite. + * g++.dg/modules/scc-1.C: Readjust. + + gcc/cp/ + * module.c (depset::tarjan::connect): Use section==0 for done, not + top bit of cluster. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_b.C: Fix scan. + +2018-05-06 Nathan Sidwell <nathan@acm.org> + + Horcruxes! + gcc/cp/ + * module.c (FIXED_LIMIT): Remove. + (trees_out::{,maybe_}insert): Make public. + (trees_out::maybe_mark_unnamed): Delete. + (trees_out::tree_ref): Remove voldemort handling. + (trees_in::tree_node): Likewise. + (tree_tag): Remove tt_voldemort. + (trees_out::maybe_tag_decl_type): Move back into .. + (trees_out::tree_decl): ... here. + (cluster_tag): Add voldemort & horcruxes. + (module_state::{read,write}_cluster): Deal with horcruxes. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_[ab].C: Adjust scans. + +2018-05-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::maybe_tag_decl_type): New, broken out of ... + (trees_out::tree_decl): ... here. Call it. + (trees_out::tree_ref): Use it. + gcc/testsuite/ + * g++.dg/modules/unnamed-1_[ab].C: New. + + gcc/cp/ + * ptree.c (cxx_print_decl): Show module. + * module.c (tree_tags): Add tt_voldemort. + (FIXED_LIMIT): New. + (trees_out::maybe_mark_unnamed): New. + (module_state::unnamed): New field. + (module_state::{read,write}_unnamed): New. + (module_state::{read,write}_config): Serialize unnamed count. + (module_state::{read,write}_cluster): Determine unnamedness. + (trees_out::tree_ref): Check for unnamed. + (trees_in::tree_node): Add tt_voldemort. + (depset::hash::add_dependency): Don't add decl to its binding. + (cluster_cmp): Reorder, again. + (cluster_tag): Add ct_unnamed. + (module_state::{read,write}): Adjust. + gcc/testsuite/ + * g++.dg/modules/namespace-2.C: Adjust scan. + * g++.dg/modules/unnamed-[12].C: New. + * g++.dg/modules/scc-1.C: Unadjust. + + gcc/cp/ + * module.c (module_state::mark_definition): Add include_decl arg. + (module_state::mark_{template,function,var,class,enum}_def): Likewise. + (cluster_cmp): Reorder decl < defn < bind. + (enum cluster_tag): New. + (module_state::{read,write}_cluster): Use it. + gcc/testsuite/ + * g++.dg/modules/scc-1.C: Adjust. + +2018-05-03 Nathan Sidwell <nathan@acm.org> + + gcc/c-family + * c-cppbuiltin.c (c_cpp_builtins): Update __cpp_modules value, + define __cpp_modules_{ts,atom} as selected. + gcc/testsuite/ + * g++.dg/modules/atom-check-1_a.C: Check for __cpp_modules_atom. + * g++.dg/modules/atom-check-1_b.C: Check for __cpp_modules_ts. + + gcc/cp/ + * module.c (cluster_size): Delete. + (module_state::write_{cluster,namespaces,bindings}): Adjust. + (module_state::write): Precalculate section numbers. + +2018-05-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cxx-module-wrapper.sh: Require bash. + + Fragment depsets more. + gcc/cp/ + * module.c (depset): Replace container & decls with key. Adjust + hashing etc. + (depset::{binding,decl,defn}_key): New. + (depset::is_{binding,decl,defn}): New. + (depset::hash::{maybe_insert,find}): Take a key. + (depset::hash::add_definition): Reimplement. + (depset::hash::add_dependency): Reimplement. + (depset::hash::add_binding): Reimplement. + (cluster_cmp): Extend. + (module_state::write_{cluster,namespaces,bindings}): Adjust. + (module_state::{add_writables,find_dependencies}): Adjust. + + gcc/cp/ + * module.c (depset::tarjan): Replace binds, spaces & defs fields + with plain result field. + (depset::tarjan::connect): Don't categorize SCCs here. + (cluster_size): New. + (module_state::write_cluster): Take SIZE arg. + (module_state::write): Use cluster_size, split out namespaces here. + +2018-05-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::tree_{type,decl,ctx}): Separate need_body + and owner args. + (trees_{in,out}::core_vals): Don't stream TYPE_CONTEXT. + (trees_in::finish_type, module_state::read_class_def): Reconstruct + it here. + (trees_out::tree_binfo): Use tree_ctx. + + gcc/cp/ + * module.c (trees_out::tree_decl): Write innermost args. + gcc/testsuite/ + * g++.dg/modules/indirect-4_[abc].C: New. + + gcc/cp/ + * module.c (module_state::occupy): Do not set filename here. + (search_module_path): Rename to ... + (find_file): ... here. Search for bmis too. + (find_module_file): Use find_file. + (add_module_mapping, finish_module): Adjust. + gcc/ + * doc/invoke.texi (C++ Modules): Document search path and prefix. + + gcc/cp/ + * Make-lang.in (c++.install-common): Install wrapper into + libexecsubdir. + + Merge trunk r184995. + +2018-04-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::tree_decl): Adjust for member templates. + (trees_out::tree_node): Don't deal with templates here. + (trees_in::tree_node): Adjust template instantiations here. + (module_state::mark_template_def): Adjust. + gcc/testsuite/ + * g++.dg/modules/indirect-2_b.C: Adjust module scan. + * g++.dg/modules/indirect-3_[abc].C: New. + +2018-04-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r259710. + +2018-04-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (DECL_TEMPLATE_INFO): Correct comment. + * module.c: Update description, general format cleanups. + (elf_out::SECTION_ALIGN): New. + (elf_out::pad): Use it. + * pt.c (build_template_decl): Make static. + +2018-04-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (maybe_get_template): Delete. + (trees_out::tree_decl): Move dependency building into named-decl + handling. Don't walk into namespaces. + + gcc/cp/ + * module.c (trees_out::tree_node): Reorder. + +2018-04-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::tree_decl): Deal with templated types. + (tree_in::tree_node): Likewise. + gcc/testsuite/ + * g++.dg/modules/indirect-2_[abc].C: Add template class. + + gcc/cp/ + * module.c (enum tree_tag): Add tt_template. + (trees_out::tree_decl): Emit tt_template as needed. + (trees_in::tree_node): Read tt_template. + gcc/testsuite/ + * g++.dg/modules/class-3_b.C: Adjust. + * g++.dg/modules/indirect-1_b.C: Adjust. + * g++.dg/modules/indirect-2_[abc].C: New. + + gcc/cp/ + * module.c (trees_out::core_vals): Check module of type context. + (trees_out::tree_decl): Assert we can find the named decl. + (module_state:read_config): Move defrosting to ... + (module_state::read): ... here. + +2018-04-23 Nathan Sidwell <nathan@acm.org> + + gcc/testsuite/ + * g++.dg/modules/indirect-1_[abc].C: Add exported constant. + + gcc/cp/ + * name-lookup.c (lookup_by_ident): Look in enumerals. + gcc/testsuite/ + * g++.dg/modules/indirect-1_[abc].C: Add enum. + + gcc/cp/ + * module.c (trees_{in,out}::core_vals): More FUNCTION_DECL fields. + gcc/testsuite/ + * g++.dg/modules/indirect-1_[abc].C: Add virtual class. + + gcc/cp/ + * module.c (dumper::pop): Don't print trailing line. + + gcc/cp/ + * module.c (trees_{in,out}::core_vals): Allow NULL-context VAR_DECLS. + gcc/testsuite/ + * g++.dg/modules/indirect-1_[abc].C: Add class. + + gcc/cp/ + * module.c (enum tree_tag): Remove tt_namespace. + (trees_out::tree_{value,decl,type,ref,ctx}): New. Broken out of ... + (trees_out::tree_node): ... here. Use them. + (trees_out::core_vals): Use tree_ctx. + (module_state::write_cluster): Use tree_ctx. + * name-lookup.h (find_imported_namespace): Delete. + * name-lookup.c (find_imported_namespace): Delete. + gcc/testsuite/ + * g++.dg/modules/class-3_d.C: Adjust scans. + * g++.dg/modules/indirect-1_[abc].C: New. + + gcc/cp/ + * module.c (module_state::importing): New. + (module_state::init): Lazy_open is not just for laziness. + (module_state::read_config): Call maybe_defrost. + (module_state::maybe_defrost): New, broken out of ... + (module_state::load_section): ... here. Call it. + (module_state::freeze_an_elf): Look in importing stack too. + gcc/testsuite/ + * g++.dg/modules/nest-1_[abc].C: New. + +2018-04-11 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c-lex.c (c_lex_with_flags): Check C_LEX_FILENAME. Deal with + CPP_HEADER_NAME. + * c-pragma.h (C_LEX_FILENAME): New. + gcc/cp/ + * parser.c (cp_parser_fill_main): Ask for C_LEX_FILENAME. + (cp_parser_import_declaration): Parse legacy import names. + * cp-tree.h (HEADER_STRING_LITERAL_P): New. + libcpp/ + * include/cpplib.h (cpp_enable_filename_token): Declare. + * macro.c (cpp_enable_filename_token): Define. + pfile->state.angled_headers. + gcc/testsuite/ + * g++.dg/modules/atom-inc-1.C: New. + + gcc/cp/ + * module.c (module_state::lazy_depth): Remove. + (module_state::lazy_open): Make countdown value. + (module_state::init): Use getrlimit to default PARAM_LAZY_MODULES. + gcc/ + * doc/invoke.texi (C++ Modules): Document lazy loading. + * params.def (PARAM_LAZY_MODULE_FILES): Rename to ... + (PARAM_LAZY_MODULES): ... here. + gcc/testsuite/ + * g++.dg/modules/freeze-1_d.C: Fix. + +2018-04-10 Nathan Sidwell <nathan@acm.org> + + Protect against too-many lazy loadings. + gcc/ + * params.def (PARAM_LAZY_MODULE_FILES): Define. + gcc/cp/ + * module.c: Include params.h + (elf::has_error): Return the error code. + (elf_in): Add device, inode & size fields. + (elf_in::{is_frozen,freeze,defrost}): New. + (module_state): Add lru, lazy_lru, lazy_open fields. + (module_state::{load_section,freeze_an_elf}): New. + (module_state::{read,lazy_load}): Adjust. + (module_state::check_read): Check for EMFILE. + (module_state::do_import): Adjust. + gcc/testsuite/ + * g++.dg/modules/freeze-1_[a-d].C: New. + + gcc/cp/ + * parser.c (cp_parser_declaration_seq_opt): Remove ATOM handling here. + + Incremental tokenization of ATOM preamble. + gcc/c-family/ + * c-pragma.h (C_LEX_STRING_FILENAME): New. + gcc/cp/ + * cp-tree.h (module_file_nest): Declare. + * lex.c (module_file_nest): Define. + * module.c (module_state::{push,pop}_location): Use it. + * parser.c (cp_lexer_fill_main): Rename to ... + (cp_parser_file_main): ... this. Take parser not lexer. Read & + parse one atom declaration at a time. + (cp_parser_declaration_seq_opt): Disable atom preamble here. + (c_parse_file): Adjust. + libcpp/ + * files.c (cpp_module_file): New. + * include/cpplib.h (cpp_module_file): Declare. + +2018-04-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * parser.c (cp_lexer_new_main): Replace with ... + (cp_lexer_fill_main): ... this. Move initial pragma processing to + ... + (c_parse_file): ... here. + (cp_parser_new): Adjust. + + gcc/cp/ + * parser.c (cp_lexer_get_preprocessor_token): Take cpp-flags + directly. + (cp_lexer_new_main, cp_parser_initial_pragma): Adjust. + + gcc/cp/ + * cp-tree.h (modules_p, modules_atom_p): New predicates. + * decl.c (cxx_init_decl_processing): Use modules_p. + * decl2.c (c_parse_final_cleanups): Likewise. + * lex.c (init_reswords): + * module.c (module_state::write_readme): Use modules_atom_p. + (module_state::{read,write}_config): Likewise. + (handle_module_option): Don't handle OPT_fmodules_atom here, + * name-lookup,c (reuse_namespace, make_namespace_finish): Use + modules_p. + * optimize.c (maybe_clone_body): Likewise. + * semantics.c (expand_or_defer_fn_1): Likewise. + * parser.c (cp_parser_diagnose_invalid_type_name) + (cp_parser_declaration_seq_opt, cp_parser_declaration): Use + modules predicates. + (cp_parser_initial_pragma): Reject pragma with modules. + (c_parse_file): Adjust error message. + gcc/c-family/ + * c.opt (fmodules-ts, fmodules-atom): Adust. + (fno-modules): New. + gcc/ + * doc/invoke.texi (fno-modules): Document. + + gcc/cp/ + * module.c (init_module_processing): Disallow PCH. + gcc/c-family/ + * c-pch.c (c_common_valid_pch): Never valid with modules. + + gcc/cp/ + * module.c (module_state::{read,write}_config): Check ATOM/TS + matches. + gcc/testsuite/ + * g++.dg/modules/atom-check-1_[ab].C: New. + + gcc/cp/ + * module.c (module_state::write_readme): New. Broken out of ... + (module_state::write_context): ... here. Absorb remainder into ... + (module_state::write_config): ... here. + (module_state::read_context): Merge into ... + (module_state::read_config): ... here. + (module_state::{read,write}): Adjust. + + gcc/cp/ + * module.c (module_state::release): Simplify. + (module_state::check_read): Release if done. + gcc/testsuite/ + * g++.dg/modules/import-2.C: Expect no bmi. + * g++.dg/modules/modules.exp (dg-module-bmi): Always delete the bmi. + + gcc/cp/ + * module.c (module_state::read): Allocate elf_in here. + (module_state::do_import): Adjust. + gcc/testsuite/ + * g++.dg/modules/import-2.C: New. + + gcc/cp/ + * module.c (trees_out::tree_node): Avoid uninitialized false + positive. + +2018-04-06 Nathan Sidwell <nathan@acm.org> + + Merge trunk r259189. + + Lazy loading! + gcc/cp/ + * cp-tree.h (union mc_slot): New. + (struct module_cluster): Use it. + (lazy_load_binding): Take an mc_slot. + * module.c (module_state::release): End the elf source. + (module_state::read_function_def): Save and restore + current_function_decl. + (module_state::read): Enable lazy loading. + (module_state::lazy_load): Take an mc_slot, adjust. + (lazy_load_binding): Likewise. + * name-lookup.c (module_binding_slot): Return an mc_slot pointer. + (fixed_module_binding_slot): New. + (name_lookup::search_namespace_only): Lazily load. + (do_pushdecl): Use fixed_module_binding_slot. + (merge_global_decl): Adjust. + (import_module_binding): Install lazy cookie. + (set_module_binding): Adjust. Kill stale & wrong global module + bits. + (lookup_by_ident): Lazily load. + (reuse_namespace): Use fixed_module_binding_slot. + (make_namespace_finish): Likweise. + (add_imported_namespace, find_imported_namespace): Adjust. + gcc/c-family/ + * c.opt (fmodule-lazy): Default on. + gcc/testsuite/ + * g++.dg/modules/lazy-1_[ab].C: New. + + gcc/cp/ + * module.c (elf::E_BAD_LAZY): New error. + (elf::has_error): New. + (elf::get_error): Return string. + (elf::end): Return bool. + (elf_in::forget_section): New. + (module_state::check_error): New. + (module_state::do_module_import): Use it. + (module_state::lazy_load): New. + (module_state::{read,write}_decls): Absorb into callers. + (module_state::read_{context,config,namespaces,bindings,cluster}): Lose + from parm. + (module_state::lazy_depth): New. + (lazy_load_binding): New. + (finish_module): Adjust. + * cp-tree.h (lazy_load_binding): Declare. + gcc/testsuite/ + * g++.dg/modules/circ-1_c.C: Adjust errors. + * g++.dg/modules/mod-stamp-1_d.C: Adjust errors. + + gcc/cp/ + * module.c (elf_in::keep_sections): New. + (elf_in::read): Add type arg. + (elf_in::find): Remove type arg. + (elf_in::begin): Coalesce error messages. + (module_state::loading): New field. + (module_state::{read,write}_config): Serialize section range ... + (module_state::{read,write}_namespace): ... not here. + (module_state::read_decls): Do not read the actual decls. + (module_state::read): ... do them here. + + gcc/cp/ + * module.c (trees_{in,out}, depset): Reorder definitions. + + gcc/cp/ + * module.c (module_state::{read,write}_binfos): Merge loops. + + gcc/cp/ + * module.c (trees_{in,out}::tree_binfo): Delete. + (module_state::{read,write}_binfos): New. + (module_state::{read,write}_class_def): Use them. + +2018-04-05 Nathan Sidwell <nathan@acm.org> + + gcc/ + * doc/invoke.texi (C++ Modules): New section. + gcc/c-family/ + * c.opt (-fmodule-lazy): New option. + gcc/cp/ + * module.c (module_state::read_decls): Prepare for laziness. + + gcc/cp/ + * module.c (module_state::tng_*): Rename. + + gcc/cp/ + * module.c (enum tree_tag): Delete tt_definition, tt_binding. + (trees_in::tag_{binding,definition}): Delete. + (trees_out::{,maybe_}tag_definition): Delete. + (trees_{in,out}::define_{function,var,class,enum}): Delete. + (trees_in::tree_node): Remove tt_definition handling. + (trees_in::read, trees_out::write): Delete. + + gcc/cp/ + * module.c (module_state::write_namespace): Delete. + (module_state::{write_bindings,read_bindings}): Likewise. + + gcc/cp/ + * module.c (TNG): Delete. + (module_state::{tng_read_bindings,write): Constant fold TNG. + (trees_out::tree_node, trees_in::finish_type): Likewise. + + gcc/cp/ + * module.c (refs_tng): Replace with TNG. + + Switch over to new binding scheme. + gcc/cp/ + * module.c (TNG): Enable. + + gcc/cp/ + * module.c (module_state::{read,write,mark}_template_def): Deal + with CLASSTYPE_DECL_LIST. + (trees_out::tree_node): Check implicit TEMPLATE_DECLs. + + gcc/cp/ + * module.c (trees_out::tree_node): Reorder by-name checks. + * name-lookup.c (pushdecl_top_level): Replace IS_FRIEND parm with + MAYBE_INIT. Set DECL_CONTEXT. Finish if requested. + (pushdecl_top_level_and_finish): Use pushdecl_top_level. + * name-lookup.h (pushdecl_top_leve): Adjust declaration. + +2018-04-04 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_state::{read,write,mark}_template_def): New. + (module_state::{read_write_mark}_definition): Call them. + (depset::hash::add_dependency): Don't depend on no-context decls. + (trees_out::tree_node): Don't try and name no-context decls. + + gcc/cp/ + * module.c (module_state::{read,write}_class_def}): Fixup + vptr-containing logic. + (trees_in::tree_binfo): Forward walk. + + gcc/cp/ + * module.c (enum tree_tag): Replace tt_tinfo_pseudo with + tt_tinfo_typedef. Add tt_vtable. + (module_state::mark_class_def): Mark vtables. + (trees_out::tree_node): Move TINFO processing to decl section. + Replace tinfo_psuedo handling with tinfo_typedef handling. Add + vtable special. + (trees_in::tree_node): Likewise. + * rtti.c (struct tinfo_s): Note type is const qualified variant. + gcc/testsuite/ + * g++.dg/aaa/class-3_d.C: Adjust message. + + gcc/cp/ + * module.c (module_state::read_definition): New. + (module_state::read_{function,var,class,enum}_def): New. + (module_state::tng_read_cluster): New. + (module_state::tng_read_bindings): Call it. + (trees_in::tree_node): Check refs_tng. + + gcc/cp/ + * module.c (module_state::write_var_def): Write definition. + + gcc/cp/ + * module.c (trees_out::mark_node): Allow preseeding. + (trees_out::tree_node): Fix as_base. + +2018-04-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (tt_type_name, tt_named): Rename to ... + (tt_named_type, tt_named_decl): ... here. Adjust uses. + (module_state::mark_class_def): Mark fake base. + (module_state::write_class_def): Write fake base. + (trees_{in,out}::tree_node): Avoid goto again. + (trees_in::finish_type): Protect fake base serialize. + * Make-lang.in (version.o): Depend on cp dir. + gcc/testsuite/ + * g++.dg/aaa/class-3_d.C: Adjust message. + + gcc/cp/ + * module.c (bytes_in::{use,i,u,wi,str}): Use set_overrun. + (module_state::tng_write_cluster): Sort cluster here ... + (module_state::tng_write_bindings): ... not here. + (module_state::tng_read_bindings): Set refs_tng. + (trees_{in,out}::define_class): Don't deal with refs_tng here. + (trees_out::tree_binfo): Protect from dep_walk_p. Force insert + new tag. + + Reorder for better logging + gcc/cp/ + * module.c (trees_{in,out}::core_vals): Stream name-like members + early. + (module_state::do_import): Set module purview before streaming. + * name-lookup.c (set_module_binding): Don't barf on null. + + gcc/ + * gdbinit.in: Add conditions on error catching breakpoints. + + Fix enum types, more globals + gcc/cp/ + * module.c (module_state::maybe_add_global): New. + (module_state::init): Use it. + (trees_{in,out}::core_vals): Special case TYPE of unscoped enum. + +2018-04-02 Nathan Sidwell <nathan@acm.org> + + Read new .bindings section + gcc/cp/ + * module.c (elf::get_num_sections): New. + (module_state::tng_{read,write}_namespaces): Serialize section range. + (module_state::tng_read_bindings): New. + (module_State::tng_{read,write}_bindings): Adjust. + (trees_in::define_enum, trees_in::tag_binding): Adjust. + * name-lookup.h (push_module_binding): Rename to ... + (set_module_binding): ... here. + (import_module_binding): Declare. + * name-lookup.c (import_module_binding): New. + (push_module_binding): Rename to ... + (set_module_binding): ... here. Adjust. + + Kill old .bindings section + gcc/cp/ + * module.c (module_state::record_namespace): Delete. + (module_state::write_namespace): Remove bind parm. Adjust. + (module_state::read_namespace): Delete. + (module_state::tng_read_namespaces): New. + (module_state::write_bindings): Don't write bindings section. + (module_state::read_bindings): Use tng_read_bindings). + * name-lookup.c (make_namespace): Public namespaces are exported. + (push_namespace): Adjust. + + gcc/cp/ + * module.c (trees_{in,out}::define_class): Check refs_tng. + (trees_out::tree_binfo): Add definition dependency. + (trees_{in,out}::tree_node): Don't write binfos in refs_tng mode. + (trees_in::finish_type): Chek refs_tng. + + gcc/cp/ + * module.c (trees_{in,out}::tree_binfo): Serialize entire path. + (trees_{in,out}::tree_node): Adjust. + +2018-03-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (has_definition): VAR_DECLs too. + {module_state::mark_{,function_,var_,class_,enum_}definition): New. + (trees_out::walk_into): Turn into ... + (trees_out::mark_node): ... this. Adjust callers. + (module_state::write{_function_,class_,var_}_def): Define. + (module_state::find_dependencies): Look in definitions. + +2018-03-28 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (maybe_get_template): New. + (depset::hash::maybe_add_definition): Return a depset. + (depset::hash::add_dependency): Don't deal with template here. + (module_state::write_{function,class}): New stubs. + (module_state::write_enum): New. + (module_state::write_definition): New. + (module_state::tng_write_cluster): Write binding header. + (module_state::add_writables): Don't return a bool. No need to + nadger namespace ownership. + (module_state::find_dependencies): Adjust. + (bind_cmp, space_cmp): New. + (ns_cmp): Delete. + (module_state::tng_write_bindings): Sort here. + (trees_out::tree_node): Check dependency of containers. + (module_purview_p): Defend against early checks. + * name-lookup.c (extract_module_decls): Don't special-case + namespaces. + (push_namespace): Set EXPORT & OWNER inside a module. + gcc/testsuite/ + * g++.dg/modules/namespace-2.C: Adjust. + * g++.dg/modules/namespace-3.C: New. + * g++.dg/modules/scc-1.C: Adjust. + * g++.dg/modules/scc-2.C: New. + +2018-03-27 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c + (depset::hash::{add_writables,find_dependencies}): Moved to ... + (module_state::{add_writables,find_dependencies}): ... here. Adjust. + (depset::hash::write_bindings): Moved to ... + (module_state::tng_write_bindings): ... here. Adjust. + (depset::hash::{add_decls,get_work}): New. + + gcc/cp/ + * module.c (hash_definition): New. + (struct depset::tarjan): New. + (depset::tarjan_connect, depset::hash::find_sccs): Delete. + (depset::hash::maybe_add_definition): New. + (module_state::tng_write_namespaces): New. + (depset::hash::{maybe_namespace,write_namespaces): Delete. + (module_state::tng_write_bindings): Adjust. + + gcc/cp/ + * module.c (depset::traits): Hash & compare using name too. + + gcc/cp + * module.c (refs_tng): Temporary modal hack. + (tree_tag): Rename tt_import to tt_named. + (module_state::write_cluster): Fix iteration. + (module_state::tng_write_bindings): Set and clear refs_tng. + (trees_out::tree_node): Refs by name when applicable. + (trees_out::tree_node): Use tt_named. + gcc/testsuite/ + * g++.dg/modules/by-name-1.C: New. + * g++.dg/modules/class-3_b.C: Adjust. + * g++.dg/modules/scc-1.C: More checking. + +2018-03-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (depset::table): Rename to ... + (depset::hash): ... here. + (trees_out::deps_only): Rename to ... + (trees_out::dep_walk_p): ... here. + + gcc/cp/ + * module.c (depset::table::find_exports): Renamed ... + (depset::table::add_writables): .. here. Return bool, add + exported namespaces. + (depset::table::append): Add namespaces to worklist. + (mdule_state::write_namespace): Use TREE_PUBLIC. + * name-lookup.c (extract_module_decls): Only extract decls in our + purview. + (make_namespace): Remove FIXME. + (push_namespace): Set MODULE_OWNER if exporting. + gcc/testsuite/ + * g++.dg/modules/namespace-2.C: New. + + gcc/testsuite/ + * lib/scanlang.exp (scan-lang-dump-not): new. + + gcc/cp/ + * module.c (depset::visited): Use depset::cluster. Adjust users. + + gcc/cp/ + * module.c (elf_out::strtab::named_decl): Cope with TYPE constext. + (elf_out::strtab::write_named_decl): Likewise. + (module_state::write_cluster): Adjust dump. + (fixup_unscoped_enum_owner): New. + * decl.c (finish_enum_value_list): Call + fixup_unscoped_enum_owner, as necessary. + * cp-tree.h (fixup_unscoped_enum_owner): Declare. + gcc/testsuite/ + * g++.dg/modules/scc-1.C: New. + + gcc/cp/ + * module.c (elf_out::strtab): Add name-by-decl. + (module_state::write_cluster): Find naming decl, and use it. + + gcc/cp/ + * module.c (class depset): Make a class, add accessors. Implicitly + hold name as first decl. + (depset::table::{maybe_insert,find}): New. + (depset::table::{append,find_exports,find_dependencies}): Adjust. + (depset::table::{write_bindings,write_namespaces}): Adjust. + (module_state::write_cluster): Adjust. + + Add depset analysis (incomplete) + gcc/cp/ + * module.c (struct depset): New. + (module_state::tng_write_bindings, write_cluster): New. + (trees_out::{decls,mark_decls,mark_trees,unmark_trees): New. + (trees_out::{begin,end,walk_into,force_insert): New. + (module_state::write): Call tng_write_bindings. + (trees_out::{core_vals,lang_decl_vals,lang_type_vals,tree_node_raw, + tree_node): Deal with deps_only. + +2018-03-23 Nathan Sidwell <nathan@acm.org> + + Allow dump '-' + gcc/ + * dumpfile.c (dump_open): New. Allow '-' for stdout. + (dump_open_alternate_stream, dump_start, dump_begin): Call it. + (dump_finish): Identify std{out,err} by stream. + * doc/invoke.texi (fdump-rtl): Document stdout/stderr. + +2018-03-16 Nathan Sidwell <nathan@acm.org> + + Remove -fmodules, forcing -fmodules-{ts,atom} + gcc/cp/ + * parser.c (cp_parser_diagnose_invalid_type_name): Adjust error. + gcc/c-family/ + * c.opt (fmodules): Remove. + gcc/ + * doc/invoke (fmodules): Remove. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Iterate over -fmodules-{ts,atom}. + * g++.dg/modules: Mark tests that are -fmodules-ts only. + +2018-03-15 Nathan Sidwell <nathan@acm.org> + + Implement Atom module & import placement + gcc/ + * doc/invoke.texi (-fmodules): Document -fmodules-atom. + gcc/c-family/ + * c.opt (fmodules-atom): Renamed from fmodules++. + gcc/cp/ + * cp-tree.h (import_module): Add parameter. + * module.c (import_module): Add exporting param. + (handle_module_option): Adjust. + * parser.c (cp_parser_module_declaration): Remove fmodules++ + global module parsing. + (cp_parser_import_declaration): Adjust. + (cp_parser_declaration_seq_opt): Parse imports under -fmodules++ ... + (cp_parser_declaration): and not here. + gcc/testsuite/ + * g++.dg/modules/mod++-decl-0_[abc].C: Adjust. + * g++.dg/modules/mod++-decl-2.C: Adjust. + * g++.dg/modules/mod++-decl-3.C: New. + + Implement p0713 - identifiying module source + gcc/cp/ + * parser.c (cp_parser_module_declaration): Allow global module + preamble. Return bool. + (cp_parser_declaration_seq_opt): Adjust. + gcc/testsuite/ + * g++.dg/modules/circ-1_d.C: Adjust. + * g++.dg/modules/global-1_a.C: Adjust. + * g++.dg/modules/main-[123]-aux.cc: Adjust. + * g++.dg/modules/main-aux.cc: Adjust. + * g++.dg/modules/mod-decl-[13].C: Adjust. + * g++.dg/modules/mod-decl-5_b.C: Adjust. + * g++.dg/modules/mod-exp-1_b.C: Adjust. + * g++.dg/modules/mod-sym-2.C: Adjust. + * g++.dg/modules/proclaim-1.C: Adjust. + * g++.dg/modules/static-1_a.C: Adjust. + * g++.dg/modules/p0713-[123].C: New: Adjust. + +2018-03-01 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (add_module_mapping): Fix double increment. + +2018-02-28 Nathan Sidwell <nathan@acm.org> + + Merge trunk r258084. + + gcc/ + * Makefile.in (REVISION_c): Don't exec REVISION. + * REVISION: Simple text file. + gcc/cp/ + * Make-lang.in (MODULE_STAMP): New var. + (REVISION_s): Wedge stamp into it here. + (CFLAGS-cp/module.o): Adjust. + + Using flags on overloads. + gcc/cp/ + * cp-tree.h (OVL_HAS_USING_P): New. + * tree.c (alloc_ovl): New, broken out of ... + (ovl_make): ... this. Use it. Maybe set OVL_HAS_USING_P. + (ovl_copy): Use alloc_ovl. Copy OVL_HAS_USING_P. + (ovl_insert): Set OVL_HAS_USING_P appropriately. + (lookup_maybe_add): Comment on OVL_HAS_USING_P. + * name-lookup.c (name_lookup::add_overload) + (get_class_binding_direct): Check OVL_HAS_USING_P. + gcc/testsuite/ + * g++.dg/lookup/using60.C: New. + + gcc/ + * Makefile.in: Exec REVISION maybe. + * REVISION: New. + gcc/cp/ + * Make-lang.in: Directly set MODULE_STAMP. + + Map tag recognised in and out of comments + gcc/cp/ + * module.c + gcc/testsuite/ + * g++.dg/modules/hello.cc: Clone to ... + * g++.dg/modules/main{,-[123]}-aux.cc: ... here. + * g++.dg/modules/main-[123]_a.C: New. + * g++.dg/modules/main-[123]-map: New. + * g++.dg/modules/main-map: Delete. + * g++.dg/modules/main_a.C: Update. + +2018-02-27 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (version_string): Rename. + (module_state::write_context): Write compiler version. + +2018-02-16 Nathan Sidwell <nathan@acm.org> + + Use TREE_VISITED + gcc/cp/ + * module.c (trees_out::fixed_refs): New. + (trees_out::{begin,end}): New. + (module_state::init): Use TREE_VISITED. + (trees_out::{maybe_insert,tree_node}): Likewise. + + gcc/cp/ + * module.c: More commenting. + (trees_{in,out}::define_class): Don't do AsBase here. + (trees_in::finish_type, trees_out::tree_node}: Do it here. + (get_module_owner): Cleanup. + +2018-02-15 Nathan Sidwell <nathan@acm.org> + + Module ownership on containers + gcc/cp/ + * cp-tree.h (decl_set_module, module_context): Delete. + (get_module_owner, set_module_owner) + (set_implicit_module_owner): Declare. + * decl.c (grokfndecl, grokvardecl, grokdeclarator): Call + set_module_owner. + * error.c (dump_module_suffix): Use get_module_owner. + * mangle.c (maybe_write_module): Likewise. + * method.c (implicitly_declare_fn): Use set_implicit_module_owner. + * module.c (module_context, decl_set_module): Delete. + (trees_in::define_function): Adjust. + (trees_{in,out}::lang_decl_bools): Set module_owner. + (trees_{in,out}::tree_node_raw): Adjust. + (trees_out::tree_node): Adjust. + (get_module_owner, set_module_owner) + (set_implicit_module_owner): Define. + * name-lookup.c (do_pushtag): Use set_module_owner. + * pt.c (lookup_template_class_1, instanitate_decl): Use + set_implicit_module_owner. + + gcc/cp/ + * module.c (trees_out::tree_node): Reorder. + + gcc/cp/ + * module.c: Commenting and a few cleanups. + + gcc/cp/ + * module.c (elf): Make more constants private. + (elf_in::find): Swap args, default to PROGBITS. + (elf_out::add): Replace type and flags with string_p arg. + (bytes_in::begin, bytes_out::end): Adjust. + (data::set_crc): Store zero for no-crc. + + Module map files have more syntax + gcc/cp/ + * cxx-module-wrapper.sh: Accept src filename, don't search + MODULE_PATH. + * module.c (module_state::srcname): New. + (module_state::print_map): New. + (make_module_name): Rename to ... + (make_module_filename): ... here. Don't assume trailing NUL. + (find_module_file): Pass srcname. + (parse_module_mapping): New. + (add_module_mapping): Call it. Detect too-deeply nested. + gcc/c-family/ + * c.opt (fmodule-map-dump): New. + gcc/ + doc/invoke.texi: Document new module-map file syntax + gcc/testsuite/ + * g++.dg/modules/hello.c: Adjust. + * g++.dg/modules/main_a.c: Adjust. + * g++.dg/modules/main-map: New. + * g++.dg/modules/modules.exp: Set CXX_MODULE_PATH. + +2018-02-13 Nathan Sidwell <nathan@acm.org> + + Module path is for mapping files. Replace -fmodule-root with + -fmodule-prefix. + gcc/cp/ + * cxx-module-wrapper.sh: Adjust. + * module.c (module_state::lazy_{init,fini}): Drop the lazy. + (module_state::maybe_early_init): Move into init. + (module_prefix, module_file_args, module_wrapper): New. + (make_module_name): New. + (module_state::occupy): Call it. + (module_to_filename): Delete. + (search_module_path): Adjust for finding module-maps. + (find_module_file): New. + (add_module_mapping): Reimplement. + (init_module_processing): Process module_file_args array. + (module_state::do_import, finish_module): Adjust. + (maybe_prepend_dir): Delete. + (handle_module_option): Adjust. + gcc/c-family/ + * c-opts.c (c_common_post_options): Adjust clean_cxx_module_path + call. + * c.opt (fmodule-root=): Delete. + (fmodule-prefix=): New. + gcc/ + * doc/invoke.texi (fmodule-root): Replace with ... + (fmodule-prefix): ... this. + * incpath.c (clean_cxx_module_path): Drop root appending. Drop + multilib handling. + * incpath.h (clean_cxx_module_path): Adjust. + gcc/testsuite/ + * g++.dg/modules/fmod-file-1_b.C: Adjust. + * g++.dg/modules/main_a.C: Adjust. + * g++.dg/modules/modules.exp: Adjust. + +2018-02-12 Nathan Sidwell <nathan@acm.org> + + AS_BASE is by reference. + gcc/cp/ + * module.c (trees_out::define_class): Break AS_BASE loop during + streaming. + (trees_{in,out}::tree_node): Use tt_as_base. + + Mapping files are recursive. + gcc/cp/ + * module.c (maybe_prepend_dir): New. + (add_module_mapping): Recurse. Deal with relative paths. + (handle_module_option): Move file reading into add_module_mapping. + gcc/ + * doc/invoke.texi (fmodule-file): Document. + + BINFOs imported by reference. + gcc/cp/ + * module.c (trees_{in_out}::tree_binfo): New. + (trees_out::maybe_insert): New. + (trees_out::insert): Use it. + (trees_{in,out}::define_class): Stream remaining binfo contents. + (trees_{in,out}::start): Don't expect BINFOs. + (trees_{in,out}::core_vals): Likewise. + (trees_{in,out}::tree_node): Use tt_binfo. + (trees_out::tree_node): Stream a class's child binfos. + (trees_in::finish_type): Likewise. + +2018-02-11 Nathan Sidwell <nathan@acm.org> + + Add module map file reading. + gcc/cp/ + * module.c (add_module_mapping): New, swallow ... + (add_module_file): ... insertion bits. Move other bits to ... + (handle_module_option): ... here. Read module map file. + gcc/c-family/ + * c.opt (fmodule-file): Document new semantics. + gcc/ + * doc/invoke.texi (fmodule-file): Document new semantics. + gcc/testsuite/ + * g++.dg/modules/fmod-file-1_[ab].C: New. + * g++.dg/modules/fmod-out-1_[ab].C: New. + * g++.dg/modules/modules.exp (decode_mod_spec): Augment. + + Keep module-file map in module hash. + gcc/cp/ + * module.c (module_state): Add empty_p, get_module members. + Rename set_name, delete set_location. + (module_file_map, module_file): Delete. + (module_state::do_import): Use get_module, set filename here. + (declare_module): No need to set filename here. + (add_module_file): Use module_state::get_module. + + Move module option processing into module.c. + gcc/cp/ + * cp-objcp-common.c (add_module_file): Move to module.c + (cp_handle_option): Call handle_module_option. + * cp-tree.h (module_output, module_files_map, module_files): Move + to module.c + * module.c (module_state::maybe_early_init): New. + (module_output, module_files): Make static. + (module_files_map): From cp-tree.h. + (init_module_processing): Call maybe_early_init. + (add_module): Moved from cp-objcp-common.c. + (handle_module_option): New. + + Move module option processing out of c-common.c. + gcc/c-family/ + * c-common.h (module_output, module_files_map, module_files): Move + to cp-tree.h. + * c-common.c (module_output, module_files): Move to module.c + * c-opts.c (add_module_file): Move to cp-objcp-common.c. + (c_common_handle_option): Move modules options to + cp-objcp-common.c. + gcc/cp/ + * cp-objcp-common.c (add_module_file): Moved from c-opts.c. + (cp_handle_option): New, from c_common_handle_option. + * cp-objcp-common.h (LANG_HOOKS_HANDLE_OPTION): Point at + cp_handle_option. + * cp-tree.h (module_output, module_files_map, module_files): Moved + from c-common.h. + * cp-module.c (module_output, module_files): Moved from c-common.c. + +2018-02-09 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c: Update more comments. + + gcc/cp/ + * module.c: Update a lot of comments. + +2018-02-07 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_in::tree_node): Absorb ... + (trees_in::tree_node_special): ... this. + + gcc/cp/ + * module.c (trees_in::tree_node_special): Deserialize tt_node here ... + (trees_in::tree_node): ... not here. + +2018-02-06 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (trees_out::tree_node_special): Move into tree_node. + + gcc/cp/ + * module.c (trees_{in,out}::core_vals): Serialize decl name & + context here. + (trees_in::tree_node_raw): Don't set name & context here. + (trees_{in,out}::tree_node): Don't serialize decl name and context + here. + + Remove old import machinery. + gcc/cp/ + * module.c (trees_in::tree_node_raw): Set module owner. + (trees_{in,out}::tree_node): Remove importing here. + + Imports use special tags + gcc/cp/ + * module.c (module_context): Cope with C++ anon types. + (trees_{in,out}::tree_node_special): Deal with imports here ... + (trees_{in,out}::tree_node): ... not here. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust. + + Kill namespace module slot hackery + gcc/cp/ + * name-lookup.c (module_binding_slot): Make CREATE a bool. Remove + namespace hackery. + (find_namespace_partition): Delete. + (merge_global_decl): Do not expect a namespace. Remove such + handling. + (push_module_binding): Likewise. + + Namespaces use special tags + gcc/cp/ + * module.c (trees_{in,out}::tree_node_special): Deal with + namespaces. + * name-lookup.h (find_imported_namespace): Declare. + * name-lookup.c (find_imported_namespace): New. + + Less implicit tree numbering, negative indices for back refs + gcc/cp/ + * module.c (ptr_uint_traits, ptr_uint_hash_map): Rename ... + (ptr_int_traits, ptr_int_hash_map): ... here. Map to ints. + (uint_ptr_traits, uint_ptr_hash_map): Delete. + (enum record_tag): Delete. + (enum tree_tag): New. + (trees_{in,out}::insert): Return int. + (trees_{in,out}::tree_node_special): Adjust. + (trees_{in,out}::tree_node): Adjust. + (trees_out::write, trees_in::read): Adjust. + gcc/testsuite/ + * g++.dg/modules/class-3_[bd].C: Adjust. + +2018-02-05 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * decl2 (c_parse_final_cleanups): Only finish_module if we started + it. + * module.c (module_hash_state): Move earlier. + (module_state): Add hash and modules static members. + (module_state::set_import): Replace do_import. + (module_state::lazy_init): Create the hash table and default + module. + (trees_in::tree_node_raw): Don't remap a public namespace. + (module_purview_p, module_interface_p): Adjust. + (module_state::do_import): Move more stuff to lazy_init. + (import_module): Deal with setting current module flags. + (finish_module): Adjust. + + Fix bootstrap + gcc/cp/ + * module.c (elf): Clean up consts. + (module_state::record_namespace): Comment args. + (module_state::read_namespace): Comment unused vars. + (trees_in::finish_tree): Fix logic error. + (trees_in::tree_node_special): Fix undefined var. + +2018-02-04 Nathan Sidwell <nathan@acm.org> + + Module purview is implicit. + gcc/cp/ + * cp-tree.h (lang_decl): Remove module_purview_p field. + * mangle.c (maybe_write_module): Fix signed/unsigned mismatch. + * module.c (trees_in::finish): Adjust. + (trees{in,out}::lang_decl_bools): Drom module_purview_p field. + (decl_set_module): Done set DECL_MODULE_PURVIEW_P. + * name-lookup.c (extract_module_decls): check MODULE_PURVIEW_P. + (make_namespace_finish): Remove inline_p arg. Adjust callers. + * pt.c (build_template_decl): Don't copy MODULE_PURVIEW_P. + * rtti.c (tinfo_base_init): Don't clear MODULE_PURVIEW_P. + + gcc/cp/ + * name-lookup.c (make_namespace_finish): Always create the scope. + (add_imported_namespace): Check namespace inlineness here. + + gcc/cp/ + * module.c (decl_set_module): Set DECL_MODULE_OWNER. + * rtti.c (tinfo_base_init): Clear DECL_MODULE_OWNER. + + gcc/cp/ + * decl.c (grokfndecl): Protect decl_set_module call. + * name-lookup,c (do_pushtag): Likewise. + * module.c (decl_set_module): Assert namespace context. + +2018-02-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h: Adjust comments. + * module.c (module_purview_p, module_interface_p): Adjust. + + Deserializing uses an array (Nathan is a dumbass) + gcc/cp/ + * module.c (trees_in): Delete count and tree_map. Add back_refs. + (trees_in::next): Delete. + (trees_in::insert): Append to array. + (trees_in::tree_node_special): Adjust. + (trees_in::tree_node): Likewise. + +2018-02-02 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (nodel_ptr_hash): New. + (non_null_hash): Delete. + (ptr_uint_traits, uint_ptr_traits): Adjust. + (module_state_hash): Use nodel_ptr_hash. + (module_hash): Do not GTY. + (module_state::do_import, finish_module): Adjust. + + Use TREE_VEC for structured module names. + gcc/cp/ + * cp-tree.h (module_name_parts): Replace with ... + (module_vec_name): ... this. + * mangle.c (maybe_write_modules): Adjust. + * module.c (module_state): Replace name_parts with vec_name. + (module_state::set_name): Add maybe_vec parm, construct TREE_VEC. + (module_vec_name): Replace ... + (module_name_parts): ... this. + (module_state::do_import): Construct flat name. + * parser.c (cp_parser_module_name): Construct TREE_VEC. + gcc/testsuite/ + * g++.dg/modules/mod-decl-1.C: Add error. + + MODULE_PURVIEW bug fixing. + gcc/cp/ + * decl2.c (c_parse_final_cleanups): Reset current_module. + * module.c (module_state::do_import): New, swallow ... + (do_module_import): ... this. Update callers. + * name-lookup.c (name_lookup::search_namespace_only): Fix search + of SLOT_CURRENT. + (do_pushdecl): Fix assert. + (merge_global_decl, push_module_binding, lookup_by_ident): Fix + module remap thinko. + + Module purview has MODULE_PURVIEW number. + gcc/cp/ + * module.c (module_state::read): Use MODULE_PURVIEW. + (trees_{in,out}::tree_node): Adjust. + (do_module_import, import_module): Likewise. + * name-lookup.c (module_binding_slot): Adjust. + (do_pushdecl): Always push to MODULE_SLOT_CURRENT. + (merge_global_decl): Remap MODULE_PURVIEW. + (lookup_by_ident, add_imported_namespace): Likewise. + + Rename MODULE_INDEX->MODULE_OWNER + gcc/cp/ + * cp-tree.h (MODULE_NONE, MODULE_PURVIEW, MODULE_IMPORT_BASE) + (MODULE_LIMIT): New, renamed from MODULE_INDEX_$FOO. + (DECL_MODULE_OWNER): New, renamed from DECL_MODULE_INDEX. + (MAYBE_DECL_MODULE_OWNER): Likewise. + (struct lang_decl_base): Rename module_index to module_owner. + * error.c, mangle.c, module.c, name-lookup.c, pt.c: Adjust. + + Keep namespaces on global slot. + gcc/cp/ + * cp-tree.h (MODULE_SLOT_CURRENT, MODULE_SLOT_GLOBAL): Renamed + from MODULE_SLOT_TU, MODULE_SLOT_GLOBALS. + * name-lookup.h (set_module_namespace): Undeclare. + (add_imported_namespace): Declare. + * name-lookup.c (module_binding_slot): Remove assert, propagate + external namespace to GLOBAL slot on creation. + (update_binding): Don't add namespaces to level. + (reuse_namespace): New. + (make_namespace): New, absorb ... + (create_namespace): ... this. Delete. + (make_namespace_finish): New. + (push_namespace): Adjust. + (add_imported_namespace): New. Absorb ... + (set_module_namespace): ... this. Delete. + * module.c (module_state::read_namespace): Adjust. + gcc/testsuite/ + * g++.dg/modules/namespace-1_[abc].C: New. + + Fix circularity detection, and other errors + gcc/cp/ + * module.c (elf::E_BAD_DATA, elf::E_BAD_IMPORT): New. + (elf::set_error): Default to E_BAD_DATA. + (elf::end, elf_out::end): Return error string. + (module_state::set_location): New. + (module_state::{push,pop}_location): Adjust. + (do_module_import): Fixup circularity and other errors. + (declare_module, finish_module): Adjust. + gcc/testsuite/ + * g++.dg/modules/circ-1_[abcd].C: New. + * g++.dg/modules/mod-decl-1.C: Adjust errors. + * g++.dg/modules/mod-decl-2_b.C: Adjust errors. + * g++.dg/modules/mod-decl-5_b.C: Adjust errors. + * g++.dg/modules/mod-stamp-1-d.C: Adjust errors. + +2018-02-01 Nathan Sidwell <nathan@acm.org> + + Alloc a slot for global module + gcc/cp/ + * cp-tree.h (MODULE_INDEX_NONE, MODULE_INDEX_PURVIEW): New. + (MODULE_SLOT_TU, MODULE_SLOT_GLOBALS): New. + (MODULE_INDEX_IMPORT_BASE): Increment. + * module.c (do_module_import): Push reserved slot. + * name-lookup.c (module_binding_slot): Reserve slots below + MODULE_INDEX_IMPORT_BASE. + + Bindings point to decls + gcc/cp/ + * module.c (data::check_crc): Only check. + (data::get_crc): New. + (elf_in::find): Return section index. + (bytes_in::begin): Add by-section-number variant. + (module_state): Add lazy counter (unused). + (module_state::write_bindings): Emit decl section number. + (module_state::read_bindings): Adjust, swallow ... + (module_state::read_decls): ... this. Delete. + + Read and parse the binding section in module_state. + gcc/cp/ + * module.c (modules_state::record_namespace): New. + (module_state::write_namespace): Adjust, renamed from ... + (module_state::walk_namespace): ... here. + (module_state::read_namespace): New. + (module_state::{read,write}_bindings): Adjust. + (module_state::finish_module): Adjust. + * name-lookup.h (set_module_namespace): Declare. + * name-lookup.c (merge_global_decl): Adjust. + (create_namespace): New. + (set_module_namespace): New, use it. + (push_namespace): Use create_namespace. + + Write binding section in module_state. + gcc/cp/ + * name-lookup.h (extract_module_decls): Renamed from + extract_module_bindings. Adjust signature. + * name-lookup.c (extract_module_decls): Likewise. + * module.c (module_state::walk_namespace): New, absorb ... + (trees_out::walk_namespace): ... this. Delete. + (trees_out::write): Reimplement, absorb ... + (trees_out::{tag_binding,bindings}): ... these. Delete. + (module_state::write_bindings): Adjust. + + Merge trunk r257292. + +2018-01-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (cpms_{in,out}): Rename to ... + (trees_in, trees_out): ... here. + + gcc/cp/ + * module.c (module_state::global_{trees,vec,crc}): New, moved from ... + (globals{,_arys,_crc}): ... these globale scope vars. + (cpms_in): Add global_vec member. + + Derive cpm_{in,out} from bytes_{in,out} + gcc/cp/ + * module.c (cpms_{in,out}): Derive from bytes_{in,out}. Adjust + all uses of r & w. + + Kill cpm_stream. + gcc/cp/ + * module.c (class cpm_stream): Delete. + (class cpms_{in,out}): Adjust. + + Move elf out of cpms_in, cpms_out. + gcc/cp/ + * module.c (module_state::{read,write}_bindings): New. + (module_stste::read_decls): New. + (cpms_{in,out}::get_elf): Delete. + (cpms_out::{write,bindings}): Adjust. + (cpms_in::read): Adjust. + + Add module_stat read & write + gcc/cp/ + * module.c (module_state::{read,write}): New. + (cpms_in::read): Adjust. + (do_import_module, finish_module): Adjust. + + gcc/cp/ + * module.c: Move cpm_stream, cpms_in, cpms_out earlier. + + Move some reading to module_state. + gcc/cp/ + * module.c (module_state::read_{context,config}): New, swallow ... + (cpms_in::imports,header): ... these. Delete. + (cpms_in::read): Adjust. + (do_import_module): Adjust. + + Move some writing to module_state. + gcc/cp/ + * module.c (module_state::write_{context,config}): New, swallow ... + (cpms_out::imports,header): ... these. Delete. + (cpms_out::write): Adjust. + (finish_module): Adjust. + + Move global tree init. + gcc/cp/ + * module.c (module_state::lazy_init): New, swallow ... + (cpm_serial::lazy_globals): ... this. Adjust callers. + + Reorder class declarations + gcc/cp/ + * module.c (bytes, bytes_in, bytes_out): Move before module_state. + + Simplify import interface + gcc/cp/ + * module.c (MODULE_INDEX_IMPORTING, MODULE_INDEX_ERROR): Delete. + (MODULE_INDEX_UNKNOWN): New. + (module_state): Initialize mod to MODULE_INDEX_UNKNOWN. + (cpms_in::read): Return void. + (do_module_import): Return pointer to module object. + (cpms_in::imports): Adjust. + (import_module, declare_module, finish_module): Adjust. + + Module_state owns elf and elf owns stream + gcc/cp/ + * module.c (elf): Add begin, end members. + (elf_in, elf_out): Adjust. + (module_state::announce): New. + (cpms_{in,out}::get_elf): Adjust. + (cpms_{in,out}::{begin,end}): Delete. + (do_module_import, finish_module): Adjust. + + Commonize module location + gcc/cp/ + * module.c (module_state::{push,pop}_location): Set and restore + input_location. + (make_module_file): Lose module_root prepending. + (do_module_import): Always set module location. + (declare_module): Create location and filename. + (finish_module): Adjust. + + Staticize instrumentation + gcc/cp/ + * module.c (bytes_out): Staticize spans, lengths, is_set. + (bytes_out::instrument): Make static. + (cpms_out): Staticize unique, refs, nulls, records. + (cpms_out::instrument): Make static. Adjust. + + Separate dumper object + gcc/cp/ + * cp-tree.h (dump, print_other_binding_stack): Undeclare. + * name-lookup.c (print_other_binding_stack): Make static. + * module.c (class dumper): New. + (cpm_serial): Remove dumping machinery here. Adjust all uses. + gcc/testsuite/ + * g++.dg/modules/mod-imp-1_[abcd].C: Adjust dump scans. + + Start refactoring cpm_serial + gcc/cp/ + * module.c (cpms_{in,out}::elf): Pointer to elf object, + (cpms_{in,out}::get_elf): New. Use it. + (do_module_import, finish_module): Adjust. + +2018-01-30 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (data::release): Return NULL, update users. + (cpms_in::{mod_ix,crc}): Delete, adjust users. + + Reorder source + gcc/cp/ + * module.c (struct data): First. + (class elf, elf_in & elf_out): Next. + + gcc/cp/ + * module.c (module_state): Remove name_hash, crc_known, set_crc, + set_location. + (cpms_in::{read,header}): Add crc_ptr arg. + (do_module_import): Expected CRC is a pointer. + (cpms_in::imports): Adjust. + + Push remaps as they happen. + gcc/cp/ + * module.c (cpms_{in,out}::imports): Write in ascending order. + + Move remap vector into module state. + gcc/cp/ + * module.c (module_state): Add remap; + (cpms_in): Remove remap_num, remap_vec. + (module_state::release): New. + (cpms_in::{imports,tree_node,read}): Adjust. + (finish_module): Release module state. + + gcc/cp/ + * module.c (bytes_out::end): Create PROGBITS or STRTAB. + (cpms_out::write): README is a STRTAB. + + Remove SYMTAB knowledge, the README is better. + gcc/cp/ + * module.c (elf_out::symtab): Delete. + (elf_out::end): Adjust. + (cpms_out::imports): Don't create symtab. + + Section structure completish. + gcc/cp/ + * module.c (elf::isection): Add flags. + (elf_out::add): Add section flags. + (bytes_out::end): Likewise, + (elf_out::end): Adjust. + (cpms_out::bindings): Generate bindings section too. + (cpms_out::write): Add imports to README. Make string section. + (cpms_in::read): Adjust. + + Config in header + gcc/cp/ + * module.c (cpms_{in,out}::tag_conf): Delete. + (cpms_{in,out}::header): Serialize host & target conf. + (cpms_in::read, cpms_out::write): Adjust. + + Globals in header + gcc/cp/ + * module.c (module_state::set_name): Kill string names. + (cpms_{in,out}::tag_globals): Delete. + (cpms_{in,out}::header): Do globals. Add outer crc. + (cpms_in::read): Absorb cpms_in::read_item. + (search_module_path, do_module_import): Kill string names. + +2018-01-29 Nathan Sidwell <nathan@acm.org> + + Import table is separate section + gcc/cp/ + * module.c (bytes): Reorganize CRC calcs. + (struct elf::symbol): New. + (struct elf_out::symtab): New. + (elf_out::end): Deal with symbol table. + (bytes_{in,out}::{begin,end}): Adjust crc calcs. + (cpms_{in,out}::imports): New. + (cpms_{in,out}::tag_import): Delete. + (cpms_in::read, cpms_out::write): Adjust. + + Header is separate section + gcc/cp/ + * module.c (module_state_hash::equal): Remove string names. + (elf_in::find): Find by name. + (elf_in::name): New. + (class elf_out::strtab): Rename type. + (elf_out::strings): New member. + (elf_in::begin): Veriy string table. Create default. + (elf_out::end): Write string table here. + (bytes_in::begin, bytes_out::end): Always PROGBITS. + (cpm_stream::rt_eof): Delete. + (cpms_{in,out}::header): Reimplement. + (cpms_in::read, cpms_out::write): Adjust. + + Remove string-literal module names :( + gcc/cp/ + * cp-tree.h (validate_module_name): Remove. + * module.c (validate_module_name): Delete. + (bytes_{in,out}::module_name): Delete, adjust callers. + * parser.c (cp_parser_module_name): Adjust. + (cp_parser_module_declaration, cp_parser_import_declaration) + (cp_parser_module_proclamation): Adjust. + gcc/testsuite/ + * g++.dg/modules/mod++-decl-3_[ab].C: Delete. + + {read,write}_module become member fns + gcc/cp/ + * module.c (cpms_{in,out}::elf}: Direct member. Adjust ctors. + (cpms_{in,out}::{begin,end}): New. + (cpms_in::read, cpms_out::write): New. + (read_module, write_module): Delete. + (do_module_import, finish_module): Adjust. + + README section + gcc/cp/ + * module.c (version2date, version2time, version2string): Moved + from cpm_serial. + (struct_data): Broken out of elf. + (struct elf::isection): Remove link field. Adjust all uses. + (class elf_out::strings): New. + (elf_out::add): New. + (bytes_out::printf): New. + (cpm_stream::dump, cpms_in::header): Adjust version handling. + (write_module): Write README section. + + Fix layering violation + gcc/cp/ + * module.c (elf): Rename bad -> set_error. + (elf_out, elf_in): Update. + (cpm_serial, cpm_writer, cpm_reader): Rename to ... + (bytes, bytes_out, bytes_in): ... here. + (bytes_{in,out}): Remove source, sink members. + (bytes_in): Rename overran -> get_overrun. Add end, set_overrun. + Delete bad, get_error. Adjust users. + (cpms_in, cpms_out): Add elf field. Adjust. + +2018-01-26 Nathan Sidwell <nathan@acm.org> + + Simplify buffer filling & drainging + gcc/cp/ + * module.c (cpm_serial): Add begin, end, use, unuse. + (cpm_writer): Add use, unuse, begin, end. Delete reserve, flush, + seek, tell, checkpoint. + (cpm_reader): Add overrun, use, begin, overran. Delete fill, + checkpoint. + (cpm_{reader,writer}): Update all seralizers. + (cpms_{in,out}): Remove checkpointing. + + CRC at section level + gcc/cp/ + * module.c (elf::data): Add crc routines. + (cpm_serial): Remove crc routines. + (cpm_in, cpm_out): Don't calculate crcs. + (read_module, write_module): Adjust (incomplete). + + BMI is ELF + gcc/cp/ + * module.c (get_version): Moved from cpm_stream::version. + (struct non_null_hash, ptr_uint_traits, ptr_uint_hash_map) + uint_ptr_traits, uint_ptr_hash_map): New. + (elf, elf_in, elf_out): New classes. + (cpm_serial, cpm_in, cpm_out): Modify (incomplete). + (cpms_in, cpms_out): Adjust. + (read_module, write_module, finish_module): Adjust. + +2018-01-24 Nathan Sidwell <nathan@acm.org> + + Global tree via crc + gcc/cp/ + * module.c (cpm_stream): Add globals & globals_crc. + (cpm_stream::next): Add default arg. + (cpm_stream::cpm_stream): Lazily init globals vector. + (cpms_{in,out}::mark_present, globals): Delete. + (cpms_{in,out}::tag_globals): Reimplement. + (cpms_in::tree_node_special): Read global tree directly. + * name-lookup.c (extract_module_bindings): Skip RTTI types. + + gcc/cp/ + * module.c (module_state): Replace direct_import with imported & + exported flags. + (module_state::do_import): Adjust. + (enum import_kind): Delete. + (do_module_import): Adjust. + (cpms_{in.out}::tag_import): Adjust. + (module_interface_p, import_module, declare_module) + (finish_module): Adjust. + +2018-01-23 Nathan Sidwell <nathan@acm.org> + + Static bindings not visible in imports + gcc/cp/ + * name-lookup.h (decapsulate_binding): Delete. + (module_binding_vec, extract_module_bindings): Declare. + * module.c (cpms_{in,out}::tag_binding): Reimplement. + (cpms_out::bindings): Likewise. + * name-lookup.c (decapsulate_binding): Delete. + (extract_module_bindings): New. + gcc/testsuite/ + * g++.dg/modules/mod++-decl-0_c.C: Remove XFAIL. + * g++.dg/modules/static-1_[abc].C: New. + +2018-01-22 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * tree.c (ovl_insert): No need to sort by USING_P. + (ovl_iterator::reveal_node): Likewise. + + Update bug reporting instructions + gcc/ + * configure.ac (ACX_BUGURL): Set new url + * diagnostic.c (diagnostic_action_after_output): Special ICE + instructions. + * configure: Rebuilt. + +2018-01-19 Nathan Sidwell <nathan@acm.org> + + Kill mangle_namespace. + gcc/cp/ + * cp-tree.h (CPTI_MANGLE, mangle_namespace): Delete. + * decl.c (cxx_init_decl_processing): Don't create it. + * module.c (cpms_out::bindings): Don't skip it. + * name-lookup.c (suggest_alternatives_for): Likewise. + + Import ident by type not index. + gcc/cp/ + * name-lookup.h (get_ident_in_namespace, get_ident_in_class, + find_by_ident_in_namespace, find_by_ident_in_class): Delete. + (lookup_by_ident): Declare. + * name-lookup.c (get_ident_in_namespace, get_ident_in_class): Delete. + (find_by_ident_in_namespace, find_by_ident_in_class): Replace with ... + (lookup_by_ident): ... this. + * module.c (cpms_{in,out}::ident_imported_decl): Delete. + (cpms_out::tree_node): Write imported decl info directly. + (cpms_in::tree_node): Use lookup_by_ident. + + gcc/cp/ + * module.c (cpms_{in.out}::tree_node_special): New, broken out of ... + (cpms_{in,out}::tree_node): ... here. Call them. + + Merge trunk r256894. + + gcc/cp/ + * Make-lang.in: Set MODULE_STAMP if non-branch experimental. + + Beginnings of global module correctness + gcc/cp/ + * cp-tree.h (struct mc_index): New. + (module_cluster): Use it. + (MODULE_VECTOR_SLOTS_PER_CLUSTER): New. + (GLOBAL_MODULE_INDEX, THIS_MODULE_INDEX, IMPORTED_MODULE_BASE): Delete. + (MODULE_INDEX_IMPORT_BASE): New. + (DECL_MODULE_PURVIEW_P, MAYBE_DECL_MODULE_PURVIEW_P): New. + (MAYBE_DECL_MODULE_INDEX): Adjust. + (MODULE_INDEX_BITS): New. + (struct lang_decl_base): Add module_purview_p field. + * decl2.c (c_parse_final_cleanups): Adjust. + * error.c (dump_module_suffix): Adjust. + * mangle.c (maybe_write_module): Adjust. + * module.c (MODULE_INDEX_IMPORTING, MODULE_INDEX_ERROR): New. + (module_state::freeze): Delete. + (this_module): Delete. Replace with (*modules)[0]. + (cpms_in::alloc_remap_vec): Adjust. + (cpms_in::tag_import): Use MODULE_INDEX_ERROR. + (cpms_{in,out}::tag_binding): Lose MAIN_P parm. Adjust. + (cpms_in::define_function): Remove GLOBAL_MODULE_INDEX handling. + (cpms_in::read_item): Use MODULE_INDEX_IMPORTING. + (cpms_in::finish): Remove NODE_MODULE parm. use + MAYBE_DECL_MODULE_PURVIEW_P. + (cpms_{in,out}::lang_decl_bools): Read & write module_purview_p. + (cpms_in::tree_node_raw): Lose NODE_MODULE parm. Set module + directly. + (cpms_{in,out}::tree_node): Adjust module identification. + (cpms_out::bindings): Bindings are on a single slot. + (module_loc): Delete. + (decl_set_module): Set purview as needed. + (module_purview_p, module_interface_p): Adjust. + (read_module): Simplify. + (do_module_import): Adjust for lack of global module slot. Use + MODULE_INDEX_ERROR, MODULE_INDEX_IMPORTING. Detect already + declared module here. + (import_module): Adjust. + (declare_module): Don't detect already declared here. + (write_module): Adjust. + (finish_module): Adjust. + * name-lookup.c (module_binding_slot): Reimplement. + (name_lookup::process_module_binding) + (name_lookup::search_namespace_only, name_lookup::add_module_fns) + (name_lookup::adl_namespace_only, do_pushdecl): Adjust. + (merge_global_decl): Kludge into reworking. + (push_module_binding): Likewise. + * name-lookup.h (merge_global_decl): Add module parm. + * pt.c (build_template_decl): Propagate purview. + * ptree.c (cxx_print_xnode): Adjust. + * rtti.c (tinfo_base_init): Kludge into working. + (get_tinfo_desc): Drop unnecessary push/pop abi namespace. + (emit_tinfo_decl): Simplify. + gcc/testsuite/ + * g++.dg/modules/global-1_[ab].C: New + * g++.dg/modules/mod++-decl-0_b.C: Remove xfail. + +2018-01-18 Nathan Sidwell <nathan@acm.org> + + Merge access & discriminator. + gcc/cp/ + * cp-tree.h (struct lang_decl_base): Rename u2sel to spare. + (struct lang_decl_min): Replace lang_decl_u2 union with plain + tree. + (LANG_DECL_U2_CHECK): Delete. + (DECL_DISCRIMINATOR_SET_P, DECL_DISCRIMINATOR): Adjust. + (DECL_CAPTURED_VARIABLE, DECL_ACCESS, THUNK_VIRTUAL_OFFSET): Adjust. + * decl.c (push_local_name): Represent discriminator as INTEGER_CST. + (duplicate_decls): Copy DECL_ACCESS. fix formatting. + * mangle.c (discriminator_for_local_entity): Extract integer value. + * module.c (cpms_{in,out},lang_decl_bools): Drop u.base.u2sel. + (cpms_{in,out}::lang_decl_vals): Drop u.min.u2 handling. + * semantics.c (finish_omp_threadprivate): Drop u.base.u2sel copying. + +2018-01-02 Nathan Sidwell <nathan@acm.org> + + Merge trunk r256078. + + Typedefs! + gcc/cp/ + * decl.c (grokdeclarator): Set typedef's module/export. + gcc/testsuite/ + * g++.dg/modules/tdef-2_[abc].C: New. + + gcc/testsuite/ + * g++.dg/modules/tdef-1_[ab].C: New. + +2017-12-20 Nathan Sidwell <nathan@acm.org> + + Variables! + gcc/cp/ + * decl.c (grokvardecl): Set exporting. + * module.c (dump_nested_name): Dump integer values. + (cpms_{in,out}::define_var): New. + (cpms_{in,out}::tag_definition): Deal with vars. + (cpms_out::maybe_tag_definition): Likewise. + (cpms_out::core_bools): Externalize static vars. + (cpms_out::lang_decl_bools): Likewise for not-really-extern. + gcc/testsuite/ + * g++.dg/modules/var-1_[ab].C: New. + + Enumerations! + gcc/cp/ + * module.c (module_state::set_name): Don't deal with crc. + (module_state::set_crc): New. + (cpm_serial::get_crc): Don't obscure zero. + (cpm_writer::tell): New. + (cpms_out::crc_tell): New. + (cpms_{in,out}::define_enum): New. + (cpms_out::header): Save crc location. + (cpms_in::header): Use set_crc. + (cpms_out::tag_eof): Adjust. + (cpms_out::maybe_tag_definition): Deal with enums. + (cpms_{in,out}::tag_definition): Deal with enums. + (cpms_{in,out}::core_vals): Do not write enum bits. + (do_module_import): Use set_crc. + * name-lookup.c (push_module_binding): Fix assert. + gcc/testsuite/ + * g++.dg/modules/enum-1_[ab].C: New. + +2017-12-19 Nathan Sidwell <nathan@acm.org> + + Merge trunk r255836. + +2017-11-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r255166. + +2017-11-22 Nathan Sidwell <nathan@acm.org> + + Non-type template parms, & nested template classes. + gcc/cp/ + * module.c (cpms_{in,out}::core_vals): Deal with CONST_DECLs. + gcc/testsuite/ + * g++.dg/modules/tplmem-3_[ab].C: New. + +2017-11-21 Nathan Sidwell <nathan@acm.org> + + Member types + gcc/testsuite/ + * g++.dg/modules/nested-2_[ab].C: New + + Nested classes. + gcc/cp/ + * module.c (cpm_reader::wi): Promote before shifting. + (cpms_out::define_class): Maybe define all members. + (cpms_out::maybe_tag_definition): Only implicit typedefs are + defined. + (cpms_{in.out}::core_vals): Don't stream value cache. + gcc/testsuite/ + * g++.dg/modules/nested-1_[abc].C: New + +2017-11-20 Nathan Sidwell <nathan@acm.org> + + Merge trunk r254959. + + Template member functions. + gcc/cp/ + * cp-tree.h (TI_PENDING_TEMPLATE_FLAG): Add TI_CHECK. + * module.c (cpms_out::maybe_tag_definition): Check DECL_INITIAL, + write clones. + (cpms_in::tag_definition): Don't zap clones. + (cpms_in::finish): Clear TI_PENDING_TEMPLATE_FLAG. + (cpms_{in,out}::core_vals): Check tcc_unary, tcc_binary. + * optimize.c (maybe_clone_body): Don't alias when modules. + gcc/testsuite/ + * g++.dg/modules/tplmem-1_[ab].C: New. + +2017-11-17 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (cpms_out::tree_node): Fix conv-op identifiers. + gcc/testsuite/ + * g++.dg/modules/convop-1_[ab].C: New. + +2017-11-16 Nathan Sidwell <nathan@acm.org> + + Constexprs! + gcc/cp/ + * cp-tree.h (check_constexpr_fundef, find_constexpr_fundef): Declare. + * constexpr.c (find_constexpr_fundef): New. + (register_constexpr_fundef): Split checking off to ... + (check_constexpr_fundef): ... here. Call + register_constexpr_fundef. + * decl.c (): Adjust. + * module.c (cpms_{in,out}::define_function): Serialize constexpr + body. + (cpms_{in,out}::core_vals): Serialize function-scope var initializers. + gcc/testsuite/ + * g++.dg/modules/cexpr-[12]_[ab].C: New. + + Merge trunk r254823. + + Merge trunk r254819. + +2017-11-03 Nathan Sidwell <nathan@acm.org> + + Virtual bases! + gcc/cp/ + * Make-lang.in: module.o depends on revision + * class.c (layout_class_type): Unnamed types do not get base + types. + * cxx-module-wrapper.sh: Invoke make. Strip bad args. + * module.c (module_context): Allow NULL context. + (cpms_{in,out}::define_class): Deal with classtype_as_base. + (cpms_{in,out}::tag_definition): Allow raw class. + (cpms_{in,out}:ident_imported_decl: Rework class scope. + (cpms_out::tree_node): Deal with NULL module context. + * name-lookup.c (maybe_lazily_declare): Break out of ... + (get_class_binding): ... here. Call it. + (get_ident_in_class, find_by_ident_in_class): New. + * name-lookup.h (get_ident_in_class, find_by_ident_in_class): Declare. + gcc/testsuite/ + * g++.dg/modules/class-7_[abc].C: New. + * g++.dg/modules/main.cc: Move to ... + * g++.dg/modules/main_a.C: ... here. Adjust. + * g++.dg/modules/modules.exp: Remove main.cc exceptionalism. + +2017-10-26 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (module_state): Add filename & loc. + (module_state::{set,push,pop}_location): New. + (cpm_stream): Add state member. Adjust. + (cpms_{in,out}): Adjust. + (cpms_in::{header,tag_conf}): Adjust. + (read_module, write_module): Lose fname arg. + (search_moule_path): Don't prefix . + (do_module_import, finish_module): Set location. + gcc/ + * diagnostic.c (maybe_line_and_column): New. + (diagnostic_get_location_text, diagnostic_report_current_module): + Use it. + gcc/testsuite/ + Markup no-column tests. + +2017-10-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp + * cxx-module-wrapper.sh: Cleanups. + * module.c (cpm_stream::global_tree_arys): Add integer_types. + (cpms_{in,out}::tree_node): Robustify. + (read_module): Note end of importing. + (search_module_path): Note if wrapper failed to install. + * name-lookup.c (merge_global_decl): Zap anticipated decl here ... + (push_module_binding): ... not here. + gcc/ + * incpath.c (clean_cxx_module_path): Correct env var name. + gcc/c-family/ + * c.opt (fmodules++): Add Driver. + gcc/testsuite/ + * g++.dg/modules/{main.c,hello.cc}: New. + * g++.dg/modules/modules.exp: Special case main.cc + +2017-10-23 Nathan Sidwell <nathan@acm.org> + + Wrapper program + gcc/ + * doc/invoke.texi (fmodule-root, fmodule-path, fmodule-wrapper): + Document. + * gcc.c (driver::maybe_putenv_CXX_MODULE_WRAPPER): New. + (driver::main): Call it. + * gcc.h (driver::maybe_putenv_CXX_MODULE_WRAPPER): Declare. + * incpath.h (clean_cxx_module_path): Add multilib parm. + * incpath.c (add_path): Initialize length. + (clean_cxx_module_path): Append multilib fragment. Add '.'. + gcc/c-family/ + * c-opts.c (c_common_post_options): Pass multilib suffx to + clean_cxx_module_path. + * c.opt (fmodules): Notify driver. + (fmodule-hook): Rename to ... + (fmodule-wrapper): ... here. + gcc/cp/ + * Make-lang.in (cxx-module-wrapper): New program. + * cxx-module-wrapper.sh: New. + * module.c: Include libiberty.h, tree-diagnostic.h. + (read_module): Add announcement. + (module_to_filename): Identifier mapping does not depend on + module_path. + (search_module_path): Shell out to wrapper function. + (do_module_import): Adjust. + (init_module_processing): Default flag_module_wrapper. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Adjust. + +2017-10-20 Nathan Sidwell <nathan@acm.org> + + Template class! + gcc/cp/ + * decl.c (xref_tag_1): Don't decl_set_module here. + * module.c (cpms_in::define_function): Check templatedness. + (cpms_{in,out}::define_class): Add maybe_template arg. Add + templatey bits. + (cpms_out::maybe_tag_definition): Deal with template classes. + {cpms_{in,out}::tag_definition): Add maybe_template arg, adjust. + {cpms_{in,out}::core_vals): Write record template_info. + * name-lookup.c (set_class_binding): Protect against empty + member_vec. + (do_pushtag): Call decl_set_module here. + * pt.c (build_template_decl): Copy module bits here ... + (push_template_decl_real): ... not here. + gcc/testsuite/ + * g++.dg/modules/mod-tpl-2_[ab].C: New. + + Early CRC not time stamps. + gcc/cp/ + * module.c (module_state::set_name): CRC too. + (cpm_serial::get_crc): New. + (cpm_writer::seek): New. + (cpm_{reader,writer}::bytes4): Rename to ... + (cpm_{reader,writer}::raw): ... this. Adjust all users. + (cpm_reader::get_crc): Delete. + (module_state::stamp): Replace with ... + (module_state::crc): ... this. + (cpms_in::cpms_in): Drop stamp arg. + (cpms_{in,out}::header): Deal with CRC not timestamp. + (time2str, timestamp_mismatch): Delete. + (cpms_{in,out}::tag_eof): Deal with crc. + (cpms_{in,out}::tag_import): Drop timestamp. + (read_module, do_module_import): Likewise. Use CRC. + gcc/testsuite/ + * g++.dg/modules/mod-stamp-1_d.C: Adjust. + + Merge trunk r253954. + +2017-10-13 Nathan Sidwell <nathan@acm.org> + + Template function! + gcc/ + * tree.h (MARK_TS_TYPE_NON_COMMON): New. + gcc/cp/ + * cp-objcp-common.c (cp_common_init_ts): Fix + TEMPLATE_TEMPLATE_PARM, TEMPLATE_TYPE_PARM, + BOUND_TEMPLATE_TEMPLATE_PARM marking. + * cp-tree.h (canonical_type_parameter): Declare. + * module.c (cpms_{in,out}::define_function): Add maybe_template + parm, adjust. + (cpms_out::maybe_tag_definition): Allow function templates. + (cpms_{in,out}:tag_definition): Allow templates. + (cpms_{in,out}::core_vals): Stream more nodes. + (cpms_{in,out}::lang_decl_vals): Stream more nodes. + (cpms_in::finish_type): Deal with TEMPLATE_TYPE_PARM, + TEMPLATE_TEMPLATE_PARM. + * pt.c (canonical_type_parameter): Make extern, simplify. + (push_template_decl_real): Propagate exportednes. + gcc/testsuite/ + * g++.dg/modules/mod-tpl-1_[ab].C: New. + +2017-10-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (TS_CP_BINDING, TS_CP_WRAPPER, LAST_TS_CP_ENUM): Delete. + (union lang_tree_node): Adjust GTY desc. + (cp_tree_node_structure): Take a tree_code. + * decl.c (cp_tree_node_structure): Take a tree_code. + * module.c (cpms_{out,in}::core_vals): Order clauses from + tree-core.h, use cp_tree_node_structure for C++. + + Module name can be a string const (-fmodules++) + gcc/cp/ + * cp-tree.h (cp_expr): Add constant operator* and operator->. + (validate_module_name): New. + (declare_module, import_module): Take cp_expr. + * error.c (dump_module_suffix): Adjust. + * module.c (module_state): Add name_hash. Adjust. + (module_state_hash): Allow string consts. + (module_state::set_name): Likewise. + (cpm_{writer,reader}::module_name): New. + (dump_nested_name): Name can be a string const. + (cpms_{out,in}::header): Adjust. + (cpms_{out,in}::tag_import): Adjust. + (validate_module_name): New. + (module_to_filename): Allow string consts. + (make_module_file): Adjust. + (do_module_import): Adjust. + (import_module, declare_module): Adjust. + * parser.c (cp_parser_module_name): Return cp_expr, allow + string-cst. + (cp_parser_module_declaration, cp_parser_import_declaration, + cp_parser_module_proclamation): Adjust. + gcc/testsuite/ + * g++.dg/modules/modules.exp (dg-module-bmi): Renamed. + * g++.dg/modules/mod++-decl-3_[ab].C: New. + + Add -fmodule-path, -fmodule-root. + gcc/ + * incpath.h (INC_CXX_MPATH): New. + (clean_cxx_module_path): Declare. + * incpath.c (clean_cxx_module_path): New. + gcc/cp/ + * cp-tree.h (init_module_processing): Declare. + * decl.c (cxx_init_decl_processing): Call init_module_processing. + * module.c (module_path, module_path_max): New vars. + (MOD_FNAME_PFX): Delete. + (module_to_filename): Reimplement. + (search_module_path, make_module_file): New. + (do_module_import): Adjust. + (init_module_processing): New. + (finish_module): Adjust. + gcc/c-family/ + * c-opts.c (c_common_handle_option): Process OPT_fmodule_path_. + (c_common_post_options): Clean module path. + * c.opt (fmodule-root=, fmodule-path=, fmodule-hook=): New. + gcc/testsuite/ + * g++.dg/modules/modules.exp: Adjust module name logic. + +2017-10-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r253654. + +2017-10-10 Nathan Sidwell <nathan@acm.org> + + Merge trunk r253585. + +2017-09-25 Nathan Sidwell <nathan@acm.org> + + gcc/c-family/ + * c_common_handle_option: Handle fmodules++. + * c.opt (fmodules): Make Uinteger. + (fmodules++, fmodules-ts): New. + gcc/cp/ + * parser.c (cp_parser_consume_semicolon_at_end_of_statement): + Return success bool. + (cp_parser_translation_unit): Adjust cp_parser_declaration_seq_opt + call. + (cp_parser_declaration_seq_opt): Add top_level parm, look for + module-decl here. + (cp_parser_module_declaration): Handle -fmodules++ syntax. + (cp_parser_module_export): No need to handle module-declaration + here ... + (cp_parser_declaration): ... or here. + gcc/ + * doc/invoke.texi (-fmodules++): Document. + gcc/testsute/ + * g++.dg/modules/mod++-decl-0_[abc].C: New. + * g++.dg/modules/mod++-decl-[12].C: New. + * g++.dg/modules/mod-decl-1.C: Adjust expected error. + +2017-09-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk 252831. + +2017-07-20 Boris Kolpackov <boris@codesynthesis.com> + + Add -fmodule-output & -fmodule-file options. + gcc/c-family/ + * c.opt (-fmodule-output): New option. + (-fmodule-file): New option. + * c-common.h (module_output): Declare. + (module_files): Declare. + * c-common.c (module_output): New variable. + (module_files): New variable. + * c-opts.c (add_module_file): New function. + * c-opts.c: Handle -fmodule-output and -fmodule-file. + gcc/cp/ + * module.c (finish_module): If specified, use module_output as output + file name. + * module.c (do_module_import): Check module_files for a module name + to file mapping before falling back to default. + gcc/ + * doc/invoke.texi (C++ Dialect Options): Document -fmodule-output + and -fmodule-file. + +2017-07-17 Nathan Sidwell <nathan@acm.org> + + Merge trunk r250272. + +2017-07-13 Nathan Sidwell <nathan@acm.org> + + Merge trunk r250159. + +2017-07-03 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (CLASSTYPE_CONSTRUCTORS, CLASSTYPE_DESTRUCTOR): Use + lookup_fnfields_slot_nolazy. + * search.c (lookup_fnfields_idx_nolazy): Don't use + CLASSTYPE_CONSTRUCTORS, CLASSTYPE_DESTRUCTOR. + + gcc/cp/ + * class.c (type_has_user_declared_move_constructor, + type_has_user_declared_move_assign): Delete, replace with: + (classtype_has_user_move_assign_or_ctor_p): ... this. + * cp-tree.h (type_has_user_declared_move_constructor, + type_has_user_declared_move_assign): Delete, replace with: + (classtype_has_user_move_assign_or_ctor_p): ... this. + * method.c (maybe_explain_implicit_delete): Update. + (lazily_declare_fn): Update. + * tree.c (type_has_nontrivial_copy_init): Update. + * search.c (lookup_fnfields_slot_nolazy): Don't try and complete + the type. + * pt.c (check_explicit_specialization): Use regular lookup. + + gcc/cp/ + * class.c (maybe_warn_about_overly_private_class): Ignore + copy/move ctors. + * semantics.c (classtype_has_nothrow_assign_or_copy_p): Use + lookup_fnfields_slot for ctors. + + gcc/cp/ + * module.c (cpms_{out,in}::start): Don't deal with identifiers + here. + (cpms_{out,in}::tree_node): Deal with identifiers specially. + + Merge trunk r249852. + +2017-06-30 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249835. + +2017-06-29 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249794. + + gcc/cp/ + * cp-tree.h (class_method_index_for_fn): Delete. + * decl2.c (check_classfn): Use lookup_fnfields_slot, reimplement + diagnostics. + * name-lookup.h (lookup_all_conversions): Declare. + * name-lookup.c (lookup_all_conversions): New. + * pt.c (retrieve_specialization): Use lookup_fnfields_slot, + lookup_all_conversions. + * search.c (class_method_index_for_fn): Delete. + gcc/testsuite/ + * g++.dg/concepts/memfun-err.C: Adjust. + * g++.dg/cpp0x/decltype9.C: Adjust. + * g++.dg/lookup/decl1.C: Adjust. + * g++.dg/other/pr28432.C: Adjust. + * g++.dg/parse/crash12.C: Adjust. + * g++.dg/parse/enum3.C: Adjust. + * g++.dg/parse/operator6.C: Adjust. + * g++.dg/template/crash69.C: Adjust. + * g++.dg/template/error27.C: Adjust. + * g++.dg/template/error28.C: Adjust. + * g++.dg/template/memfriend6.C: Adjust. + * g++.old-deja/g++.mike/err1.C: Adjust. + * g++.old-deja/g++.mike/p811.C: Adjust. + * g++.old-deja/g++.other/crash25.C: Adjust. + * g++.old-deja/g++.other/dtor4.C: Adjust. + * g++.old-deja/g++.pt/t37.C: Adjust. + + Merge trunk r249779. + + gcc/cp/ + * class.c (finish_struct): Use OVL_P. + * cp-tree.h (THIS_NAME, IN_CHARGE_NAME, VTBL_PTR_TYPE, + VTABLE_DELTA_NAME, VTABLE_PFN_NAME): Delete. + * decl.c (initialize_predefined_identifiers): Encode them here + directly. Rename cdtors consistently. + (cxx_init_decl_processing): Name vtbl_ptr_type directly. + * search.c (class_method_index_for_fn): No need to frob cdtor names. + +2017-06-28 Nathan Sidwell <nathan@acm.org> + + cdtor name cleanup. expunge lookup_fnfields_1 use. + gcc/ + * builtins.c (fold_builtin_FUNCTION) Use + lang_hooks.decl_printable_name. + gcc/cp/ + * call.c (build_new_method_call_1) Update cdtor handling. + * class.c (get_basefndecls): Use lookup_fnfields_slot. + * cp-tree.h (lookup_fnfields_1): Don't declare. + * decl.c (register_dtor_fn): Use lookup_fnfields_slot. + (grokfndecl): Set cdtor name. + * method.c (implicitly_declare_fn): Adjust cdtor flag setting. + * pt.c (check_explicit_specialization): Adjust cdtor checking, use + lookup_fnfields_slot_nolazy. + * search.c (lookup_fnfields_1): Make static. + * semantics.c (classtype_has_nothrow_assign_or_copy_p): Use + lookup_fnfields_slot. + gcc/testsite/ + * g++.dg/cpp1y/builtin_FUNCTION.C: New. + * g++.dg/plugin/decl-plugin-test.C: Adjust. + + Merge trunk r249746. + + gcc/cp/ + * cp-tree.h (SET_CLASS_TYPE_P): Use RECORD_OR_UNION_CHECK. + (NON_UNION_CLASS_TYPE_P): Just check for RECORD_TYPE. + * call.c (check_dtor_name): Adjust constructor_name check. + (name_as_c_string): Move const cast. + (build_new_method_call_1): Use constructor_name from basetype. + * class.c (get_vfield_name): Measure constructor_name length. + (build_self_reference): Don't use constructor_name here. + * cxx-pretty-print.c (is_destructor): Delete. + (pp_cxx_unqualified_id): Remove bogus dtor code. + * decl.c (grokdeclarator): Minor cleanup. + * method.c (implicitly_declare_fn): Use ctor_identifier and + dtor_identifier. + * name-lookup.c (constructor_name): Reimplement. + (constructor_name_p): Likewise. + (push_class_level_binding_1): Don't use constructor_name here. + * parser.c (cp_parser_direct_declarator): Reformat to avoid + nesting ifs. + * pt.c (tsubst_decl <FUNCTION_DECL>): Move var decls to + initialization point. Don't unnecessarily check for ctor name. + gcc/c-family/ + * c-common.c (resort_field_decl_cmp): Don't declare. + +2017-06-27 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249702. + gcc/c-family/ + * c-common.h (field_decl_cmp, resort_sorted_fields): Delete. + * c-common.c (field_decl_cmp, resort_data, + resort_field_decl_cmp): Move to c-decl.c. + gcc/c/ + * c-decl.c (field_decl_cmp, resort_data, + resort_field_decl_cmp): Moved from c-common.c + +2017-06-26 Nathan Sidwell <nathan@acm.org> + + Replace lang_type::sorted_fields with lang_type::bindings. + gcc/cp/ + * cp-tree.h (lang_type): Delete sorted_fields. Add bindings + field. + (CLASSTYPE_SORTED_FIELDS): Replace with ... + (CLASSTYPE_BINDINGS): ... this. + * name-lookup.c (lookup_class_member): Reimplement. + (count_fields): Delete. + (sorted_fields_type_new): Delete. + (add_class_member): New. + (add_fields_to_record_type): Replace with ... + (add_class_members): ... this. + (add_enum_fields_to_record_type): Delete. + (create_classtype_sorted_fields): Replace with ... + (set_class_bindings): ... this. + (insert_late_enum_def_into_classtype_sorted_fields): Replace with ... + (insert_late_enum_def_bindings): ... this. + * name-lookup.h (create_classtype_sorted_fields, + insert_late_enum_def_into_classtype_sorted_fields): Replace with ... + (set_class_bindings, insert_late_enum_def_bindings): ... this. + * ptree.h (cxx_print_type): Don't print SORTED_FIELDS. + * search.c (lookup_field_1): Check CLASSTYPE_BINDINGS. + * decl.c (finish_enum_value_list): Use insert_late_enum_def_bindings. + * class.c (finish_struct_1): Use set_class_bindings. + * module.c (cpms_in::define_class): Likewise. + + Start moving class name lookup around + gcc/cp/ + * class.c (count_fields, add_fields_to_record_type, + add_enum_fields_to_record_type, sorted_fields_type_new, + create_classtype_sorted_fields, + insert_late_enum_def_into_classtype_sorted_fields): Move to ... + * name-lookup.c: ... here. + (lookup_class_member): New. Broken out of ... + * search.c (lookup_field_1): ... here. Call it. + * name-lookup.h (lookup_class_member, + create_classtype_sorted_fields, + insert_late_enum_def_into_classtype_sorted_fields): Declare. + + Merge trunk r249657. + + gcc/cp/ + * cp-tree.h (lang_decl_fn): Remove assignment_operator_p field. + * module.c (cpms_{out,in}::lang_decl_bools: Likewise. + libcc1/ + * libcp1plugin.cc (plugin_build_decl): Don't set + DECL_ASSIGNMENT_OPERATOR_P. + + gcc/ + * Makefile.in (MODULE_STAMP): Set here + (REVISION, REVISION_c): Override. + gcc/cp/ + * Make-lang.in (MODULE_STAMP): Not here. + +2017-06-23 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (DECL_COMPLETE_CONSTRUCTOR_P): Directly compare + identifier. + (DECL_BASE_CONSTRUCTOR_P, DECL_COMPLETE_DESTRUCTOR_P, + DECL_BASE_DESTRUCTOR_P, DECL_DELETING_DESTRUCTOR_P): Likewise. + (DECL_ASSIGNMENT_OPERATOR_P): Use IDENTIFIER_ASSIGN_OP_P. + * decl.c (grok_op_properties): Adjust identifier checking. + * init.c (expand_default_init): Adjust identifier descision. + * method.c (implicitly_declare_fn): Don't use + DECL_ASSIGNMENT_OPERATOR_P. + * search.c (lookup_fnfields_1): Use IDENTIFIER_CTOR_P, + IDENTIFIER_DTOR_P. + * call.c (in_charge_arg_for_name): Reimplement. + (build_special_member_call): Use IDENTIFIER_CDTOR_P, + IDENTIFIER_DTOR_P. + +2017-06-22 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249572. + + Reorder IDENTIFIER flags + gcc/cp/ + * cp-tree.h (enum cp_identifier_kind): New. + (IDENTIFIER_KIND_BIT_0, IDENTIFIER_KIND_BIT_1, + IDENTIFIER_KIND_BIT_2): New. + (IDENTIFIER_MARKED): Move to TREE_LANG_FLAG_4. + (IDENTIFIER_VIRTUAL_P, IDENTIFIER_REPO_CHOSEN): Add IDENTIFIER_CHECK. + (C_IS_RESERVED_WORD): Replace with ... + (IDENTIFIER_KEYWORD_P): ... this. + (IDENTIFIER_CTOR_OR_DTOR_P): Replace with ... + (IDENTIFIER_CDTOR_P): ... this. + (IDENTIFIER_CTOR_P, IDENTIFIER_DTOR_P): New. + (IDENTIFIER_OPNAME_P): Replace with ... + (IDENTIFIER_ANY_OP_P): ... this. + (IDENTIFIER_ASSIGN_OP_P): New. + (IDENTIFIER_TYPENAME_P): Replace with ... + (IDENTIFIER_CONV_OP_P): ... this. + (NEW_DELETE_OPNAME_P): Replace with ... + (IDENTIFIER_NEWDEL_OP_P): ... this. + (DECL_CONV_FN_P, DECL_OVERLOADED_OPERATOR_P): Adjust. + (get_identifier_kind_name, set_identifier_kind): Declare. + * lex.c (get_identifier_kind_name, set_identifier_kind): New. + (init_operators): Adjust to avoid keywords, use + set_identifier_kind. Copy TYPE_EXPR slot. + (init_reswords): Call set_identifier_kind. + (unqualified_name_lookup_error): Adjust. + * operators.def (TYPE_EXPR): Remove. + * decl.c (struct predefined_identifier): Move into ... + (initialize_predefined_identifiers): ... here. Call + set_identifier_kind. + (grokfndecl, check_var_type, grokdeclarator): Adjust. + (grok_op_properties): Use IDENTIFIER_ANY_ASSIGN_OP to halve search + space. Adjust. + * call.c (name_as_c_string): Adjust. + (build_new_method_call_1): Likewise. + * cp-cilkplus.c (is_conversion_operator_function_decl_p): Likewise. + * cxx-pretty-print.c (pp_cxx_unqualified_id): Adjust. + * dump.c (cp_dump_tree): Adjust. + * error.c (dump_decl_name): Adjust. + * mangle.c (write_unqualified_id, write_member_name, + write_expression): Adjust. + (mangle_conv_op_name_for_type): Use set_identifier_kind. + * name-lookup.c (do_class_using_decl): Adjust. + (lookup_name_fuzzy, lookup_name_real_1): Likewise. + * parser.c (cp_lexer_get_preprocessor_token, + cp_parser_direct_declarator): Likewise. + * pt.c (push_template_decl_real, tsubst_decl, tsubst_baselink, + tsubst_copy, tsubst_copy_and_build): Adjust. + * ptree.c (cxx_print_identifier): Print identifier kind. + * search.c (lookup_field_r, lookup_member, + lookup_fnfields_idx_nolazy): Adjust. + * semantics.c (finish_id_expression): Adjust.. + * typeck.c (cp_build_addr_expr_1): Adjust. + +2017-06-21 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249464. + + gcc/c-family/ + * c-ada-spec.c (decl_sloc): Ignore builtin fields. + gcc/cp/ + * class.c (layout_class_type): Anon aggregates can never be bases. + (finish_struct_1, dump_class_hierarchy_1): CLASSTYPE_AS_BASE can + be null. + * cp-tree.h (enum cp_tree_index): Add CPTI_AS_BASE_IDENTIFIER. + (as_base_identifier): New. + (module_context): Declare. + * decl.c (initialize_predefined_identifiers): Initialize as_base. + * error.c (dump_module_suffix): Use module_context. + * mangle.c (maybe_write_module): Likewise. + * module.c (module_context): New. + (dump_nested_name): Distingush NULL context. + (cpms_{in,out}::globals): Take array directly. + (cpms_{in,out}::tree_node_raw): New, broken out of ... + (cpms_{in,out}::tree_node): ... here. Call it. Use + module_context. + (cpms_in::finish): Add module number. Adjust. + (cpms_{in,out}::tag_trees): Write translation unit decl. + +2017-06-16 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249268. + +2017-06-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249217. + libcc1/ + * libcp1plugin.c (supplement_binding): Don't call + maybe_remove_implicit_alias. + + First bug report! + gcc/cp/ + * cp-tree.h (CPTI_MANGLE): New. + (mangle_namespace): New. + (maybe_remove_implicit_alias): Delete. + * decl.c (cxx_init_decl_processing): Create mangle namespace. + * decl2.c (generate_mangling_alias): Use mangle_namespace. + * mangle.c (maybe_remove_implicit_alias): Delete. + (mangle_decl): Use mangle_namespace. Remove alias here. + * module.c (cpms_out::bindings): Ignore mangle_namespace. + * name-lookup.h (set_namespace_binding): Declare. + * name-lookup.c (supplement_binding_1): Don't deal with implicit + aliases here. + (set_namespace_binding): New. Broken out of ... + (set_global_binding): ... this. Call it. + (suggest_alternatives_for): Ignore mangle namespace. + gcc/testuite/ + * g++.dg/module/bug-1_[ab].C: New. + +2017-06-14 Nathan Sidwell <nathan@acm.org> + + Classes complete - Vcall indices and friends added. + gcc/cp/ + * module.c (cpms_{out,in}::tree_pair_vec): New. + (cpms_{out,in}::define_class): Stream vcall indices and friend list. + gcc/testsuite/ + * g++.dg/module/class-6_[abc].C: New. + +2017-06-12 Nathan Sidwell <nathan@acm.org> + + Merge trunk r249076. + +2017-06-09 Nathan Sidwell <nathan@acm.org> + + Vtable streaming. Change keyed_classes representation. + gcc/cp/ + * class.c (finish_struct_1): Adjust keyed_classes pushing. + * cp-tree.h (CPTI_KEYED_CLASSES): Delete. + (keyed_classes): Now a vector. + * decl.c (keyed_classes): Define. + (cxx_init_decl_processing): Initialize it. + (record_key_method_defined): Adjust pushing. + * decl2.c (decl_needed_p): Formatting fixes. + (c_parse_final_cleanups): Reset current module. + Call finish_module earlier. Adjust keyed_classes iteration. + * pt.c (instantiate_class_template_1): Adjust keyed_classes pushing. + * module.c (cpms_{out,in}::define_class): Adjust key method + streaming. + (cpms_{out,in}::lang_type_bools): Don't srtream interface flags. + gcc/testsuite/ + * g++.dg/modules/class-5_[abc].C: New. + + Typeinfo streaming + gcc/cp/ + * cp-tree.h (DECL_TINFO_P): Also for TYPE_DECLs. + (get_pseudo_tinfo_index, get_pseudo_tinfo_type): Declare. + * rtti.c (enum tinfo_kind): Add TK_DERIVED_TYPES, + TK_VMI_CLASS_TYPES, TK_MAX, delete TK_FIXED. + (tinfo_names): New. + (typeid_ok_p): Lool at TYPE_MAIN_VARIANT. + (get_pseudo_to_index): Only determine index, don't create type. + (get_tinfo_desc): New. Create the pseudo type. Set DCL_TINFO_P. + (create_pseudo_type_info): Delete. + (get_pseudo_ti_init): Use get_tinfo_desc. + (get_pseudo_tinfo_index, get_pseudo_tinfo_type): New. + (create_tinfo_types): Only allocate the vector. + * module.c (cpms_{out,in}::insert): New. + (cpm_stream::global_tree_arys): Add sizetype_tab. + (cpms_out::tag_binding): Don't stream DECL_TINFO_P bindings. + (cpms_{out,in}::define_class): Don't stream + CLASSTYPE_TYPEINFO_VAR. Stream CLASSTYPE_VTABLES. + (cpms_{out,in}::core_vals): Stream CONSTRUCTORs. + (cpms_{out,in}::tree_node): Detect DECL_TINFO_P things. + +2017-06-08 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (cpms_in::read_item, cpms_in::tree_node): More + diagnostics. + (cpms_{out,in}::start, cpms_{out,in}::core_vals): Fix call + handling. + gcc/testsuite/ + * g++.dg/modules/class-4_[ab].C: New. + + gcc/cp/ + * module.c: Implement dump printf. + +2017-06-07 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248972. + + gcc/cp/ + * module.c (cpms_{out,in}::core_vals): Stream block vars & + abstract origin. + +2017-06-06 Nathan Sidwell <nathan@acm.org> + + Inline ctors/dtors + gcc/cp/ + * module.c (cpms_in::define_function): Deal with non-namespace + fn definitions. + (cpms_{out,in}::define_class): Define member fns. + (cpms_in::tag_definition): Clone fn. + * semantics.c (expand_or_defer_fn_1): Keep cloned fns body when + modules. + gcc/testsuite/ + * g++.dg/modules/class-3_[abcd].C: Augment. + + Member functions + gcc/cp/ + * class.c (resort_type_method_vec): Avoid signed/unsigned compare. + * module.c (cpms_out::maybe_tag_definition): New. + (cpms_{out,in}::tag_definition): Always tag, return tagged thing. + (cpms_{out,in}::chained_decls, tree_vec): New. + (cpms_{out,in}::define_class): Stream methods, as_base. + (cpms_{out,in}::core_vals): Stream ARGUMENTs here. + (cpms_in::tree_node): Cope with immediate definitions. + gcc/testsuite/ + * g++.dg/modules/class-3_[abcd].C: Augment. + + More PoD struct + gcc/cp/ + * module.c (cpms_{out,in}::ident_imported_decl): New. + (cpms_{out,in}::lang_type_vals): New. + (cpms_{out,in}::core_vals): Blocks and statements. + (cpms_{out,in}::tree_node): More general import referencing. + * name-lookup.c (name_lookup::add_module_fns): New. + (name_lookup::adl_namespace_only): Use it. + gcc/testsuite/ + * g++.dg/modules/class-3_[abc].C: New. + +2017-06-05 Nathan Sidwell <nathan@acm.org> + + More PoD struct + gcc/cp/ + * cp-tree.h (default_hash_traits): Make non-deletable. + (cpms_out::non_null): New hash trait. + (cpms_in::traits): Use simple_hashmap_traits. + (cpms_in::define_class, cpms_in::finish_type): Propagate + completeness. + (cpms_in::finish_type): Deal with pointer/ref to. + (cpms_{out,in}::core_vals): Stream ints, pointer/ref to. + (cpms_{out,in}::tree_node): Interstitial typedef. + gcc/testsuite/ + * g++.dg/modules/class-1_[abc].C: Extend. + * g++.dg/modules/class-2_[ab].C: New. + +2017-06-02 Nathan Sidwell <nathan@acm.org> + + Pod struct + gcc/cp/ + * cp-tree.h (create_classtype_sorted_fields): Declare. + * class.c (finish_struct_1): Adjust sorted field call. + (insert_into_classtype_sorted_fields): Rename to ... + (create_classtype_sorted_fields): ... here. Export + * module.c (cpms_{out,in}::tree_vec): New. + (cpms_{out,in}::define_function): New. + (cpms_{out,in}::define_class): New. + (cpms_{out,in}::tag_definition): Adjust. + (cpms_{out,in}::core_vals): Stream binfo, field_decl. + gcc/testsuite/ + * g++.dg/modules/class-1_[abcd].C: Add field accesses. + + Merge r248828. + + gcc/cp/ + * modules.c (cpms_out::core_vals, cpms_in::core_vals): Don't + stream structure fields etc. + +2017-06-01 Nathan Sidwell <nathan@acm.org> + + Incomplete or empty classes. + gcc/cp/ + * cp-tree.h (ovl_iterator::export_tail): New. + (TYPE_GET_PTRMEMFUNC_TYPE, TYPE_SET_PTRMEMFUNC_TYPE): Delete. + (TYPE_PTRMEMFUNC_TYPE): New. + (maybe_add_lang_type_raw): Add ptrmem_p arg. + (fit_ptrmem_type_decl): Declare. + (ovl_insert): Add export_tail. + * decl.c (build_ptrmemfunc_type): Use fit_ptrmem_type_decl, + adjust. + (xref_tag_1): Call decl_set_module. + * lex.c (maybe_add_lang_type_raw): Add ptrmem_p arg. Adjust. + (fit_ptrmem_type_decl): New. + (cxx_make_type): Adjust. + * module.c (name_string): New. Use it everywhere. + (cpm_reader::fill): Check ferror. + (cpms_out::tag_binding): Skip builtins. Write types. + (cpms_out::lang_type_bools, cpms_in::lang_type_bools): New. + * name-lookup.c (STAT_EXPORTS): New. + (name_lookup::process_module_binding): Use it. + (update_binding): Set it. + (newbinding_bookkeeping): New. Broken out of ... + (do_pushdecl): ... here. Call it. + (push_module_binding): And call it here. Set STAT_EXPORTS. + * rtti.c (create_pseudo_type_info): Mark as builtins. + (get_pseudo_ti_index): Likewise. + (emit_support_tinfos): Use regular lookup to find type. Set + builtins location. + * tree.c (ovl_insert): Add export_tail arg. + gcc/testsuite/ + * g++.dg/modules/class-1_[abcd].C: New. + +2017-05-31 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c: Instrumentation. + + Merge trunk r248748. + +2017-05-30 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248694. + + gcc/cp/ + * module.c (cpms_out::tag_binding, cpms_in::tag_binding): Mark + type too. + (cpms_out::bindings): Adjust. + * name-lookup.c (push_module_binding): Add type arg. + + gcc/cp/ + * cp-tree.h (lang_decl_base): Lose decomposition_p flag. + (lang_decl) Update GTY tags. + (enum lang_decl_selector): New. Replace magic consts with this. + (DECL_DECOMPOSITION_P): Update. + (SET_DECL_DECOMPOSITION_P): Delete. + (maybe_add_lang_decl_raw): Second arg is bool. + (retrofit_lang_decl): Lose selector arg. + (fit_decomposition_lang_decl): Declare. + * decl.c (cp_finish_decomp): Use fit_decomposition_lang_decl. + (grokdeclarator): Likewise. + * lex.c (maybe_add_lang_decl_raw): Change 2nd arg to bool. Don't + to copying here. + (set_decl_linkage, fit_decomposition_lang_decl): New. + (retrofit_lang_decl): Lose selector arg. + (cxx_dup_lang_specific_decl): Use selector directly. + * module.c (cpms_out::lang_decl_bools, cpms_in::lang_decl_bools, + cpms_out::lang_decl_vals, cpms_in::lang_decl_vals): Use + lang_decl_selector. + (cpms_in::tree_node): Adjust maybe_add_lang_decl call. + + gcc/ + * REVISION: Add file. + gcc/c-family/ + * c-cppbuiltin.c (c_cpp_builtins): Update __cpp_modules=201704. + +2017-05-29 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248578. + + Merge trunk r248574. + + Merge trunk r248571. + +2017-05-26 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248517. + + gcc/cp/ + * cp-tree.h: Comment cleanup. + * name-lookup.c: Likewise. + * tree.c: Likewise. + + Merge trunk 248485. + gcc/cp/ + * lex.c (maybe_retrofit_lang_decl): Add sel parm. + +2017-05-25 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * cp-tree.h (ovl_iterator): Make unduplicatable. + (ovl_iterator::pop): New. + (lkp_iterator::operator++): Adjust. + + Merge trunk r248454. + + Merge trunk r248436. + +2017-05-24 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * name-lookup.c (lookup_name): Reimplement state preservation and + restoration. + * tree.c (lookup_mark): Add asserts. + gcc/testsuite/ + * g++.dg/lookup/koenig14.C: New. + + Merge trunk r248406. + + gcc/cp/ + * call.c (build_operator_new_call, build_new_op_1): Open code ADL + lookup. + * name-lookup.h (lookup_function_nonclass): Delete. + (lookup_arg_dependent): Adjust return type. + * name-lookup.c (name_lookup): Absorb adl_lookup. + (name_lookup::search_adl): New. + (lookup_function_nonclass): Delete. + (lookup_arg_dependent): Adjust. + +2017-05-23 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248389. + + gcc/cp/ + * name-lookup.c (name_lookup::name_lookup): Lose F parm. + (name_lookup::ambiguous, add_value, add_type): New. + (name_lookup::merge_binding): Delete. + (name_lookup::find_and_mark): Move from adl_lookup. + (name_lookup::process_binding): Adjust. + (adl_lookup::search_adl): New. + (do_lookup_arg_dependent): Call it. + (qualified_namespace_lookup): Return found flag. + (unqualified_namespace_lookup): Delete. + (lookup_name_real_1, push_namepace): Adjust. + + Merge trunk r248377. + + Merge trunk r248365. + +2017-05-22 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248338. + gcc/cp/ + * name-lookup.c (add_using_namespace): Remove FROM arg. + (notify_debug_using_namespace): New. + (finish_namespace_using_directive, push_namespace): Notify debug. + gcc/testsuite/ + * g++.dg/lookup/strong-using-6.C: Delete. + + gcc/cp/ + * config-lang.in: Update. + * name-lookup.c (add_using_directive): Rename to ... + (add_using_namespace): ... here. Add FROM arg. + (do_toplevel_using_directive): Fold into add_using_namespace. + (finish_namespace_using_directive, finish_local_using_directive, + push_namespace): Adjust. + + Merge trunk r248329. + + gcc/testsuite/ + PR c++/80830 + * g++.dg/lookup/friend20.C: New testcase. + +2017-05-19 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248295. + + gcc/cp/ + * cp-tree.h: Misc cleanups. + * name-lookup.c (pushdecl_top_level): Fix description. + gcc/ + * dumpfile.h: Whitespace cleanups. + * system.h (ATTRIBUTE_NTC_PURE): Delete. + gcc/testsuite/ + * g++.dg/tree-ssa/ssa-dse-2.C: Restore. + + Merge trunk r248285. + + Merge trunk r248271. + +2017-05-18 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248250. + + LANG_HOOK_REGISTER_DUMPS + gcc/ + * context.h (context::set_passes): New. + * context.c (context::context): Do not create pass manager. + * toplev.c (general_init): Create pass manager here. Call + register dump lang hook. + * doc/invoke.texi: Document -fdump-lang option family. + * dumpfile.c (dump_files): Remove module and class dumps here. + (FIRST_AUTO_NUMBERED_DUMP): Adjust. + * dumpfile.h (tree_dump_index): Remove TDI_lang, TDI_class. + * langhooks-def.h (lhd_register_dumps): Declare. + (LANG_HOOKS_REGISTER_DUMPS): Define. + (LANG_HOOKS_INITIALIZER): Add it. + * langhooks.c (lhd_register_dumps): Define. + * langhooks.h (struct lang_hooks): Add register_dumps. + gcc/c-family/ + * c-opts.c (class_dump_file, class_dump_flags): Delete. + (c_common_parse_file): Remove class dump handling. + (get_dump_info): Likewise. + gcc/cp/ + * class.c (class_dump_id): Define. + (dump_class_hierarchy, dump_vtable, dump_vtt): Use it. + * cp-objcp-common.c (cp_register_dumps): New. + * cp-objcp-common.h (cp_register_dumps): Declare. + (LANG_HOOKS_REGISTER_DUMPS): Override. + * cp-tree.h (class_dump_id, module_dump_id): Declare. + * module.c (module_dump_id): Define. + (read_module, write_module): Use it. + gcc/testsuite/ + * g++.dg/inherit/covariant7.C: Adjust. + * g++.dg/modules/ Adjust scans. + + gcc/cp/ + * cp-tree.h (lookup_add, lookup_maybe_add): Swap args. + * name-lookup.c (name_lookup::merge_binding, + adl_lookup::add_functions): Adjust. + * pt.c (check_explicit_specialization, do_class_deduction): Adjust. + * tree.c (lookup_add, lookup_maybe_add): Adjust. + + Merge trunk r248192. + +2017-05-17 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248159. + + Merge trunk r248151. + * cp-tree.h (ovl_insert): Swap first two args. Update all uses. + + Merge trunk r248144. + +2017-05-16 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248126. + + Merge trunk r248121. + + Merge trunk r248116. + + Merge trunk r248109. + +2017-05-15 Nathan Sidwell <nathan@acm.org> + + Merge trunk r248059. + + gcc/cp/ + * module.c (cpms_in::tag_definition): Robustify. + +2017-05-12 Nathan Sidwell <nathan@acm.org> + + gcc/cp/ + * module.c (cpms_{in,out}): Rename {read,write}_tree to tree_node. + + gcc/cp/ + * module.c (cpms_{in,out}): Rename read/write fns. + + More inline bodies + gcc/cp/ + * module.c (cpms_{in,out}::write_core_vals): Read/write + statement lists & LABEL_DECLs. + gcc/testsuite/ + * g++.dg/modules/fn-inline-1_c.C: More test. + + Inline function bodies + gcc/cp/ + * module.c (cpms_{in,out}::write_core_vals): Read/write + exprs + (cpms_in::tag_definition): Insert inline function. + gcc/testsuite/ + * g++.dg/modules/fn-inline-1_[ab].C: New. + + Merge trunk r247968. + + gcc/cp/ + * module.c (cpm_reader::read_tree): Change interface, adjust callers. + + gcc/cp/ + * module.c (cpm_writer): Instrument bool distribution. + (cpms_out::tag_definition, cpms_in::tag_definition): New. + (cpms_out, cpms_in): Transfer more stuff. + +2017-05-11 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247911. + +2017-05-10 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247864. + + Merge trunk r247834. + +2017-05-09 Nathan Sidwell <nathan@acm.org> + + Rename -fdump-front-end to -fdump-lang. + gcc/ + * dumpfile.h (TDF_KIND_MASK, TDF_KIND): New. Adjust. + * dumpfile.c (dump_files): Rename file suffix. + (get_dump_file_name, dump_enable_all): Adjust. + * doc/invoke.texi: Rename option. + gcc/testsuite/ + * g++.dg/modules: Adjust tests. + + gcc/cp/ + * module.c (cpms_in::finish): Merge global decls. + (cpms_in::finish_function, cpms_in::finish_namespace): Delete. + * name-lookup.h (push_module_namespace): Replace with ... + (merge_global_decl): ... this. + * name-lookup.c (push_module_namespace): Morph into ... + (merge_global_decl): ... this. + (push_module_binding): Don't re-add found things. + + gcc/ + * tree.h (TREE_CHECK6, tree_check6): Delete. + + Merge trunk r247787. + gcc/cp/ + * tree.c (type_has_nontrivial_copy_init): Use ovl_iterator. + + Error message module designation. + gcc/cp/ + * error.c (dump_module_suffix): New. + (dump_simple_decl, dump_function_name): Use it. + gcc/testsuite/ + * g++.dg/modules/err-1_[abcd].C: New. + +2017-05-08 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247749. + + Implement 'export module foo;' + gcc/cp/ + * cp-tree.h (declare_module): Add interface flag. + (import_export_module): Rename to ... + (import_module): ... here. Lose export flag. + * module.c (import_module): Determine exportness from export + depth. + (declare_module): Add interface flag, don't check attribs. + * parser.c (check_module_outermost): Don't check export depth. + (cp_parser_module_declaration): Don't deal with imports. + (cp_parser_import_declaration): New. + (cp_parser_module_export, cp_parser_declaration): Adjust. + gcc/testsuite/ + * g++.dg/modules/import-1_[a-g].C: New. + + Implement DR2061 + gcc/cp/ + * name-lookup.c (push_inline_namespace): New. + (push_namespace): Use it. Check inline consistency here ... + * parser.c (cp_parser_namespace_definition): ... not here. + gcc/testsuite/ + * g++.dg/cpp0x/dr2061.C: New. + * g++.dg/parse/namespace-alias-1.C: Augment. + + gcc/cp/ + * cp-tree.h, call.c, class.c, name-lookup.c, parser.c, pt.c, + semantics.c, tree.c: Rename ovl2_iterator to lkp_iterator. + + gcc/cp/ + * name-lookup.h (push_namespace): Return int. + * name-lookup.c (push_namespace): Return count of depth pushed. + * parser.c (cp_parser_namespace_definition): Accumulate depth pushed. + +2017-05-05 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247654. + + Merge trunk r247646. + + Merge trunk r247636. + + Indirect import lookup by tagging + gcc/cp/ + * cp-tree.h (MAYBE_DECL_MODULE_INDEX): New. + (DECL_GLOBAL_MODULE_P, DECL_THIS_MODULE_P): Delete. + * mangle.c (maybe_write_module): Adjust. + * module.c (cpms_out::write_tree, cpms_in::read_tree): Mark + imported decls by tag. + * name-lookup.h (key_module_instance, find_module_instance): Declare. + * name-lookup.c (module_binding_slot): Allow search only. + (key_module_instance): New. + (find_module_instance): Use key. + gcc/testsuite/ + * g++.dg/modules/mod-indirect-1_[a-e].C: New. + +2017-05-04 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247612. + gcc/testsuite/ + * g++.dg/lookup/using17.C: Adjust error message. + + Overload bindings + gcc/cp/ + * module.c (cpms_in::tag_binding, cpms_out::tag_binding): Binding + can be overload. + (cpms_out::write_bindings): Write whole slot. + (cpms_in::finish): Look for import match. + (cpms_in::read_lang_decl_bools, cpms_out::write_lang_decl_bools, + cpms_in::read_lang_decl_vals, cpms_out::write_lang_decl_vals): + Implement. + * name-lookup.c (push_module_binding): Binding can be overload. + (find_module_instance): New. + * name-lookup.h (find_module_instance): Declare. + gcc/testsuite/ + * g++.dg/modules/mod-impl-1_[abcd]: Add overloads. + +2017-05-03 Nathan Sidwell <nathan@acm.org> + + Merge trunk r247593. + + gcc/cp/ + * cp-tree.h (LOOKUP_SEEN_P): Map to TREE_VISITED. + (LOOKUP_FOUND_P, OVL_LOOKUP_P): Move to lang_flag_4 + + Modules via index, working again! + gcc/cp/ + * module.c (cpms_in::tag_binding): Set module index. + gcc/testsuite/ + * g++.dg/modules/mod-impl-1_a.C: Remove xfail. + + Namespace partitions. + gcc/cp/ + * cp-tree.h (MODULE_NAMESPACE_P, GLOBAL_MODULE_NAMESPACE_P, + CURRENT_MODULE_NAMESPACE_P): Delete. + (pop_module_namespace, push_module_namespace): Delete. + * module.c (cpms_out::write_bindings, cpms_in::finish_namespace): + Remove module namespace hacks. + (push_module_namespace, pop_module_namespace): Delete. + (module_to_ext): Swallow into ... + (module_to_filename): ... here. + (declare_module): Don't create module namespace symbol. + * name-lookup.c (module_binding_slot): Fixup global module + insertion. + (is_nested_namespce, is_ancestor): Remove module namespace hacks. + * parser.c (check_module_outermost, cp_parser_module_export, + cp_parser_module_proclamation, + cp_parser_namespace_definition): Likewise + gcc/testsuite/ + * g++.dg/modules/mod-sym-[123].C: Remove xfails. + * g++.dg/modules/mod-impl-1_a.C: Revert to run test. + + Namespace partitions.[...] [diff truncated at 524288 bytes]
reply other threads:[~2020-08-28 16:10 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200828161007.B0CE4394847E@sourceware.org \ --to=nathan@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).