Mercurial > hg > CbC > CbC_gcc
diff libcpp/directives.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | 3bfb6c00c1e0 |
children | b7f97abdc517 |
line wrap: on
line diff
--- a/libcpp/directives.c Sun Feb 07 18:28:00 2010 +0900 +++ b/libcpp/directives.c Fri Feb 12 23:39:51 2010 +0900 @@ -92,14 +92,15 @@ /* Forward declarations. */ static void skip_rest_of_line (cpp_reader *); -static void check_eol (cpp_reader *); +static void check_eol (cpp_reader *, bool); static void start_directive (cpp_reader *); static void prepare_directive_trad (cpp_reader *); static void end_directive (cpp_reader *, int); static void directive_diagnostics (cpp_reader *, const directive *, int); static void run_directive (cpp_reader *, int, const char *, size_t); static char *glue_header_name (cpp_reader *); -static const char *parse_include (cpp_reader *, int *, const cpp_token ***); +static const char *parse_include (cpp_reader *, int *, const cpp_token ***, + source_location *); static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *); static unsigned int read_flag (cpp_reader *, unsigned int); static bool strtolinenum (const uchar *, size_t, linenum_type *, bool *); @@ -121,7 +122,7 @@ static const cpp_token *get_token_no_padding (cpp_reader *); static const cpp_token *get__Pragma_string (cpp_reader *); static void destringize_and_run (cpp_reader *, const cpp_string *); -static int parse_answer (cpp_reader *, struct answer **, int); +static int parse_answer (cpp_reader *, struct answer **, int, source_location); static cpp_hashnode *parse_assertion (cpp_reader *, struct answer **, int); static struct answer ** find_answer (cpp_hashnode *, const struct answer *); static void handle_assertion (cpp_reader *, const char *, int); @@ -152,11 +153,11 @@ D(pragma, T_PRAGMA, STDC89, IN_I) /* 195 */ \ D(warning, T_WARNING, EXTENSION, 0) /* 22 */ \ D(include_next, T_INCLUDE_NEXT, EXTENSION, INCL | EXPAND) /* 19 */ \ -D(ident, T_IDENT, EXTENSION, IN_I | DEPRECATED) /* 11 */ \ +D(ident, T_IDENT, EXTENSION, IN_I) /* 11 */ \ D(import, T_IMPORT, EXTENSION, INCL | EXPAND) /* 0 ObjC */ \ D(assert, T_ASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \ D(unassert, T_UNASSERT, EXTENSION, DEPRECATED) /* 0 SVR4 */ \ -D(sccs, T_SCCS, EXTENSION, IN_I | DEPRECATED) /* 0 SVR4? */ +D(sccs, T_SCCS, EXTENSION, IN_I) /* 0 SVR4? */ /* #sccs is synonymous with #ident. */ #define do_sccs do_ident @@ -210,11 +211,14 @@ ; } -/* Ensure there are no stray tokens at the end of a directive. */ +/* Ensure there are no stray tokens at the end of a directive. If + EXPAND is true, tokens macro-expanding to nothing are allowed. */ static void -check_eol (cpp_reader *pfile) +check_eol (cpp_reader *pfile, bool expand) { - if (! SEEN_EOL () && _cpp_lex_token (pfile)->type != CPP_EOF) + if (! SEEN_EOL () && (expand + ? cpp_get_token (pfile) + : _cpp_lex_token (pfile))->type != CPP_EOF) cpp_error (pfile, CPP_DL_PEDWARN, "extra tokens at end of #%s directive", pfile->directive->name); } @@ -407,8 +411,8 @@ if (dname->type == CPP_NAME) { - if (dname->val.node->is_directive) - dir = &dtable[dname->val.node->directive_index]; + if (dname->val.node.node->is_directive) + dir = &dtable[dname->val.node.node->directive_index]; } /* We do not recognize the # followed by a number extension in assembler code. */ @@ -537,7 +541,7 @@ if (token->type == CPP_NAME) { - cpp_hashnode *node = token->val.node; + cpp_hashnode *node = token->val.node.node; if (is_def_or_undef && node == pfile->spec_nodes.n_defined) cpp_error (pfile, CPP_DL_ERROR, @@ -548,7 +552,7 @@ else if (token->flags & NAMED_OP) cpp_error (pfile, CPP_DL_ERROR, "\"%s\" cannot be used as a macro name as it is an operator in C++", - NODE_NAME (token->val.node)); + NODE_NAME (token->val.node.node)); else if (token->type == CPP_EOF) cpp_error (pfile, CPP_DL_ERROR, "no macro name given in #%s directive", pfile->directive->name); @@ -611,7 +615,7 @@ } } - check_eol (pfile); + check_eol (pfile, false); } /* Undefine a single macro/assertion/whatever. */ @@ -682,17 +686,21 @@ /* Returns the file name of #include, #include_next, #import and #pragma dependency. The string is malloced and the caller should - free it. Returns NULL on error. */ + free it. Returns NULL on error. LOCATION is the source location + of the file name. */ + static const char * parse_include (cpp_reader *pfile, int *pangle_brackets, - const cpp_token ***buf) + const cpp_token ***buf, source_location *location) { char *fname; const cpp_token *header; /* Allow macro expansion. */ header = get_token_no_padding (pfile); - if (header->type == CPP_STRING || header->type == CPP_HEADER_NAME) + *location = header->src_loc; + if ((header->type == CPP_STRING && header->val.str.text[0] != 'R') + || header->type == CPP_HEADER_NAME) { fname = XNEWVEC (char, header->val.str.len - 1); memcpy (fname, header->val.str.text + 1, header->val.str.len - 2); @@ -723,7 +731,7 @@ /* This pragma allows extra tokens after the file name. */ } else if (buf == NULL || CPP_OPTION (pfile, discard_comments)) - check_eol (pfile); + check_eol (pfile, true); else { /* If we are not discarding comments, then gather them while @@ -741,12 +749,13 @@ const char *fname; int angle_brackets; const cpp_token **buf = NULL; + source_location location; /* Re-enable saving of comments if requested, so that the include callback can dump comments which follow #include. */ pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); - fname = parse_include (pfile, &angle_brackets, &buf); + fname = parse_include (pfile, &angle_brackets, &buf, &location); if (!fname) { if (buf) @@ -756,8 +765,9 @@ if (!*fname) { - cpp_error (pfile, CPP_DL_ERROR, "empty filename in #%s", - pfile->directive->name); + cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0, + "empty filename in #%s", + pfile->directive->name); XDELETEVEC (fname); if (buf) XDELETEVEC (buf); @@ -911,9 +921,9 @@ { cpp_string s = { 0, 0 }; if (cpp_interpret_string_notranslate (pfile, &token->val.str, 1, - &s, false)) + &s, CPP_STRING)) new_file = (const char *)s.text; - check_eol (pfile); + check_eol (pfile, true); } else if (token->type != CPP_EOF) { @@ -923,7 +933,7 @@ } skip_rest_of_line (pfile); - _cpp_do_file_change (pfile, LC_RENAME, new_file, new_lineno, + _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, new_file, new_lineno, map_sysp); } @@ -939,7 +949,7 @@ const char *new_file = map->to_file; linenum_type new_lineno; unsigned int new_sysp = map->sysp; - enum lc_reason reason = LC_RENAME; + enum lc_reason reason = LC_RENAME_VERBATIM; int flag; bool wrapped; @@ -967,7 +977,7 @@ { cpp_string s = { 0, 0 }; if (cpp_interpret_string_notranslate (pfile, &token->val.str, - 1, &s, false)) + 1, &s, CPP_STRING)) new_file = (const char *)s.text; new_sysp = 0; @@ -993,7 +1003,7 @@ } pfile->buffer->sysp = new_sysp; - check_eol (pfile); + check_eol (pfile, false); } else if (token->type != CPP_EOF) { @@ -1003,6 +1013,14 @@ } skip_rest_of_line (pfile); + + /* Compensate for the increment in linemap_add that occurs in + _cpp_do_file_change. We're currently at the start of the line + *following* the #line directive. A separate source_location for this + location makes no sense (until we do the LC_LEAVE), and + complicates LAST_SOURCE_LINE_LOCATION. */ + pfile->line_table->highest_location--; + _cpp_do_file_change (pfile, reason, new_file, new_lineno, new_sysp); } @@ -1070,7 +1088,7 @@ else if (pfile->cb.ident) pfile->cb.ident (pfile, pfile->directive_line, &str->val.str); - check_eol (pfile); + check_eol (pfile, false); } /* Lookup a PRAGMA name in a singly-linked CHAIN. Returns the @@ -1330,7 +1348,7 @@ ns_token = *token; if (token->type == CPP_NAME) { - p = lookup_pragma_entry (pfile->pragmas, token->val.node); + p = lookup_pragma_entry (pfile->pragmas, token->val.node.node); if (p && p->is_nspace) { bool allow_name_expansion = p->allow_expansion; @@ -1338,7 +1356,7 @@ pfile->state.prevent_expansion--; token = cpp_get_token (pfile); if (token->type == CPP_NAME) - p = lookup_pragma_entry (p->u.space, token->val.node); + p = lookup_pragma_entry (p->u.space, token->val.node.node); else p = NULL; if (allow_name_expansion) @@ -1405,7 +1423,7 @@ if (cpp_in_primary_file (pfile)) cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file"); - check_eol (pfile); + check_eol (pfile, false); _cpp_mark_file_once_only (pfile, pfile->buffer->file); } @@ -1424,7 +1442,7 @@ source_location src_loc = pfile->cur_token[-1].src_loc; cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, "invalid #pragma push_macro directive"); - check_eol (pfile); + check_eol (pfile, false); skip_rest_of_line (pfile); return; } @@ -1439,7 +1457,7 @@ *dest++ = *src++; } *dest = 0; - check_eol (pfile); + check_eol (pfile, false); skip_rest_of_line (pfile); c = XNEW (struct def_pragma_macro); c->name = XNEWVAR (char, strlen (macroname) + 1); @@ -1463,7 +1481,7 @@ source_location src_loc = pfile->cur_token[-1].src_loc; cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0, "invalid #pragma pop_macro directive"); - check_eol (pfile); + check_eol (pfile, false); skip_rest_of_line (pfile); return; } @@ -1478,7 +1496,7 @@ *dest++ = *src++; } *dest = 0; - check_eol (pfile); + check_eol (pfile, false); skip_rest_of_line (pfile); while (c != NULL) @@ -1520,7 +1538,7 @@ break; } - hp = tok->val.node; + hp = tok->val.node.node; if (hp->flags & NODE_POISONED) continue; @@ -1547,7 +1565,7 @@ "#pragma system_header ignored outside include file"); else { - check_eol (pfile); + check_eol (pfile, false); skip_rest_of_line (pfile); cpp_make_system_header (pfile, 1, 0); } @@ -1561,8 +1579,9 @@ { const char *fname; int angle_brackets, ordering; + source_location location; - fname = parse_include (pfile, &angle_brackets, NULL); + fname = parse_include (pfile, &angle_brackets, NULL, &location); if (!fname) return; @@ -1613,7 +1632,8 @@ if (string->type == CPP_EOF) _cpp_backup_tokens (pfile, 1); if (string->type != CPP_STRING && string->type != CPP_WSTRING - && string->type != CPP_STRING32 && string->type != CPP_STRING16) + && string->type != CPP_STRING32 && string->type != CPP_STRING16 + && string->type != CPP_UTF8STRING) return NULL; paren = get_token_no_padding (pfile); @@ -1788,7 +1808,9 @@ pfile->cb.used_undef (pfile, pfile->directive_line, node); } } - check_eol (pfile); + if (pfile->cb.used) + pfile->cb.used (pfile, pfile->directive_line, node); + check_eol (pfile, false); } } @@ -1824,7 +1846,9 @@ pfile->cb.used_undef (pfile, pfile->directive_line, node); } } - check_eol (pfile); + if (pfile->cb.used) + pfile->cb.used (pfile, pfile->directive_line, node); + check_eol (pfile, false); } } @@ -1877,7 +1901,7 @@ /* Only check EOL if was not originally skipping. */ if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) - check_eol (pfile); + check_eol (pfile, false); } } @@ -1938,7 +1962,7 @@ { /* Only check EOL if was not originally skipping. */ if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) - check_eol (pfile); + check_eol (pfile, false); /* If potential control macro, we go back outside again. */ if (ifs->next == 0 && ifs->mi_cmacro) @@ -1983,9 +2007,11 @@ /* Read the tokens of the answer into the macro pool, in a directive of type TYPE. Only commit the memory if we intend it as permanent storage, i.e. the #assert case. Returns 0 on success, and sets - ANSWERP to point to the answer. */ + ANSWERP to point to the answer. PRED_LOC is the location of the + predicate. */ static int -parse_answer (cpp_reader *pfile, struct answer **answerp, int type) +parse_answer (cpp_reader *pfile, struct answer **answerp, int type, + source_location pred_loc) { const cpp_token *paren; struct answer *answer; @@ -2010,7 +2036,8 @@ if (type == T_UNASSERT && paren->type == CPP_EOF) return 0; - cpp_error (pfile, CPP_DL_ERROR, "missing '(' after predicate"); + cpp_error_with_line (pfile, CPP_DL_ERROR, pred_loc, 0, + "missing '(' after predicate"); return 1; } @@ -2074,15 +2101,16 @@ if (predicate->type == CPP_EOF) cpp_error (pfile, CPP_DL_ERROR, "assertion without predicate"); else if (predicate->type != CPP_NAME) - cpp_error (pfile, CPP_DL_ERROR, "predicate must be an identifier"); - else if (parse_answer (pfile, answerp, type) == 0) + cpp_error_with_line (pfile, CPP_DL_ERROR, predicate->src_loc, 0, + "predicate must be an identifier"); + else if (parse_answer (pfile, answerp, type, predicate->src_loc) == 0) { - unsigned int len = NODE_LEN (predicate->val.node); + unsigned int len = NODE_LEN (predicate->val.node.node); unsigned char *sym = (unsigned char *) alloca (len + 1); /* Prefix '#' to get it out of macro namespace. */ sym[0] = '#'; - memcpy (sym + 1, NODE_NAME (predicate->val.node), len); + memcpy (sym + 1, NODE_NAME (predicate->val.node.node), len); result = cpp_lookup (pfile, sym, len + 1); } @@ -2182,7 +2210,7 @@ node->type = NT_ASSERTION; node->value.answers = new_answer; - check_eol (pfile); + check_eol (pfile, false); } } @@ -2210,7 +2238,7 @@ if (node->value.answers == 0) node->type = NT_VOID; - check_eol (pfile); + check_eol (pfile, false); } else _cpp_free_definition (node); @@ -2228,7 +2256,8 @@ void cpp_define (cpp_reader *pfile, const char *str) { - char *buf, *p; + char *buf; + const char *p; size_t count; /* Copy the entire option so we can modify it. @@ -2376,13 +2405,6 @@ run_directive (pfile, type, str, count); } -/* The number of errors for a given reader. */ -unsigned int -cpp_errors (cpp_reader *pfile) -{ - return pfile->errors; -} - /* The options structure. */ cpp_options * cpp_get_options (cpp_reader *pfile)