Commit 14b1760c by Dodji Seketeli

Revert "PR preprocessor/60723 - missing system-ness marks for macro tokens"

This reverts commit 747e04f26ac3fb775bfc9af61e9170b9461b6cfc.

From-SVN: r212199
parent 08eedf75
2014-07-01 Dodji Seketeli <dodji@redhat.com>
PR preprocessor/60723
* c-ppoutput.c (struct print::prev_was_system_token): New data
member.
(init_pp_output): Initialize it.
(maybe_print_line_1, maybe_print_line, print_line_1, print_line)
(do_line_change): Return a flag saying if a line marker was
emitted or not.
(scan_translation_unit): Detect if the system-ness of the token we
are about to emit is different from the one of the previously
emitted token. If so, emit a line marker. Avoid emitting useless
adjacent line markers.
(scan_translation_unit_directives_only): Adjust.
2014-07-01 Marek Polacek <polacek@redhat.com> 2014-07-01 Marek Polacek <polacek@redhat.com>
* c.opt (Wint-conversion): New option. * c.opt (Wint-conversion): New option.
......
...@@ -36,8 +36,6 @@ static struct ...@@ -36,8 +36,6 @@ static struct
unsigned char printed; /* Nonzero if something output at line. */ unsigned char printed; /* Nonzero if something output at line. */
bool first_time; /* pp_file_change hasn't been called yet. */ bool first_time; /* pp_file_change hasn't been called yet. */
const char *src_file; /* Current source file. */ const char *src_file; /* Current source file. */
bool prev_was_system_token; /* True if the previous token was a
system token.*/
} print; } print;
/* Defined and undefined macros being queued for output with -dU at /* Defined and undefined macros being queued for output with -dU at
...@@ -60,11 +58,11 @@ static void account_for_newlines (const unsigned char *, size_t); ...@@ -60,11 +58,11 @@ static void account_for_newlines (const unsigned char *, size_t);
static int dump_macro (cpp_reader *, cpp_hashnode *, void *); static int dump_macro (cpp_reader *, cpp_hashnode *, void *);
static void dump_queued_macros (cpp_reader *); static void dump_queued_macros (cpp_reader *);
static bool print_line_1 (source_location, const char*, FILE *); static void print_line_1 (source_location, const char*, FILE *);
static bool print_line (source_location, const char *); static void print_line (source_location, const char *);
static bool maybe_print_line_1 (source_location, FILE *); static void maybe_print_line_1 (source_location, FILE *);
static bool maybe_print_line (source_location); static void maybe_print_line (source_location);
static bool do_line_change (cpp_reader *, const cpp_token *, static void do_line_change (cpp_reader *, const cpp_token *,
source_location, int); source_location, int);
/* Callback routines for the parser. Most of these are active only /* Callback routines for the parser. Most of these are active only
...@@ -158,7 +156,6 @@ init_pp_output (FILE *out_stream) ...@@ -158,7 +156,6 @@ init_pp_output (FILE *out_stream)
print.outf = out_stream; print.outf = out_stream;
print.first_time = 1; print.first_time = 1;
print.src_file = ""; print.src_file = "";
print.prev_was_system_token = false;
} }
/* Writes out the preprocessed file, handling spacing and paste /* Writes out the preprocessed file, handling spacing and paste
...@@ -171,7 +168,6 @@ scan_translation_unit (cpp_reader *pfile) ...@@ -171,7 +168,6 @@ scan_translation_unit (cpp_reader *pfile)
= cpp_get_options (parse_in)->lang != CLK_ASM = cpp_get_options (parse_in)->lang != CLK_ASM
&& !flag_no_line_commands; && !flag_no_line_commands;
bool in_pragma = false; bool in_pragma = false;
bool line_marker_emitted = false;
print.source = NULL; print.source = NULL;
for (;;) for (;;)
...@@ -204,7 +200,7 @@ scan_translation_unit (cpp_reader *pfile) ...@@ -204,7 +200,7 @@ scan_translation_unit (cpp_reader *pfile)
&& do_line_adjustments && do_line_adjustments
&& !in_pragma) && !in_pragma)
{ {
line_marker_emitted = do_line_change (pfile, token, loc, false); do_line_change (pfile, token, loc, false);
putc (' ', print.outf); putc (' ', print.outf);
} }
else if (print.source->flags & PREV_WHITE else if (print.source->flags & PREV_WHITE
...@@ -220,7 +216,7 @@ scan_translation_unit (cpp_reader *pfile) ...@@ -220,7 +216,7 @@ scan_translation_unit (cpp_reader *pfile)
if (src_line != print.src_line if (src_line != print.src_line
&& do_line_adjustments && do_line_adjustments
&& !in_pragma) && !in_pragma)
line_marker_emitted = do_line_change (pfile, token, loc, false); do_line_change (pfile, token, loc, false);
putc (' ', print.outf); putc (' ', print.outf);
} }
...@@ -232,7 +228,7 @@ scan_translation_unit (cpp_reader *pfile) ...@@ -232,7 +228,7 @@ scan_translation_unit (cpp_reader *pfile)
const char *space; const char *space;
const char *name; const char *name;
line_marker_emitted = maybe_print_line (token->src_loc); maybe_print_line (token->src_loc);
fputs ("#pragma ", print.outf); fputs ("#pragma ", print.outf);
c_pp_lookup_pragma (token->val.pragma, &space, &name); c_pp_lookup_pragma (token->val.pragma, &space, &name);
if (space) if (space)
...@@ -252,18 +248,9 @@ scan_translation_unit (cpp_reader *pfile) ...@@ -252,18 +248,9 @@ scan_translation_unit (cpp_reader *pfile)
if (cpp_get_options (parse_in)->debug) if (cpp_get_options (parse_in)->debug)
linemap_dump_location (line_table, token->src_loc, linemap_dump_location (line_table, token->src_loc,
print.outf); print.outf);
if (!line_marker_emitted
&& print.prev_was_system_token != !!in_system_header_at(loc))
/* The system-ness of this token is different from the one
of the previous token. Let's emit a line change to
mark the new system-ness before we emit the token. */
line_marker_emitted = do_line_change (pfile, token, loc, false);
cpp_output_token (token, print.outf); cpp_output_token (token, print.outf);
line_marker_emitted = false;
} }
print.prev_was_system_token = !!in_system_header_at(loc);
/* CPP_COMMENT tokens and raw-string literal tokens can /* CPP_COMMENT tokens and raw-string literal tokens can
have embedded new-line characters. Rather than enumerating have embedded new-line characters. Rather than enumerating
all the possible token types just check if token uses all the possible token types just check if token uses
...@@ -288,7 +275,7 @@ scan_translation_unit_directives_only (cpp_reader *pfile) ...@@ -288,7 +275,7 @@ scan_translation_unit_directives_only (cpp_reader *pfile)
struct _cpp_dir_only_callbacks cb; struct _cpp_dir_only_callbacks cb;
cb.print_lines = print_lines_directives_only; cb.print_lines = print_lines_directives_only;
cb.maybe_print_line = (void (*) (source_location)) maybe_print_line; cb.maybe_print_line = maybe_print_line;
_cpp_preprocess_dir_only (pfile, &cb); _cpp_preprocess_dir_only (pfile, &cb);
} }
...@@ -319,13 +306,11 @@ scan_translation_unit_trad (cpp_reader *pfile) ...@@ -319,13 +306,11 @@ scan_translation_unit_trad (cpp_reader *pfile)
/* If the token read on logical line LINE needs to be output on a /* If the token read on logical line LINE needs to be output on a
different line to the current one, output the required newlines or different line to the current one, output the required newlines or
a line marker. If a line marker was emitted, return TRUE otherwise a line marker, and return 1. Otherwise return 0. */
return FALSE. */
static bool static void
maybe_print_line_1 (source_location src_loc, FILE *stream) maybe_print_line_1 (source_location src_loc, FILE *stream)
{ {
bool emitted_line_marker = false;
int src_line = LOCATION_LINE (src_loc); int src_line = LOCATION_LINE (src_loc);
const char *src_file = LOCATION_FILE (src_loc); const char *src_file = LOCATION_FILE (src_loc);
...@@ -349,34 +334,29 @@ maybe_print_line_1 (source_location src_loc, FILE *stream) ...@@ -349,34 +334,29 @@ maybe_print_line_1 (source_location src_loc, FILE *stream)
} }
} }
else else
emitted_line_marker = print_line_1 (src_loc, "", stream); print_line_1 (src_loc, "", stream);
return emitted_line_marker;
} }
/* If the token read on logical line LINE needs to be output on a /* If the token read on logical line LINE needs to be output on a
different line to the current one, output the required newlines or different line to the current one, output the required newlines or
a line marker. If a line marker was emitted, return TRUE otherwise a line marker, and return 1. Otherwise return 0. */
return FALSE. */
static bool static void
maybe_print_line (source_location src_loc) maybe_print_line (source_location src_loc)
{ {
if (cpp_get_options (parse_in)->debug) if (cpp_get_options (parse_in)->debug)
linemap_dump_location (line_table, src_loc, linemap_dump_location (line_table, src_loc,
print.outf); print.outf);
return maybe_print_line_1 (src_loc, print.outf); maybe_print_line_1 (src_loc, print.outf);
} }
/* Output a line marker for logical line LINE. Special flags are "1" /* Output a line marker for logical line LINE. Special flags are "1"
or "2" indicating entering or leaving a file. If the line marker or "2" indicating entering or leaving a file. */
was effectively emitted, return TRUE otherwise return FALSE. */
static bool static void
print_line_1 (source_location src_loc, const char *special_flags, FILE *stream) print_line_1 (source_location src_loc, const char *special_flags, FILE *stream)
{ {
bool emitted_line_marker = false;
/* End any previous line of text. */ /* End any previous line of text. */
if (print.printed) if (print.printed)
putc ('\n', stream); putc ('\n', stream);
...@@ -411,39 +391,33 @@ print_line_1 (source_location src_loc, const char *special_flags, FILE *stream) ...@@ -411,39 +391,33 @@ print_line_1 (source_location src_loc, const char *special_flags, FILE *stream)
fputs (" 3", stream); fputs (" 3", stream);
putc ('\n', stream); putc ('\n', stream);
emitted_line_marker = true;
} }
return emitted_line_marker;
} }
/* Output a line marker for logical line LINE. Special flags are "1" /* Output a line marker for logical line LINE. Special flags are "1"
or "2" indicating entering or leaving a file. Return TRUE if a or "2" indicating entering or leaving a file. */
line marker was effectively emitted, FALSE otherwise. */
static bool static void
print_line (source_location src_loc, const char *special_flags) print_line (source_location src_loc, const char *special_flags)
{ {
if (cpp_get_options (parse_in)->debug) if (cpp_get_options (parse_in)->debug)
linemap_dump_location (line_table, src_loc, linemap_dump_location (line_table, src_loc,
print.outf); print.outf);
return print_line_1 (src_loc, special_flags, print.outf); print_line_1 (src_loc, special_flags, print.outf);
} }
/* Helper function for cb_line_change and scan_translation_unit. /* Helper function for cb_line_change and scan_translation_unit. */
Return TRUE if a line marker is emitted, FALSE otherwise. */ static void
static bool
do_line_change (cpp_reader *pfile, const cpp_token *token, do_line_change (cpp_reader *pfile, const cpp_token *token,
source_location src_loc, int parsing_args) source_location src_loc, int parsing_args)
{ {
bool emitted_line_marker = false;
if (define_queue || undef_queue) if (define_queue || undef_queue)
dump_queued_macros (pfile); dump_queued_macros (pfile);
if (token->type == CPP_EOF || parsing_args) if (token->type == CPP_EOF || parsing_args)
return false; return;
emitted_line_marker = maybe_print_line (src_loc); maybe_print_line (src_loc);
print.prev = 0; print.prev = 0;
print.source = 0; print.source = 0;
...@@ -460,8 +434,6 @@ do_line_change (cpp_reader *pfile, const cpp_token *token, ...@@ -460,8 +434,6 @@ do_line_change (cpp_reader *pfile, const cpp_token *token,
while (-- spaces >= 0) while (-- spaces >= 0)
putc (' ', print.outf); putc (' ', print.outf);
} }
return emitted_line_marker;
} }
/* Called when a line of output is started. TOKEN is the first token /* Called when a line of output is started. TOKEN is the first token
......
...@@ -13,11 +13,6 @@ ...@@ -13,11 +13,6 @@
* g++.dg/cpp1y/pr59867.C: Fix target selector. * g++.dg/cpp1y/pr59867.C: Fix target selector.
2014-07-01 Dodji Seketeli <dodji@redhat.com>
PR preprocessor/60723
* gcc.dg/cpp/syshdr{4,5}.{c,h}: New test files.
2014-07-01 Marek Polacek <polacek@redhat.com> 2014-07-01 Marek Polacek <polacek@redhat.com>
* gcc.dg/Wint-conversion.c: New test. * gcc.dg/Wint-conversion.c: New test.
......
/* Contributed by Nicholas Ormrod */
/* Origin: PR preprocessor/60723 */
/* This tests that multi-line macro callsites, which are defined
in system headers and whose expansion contains a builtin followed
by a non-builtin token, do not generate a line directive that
mark the current file as being a system file, when performing
non-integrated preprocessing. */
/* System files suppress div-by-zero warnings, so the presence of
such indicates the lack of the bug.
{ dg-do compile }
{ dg-options -no-integrated-cpp } */
#include "syshdr4.h"
FOO(
)
int
foo()
{
return 1 / 0; /* { dg-warning "div-by-zero" } */
return 0;
}
/* Contributed by Nicholas Ormrod
Origin: PR preprocessor/60723.
This file is to be included by the syshdr4.c file. */
#pragma GCC system_header
#define FOO() int line = __LINE__ ;
/* Origin: PR preprocessor/60723
{ dg-do compile }
{ dg-options -no-integrated-cpp } */
#include "syshdr5.h"
int
main()
{
FOO(1/0 /* { dg-warning "division by zero" } */
);
return 0;
}
/* Origin: PR preprocessor/60723
This header file is to be included by the syshdr5.c file. */
#pragma GCC system_header
#define FOO(A)do {int line = __LINE__ ; A;} while(0)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment