c++: Module parsing
authorNathan Sidwell <nathan@acm.org>
Wed, 9 Dec 2020 15:18:23 +0000 (07:18 -0800)
committerNathan Sidwell <nathan@acm.org>
Wed, 9 Dec 2020 15:22:35 +0000 (07:22 -0800)
commit0b37233152b55fb256d7537d7e76067edc52cb88
tree06c922f186b65e8ac0eed9733da3651498d23bd4
parentfe70679b80f5e6193a0976be41b68d590c7cb2f3
c++: Module parsing

This adds the module-declaration parsing and other logic.  We have two
new kinds of declaration -- module and import.  Plus the ability to
export other declarations.  The module processing can also divide the
TU into several portions -- GMF, Purview and PMF.

There are restrictions that some declarations must or mustnot appear
in a #include, so I needed to add a bit to indicate whether a token
came from the main source or not.  This seemed the least unpleasant
way of implementing such a check.

gcc/cp/
* parser.h (struct cp_token): Add main_source_p field.
* parser.c (cp_lexer_new_main): Pass thought module token filter.
Check macros.
(cp_lexer_get_preprocessor_token): Set main_source_p.
(enum module_parse): New.
(cp_parser_diagnose_invalid_type_name): Deal with unrecognized
module-directives.
(cp_parser_skip_to_closing_parenthesize_1): Skip module-directivres.
(cp_parser_skip_to_end_of_statement): Likewise.
(cp_parser_skiup_to_end_of_block_or_statement): Likewise.
(cp_parser_translation_unit): Add module parsing calls.
(cp_parser_module_name, cp_parser_module_declaration): New.
(cp_parser_import_declaration, cp_parser_module_export): New.
(cp_parser_declaration): Add module export detection.
(cp_parser_template_declaration): Adjust 'export' error message.
(cp_parser_function_definition_after_declarator): Add
module-specific logic.
* module.cc (import_module, declare_module)
(maybe_check_all_macros): Stubs.
gcc/cp/module.cc
gcc/cp/parser.c
gcc/cp/parser.h