aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/lex.c
diff options
context:
space:
mode:
authorMatt Austern <austern@apple.com>2004-09-21 02:22:45 +0000
committerZack Weinberg <zack@gcc.gnu.org>2004-09-21 02:22:45 +0000
commitc162c75e43f4813cd30a1d4a693ce20f35a3f9fb (patch)
treef002886f8df77ba4f971f13ad13d646fe43bff5a /gcc/cp/lex.c
parent5cfa876635638a93a8d6d209ce700beb373b9c1d (diff)
downloadgcc-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.c40
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;
}