2019-12-04 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 gcc/cp/ * module.cc (module_state::read_cluster): Hack around cfun. 2019-10-29 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r275641. 2019-09-09 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r273771. 2019-08-04 Nathan Sidwell 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 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 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 gcc/ * doc/invoke.texi (C++ Modules): Update. 2019-07-24 Nathan Sidwell 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 gcc/cp/ * module.cc (depset): Rename MARKED to SPECIAL, update all users. 2019-07-22 Nathan Sidwell 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 gcc/cp/ * Make-lang.in (MODULE_REVISION): Add git rev, if it's git. 2019-07-16 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r272583. 2019-06-21 Nathan Sidwell 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 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 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 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 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 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 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 Update Revision number 2019-06-11 Nathan Sidwell Merge trunk r272149. 2019-06-10 Nathan Sidwell 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 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 Update Revision number 2019-06-06 Nathan Sidwell gcc/cp/ * Make-lang.in (MODULE_REVISION): Read from Changelog.modules. 2019-06-05 Nathan Sidwell 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 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 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 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 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 * 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 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 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 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 Merge trunk r271420. 2019-05-17 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Nathan Sidwell 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 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 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 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 gcc/cp/ * pt.c: Comment some structures. gcc/ * doc/invoke.texi (C++ Modules): Update. Merge trunk r269975. 2019-03-27 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 __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 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 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 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 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 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 libcpp/ * mkdeps.c (struct deps): Make more C++y. Update all uses. 2019-02-07 Nathan Sidwell 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 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 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 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 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 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 gcc/ * doc/invoke.texi (C++ Modules): Add submenu. 2019-01-29 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 gcc/cp/ * modules.cc (dumper): Rename dump flags. Adjust throughout. 2018-11-19 Nathan Sidwell 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 Merge trunk r266161. gcc/ * doc/invoke.texi: Rename cookie->ident, people read too much into 'cookie'. 2018-11-07 Nathan Sidwell 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 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 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 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 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 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 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 Merge trunk r265554. 2018-10-26 Nathan Sidwell 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 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 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 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 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 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 gcc/cp/ * parser.c (cp_parser_tokenize): Don't stop after nested module/import decl. 2018-10-18 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 %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 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 Merge trunk r263679. Merge trunk r263673. Revert r263619 2018-08-17 Nathan Sidwell Revert r263597 2018-08-16 Nathan Sidwell They break GTY strangely. 2018-08-17 Nathan Sidwell 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 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 Merge trunk r263429. 2018-08-02 Nathan Sidwell Merge trunk r263272. 2018-07-12 Nathan Sidwell 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 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 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 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 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 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 (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 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 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 gcc/cp/ * cxx-mapper.cc: BMI->GCC * module.c: Likewise. gcc/ * doc/invoke.texi: Likewise. 2018-06-23 Nathan Sidwell 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 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 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 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 gcc/testsuite/ * g++.dg/modules/loc-2_[a-f].C: New. 2018-06-17 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 gcc/ * doc/invoke.texi (C++ Modules): Clarify and extend. 2018-06-04 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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) : 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r259710. 2018-04-26 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 gcc/cp/ * module.c (add_module_mapping): Fix double increment. 2018-02-28 Nathan Sidwell 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 gcc/cp/ * module.c (version_string): Rename. (module_state::write_context): Write compiler version. 2018-02-16 Nathan Sidwell 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 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 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 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 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 gcc/cp/ * module.c: Update more comments. gcc/cp/ * module.c: Update a lot of comments. 2018-02-07 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r255836. 2017-11-27 Nathan Sidwell Merge trunk r255166. 2017-11-22 Nathan Sidwell 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 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 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 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 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 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 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 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 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 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 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 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 Merge trunk r253654. 2017-10-10 Nathan Sidwell Merge trunk r253585. 2017-09-25 Nathan Sidwell 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 Merge trunk 252831. 2017-07-20 Boris Kolpackov 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 Merge trunk r250272. 2017-07-13 Nathan Sidwell Merge trunk r250159. 2017-07-03 Nathan Sidwell 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 Merge trunk r249835. 2017-06-29 Nathan Sidwell 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 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 ): 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 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 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 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 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 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 Merge trunk r249268. 2017-06-15 Nathan Sidwell 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 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 Merge trunk r249076. 2017-06-09 Nathan Sidwell 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 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 Merge trunk r248972. gcc/cp/ * module.c (cpms_{out,in}::core_vals): Stream block vars & abstract origin. 2017-06-06 Nathan Sidwell 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 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 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 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 gcc/cp/ * module.c: Instrumentation. Merge trunk r248748. 2017-05-30 Nathan Sidwell 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 Merge trunk r248578. Merge trunk r248574. Merge trunk r248571. 2017-05-26 Nathan Sidwell 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 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 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 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 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 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 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 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 Merge trunk r248126. Merge trunk r248121. Merge trunk r248116. Merge trunk r248109. 2017-05-15 Nathan Sidwell Merge trunk r248059. gcc/cp/ * module.c (cpms_in::tag_definition): Robustify. 2017-05-12 Nathan Sidwell 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 Merge trunk r247911. 2017-05-10 Nathan Sidwell Merge trunk r247864. Merge trunk r247834. 2017-05-09 Nathan Sidwell 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 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 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 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 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. gcc/cp/ * cp-tree.h (OVL_EXPORT_P): New. Move OVL_LOOKUP_P. (DECL_MODULE_EXPORT_P): Allow any DECL. (module_import_bitmap): Declare. * decl.c (cxx_init_decl_processing): Export global_namespace. * module.c (module_import_bitmap): New. (do_module_import): Install as global module, if needed. (declare_module): Freeze global imports. * name-lookup.c: Include bitmap.h. (name_lookup::process_binding): Take split bindings. (name_lookup::process_module_binding): New. (name_lookup::search_namespace_only): Adjust. * tree.c (ovl_insert): Sort by export_p too. Merge trunk r247550. Namespace partitions. gcc/cp/ * cp-tree.h (MODULES_PER_BINDING_CLUSTER): Delete. (MODULE_VECTOR_NUM_CLUSTERS, MODULE_VECTOR_CLUSTER_BASE, MODULE_VECTOR_CLUSTER_LAST, MODULE_VECTOR_CLUSTER): New. (make_module_vec): Declare. * module.c (cpms_out::write_bindings): Look into MODULE_VECTOR. * name-lookup.c (modue_binding_slot): New. (name_lookup::merge_binding, name_lookup::process_binding): New. (name_lookup::search_qualified): Add usings parm. (name_lookup::search_namespace_only): Look into MODULE_VECTOR. (do_pushdecl): Create module slot. (find_namespace_partition): New, from ... (push_module_namespace): ... here. Call it. (push_module_binding): Create module slot. (push_namespace): Adjust. * ptree.c (cxx_print_xnode): Print MODULE_VECTOR. * tree.c (make_module_vec): New. 2017-05-02 Nathan Sidwell gcc/cp/ * cp-tree.h (saved_scope): Add this_module. (current_module): New. * module.c (cpms_in): Add remapping vector. Remove scope. (cpms_in::tag_import): Update remapping vector. (cpms_out::tag_binding, cpms_in::tag_binding): Write/read module no. * name-lookup.c (do_push_to_top_level): Set current_module. gcc/doc/ * invoke.texi (-fdump-front-end): Document. Read/write direct namespace bindings part 2. gcc/cp/ * module.c (cpms_out::tag_binding): Write the tag. (cpms_in::read_item): Detect rt_binding, set modules slot. (cpms_out::write_context_binding): Delete. (cpms_out::write_bindings): Simplify. (cpms_in::finish_function): Don't push function here. (cpms_in::finish_namespace): Adjust. (do_module_import): Adjust. * name-lookup.h (push_module_namespace): Declare. * name-lookup.c (push_module_namespace): New. Read/write direct namespace bindings part 1. gcc/cp/ * cp-tree.def (module_vector): New tree type. * cp-tree.h (module_cluster, tree_module_vec): New tree. (enum cp_tree_node_structure_enum): Add TS_CP_MODULE_VECTOR. (lang_tree_node): Add tree_module_vec. * decl.c (cp_tree_node_structure): Detect MODULE_VECTOR. * module.c (cpms_out::tag_binding, cpms_in::tag_binding): New. (cpms_out::write_context_binding): New. (cpms_out::walk_namespace): Replace with ... (cpms_out::write_bindings): ... this. * name-lookup.h (push_module_binding): Declare. * name-lookup.c (push_module_binding): New. 2017-05-01 Nathan Sidwell gcc/ * tree.c (type_hash_default): Adjust ARRAY_TYPE hash. Import timestamp & crc gcc/cp * module.c (module_state): Add crc & stamp. (enum import_kind): New. (cpms_out::header, cpms_in::header): Check timestamps. (time2str, timestamp_mismatch): New. (cpms_out::tag_import, cpms_in::tag_import): Xfer indirect imports too. (read_module, do_module_import): Check timestamp & crc. gcc/testsuite/ * g++.dg/modules/mod-stamp-1_[abcd].C: New. Proper mangle for module. Still have namespace hack though. gcc/cp/ * cp-tree.h (DECL_GLOBAL_MODULE_P, DECL_THIS_MODULE_P): Protect DECL_LANG_SPECIFIC. (decl_set_module, module_name, module_name_parts): New. * decl.c (duplicate_decls): Check moduleness. (grokfndecl): Set moduleness. * mangle.c (maybe_write_module): New. (write_name): Call it. * module.c (module_state::set_name): New. (decl_set_module, module_name, module_name_parts): New. gcc/testsuite/ * g+.dg/modules.exp (dg-module-do, module_do_it): Adjust. * g++.dg/modules/mod-impl-1_a.C: Adjust & XFAIL. * g++.dg/modules/mod-impl-1_c.C: Likewise. * g++.dg/modules/mod-sym-1.C: Likewise. * g++.dg/modules/mod-sym-2.C: Likewise. * g++.dg/modules/mod-sym-3.C: Likewise. 2017-04-28 Nathan Sidwell gcc/cp/ * cp-tree.h (struct_lang_base): Add module_index. Shrink selector. (DECL_MODULE_INDEX, DECL_GLOBAL_MODULE_P, DECL_THIS_MODULE_P): New. (EXPORTED_P): Rename to .. (DECL_EXPORTED_P): ... here. * modules.c: Adjust EXPORTED_P uses. Module indices and separated import/export info gcc/cp/ * cp-tree.h (GLOBAL_MODULE_INDEX, THIS_MODULE_INDEX, IMPORTED_MODULE_BASE): New. (import_module, export_module): Replace with ... (import_export_module): ... this. * module.c: #include bitmap.h. (enum import_kind): Delete. (struct module_state): New. (modules, module_map, this_module): New. (imported_modules): Delete. (cpms_in::state): New member. Update constructor. (cpms_in::tag_import, cpms_out::tag_import): Take is_export arg. (cpms_in::read_item): Assign module index. (module_user, is_interface): Delete. (dopen, dclose): Delete. Move to call sites. (read_module): Return module index. (do_module_import): Reimplement. (import_module, export_module): Replace with ... (import_export_module): ... this. (declare_module, write_module, finish_module): Adjust. * parser.c (cp_parser_module_declaration): Adjust, gcc/testsuite/ * g++.dg/modules/mod-decl-5_b.C: Adjust. 2017-04-27 Nathan Sidwell Kill rt_import popping madness gcc/cp/ * module.c (cpm_serial::rt_export): New tag. (cpms_in::tag_import): Do the importing right now. (cpms_in::read_item): ... not here. (read_module): Pass in dump file name, open it if needed. Kill walk_namespaces gcc/cp/ * cp-tree.h (walk_namespaces): Delete. * decl.c (walk_namespaces_r, walk_namespaces): Delete. Rework module namespace walking gcc/cp/ * name-lookup.h: (decapsulate_binding): Declare. * name-lookup.c: (decapsulate_binding): New. * module.c (cpms_out::walk_namespace): Iterate over namespace bindings, not decls. (imported_modules): Key by lang_identifier. Adjust allocation/deletion. Refix unhidden extern C Revert 2017-04-26 extern_c_slot patch. gcc/cp/ * name-lookup (do_pushdecl): Call check_extern_c_conflict when unhiding. gcc/testsuite/ * g++.dg/lookup/extern-c-redecl.C: Adjust. * g++.dg/lookup/extern-c-hidden.C: New test. Merge trunk r247281. gcc/ * tree.c (type_hash_default): Hash TYPE_TYPELESS_STORAGE. gcc/objc/ * objc-gnu-runtime-abi-01.C (objc_add_static_instance): Use pushdecl langhook. 2017-04-26 Nathan Sidwell gcc/cp/ * name-lookup.c (extern_c_slot): New. (check_extern_c_conflict): Use it. (unhidden_extern_c): New. (do_pushdecl): Call it. gcc/cp/ * name-lookup.c (extern_c_slot): New. (check_extern_c_conflict): Use it. (unhidden_extern_c): New. (do_puhdecl): Call it. Die IDENTIFIER_GLOBAL_BINDINGS! Die! gcc/ * ipa-devirt.c (default_hash_traits ): Add GTY((skip))s. gcc/cp/ * cp-tree.h (lang_identifier): Remove namespace_bindings. (default_hash_traits): Specialization. (IDENTIFIER_NAMESPACE_BINDINGS): Delete. (lang_decl_ns): Add bindings map. (DECL_NAMESPACE_BINDINGS): New. * lex.c (maybe_add_lang_decl_raw): Allocate namespace binding map. * name-lookup.c (create_namespace_binding): Delete. (find_namespace_binding): Split into ... (find_or_create_namespace_slot, find_namespace_slot): ... these. Update all callers. (extern_c_fns): Change to identifier map. * ptree.c (cxx_print_identifier): Remove IDENTIFIER_NAMESPACE_BINDINGS. 2017-04-25 Nathan Sidwell gcc/cp/ * name-lookup.c (find_namespace_binding): Return slot pointer. Adjust all callers. (update_binding): Add slot pointer arg. Adjust. (check_extern_c_conflict): Cons up list of fns. (c_linkage_bindings): Use extern_c_fns map. gcc/cp/ * name-lookup.c (extern_c_fns): New hash. (check_extern_c_conflict): Reimplement using hash map. (do_pushdecl): Move check_extern_c_conflict later. Namespace stat hack via special overload gcc/cp/ * name-lookup.c (STAT_HACK_P, STAT_TYPE, STAT_DECL, MAYBE_STAT_DECL, MAYBE_STAT_TYPE): New. (stat_hack): New. (find_namespace_value, name_lookup::search_namespace_only, update_binding, do_pushdecl, set_identifier_type_value_with_scope, set_global_value, lookup_type_scope_1, do_pushtag): Adjust. 2017-04-24 Nathan Sidwell gcc/cp/ * name-lookup.c (add_local_decl): Delete. (name_lookup::add): Fold into ... (name_lookup::search_namespace_only): ... here. (update_binding): Allow pushing the same artificial type. (do_pushdecl): Explicitly set namespace type. (push_local_binding): Use add_decl_to_level. (set_identifier_type_Value_with_scope): Use update_binding for namespaces. gcc/cp/ * name-lookup.c (do_nonmember_using_decl): Pass in pointers to value and type nodes. (do_local_using_directive): Use current_binding_level directly. (do_toplevel_using_directive): Adjust. (lookup_type_current_level): Delete. gcc/cp/ * name-lookup.c (diagnose_name_conflict): Check decl context. (do_nonmember_using_decl): Simplify. gcc/testsuite/ * g++.dg/lookup/using13.C: Adjust error. * g++.dg/lookup/using59.C: Likewise, gcc/cp/ * cp-tree.h (SET_IDENTIFIER_GLOBAL_VALUE): Update. * name-lookup.h (set_namespace_value): Rename to .... (set_global_value): ... here. * name-lookup.c (update_namespace_binding): Delete. (set_namespace_value): Rename to .... (set_global_value): ... here. Update binding directly. 2017-04-20 Nathan Sidwell gcc/cp/ * cp-tree.h (ovl_lookup_keep, ovl_lookup_mark, ovl_lookup_add, ovl_lookup_maybe_add): Rename to ... (lookup_keep, lookup_mark, lookup_add, lookup_maybe_add): ... these. Keep overloads correctly ordered gcc/cp/ * cp-tree.h (ovl_iterator::unhide): Reimplement. (ovl_iterator::replace, ovl_iterator::ovl_unhide): Delete. (ovl_iterator::remove_node, ovl_iterator::unhide_node): Declare. (ovl_insert, ovl_lookup_maybe_add): Declare. * name-lookup.c (adl_lookup::add_functions): Adjust. (do_lookup_arg_dependent): Adjust. (do_nonmember_using_decl): Adjust. * pt.c (make_constrained_auto, do_class_deduction): Adjust. * tree.c (ov_move_unhidden, ovl_add): Delete. (ovl_copy, ovl_insert): New. (ovl_iterator::unhide_node, ovl_iterator::remove_node): New. (ovl_lookup_mark, ovl_lookup_add): Adjust. (ovl_lookup_maybe_add): New. (ovl_lookup_keep, ovl_skip_hidden): Adjust. (ovl_iterator::ovl_unhide, ovl_iterator::replace): Delete. * class.c (add_method): Adjust. 2017-04-14 Nathan Sidwell Kill per-namespace static_decls. gcc/cp/ * cp-tree.h (static_decls): Declare. (wrapup_globals_for_namespace, diagnose_inline_vars_for_namespace): Replace with ... (wrapup_namespace_globals): ... this. * decl.c (static_decls): Define. (wrapup_globals_for_namespace, diagnose_inline_vars_for_namespace): Replace with ... (wrapup_namespace_globals): ... this. (cxx_init_decl_processing): Initialize static_decls. * decl2.c (c_parse_final_cleanups): Adjust. * name-lookup.h (cp_binding_level): Remove static_decls member. * name-lookup.c (add_decl_to_level): Adjust. (begin_scope): Adjust. Merge namespace and local scope binding update gcc/cp/ * name-lookup.c (add_namespace_decl): Delete. (namespace_push_binding, local_push_binding): Merge into ... (update_binding): ... this. (do_pushdecl): Adjust. 2017-04-13 Nathan Sidwell Cleanups gcc/cp/ * lex.c (unqualified_name_lookup_error): Use pushdecl. * name-lookup.h (push_local_binding): Delete. * name-lookup.c (add_decl_to_level): New, combining add_namespace_decl, add_local_decl. (namespace_push_binding, local_push_binding): Adjust. (do_pushdecl): Adjust. (push_local_binding): Make static. Unify binding push part 7 gcc/cp/ * name-lookup.c (namespace_push_binding): Merge duplicate code from local_push_binding. Chain the decl. (do_pushdecl): Adjust. Cleanup pushdecl interface gcc/cp/ * cp-lang.c (cxx_pushdecl): New. (LANG_HOOKS_PUSHDECL): Override. * name-lookup.h (pushdecl): Remove overload. Add default arg. * name-lookup.c (pushdecl): Likewise. gcc/c/ * c-tree.h (pushdecl): Declare. gcc/c-family/ * c-common.c (c_register_builtin_type): Use pushdecl lang hook. * c-common.h (pushdecl): Don't declare. Some cleanups gcc/cp/ * name-lookup.c (update_local_overload): Drop oldval parm. (replace_local_overload_binding): Delete. Fold into only caller. (fixup_unhidden_decl): Likewise. (augment_local_overload_binding): Likewise. Unifying binding push part 6 gcc/cp/ * name-lookup.c (find_local_binding): New. Broken out of ... (find_local_value): ... this. Use it. (update_local_overload): New. Broken out of ... (replace_local_overload_binding): ... this. Use it. (do_pushdecl): Keep local binding around. (local_push_binding): Consume supplement_binding, add_local_decl. Unifying binding push part 5 gcc/cp/ * name-lookup.c (skip_anticipated_builtins): Kill. (namespace_push_binding): Consume supplement_binding. (do_pushdecl): Skip hidden builtin here. Adjust. gcc/testsuite/ * g++.dg/lookup/using59.C: New. 2017-04-12 Nathan Sidwell Unifying binding push part 4 gcc/cp/ * name-lookup.c (namespace_push_binding, local_push_binding): Don't dup decls here. Deal with using. (do_pushdecl): Adjust. gcc/testsuite/ * g++.dg/lookup/using58.C: New. Unifying binding push part 3 gcc/cp/ * name-lookup.c (create_local_binding) New. (do_local_push_overload): Turn into ... (local_push_binding): ... this. (do_pushdecl): Adjust. Unifying binding push part 2 gcc/cp/ * name-lookup.c (create_namespace_binding) New. (find_namespace_binding): Use it. (do_namespace_push_overload): Convert to ... (namespace_push_binding): ... this. (do_pusdecl): Adjust Unifying binding push part 1 gcc/cp/ * name-lookup.c (do_pusdecl): Skip using decls. Retain namespace. 2017-04-11 Nathan Sidwell Separating namespace bindings part 15 gcc/cp/ * cp-tree.h (PUSH_GLOBAL, PUSH_LOCAL, PUSH_USING): Delete. * lex.c (unqualified_name_lookup_error): Adjust push_local_binding call. * name-lookup.h (push_local_binding): Flags is now bool. * name-lookup.c (matching_using_decl_p): Rename to ... (matching_fn_p): ... here. Update callers. (set_local_extern_decl_linkage): New. Broken out of ... (do_pushdecl): ... here. Call it. (push_local_binding, augment_local_overload_binding, do_local_push_overload, do_local_using_decl): Flags is now bool. gcc/testsuite/ * g++.dg/lookup/extern-redecl1.C: New. * g++.dg/parse/ctor9.c: tweak. Separating namespace bindings part 14 gcc/cp/ * friend.c (do_friend): Use pushdecl directly. * name-lookup.h (lookup_name_innermost_nonclass_level): Delete. * name-lookup.c (find_local_value): New. Broken out of ... (lookup_name_innermost_nonclass_level_1): ... here. Call it. Rename to ... (lookup_name_innermost_nonclass_level): ... this. Delete external entry point. (do_pushdecl): Start handling binding levels directly. Check local class friend injection rule. More cleanup. gcc/testsuite/ * g++.dg/lookup/friend12.C: Augment & adjust. * g++.old-deja/g++.jason/scoping12.C: Adjust. Separating namespace bindings part 13 gcc/cp/ * name-lookup.c (do_pushdecl): Some cleanups. Separating namespace bindings part 12 gcc/cp/ * name-lookup.c (do_pushdecl): Move overload pushing next to non-overload pushing. 2017-04-10 Nathan Sidwell Separating namespace bindings part 11 gcc/cp/ * name-lookup.c (check_local_shadow): Move lookup code to here ... (do_pushdecl): ... from here. Separating namespace bindings part 10 gcc/cp/ * name-lookup.c (do_pushdecl): Reorder & delete more obsolete code. Separating namespace bindings part 9 gcc/cp/ * name-lookup.c (do_pushdecl): Delete a tonne of obsolete code. 2017-04-07 Nathan Sidwell Fix bogus scope handling gcc/cp/ * call.c (make_temporary_var_for_ref_to_temp): Push temp into current scope. * decl.c (xref_tag_1): Pass ts_lambda to pushtag. * name-lookup (do_pushtag): Deal with ts_lambda scope. gcc/testsuite * g++.dg/cpp0x/forw_enum9.C: Fix testcase. 2017-04-06 Nathan Sidwell Separating namespace bindings part 8 gcc/cp/ * name-lookup.c (do_pushdecl): Kill obsolete C-era code! Separating namespace bindings part 7 gcc/cp/ * name-lookup.c (check_local_shadow, set_decl_context_in_fn): Break out and simplify from ... (do_pushdecl): ... here. Call them. Separating namespace bindings part 6 gcc/c-family/ * c-common.h (pushdecl_top_level): Delete. gcc/cp/ * name-lookup.h (pushdecl_top_level): Delete non-friendly version. * name-lookup.c (check_extern_c_conflict): New. (lookup_extern_c_fun_in_all_ns): Delete. (do_pushdecl): Call it. Rename variables sanely. (pushdecl_top_level): Delete non-friendly version. 2017-04-05 Nathan Sidwell Separating namespace bindings part 5 gcc/cp/ * name-lookup.h (getdecls): Rename to ... (get_local_decls): ... here. * name-lookup.c (pop_bindings_and_leave_scope): Adjust. (do_pushdecl): Add some asserts. (getdecls): Rename to ... (get_local_decls): ... here. Assert local scope. * decl.c (poplevel): Adjust. (start_preparsed_function): Don't set current_function_decl, until decl is pushed. (store_parm_decls): Adjust. * parser.c (synthesize_implicit_template_parm): Adjust. Separating namespace bindings part 4 gcc/cp/ * cp-lang.c (LANG_HOOKS_GETDECLS): Override. (get_global_decls): New. * decl.c (poplevel): Assert not in namespace. Simplify. * name-lookup.c (pop_binding): Rename to ... (pop_local_binding): ... here. (pop_bindings_and_leave_scope): Adjust. (getdecls): Assert not in namespace. * name-lookup.h (pop_binding): Rename to ... (pop_local_binding): ... here. Separating namespace bindings part 3 gcc/cp/ * name-lookup.c (do_local_push_overload): New, split out of ... (push_overloaded_decl_1): ... this. Delete. (push_overloaded_decl): Delete. (do_pushdecl): Adjust. Separating namespace bindings part 2 gcc/cp/ * name-lookup.c (compparms_for_decl_and_using_decl): Replace with ... (matching_using_decl_p): ... this. (do_namespace_push_overload): New, split out of ... (push_overloaded_decl_1): ... this. (do_pushdecl): Adjust. (do_nonmember_using_decl): Adjust. 2017-04-04 Nathan Sidwell gcc/cp/ * name-lookup.h (get_global_value_if_present, is_typename_at_global_scope): Delete. * class.c (build_vtbl_initializer): Adjust. * decl.c (grokdeclarator) * except.c (do_get_exception_ptr, do_begin_catch, do_end_catch, do_allocate_exception, do_free_exception, build_throw): Adjust. * init.c (throw_bad_array_new_length): Adjust. * rtti.c (throw_bad_cast, throw_bad_typeid): Adjust. gcc/cp/ * cp-tree.h (CPTI_INIT_LIST_IDENTIFIER, init_list_identifier): New. * decl.c (initialize_predefined_identifiers): Initialize initializer_list identifier. * call.c (is_std_init_list): Adjust. * name-lookup.c (do_pushtag): Likewise. * pt.c (listify): Likewise. Separating namespace bindings part 1 gcc/cp/ * name-lookup.h (namespace_binding, set_namespace_binding): Replace with ... (get_namespace_value, set_namespace_value): ... these. (get_global_value_if_present, is_typename_at_global_scope): Adjust. * cp-tree.h (IDENTIFIER_GLOBAL_VALUE, SET_IDENTIFIER_GLOBAL_VALUE): Adjust. (IDENTIFIER_NAMESPACE_VALUE, SET_IDENTIFIER_NAMESPACE_VALUE): Delete. * pt.c (listify): Use get_namespace_value. * decl.c (poplevel): Use get_namespace_value. * name-lookup.c (cp_binding_level_find_binding_for_name): Replace with ... (find_namespace_binding): ... this. (update_namespace_binding, find_namespace_value, add_namespace_decl, add_local_decl): New. (name_lookup::search_namespace_only, adl_lookup::assoc_namespace_only): Adjust. (binding_for_name, add_decl_to_level): Delete. (fixup_unhidden_decl, do_pushdecl, push_local_binding, check_for_out_of_scope_variable, set_identifier_type_value_with_scope, push_overloaded_decl_1): Adjust. (namespace_binding_1, namespace_binding): Replace with ... (get_namespace_value): ... this. (set_namespace_binding_1, set_namespace_binding): Replace with ... (set_namespace_value): ... this. (do_toplevel_using_decl, lookup_type_scope_1, lookup_name_innermost_nonclass_level_1, do_push_nested_namespace, push_namespace): Adjust. 2017-04-03 Nathan Sidwell Merge trunk r246647. gcc/cp/ * pt.c (): Adjust guiding decl code. libcc1/ * libcp1plugin.cc (safe_pushdecl_maybe_friend): Adjust. (plugin_make_namespace_inline): Adjust. (plugin_add_using_namespace): Likewise. Remove usings graph. gcc/cp/ * cp-tree.h (lang_decl_ns): Replace tree list ns_using, ns_users with tree vector usings & inlinees. (DCL_NAMES_SPACE_USING, DECL_NAMESPACE_INLINEES): Update. (TREE_INDIRECT_USING): Delete. * decl.c (cxx_init_decl_processing): Tweak. * name-lookup.h (cp_binding_level): using_directives is a vec. * name-lookup.c (name_lookup::do_queue_usings, queue_usings, search_namespace, search_usings, queue_namespace, search_unqualified, assoc_namespace_only): inlinees and usings are vectors. Remove old TREE_LIST code. (namespace_ancestor_1, namespace_ancestor, add_using_namespace_1, add_using_namespace): Delete. (qualified_namespace_lookup): Tweak. (add_using_directive): New. (do_toplevel_using_directive, do_local_using_directive): Adjust. (push_namespace): Adjust. * tree.c (decl_anon_ns_mem_p): Reimplement. (cp_free_lang_data): Update. 2017-03-31 Nathan Sidwell Reimplement unqualified namespace lookup gcc/cp/ * name-lookup.c (name_lookup::state, name_lookup::preserve_state, name_lookup::restore_state): New. (name_lookup::queue_namespace, name_lookup::do_queue_usings, name_lookup::queue_usings, name_lookup::search_unqualified): New. (unqualified_namespace_lookup_1): Kill. (unqualified_namespace_lookup): Adjust. (lookup_using_namespace): Kill. gcc/testsuite/ * g++.dg/lookup/lambda1.C: New. gcc/cp/ * name-lookup.c (name_lookup::scopes): Make static. Adjust uses. (name_lookup::search_namespace_only): Broken out of ... (name_lookup::search_namespace): ... here. Call it. * tree.c (ovl_cache): New. (ovl_make, ovl_lookup_keep): Use it. 2017-03-30 Nathan Sidwell gcc/cp/ * dump.c (cp_dump_tree): Allow nested overloads. Add SCOPE_DEPTH gcc/cp/ * cp-tree.h (SCOPE_DEPTH): New. * decl.c (cxx_init_decl_processing): Set current_namespace. * name-lookup.h (is_nested_namespace): Declare. (is_associated_namespace): Delete. * name-lookup.c (is_nested_namespace): New. (is_ancestor): Use is_nested_namespace for namespaces. (set_decl_namespace): Use is_nested_namespace. (namespace_ancestor_1): Likewise. (is_associated_namespace): Delete. (push_namespace): Set SCOPE_DEPTH. * pt.c (check_specialization_namespace): Use is_nested_namespace. (check_unqualified_spec_or_inst): Likewise. Reimplement qualified namespace lookup gcc/cp/ * name-lookup.c (cp_binding_level_find_binding_for_name): Remove premature optimiation. (find_binding): Delete. (name_lookup): Add flags, move scopes from adl_lookup. (name_lookup::search_namespace, search_usings, search_qualified): New. (tree_vec_contains): Kill. (qualified_namespace_lookup): Kill old O(N^2) code. gcc/cp/ * pt.c (determine_specialization): Use 2-d iterator 2017-03-29 Nathan Sidwell gcc/cp/ * cp-tree.h (LOOKUP_MARKED_P, RECORD_MARKED_P): Rename to ... (LOOKUP_SEEN_P, LOOKUP_FOUND_P): ... here. Update everywhere. gcc/cp/ * name-lookup.c (arg_assoc::assoc_expr): Refactor. (do_lookup_arg_dependent): Renamed from lookup_arg_dependent_1. (lookup_arg_dependent): Adjust. (qualified_namespace_lookup): Renamed from qualified_lookup_using_namespace. Kill DECL_NAMESPACE_ASSOCATIONS gcc/cp/ * cp-tree.h (DECL_NAMESPACE_INLINE_P): Renamed. (DECL_NAMESPACE_ASSCIATIONS): Delete. (DECL_NAMESPACE_INLINEES): New. * name-lookup.c (adl_lookup::assoc_namespace_only): New. (adl_lookup::assoc_namespace): Find parent, walk from there. (is_associated_namespace): Walk inline namespace tree. (push_namepace): Add to INLINEES not ASSOCIATIONS. gcc/cp/ * lambda.c (maybe_add_lambda_conv_op): Use namespace_bindings_p. * method.c (implicitly_declare_fn): Likewise. * search.c (node_debug_info_needed): Likewise. gcc/cp/ * name-lookup.h (finish_namespace_using_directive): Rename from ... (finish_toplevel_using_directive): ... here. * name-lookup.c: Likewise. * parser.c (cp_parser_using_directive): Adjust. 2017-03-28 Nathan Sidwell Cleanup pushdecl_top_level gcc/cp/ * cp-tree.h (pushdecl_top_level_maybe_friend, pushdecl_top_level_and_finish): Delete. * decl.c (cp_make_fname_decl): Adjust. * decl2.c (get_guard, handle_tls_init): Likewise. * pt.c (tsubst_friend_class): Likewise. * rtti.c (get_tinfo_decl, tinfo_base_init): Likewise. * name-lookup.h (pushdecl_top_level, pushdecl_top_level_init): Declare. * name-lookup.c (pushdecl_top_level_1): Rename to ... (push_decl_top_level): ... here. (pushdecl_top_level_init): New. (pushdecl_top_level_maybe_friend): Delete. (pushdecl_top_level_and_finish): Delete. Cleanup pushdecl gcc/cp/ * cp-tree.h (pushdecl, pushdecl_maybe_friend): Delete. (pushtag): Delete. * decl.c (cp_make_fname_decl): Call pushdecl_outermost_localscope. * lambda.c (insert_capture_proxy): Likewise. * friend.c (do_friend): Call overloaded pushdecl. * name-lookup.h (pushdecl_with_scope): Delete. (pushdecl, pushtag, pushdecl_outermost_localscope): Declare. * name-lookup.c (pushdecl_maybe_friend_1): Rename to ... (do_pushdecl): ... here. (pushdecl_maybe_friend): Replace with overloaded pushdecl. (pushdecl): Adjust. (pushdecl_with_scope_1): Rename to do_pushdecl_with_scope. Adjust. (pushdecl_with_scope): Delete. (pushdecl_outermost_localscope): New. (pushdecl_namespace_level): Adjust. (do_pushtag): Renamed from pushtag_1. (pushtag): Adjust. Cleanup namespace push/pop part 2 gcc/cp/ * module.c (cpms_in::finish_namespace): Adjust. (push_module_namespace): Adjust. * name-lookup.c (push_namespace, pop_namespace): Reimplement. (make_namespace_inline): Delete. * name-lookup.h (push_namespace): Change prototype. * parser.c (cp_parser_namespace_definition): Adjust. Cleanup namespace push/pop part 1 gcc/cp/ * cp-tree.h (CPTI_GLOBAL, CPTI_GLOBAL_IDENTIFIER, CPTI_GLOBAL_TYPE, CPTI_ANON_IDENTIFIER): New. (global_namespace, global_identifier, global_type_node, anon_identifier): New. * decl.c (global_type_node, global_scope_name): Delete. (initialize_predefined_identifiers): Add new idents. (cxx_init_decl_processing): Adjust. * name-lookup.h (global_namespace, global_scope_name, global_type_node): Delete. * name-lookup (global_namespace, anonymous_namespace_name, get_anonomous_namespace_name): Delete. (do_push_nested_namespace, do_pop_nested_namespace): New. (push_nested_namespace, pop_nested_namespace): Reimplement. Cleanup using-directives gcc/cp/ * cp-tree.h (LOOKUP_MARKED_P): Rename from NAME_MARKED_P, update all. * name-lookup.h (finish_toplevel_using_directive, finish_local_using_directive): Declare. (do_using_directive, parse_using_directive): Delete. * name-lookup.c (do_using_directive): Delete. (do_toplevel_using_directive): Reimplement. (do_local_using_directive, do_local_using_directive_1): New. (parse_using_directive): Delete. (push_using_directive, push_using_directive_1): Delete. (finish_toplevel_using_directive, finish_local_using_directive): New. * pt.c (tsubst_expr): Adjust. * parser.c (cp_parser_using_directive): Adjust. Kill strong using gcc/ * doc/extend.texi (Namespace Association): Document removal. gcc/cp/ * name-lookup (parse_using_directive): Remove strong handling. gcc/testsuite/ * g++.dg/lookup/strong-using-6.C: New. 2017-03-27 Nathan Sidwell Simplify ADL part 2 gcc/cp * cp-tree.h (RECORD_MARKED_P): New. * tree.c (ovl_lookup_keep): Allow NULL. * name-lookup.c (struct adl_lookup): New. (struct arg_lookup): Delete. 2017-03-24 Nathan Sidwell gcc/ * tree.h (TREE_CHECK6): New. (tree_check6): New. gcc/cp/ * cp-tree.h (NAME_MARKED_P): Add UNION_TYPE. * name-lookup.c (arg_lookup): Replace namespace & class vectors with visited. (arg_assoc_namespace, arg_assoc_class): Use NAME_MARKED_P. (lookup_arg_dependent_1): Unmark namespaces and classes. gcc/cp/ * cp-tree.h (ovl2_iterator::operator++): Tweak. Simplify ADL part 1 gcc/cp/ * cp-tree.h (OVL_LOOKUP_P, NAME_MARKED_P): New. (OVL_TRANSIENT_P): Morph into ... (OVL_USED_P): ... this. (ovl_add_transient): Kill. (ovl_maybe_keep): Replace with ... (ovl_lookup_keep): ... this. (ovl_lookup_mark, ovl_lookup_add): Declare. * tree.c (ovl_add): Rename arg. Set OVL_LOOKUP_P. (ovl_add_transient): Kill. (ovl_lookup_mark, ovl_lookup_add): New. (ovl_maybe_keep): Rename to ... (ovl_lookup_keep): ... this. Adjust. * name-lookup.c (name_lookup::add): Use ovl_add directly. (struct arg_lookup): Kill args and fn_set. (add_function): Replace with ... (add_functions): ... this. (arg_assoc_namespace, arg_assoc_class_only): Use it. (lookup_arg_dependent_1): Use new API. * pt.c (tsubst_copy): Assert OVERLOAD is marked used. * semantics.c (finish_call_expr): Adjust. 2017-03-23 Nathan Sidwell Fixup transient_p bug gcc/cp/ * tree.c (ovl_add): Set TRANSIENT_P here. (ovl_add_transient): Not here. gcc/cp/ * cp-tree.h (type_unknown_p): Make inline. Lose TREE_LIST case. * tree.c (type_unknown_p): Delete. * name-lookup.c (arg_assoc): Lose TREE_LIST case. gcc/cp/ * cp-tree.h (OVL_P, OVL_PLURAL_P): New. * name-lookup.c (name_lookup::add, diagnose_name_conflict, pushdecl_maybe_friend_1, push_overloaded_decl_1, do_nonmember_using_decl, push_class_level_binding_1, set_decl_namespace, lookup_arg_dependent_1): Use OVL_P. Two dimensional OVERLOADs gcc/cp/ * cp-tree.h (OVL_FIRST): Call ovl_first. (ovl_iterator): Add allow_inner, adjust. (ovl2_iterator): New. (ovl_first): New. * name-lookup.c (name_lookup::add): Create 2d overload. (do_nonmember_using_decl): 2D overload. (lookup_arg_dependent_1, cp_emit_debug_info_for_using): Likewise. * call.c (add_candidates): Likewise. * class.c (resolve_address_of_overloaded_function): Likewise. * parser.c (cp_parser_template_name): Likewise. * pt.c (type_dependent_expression_p): Likewise. (print_candidates_1): Likewise. * ptree.c (cxx_print_xnode): Allow inner overload. * semantics.c (finish_call_expr): Keep overload, 2D overload. * tree.c (ovl_scope): Allow inner overload. gcc/testsuite/ * g++.dg/lookup/using57.C: New. 2017-03-22 Nathan Sidwell gcc/cp/ * name-lookup.c (lookup_qualified_name): Unwrap singleton overload. (lookup_name_real_1): Remove ovl_hidden assert. (lookup_arg_dependent_1): Don't skip hidden here. * parser.c (cp_parser_lookup_name): Don't unwrap singleton overload here. 2017-03-21 Nathan Sidwell gcc/cp/ * name-lookup.c (lookup_name_real_1): Don's skip hidden here. Simplify singleton overload extraction. * tree.c (ovl_add): Assert no unexpected 2 dimensional overloads. gcc/ * system.h (ATTRIBUTE_NTC_PURE): Define. * tree.h (tree_fits_shwi_p, tree_fits_uhwi_p): Use it. Refactor lookup part 1 gcc/cp/ * name-lookup.c (struct name_lookup): New. (struct scope_binding): Delete. (EMPTY_SCOPE_BINDING): Delete. (build_ambigious): New. (name_lookup::add): New. (do_nonmember_using_decl): Take pointer to cxx_binding. Adjust. (do_local_using_decl, do_toplevel_using_decl): Adjust. (merge_functions, same_entity_p, ambiguous_decl): Delete. (suggest_alternatives_for): Adjust lookup functions. (unqualified_namespace_lookup_1): Use name_lookup. (lookup_qualified_name): Likewise. (lookup_using_namespace, qualified_lookup_using_namespace): Take a name_lookup. gcc/testsuite/ * g++.dg/lookup/using17.C: Adjust error message. Keep hidden overloads at start of OVERLOAD list gcc/cp/ * cp-tree.h (OVL_HIDDEN_P): New. (ovl_iterator::hidden_p, unhide): New. (DECL_HIDDEN_P): New. (hidden_name_p, remove_hidden_names): Delete. (ovl_skip_hidden): Declare. * decl.c (builtin_function_1): Set DECL_ANTICIPATED before pushing. (xref_tag_1): Replace hidden_name_p with DECL_HIDDEN_P. * name-lookup.c (anticipated_builtin_p, skip_anticipated_buitins): New. (supplement_binding_1): Use anticipated_builtin_p. (replace_local_overload_binding): New. Broken out of augment_local_overload_binding. (fixup_unhidden_decl): New. (pushdecl_maybe_friend_1): Deal with unhiding decl. Set DECL_ANTICIPATED before really pushing. (augment_local_overload_binding): Call replace_local_overload_binding. (push_overloaded_decl_1): Deal with unhiding decl. (do_nonmember_using_decl): Use anticipated_builtin_p. (ambiguous_decls): Use ovl_skip_hidden. (lookup_name_real_1): Use DECL_HIDDEN_P, ovl_skip_hidden. (arg_assoc_namespace): Use DECL_HIDDEN_P. (lookup_arg_dependent_1): Use ovl_skip_hidden. * pt.c (instantiate_class_template): Use DECL_HIDDEN_P. * tree.c (ovl_move_unhidden): New. (ovl_add): Deal with hiddenness. (ovl_add_transient): Adjust. (hidden_name_p, remove_hidden_names): Delete. (ovl_skip_hidden): New. (ovl_iterator::ovl_unhide): New. gcc/testsuite/ * g++.dg/lookup/friend19.C: New. * g++.dg/lookup/using56.C: New. 2017-03-16 Nathan Sidwell New OVERLOAD representation part 6 gcc/cp/ * cp-tree.h: Move ovl handling fns to original location. * tree.c (ovl_add): Use ovl_make. (ovl_add_transient): Use ovl_add. New OVERLOAD representation part 5 gcc/cp/ * cp-tree.h (OVL_NEXT): Delete. Update uses. (OVL_CHAIN): Check for overload. New OVERLOAD representation part 4 gcc/cp/ * cp-tree.h (OVL_CURRRENT): Delete. (ovl_make): Declare. * tree.c (ovl_make): New. * constraint.cc (finish_shorthand_constraint): Use ovl_make. * typeck.c (build_x_unary_op): Likewise. New OVERLOAD representation part 3 gcc/cp/ * cp-tree.h: Remove OVLNEW pieces. * tree.c: Likewise. New OVERLOAD representation part 2 gcc/cp/ * cp-tree.h (OVL_VIA_USING_P, OVL_TRANSIENT_P, OVL_SINGLE_P): New names. * error.c, name-lookup.c, parser.c, search.c, tree.c: Adjust uses. 2017-03-15 Nathan Sidwell New OVERLOAD representation part 1 gcc/cp/ * cp-tree.h (OVL_LENGTH, OVL_USINGS, OVL_FIRST, OVL_NAME, OVL_SINGLE, OVL_ELT, OVL_HAS_USING, OVL_HAS_HIDDEN): New. (ovl_iterator): Implement new-style iterator. * tree.c (tree_ovl_elt_check_failed): New. (ovl_maybe_keep): Fixup bracing. (ovl_scope): Add new smarts. Vectorize OVERLOAD part 9 gcc/cp/ * cp-tree.h (build_new_function_call): Lose koenig_p arg. (OVL_HAS_USING): New. * call.c (build_new_function_call): Lose koenig_p arg. * name-lookup.c (augment_local_overload_binding): New. Broken out of ... (push_overloaded_decl_1): ... here. Call it. (do_nonmember_using_decl): Lose augment arg. (do_local_using_decl): Use augment_local_overload_binding. (do_toplevel_using_decl): Adjust do_nonmember_using_decl call. * search.c (lookup_field_r): Use OVL_HAS_USING. * pt.c (do_class_deduction): Adjust build_new_function_call call. * semantics.c (finish_call_expr): Likewise. Vectorize OVERLOAD part 8 gcc/cp/ * cp-tree.h (ovl_add_transient): Declare. * tree.c (ovl_add_transient): New. (remove_hidden_names): Build transient. * name-lookup.c (do_nonmember_using_decl): Add AUGMENT parm, adjust. (do_local_using_decl): Ask for newvals from do_nonmember_using_decl, iterate over that list. (do_toplevel_using_decl): Ask for augmented vals. (add_function): Return void. Remove extraneous checks. Update callers. * semantics.c (finish_call_expr): Always call ovl_maybe_keep. Vectorize OVERLOAD part 7 gcc/cp/ * name-lookup.c (hidden_name_p, remove_hidden_names): Move declarations to ... * cp-tree.h (hidden_name_p, remove_hidden_names): ... here. * call.c (build_new_function_call): Remove hidden pruning. * name-lookup.c (hidden_name_p, remove_hidden_names): Move to tree.c. (lookup_name_real_1): Adjust hidden_name_p call. (lookup_arg_dependent_1): Adjust remove_hidden_names call. * tree.c (hidden_name_p, remove_hidden_names): Moved from name-lookup.h. Adjust. Vectorize OVERLOAD part 6 gcc/cp/ * cp-tree.h (OVL_TRANSIENT): Rename from OVL_ARG_DEPENDENT. * tree.c (ovl_maybe_keep): Adjust. * name-lookup.c (set_namespace_binding_1): Use OVL_SINGLE. (lookup_name_real_1): Use OVL_FIRST. (add_function): Set OVL_TRANSIENT. (lookup_arg_dependent_1): Use OVL_FIRST. (cp_emit_debug_info_for_using): Use iterator. Add OVERLOAD iterator part 8 gcc/cp/ * name-lookup.c (do_nonmember_using_decl): Use iterators Add OVERLOAD iterator part 7 gcc/cp/ * name-lookup.c (pushdecl_maybe_friend_1): Use OVL_FIRST. (push_overloaded_decl_1): Use iterators. (consider_binding_level): Use OVL_FIRST. 2017-03-14 Nathan Sidwell Add OVERLOAD iterator part 6 gcc/cp/ * decl2.c (check_class_fn): Use iterators. * semantics.c (omp_reduction_lookup): Likewise. (finish_omp_reduction_clause): Don't OVL_FIRST here. Vectorize OVERLOAD part 5 gcc/cp/ * cp-tree.h (ovl_maybe_keep): Declare. * tree.c (ovl_maybe_keep): New. * semantics.c (finish_call_expr): Call it. (finish_omp_clauses): Use new accessrs. * class.c (handle_using_decl): Use new accessors. (resolve_address_of_overloaded_function): Likewise. * pt.c (print_candidates_1, print_candidates): Reimplement. Vectorize OVERLOAD part 5 gcc/cp/ * cp-tree.h (OVL_SINGLE): New. * constraint.cc (resove_constraint_check): Use new iterator. (normalize_template_id_expression): Use OVL_FIRST. * cvt.c (build_expr_type_conversions): Likewise. * error.c (dump_decl): Use OVL_SINGLE. * parser.c (cp_parser_nested_name_specifier_opt): Likewise. * tree.c (is_overloaded_fn): Likewise. Add OVERLOAD iterator part 5 gcc/cp/ * cp-tree.h (ovl_iterator::via_using_p): New. (ovl_iterator::replace): New. (clone_function_decl): Add via_using parm. * tree.c (ovl_iterator::replace): New. * class.c (add_method): Use ovl_iterator. (clone_function_decl): Add via_using parm. Pass it to add_method. (clone_costructors_and_destructors): Pass via_using. * pt.c (tsubst_decl, instantiate_template_1): Update clone_function_decl call. Change add_method signature gcc/cp/ * cp-tree.h (add_method): Change 3rd arg. * class.c (add_method): Change 3rd arg to bool. Update. (handle_using_decl, one_inheriting_sig, one_inherited_ctor, clone_function_decl, finish_struct): Update add_method calls. * lambda.c (maybe_add_lambda_conv_op): Likewise. * method.c (lazily_declare_fn): Likewise. * semantics.c (finish_member_declaration): Likewise. 2017-03-13 Nathan Sidwell Kill get_first_fn part 3 gcc/cp/ * cp-tree.h (get_first_fn): Delete. * pt.c (iterative_hash_template_arg, tsubst_copy_and_build): Use get_ovl. (tsubst_baselink): Use OVL_NAME. * typeck.c (invalid_nonstatic_memfn_p, build_x_unary_op, cp_build_addr_expr_1): Use get_ovl. (finish_class_member_access_expr): Use OVL_NAME. * tree.c (dependent_name): Recode. (get_first_fn): Delete. Kill get_first_fn part 2 gcc/cp/ * cp-tree.h (get_ovl): Add want_first parm, make pure. * constexpr.c (potential_constant_expression_1): Adjust get_ovl. * lambda.c (lambda_function): Likewise. * error.c (dump_decl): Use identifier_p. * mangle.c (write_expression): Use OVL_NAME. * name-lookup.c (pushdecl_class_level): Likewise. * parser.c (cp_parser_postfix_expression, cp_parser_expression_statement, cp_parser_direct_declarator, cp_parser_constructor_declarator_p): Use get_ovl. * search.c (lookup_member0: Likewise. * typeck2.c (cxx_incomplete_type_diagnostic): Likewise. * semantics.c (perform_koenig_lookup): Use OVL_NAME. (finish_call_expr, finish_id_expression): Use get_ovl. * tree.c (get_ovl): Add want_first arg, adjust. Kill get_first_fn part 1 gcc/cp/ * call.c (add_list_candidates, build_new_method_call_1): Use OVL_FIRST directly. * constraint.cc (function_concept_check_p): Likewise. * name-lookup.c (validate_nonmember_using_decl): Likewise. * constexpr.c (potential_constant_expression_1): Use ovl_fns & OVL_FIRST. * lambda.c (lambda_function): Likewise. * decl.c (grokdeclarator): Use OVL_NAME. * error.c (dump_decl): Likewise. * friend.c (do_friend): Likewise. * mangle.c (write_expression): Likewise. Kill get_fns gcc/cp/ * cp-tree.h (get_ovl): New. (get_fns): Delete. * parser.c (cp_parser_nested_name_specifier_opt): Update. * search.c (shared_member_p): Update. * semantics.c (omp_reduction_lookup): Update. Kill ovl_cons gcc/cp/ * cp-tree.h (ovl_cons): Delete. * tree.c (ovl_cons): Delete. * class.c (add_method): Use ovl_add. * name-lookup.c (push_overloaded_decl_1): Likewise. * pt.c (check_explicit_specialization, do_class_deduction): Likewise. * typeck.c (build_x_unary_op): Likewise. Kill build_overload gcc/cp/ * cp-tree.h (ovl_add): Declare. (build_overload): Delete. * tree.c (ovl_add): New. (build_overload): Delete. * class.c (add_method): Use ovl_add. * constraint.cc (finish_shorthand_constraint): Likewise. * name-lookup.c (do_nonmember_using_decl, merge_functions, remove_hidden_names, add_function): Likewise. * pt.c (make_constrained_auto): Likewise. Rename OVL_USED gcc/cp/ * cp-tree.h (OVL_USED): Rename to ... (OVL_VIA_USING): ... here. * class.c (add_method): Update. * tree.c (ovl_scope): Update. * search.c (lookup_field_r): Update. * name-lookup.c (push_overloaded_decl_1, do_nonmember_using_decl): Update. Add OVERLOAD iterator part 4 gcc/cp/ * tree.c (cp_tree_equal): Use ovl_iterator. Vectorize OVERLOAD part 4 gcc/cp/ * cp-tree.h (ovl_iterator::ref): New. * semantics.c (finish_omp_reduction_clause): Use OVL_FIRST. * tree.c (is_overloaded_fn, get_fns): Likewise. 2017-03-10 Nathan Sidwell Vectorize OVERLOAD part 3 gcc/cp/ * search.c (lookup_field_fuzzy_info::fuzzy_lookup_fn, lookup_conversion_operator, lookup_fnfields_idx_nolazy, lookup_conversions_r): Use new accessors. Vectorize OVERLOAD part 2 gcc/cp/ * decl2.c (mark_used): Use new accessors. * dump.c (cp_dump_tree): Likewise. * error.c (dump_decl, dump_expr, location_of): Likewise. * init.c (build_offset_ref): Likewise. * parser.c (cp_parser_nested_name_specifier_opt, cp_parser_lookup_name): Likewise. * pt.c (check_explicit_specialization, check_template_shadow, tsubst_baselink): Likewise. * ptree.c (cxx_print_xnode): Likewise. Vectorize OVERLOAD part 1 gcc/cp/ * cp-tree.h (OVL_FIRST, OVL_NAME): New accessors. * call.c (build_user_type_conversion_1, print_error_for_call_failure, add_candidates): Use them. * class.c (method_name_cmp, resort_method_name_cmp, resort_type_method_vec, finish_struct_methods, warn_hidden, resolve_address_of_overloaded_function, note_name_declared_in_class): Likwise. * cxx-pretty-print.c (pp_cxx_unqualified_id, pp_cxx_qualified_id, cxx_pretty_printer::id_expression, cxx_pretty_printer::expression): Likewise. * decl.c (poplevel): Likewise. * mangle.c (write_member_name): Likewise. * method.c (strip_inheriting_ctors): Likewise. * typeck.c (cp_build_addr_expr_1): Likewise. Makefile-supplied timestamp. gcc/cp * Make-lang.in: Provide MODULE_STAMP. * module.c (cpm_stream::version): Use MODULE_STAMP, not __DATE__ & __TIME__. Add OVERLOAD iterator part 3 gcc/cp/ * name-lookup.c (pushdecl_maybe_friend_1, lookup_extern_c_fun_in_all_ns, c_linkage_bindings, set_decl_namespace, pushdecl_top_level_and_finish (tree x, merge_functions, remove_hidden_names, arg_assoc_namespace, arg_assoc, lookup_arg_dependent_1, cp_emit_debug_info_for_using): Use new iterator. * pt.c (retrieve_specialization, iterative_hash_template_arg, determine_specialization, check_explicit_specialization, resolve_overloaded_unification, resolve_nondeduced_context, type_dependent_expression_p, dependent_template_p, do_class_deduction): Likewise. Add OVERLOAD iterator part 2 gcc/cp/ * class.c (handle_using_decl, maybe_warn_about_overly_private_class, modify_all_vtables, get_basefndecls, warn_hidden, add_implicitly_declared_members, adjust_clone_args, deduce_noexcept_on_destructors, default_ctor_p, in_class_defaulted_default_constructor, user_provided_p, type_has_user_provided_constructor, type_has_user_provided_or_explicit_constructor, type_has_virtual_destructor, type_has_move_constructor, type_has_move_assign, type_has_user_declared_move_constructor, type_build_ctor_call, type_build_dtor_call, type_requires_array_cookie, explain_non_literal_class, finish_struct, resolve_address_of_overloaded_function): Use new iterator. * decl2.c (maybe_warn_sized_delete): Likewise. * parser.c (cp_parser_template_name): Tweak loop exit test. * semantics.c (finish_call_expr): Likewise. * typeck.c (check_template_keyword): Likewise. Add OVERLOAD iterator, part 1 Add MAYBE_BASELINK_FUNCTIONS gcc/cp/ * cp-tree.h (struct ovl_iterator): New. (MAYBE_BASELINK_FUNCTIONS): New. * call.c (build_op_call_1, add_candidates, build_op_delete_call): Use new iterator. * lambda.c (maybe_generic_this_capture): Likewise. * method.c (inherited_ctor_binfo, binfo_inherited_from): Likewise. * parser.c (lookup_literal_operator, cp_parser_template_name): Likewise. * search.c (shared_member_p, look_for_overrides_here, lookup_conversions_r): Likewise. * semantics.c (finish_call_expr, classtype_has_nothrow_assign_or_copy_p): Likewise. * typeck.c (check_template_keyword): Likewise. * tree.c (is_overloaded_fn, get_fns): Use MAYBE_BASELINK_FUNCTIONS. gcc/cp/ * gcc/cp/cp-tree.h (NAMESPACE_CHECK): Delete. (MODULE_NAMESPACE_P, GLOBAL_MODULE_NAMESPACE, NAMESPACE_INLINE_P): Adjust. gcc/testsuite/ * g++.dg/modules/modules.exp: Protect DEFAULT_CXXFLAGS. 2017-03-06 Nathan Sidwell Add crc checkpointing. gcc/cp/ * module.c (cpm_serial::crc): New. (cpm_serial::bit_flush): Compute crc. (cpm_serial::crc_unsigned_n, crc_buffer, crc_unsigned): New. (cpm_reader::checkpoint, cpm_writer::checkpoint): New. (cpm_reader, cpm_writer): Add checkpointing to io. (cpms_in, cpms_out): Likewise. 2017-03-05 Nathan Sidwell Optimize crc. Push to trunk gcc/ * tree.h (crc32_unsigned_n): Declare. (crc32_unsigned, crc32_unsigned): Make inline. * tree.c (crc32_unsigned_bits): Replace with ... (crc32_unsigned_n): ... this. (crc32_unsigned, crc32_byte): Remove. (crc32_string): Remove unnecessary braces. 2017-03-04 Nathan Sidwell Redo bool read/write gcc/cp/ * module.c (cpm_serial::bit_flush): New. (cpm_writer::bytes4, cpm_writer::bflush: New. (cpm_reader::bytes4, cpm_reader::bflush, cpm_reader::bfill): New. (cpm_reader::fill): Rename from reserve. Update callers. (cpm_writer::b, cpm_reader::b): Reimplement. (cpm_writer::flush_bits, cpm_reader::flush_bits): Delete. (cpms_out::write_tree_ary, cpms_in::read_tree_ary): Call bflush. (cpms_out::write_tree, cpms_in::read_tree): Likewise. Cleanup test pruning. Push to trunk. gcc/testsuite/g++.dg * g++-dg.exp (find-cxx-tests): New. (main): Call it to discover direct tests rather than explicit pruning. 2017-03-03 Nathan Sidwell Cleanup retrofit_lang_decl. Push to trunk. gcc/cp/ * cp-tree.h (add_lang_decl_raw, add_lang_type_raw): Rename. * lex.c (maybe_add_lang_decl_raw, maybe_add_lang_type_raw): Return bool. Don't assert. (retrofit_lang_decl, cxx_make_type): Adjust. * module.c (cpms_in::read_tree): Verify lang_decl/type insertion valid. * class.c (alter_access): Directly call retrofit_lang_decl. * decl.c (push_local_name, duplicate_decls): Likewise. * pt.c (push_template_decl_real, txubs_omp_clauses): Likewise. * semantics.c (omp_privatize_field): Likewise. Renaming stuff. gcc/cp/ * module.c: Remove anon namespace, rename seriator, reader, writer, streamer, in & out. 2017-03-01 Nathan Sidwell Black triangle achieved gcc/cp/ * cp-tree.h (GLOBAL_MODULE_NAMESPACE_P): New. (add_lang_decl_raw, add_lang_type_raw): Declare. * lex.c (add_lang_decl_raw): New. Broken out of ... (retrofit_lang_decl): ... here. Call it. (add_lang_type_raw): New. Broken out of ... (cxx_make_type): ... here. Call it. * module.c (out::write_decl_lang_bools, in::read_decl_lang_bools): New. (in::~in, in::set_scope): Correct. (out::write_tree, in::read_tree): Start lang_type/decl handling. (in::finish_type): Fix canonical type handling. (in::finish_function): Insert into symbol table. (in::finish_function): Preserve scope. gcc/testsuite/ * g++.dg/modules/modules.exp: Add link & execute capability. * g++.dg/modules/mod-decl-2_b.C: Remove XFAILs. * g++.dg/modules/mod-decl-2_c.C: Remove XFAILs. * g++.dg/modules/mod-impl-1_a.C: New. * g++.dg/modules/mod-impl-1_b.C: New. * g++.dg/modules/mod-impl-1_c.C: New. * g++.dg/modules/mod-impl-1_d.C: New. 2017-02-17 Nathan Sidwell gcc/cp/ * module.c (in::finish_type): New. (in::finish): Call it. (out::write_core_vals, in::read_core_vals): Ensure canonical_type and type_main_variant are dumped early. gcc/testsuite/ * g++/modules/mod-exp-1_b.C: Extend. Canonicalize canonical type hashing gcc/ * tree.h (type_hash_default): Declare. * tree.c (type_hash_list, attribute_hash_list): Move into type_hash_default. (build_type_attribute_qual_variant): Break out hash code calc into type_hash_default. (type_hash_default): New. Generic type hash computation. (build_range_type_1, build_array_type_1, build_function_type, build_method_type_directly, build_offset_type, build_complex_type, make_vector_type): Call it. gcc/c-family/ * c-common.c (complete_array_type): Use type_hash_default. 2017-02-16 Nathan Sidwell Namespace decls! gcc/cp/ * module.c (out::write_tree_ary, in::read_tree_ary): New. (out::tag_trees, in::tag_trees): Repurpose. (in::finish_namespace, in::finish_function): New. (out::write_tree, in::read_tree): Adjust. (in::finish): Adjust. Some actual tree writing & reading gcc/cp/ * module.c (out::write_core_bools, out::write_core_vals): New. (in::read_core_bools, in::read_core_vals): New. (in::set_scope): New. (out::write_tree, in::read_tree): Call core readers/writers. Node length & allocation. Global trees. gcc/cp/ * module.c (streamer::tags): Rename to ... (streamer::record_tag): ... here. Fixup. (out::tag_trees, out::start, out::write_loc): New. (in::tag_trees, in::start, in::finish, in::read_loc): New. (out::write_tree, in::read_tree): Adjust. (write_module): Write global trees. 2017-02-15 Nathan Sidwell Start of tree reading & writing. Module namespace fix. gcc/cp/ * cp-tree.h (pop_module_namespace, push_module_namespace): Add flag. * parser.c (check_module_outermost, cp_parser_module_export, cp_parser_module_proclamation, cp_parser_namespace_definition): Adjust. * module.c (pop_module_namespace, push_module_namespace): Add flag. (reader::read_tree, writer::write_tree): Initial stubs. (read_module, write_module, do_import_module, declare_module): Adjust. gcc/testsuite/ * g++.dg/modules/mod-exp-1_a.C: New. * g++.dg/modules/mod-exp-1_b.C: New. * g++.dg/modules/mod-sym-1.C: Add cases. 2017-02-14 Nathan Sidwell gcc/cp/ * Make-lang.in (CFLAGS-cp/module.o): New var. * module.c (reader): Add peek_u. (reader::str): Force ending NUL. (writer::flush_bits): Avoid infinite recursion. (streamer): Extend tags, add next. (out, in): Add some readers/writers. (read_module, do_import_module, write_module): Augment. gcc/testsuite/ * g++.dg/modules/mod-imp-1_a.C * g++.dg/modules/mod-imp-1_b.C * g++.dg/modules/mod-imp-1_c.C * g++.dg/modules/mod-imp-1_d.C 2017-02-10 Nathan Sidwell Start actually writing & reading module files. (headers only) gcc/cp/ * module.c (seriator, reader, writer, streamer, in, out): New classes. (read_module, do_import_module, write_module, finish_module): Adjust. gcc/ * gengtype-lex.l (): Add '/'. 2017-02-09 Nathan Sidwell Dump file gcc/ * dumpfile.h (tree_dump_index): Add TDI_lang. (TDF_LANG): New. * dumpfile.c (dump_files): Add front-end. (dump_option_value_info): Add lang. Adjust all. gcc/cp/ * cp-tree.h (import_module): Lose is_export parm. * module.c: Include dumpfile.h (dopen, dclose): New. (import_add): Absorb into ... (do_import_module): ... here. Broken out of ... (import_module): ... here. Call it. (export_module, declare_module): Adjust. (read_module, write_module): Write dump. gcc/testsuite/ * g++.dg/modules/mod-decl-1.C: Adjust. * g++.dg/modules/mod-decl-2_b.C: Adjust. * g++.dg/modules/mod-decl-5_b.C: Adjust. gcc/cp/ * cp-tree.h (DECL_CHECK): New. (NAMESPACE_MODULE_P): Rename to ... (MODULE_NAMESPACE_P): ... here. (CURRENT_MODULE_NAMESPACE_P): New. (MODULE_EXPORT_P): New. (import_module): Add is_export param. * module.c (mstream, mfname): Delete. (imported_modules): Make hash_map. (enum import_kind): New. (push_module_namespace, pop_module_namespace): Adjust. (import_add, import_module, export_module): Adjust. (read_module, write_module): New. (declare_module, finish_module): Adjust. * name-lookup.c (is_ancestor): Adjust. gcc/testsuite/ * g++.dg/modules/mod-decl-5_b.C: Adjust * g++.dg/modules/modules.exp: Remote host, tweak module deletion. 2017-02-08 Nathan Sidwell gcc/cp/ * name-lookup.c (is_ancestor): Pop from module namespace root. gcc/testsuite/ * g++.dg/modules/mod-sym-3.C: New. Module namespaces gcc/cp/ * cp-tree.h (NAMESPACE_MODULE_P): New. (push_module_namespace, pop_module_namespace): Declare. * module.c (MOD_SYM_PFX, MOD_SYM_DOT): New. (module_namespace_name): New. (push_module_namespace, pop_module_namespace): New. (module_to_ext): New. Broken out of ... (module_to_filename): ... here. Call it. (declare_module): Push to module namespace. * parser.c (check_module_outermost): Deal with module namespace. (cp_parser_module_export, cp_parser_module_proclaimation, cp_parser_namespace_definition): Likewise. gcc/testsuite/ * g++.dg/modules/mod-decl-1.C: Adjust. * g++.dg/modules/mod-sym-1.C: New. * g++.dg/modules/mod-sym-2.C: New. Cleanup inline namespace creation. gcc/cp/ * name-lookup.h (make_namespace_inline): Declare. * name-lookup.c (do_toplevel_using_directive): New. (do_using_directive): Call it. (make_namespace_inline): New. * parser.c (cp_parser_namespace_definition): Call it. 2017-02-07 Nathan Sidwell PR c++/79369 inline namespaces gcc/cp/ * cp-tree.h (NAMESPACE_CHECK): New. (NAMESPACE_INLINE_P): New. * name-lookup.h (push_namespace): Return int. * name-lookup.c (push_namespace): Return int. Adjust. * parser.c (cp_parser_namespace_definition): Reorder nested parsing. Check inline redefinition. gcc/testsuite/ * g++.dg/cpp0x/pr65558.C: Adjust error loc. * g++.dg/cpp0x/pr79369.C: New. * g++.dg/cpp1z/nested-namespace-def1.C: Adjust. 2017-02-03 Nathan Sidwell Module files open/closed. Testsuite extension gcc/cp/ * module.c (mstream, mfname): New. (module_to_filename): New. (import_module, declare_module, finish_module): Open/close module file. gcc/testsuite/ * g++.dg/modules/modules.exp (mod_spec_to_file, dg-module-if, check_module_specs, cleanup_module_files): New. * g++.dg/modules/mod-decl-0.C: Adjust * g++.dg/modules/mod-decl-1.C: Adjust * g++.dg/modules/mod-decl-2_a.C: Adjust * g++.dg/modules/mod-decl-3.C: New. * g++.dg/modules/mod-decl-3_a.C: Delete. * g++.dg/modules/mod-decl-3_b.C: Delete. * g++.dg/modules/mod-decl-4.C: Adjust * g++.dg/modules/mod-decl-5_a.C: Adjust * g++.dg/modules/mod-decl-5_b.C: Adjust * g++.dg/modules/proclaim-1.C: Adjust Module names are identifiers. gcc/cp/ * config-lang.in (gtfiles): Add modules.c. * c-tree.h (module_name_t): Delete. (finish_module): Declare. * decl2.c (c_pare_final_cleanups): Call finish_module. * module.c: Change module_name_t to tree. (imported_module): Hash of module names. (import_add): New. (import_module, declare_module): Use it. (export_module): Import module. (finish_module): New. * parser.c (cp_parser_module_name): Build up identifier. Adjust callers. gcc/testsuite/ * g++.dg/modules/mod-decl-0.C: Adjust. * g++.dg/modules/mod-decl-1.C: Adjust. * g++.dg/modules/mod-decl-2_b.C: Adjust. * g++.dg/modules/mod-decl-2_c.C: New. * g++.dg/modules/mod-decl-5_a.C: New. * g++.dg/modules/mod-decl-5_b.C: New. 2017-02-02 Nathan Sidwell [[interface]] gcc/cp * cp-tree.h: Adjust module interface fns. * modules.c (is_interface): New. (push_module_export, pop_module_export, module_exporting_level): Adjust. (module_proclaim): Delete. (module_interface_p): New. (declare_module): Use 'interface' attrib. (mport_module, export_module): Take attribs. * parser.c (check_module_outermost, cp_parser_module_declaration, cp_parser_module_export, cp_parser_module_proclamation): Adjust. gcc/testsuite/ * g++.dg/modules/mod-decl-2_a.C: Adjust. * g++.dg/modules/mod-decl-3_a.C: Adjust. * g++.dg/modules/proclaim-1.C: Adjust. * g++.dg/modules/mod-decl-4.C: New. 2017-01-27 Nathan Sidwell Parse proclaimed ownership. gcc/cp/ * cp-tree.h (module_exporting_p, module_proclaim): Declare. * module.c (proclaimer): New. (module_exporting_p, module_proclaim): New. * parser.c (check_module_outermost): New. (cp_parser_module_declaration, cp_parser_module_export): Call it. (cp_parser_module_proclamation): New. (cp_parser_declaration): Add proclaimed-ownership. gcc/testsuite/ * g++.dg/modules/proclaim-1.C: New. Parse import & export. Test infra. gcc/cp/ * cp-tree.h (module_purview_p, push_module_export, pop_module_export, declare_module, import_module, export_module): Declare. * module.c (export_depth): New. (module_purview_p, push_module_export, pop_module_export): New (declare_module_name): Renme to ... (declare_module): ... here. (import_module, export_module): Stubs. * parser.c (cp_parser_module_declaration): Add IS_EXPORT parm. Deal with imports & exports. (cp_parser_module_export): New. (cp_parser_declaration): Allow module import, export. gcc/testsuite/ * g++.dg/dg.exp: Prune module tests. * g++.dg/modules/modules.exp: New. * g++.dg/modules/mod-decl-2_[ab].C: New. * g++.dg/modules/mod-decl-3_[ab].C: New. 2017-01-25 Nathan Sidwell Parse module-declaration. gcc/cp * cp-tree.h (module_name_t): Typedef. (declare_module_name): Declare. * parser.c (cp_parser_diagnose_invalid_type_name): Explain fmodules. (cp_parser_module_name, cp_parser_module_declaration): New. (cp_parser_declaration): Add module-declaration. * module.c (declared_module, module_location): New. (declare_module_name): Define. gcc/testsuite/ * g++.dg/modules/mod-decl-0.C: New. * g++.dg/modules/mod-decl-1.C: New. New flag & keywords, etc gcc/c-family/ * c-common.c (c_common_reswords): Add 'module', 'import'. * c-common.h (enum rid): Add RID_MODULE, RID_IMPORT. (D_CXX_MODULES, D_CXX_MODULES_FLAGS) New. * c-cppbuiltins.c (c_cpp_builtins): Add _cpp_modules define. * c.opt: Add fmodules flag. gcc/cp/ * Make-lang.in (CXX_AND_OBJCXX_OBJS): Add module.o. * module.c: New file. gcc/ * doc/invoke.texi (-fmodules): Document it. 2017-01-24 Nathan Sidwell Free up TREE_LANG_FLAG_3. DECL_CONSTRUCTION_VTABLE_P is useless. gcc/cp/ * cp-tree.h (DECL_CONSTRUCTION_VTABLE_P): Delete. (DECL_NON_TRIVIALLY_INITIALIZED_P): Move to TREE_LANG_FLAG_6. * class.c (build_ctor_vtbl_group): Don't set DECL_CONSTRUCTION_VTABLE_P. * decl2.c (determine_visibility_from_class): Don't check DECL_CONSTRUCTION_VTABLE_P anymore. 2017-01-23 Nathan Sidwell Branch creation from trunk:244828 Use this Changelog for all branch changes, including merges. Local Variables: mode: change-log change-log-default-name: "ChangeLog.modules" End: $Rev$