diff options
author | Matt Austern <austern@apple.com> | 2004-09-21 02:22:45 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-09-21 02:22:45 +0000 |
commit | c162c75e43f4813cd30a1d4a693ce20f35a3f9fb (patch) | |
tree | f002886f8df77ba4f971f13ad13d646fe43bff5a /gcc/cp/lex.c | |
parent | 5cfa876635638a93a8d6d209ce700beb373b9c1d (diff) | |
download | gcc-c162c75e43f4813cd30a1d4a693ce20f35a3f9fb.zip gcc-c162c75e43f4813cd30a1d4a693ce20f35a3f9fb.tar.gz gcc-c162c75e43f4813cd30a1d4a693ce20f35a3f9fb.tar.bz2 |
c-common.c (fix_string_type): Build the unqualified array type unconditionally...
2004-09-20 Matt Austern <austern@apple.com>
Zack Weinberg <zack@codesourcery.com>
* c-common.c (fix_string_type): Build the unqualified array
type unconditionally, then use c_build_qualified_type to get
the proper const-qualified variant, and set its
TYPE_MAIN_VARIANT to refer to the unqualified type.
* c-lex.c (c_lex_return_raw_string): New global.
(c_lex_with_flags): Honor it.
* c-pragma.h: Declare it.
cp:
* decl.c (make_rtl_for_nonlocal_decl, start_preparsed_function):
Apply lbasename to input_filename before passing to get_fileinfo.
* semantics.c (begin_class_definition): Likewise.
* lex.c (handle_pragma_interface): Apply get_fileinfo to the
correct filename. Rename variables to be less confusing.
(handle_pragma_implementation): Likewise. Disable "appears
after file is included" diagnostic.
* parser.c (struct cp_token): Add in_system_header fiag.
(CP_TOKEN_BLOCK_NUM_TOKENS, struct cp_token_block)
(CP_TOKEN_BUFFER_SIZE, cp_token_cache_push_token)
(CPP_NONE, cp_lexer_read_token): Delete.
(struct cp_lexer): Remove first_token, string_tokens,
main_lexer_p fields. Clarify comments.
(struct cp_token_cache): Now just a pair of pointers.
(CP_LEXER_BUFFER_SIZE): New #define.
(CPP_PURGED): New fake token type.
(cp_lexer_new_from_token_array, cp_lexer_destroy)
(cp_lexer_peek_token_emit_debug_info, cp_lexer_skip_purged_tokens)
(cp_lexer_handle_pragma, cp_token_cache_new, cp_parser_string_literal):
New functions.
(cp_lexer_new_from_tokens): Now a simple wrapper around
cp_lexer_new_from_token_array.
(cp_lexer_set_source_position_from_token): Also update
in_system_header.
(cp_lexer_next_token, cp_lexer_prev_token, cp_lexer_advance_token):
Don't wrap round.
(cp_lexer_token_difference): Dont handle wrapping round.
(cp_lexer_new_main): Enable pragma deferral and raw strings,
read the entire translation unit through c_lex_with_flags into
this lexer's buffer, then turn raw strings back off again.
(cp_lexer_grow_buffer): Adjust for buffer no longer being circular.
(cp_lexer_get_preprocessor_token): No need to handle not being
the main lexer. Set token->in_system_header too.
(cp_lexer_peek_token): Skip purged tokens. Feed pragma tokens
to cp_lexer_handle_pragma. No need to call cp_lexer_read_token.
(cp_lexer_peek_nth_token): Likewise.
(cp_lexer_purge_token): Mark the token PURGED, don't shift all
the other tokens down.
(cp_lexer_purge_tokens_after): Likewise.
(cp_lexer_save_tokens, cp_lexer_rollback_tokens): Don't worry
about there being no tokens.
(cp_lexer_print_token): Revise to give useful information on
all tokens.
(struct cp_parser): Add field translate_strings_p.
(cp_parser_new): Initialize it.
(cp_parser_translation_unit): Destroy the lexer when done.
(cp_parser_parameter_declaration): Restructure saving of
default arguments.
(cp_parser_save_member_function_body): Likewise.
(cp_parser_check_for_invalid_template_id)
(cp_parser_nested_name_specifier_opt, cp_parser_template_id):
Adjust calls to cp_lexer_advance_token.
(cp_parser_skip_to_closing_parenthesis, cp_parser_declaration):
No need to fiddle c_lex_string_translate.
(cp_parser_primary_expression, cp_parser_linkage_specification)
(cp_parser_asm_definition, cp_parser_asm_specification_opt)
(cp_parser_asm_operand_list, cp_parser_asm_clobber_list)
Use cp_parser_string_literal.
(cp_parser_attribute_list): Save and restore
parser->translate_strings_p, not c_lex_string_translate.
(cp_parser_cache_group): Delete.
(cp_parser_cache_group_1): Rename cp_parser_cache_group. Do
not take a cache argument.
From-SVN: r87786
Diffstat (limited to 'gcc/cp/lex.c')
-rw-r--r-- | gcc/cp/lex.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 8ae7e18..82dc35e 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -463,16 +463,16 @@ handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED ) { tree fname = parse_strconst_pragma ("interface", 1); struct c_fileinfo *finfo; - const char *main_filename; + const char *filename; if (fname == (tree)-1) return; else if (fname == 0) - main_filename = lbasename (input_filename); + filename = lbasename (input_filename); else - main_filename = ggc_strdup (TREE_STRING_POINTER (fname)); + filename = ggc_strdup (TREE_STRING_POINTER (fname)); - finfo = get_fileinfo (input_filename); + finfo = get_fileinfo (filename); if (impl_file_chain == 0) { @@ -482,7 +482,7 @@ handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED ) main_input_filename = input_filename; } - finfo->interface_only = interface_strcmp (main_filename); + finfo->interface_only = interface_strcmp (filename); /* If MULTIPLE_SYMBOL_SPACES is set, we cannot assume that we can see a definition in another file. */ if (!MULTIPLE_SYMBOL_SPACES || !finfo->interface_only) @@ -502,7 +502,7 @@ static void handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED ) { tree fname = parse_strconst_pragma ("implementation", 1); - const char *main_filename; + const char *filename; struct impl_files *ifiles = impl_file_chain; if (fname == (tree)-1) @@ -511,28 +511,36 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED ) if (fname == 0) { if (main_input_filename) - main_filename = main_input_filename; + filename = main_input_filename; else - main_filename = input_filename; - main_filename = lbasename (main_filename); + filename = input_filename; + filename = lbasename (filename); } else { - main_filename = ggc_strdup (TREE_STRING_POINTER (fname)); - if (cpp_included (parse_in, main_filename)) - warning ("#pragma implementation for %s appears after file is included", - main_filename); + filename = ggc_strdup (TREE_STRING_POINTER (fname)); +#if 0 + /* We currently cannot give this diagnostic, as we reach this point + only after cpplib has scanned the entire translation unit, so + cpp_included always returns true. A plausible fix is to compare + the current source-location cookie with the first source-location + cookie (if any) of the filename, but this requires completing the + --enable-mapped-location project first. See PR 17577. */ + if (cpp_included (parse_in, filename)) + warning ("#pragma implementation for %qs appears after " + "file is included", filename); +#endif } for (; ifiles; ifiles = ifiles->next) { - if (! strcmp (ifiles->filename, main_filename)) + if (! strcmp (ifiles->filename, filename)) break; } if (ifiles == 0) { ifiles = xmalloc (sizeof (struct impl_files)); - ifiles->filename = main_filename; + ifiles->filename = filename; ifiles->next = impl_file_chain; impl_file_chain = ifiles; } @@ -770,7 +778,7 @@ cxx_make_type (enum tree_code code) /* Set up some flags that give proper default behavior. */ if (IS_AGGR_TYPE_CODE (code)) { - struct c_fileinfo *finfo = get_fileinfo (input_filename); + struct c_fileinfo *finfo = get_fileinfo (lbasename (input_filename)); SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, finfo->interface_unknown); CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only; } |