re PR preprocessor/39646 (__FILE__ breaks for empty file name)
libcpp: PR preprocessor/39646 * include/line-map.h (enum lc_reason): Add LC_RENAME_VERBATIM. * line-map.c (linemap_add): Handle LC_RENAME_VERBATIM. * directives.c (do_line, do_linemarker): Use LC_RENAME_VERBATIM in place of LC_RENAME. gcc/testsuite: * gcc.dg/cpp/line8.c: New test. From-SVN: r146319
This commit is contained in:
parent
b8add5942c
commit
c7f9c0b983
6 changed files with 32 additions and 5 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR preprocessor/39646
|
||||||
|
* gcc.dg/cpp/line8.c: New test.
|
||||||
|
|
||||||
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
PR preprocessor/39647
|
PR preprocessor/39647
|
||||||
|
|
10
gcc/testsuite/gcc.dg/cpp/line8.c
Normal file
10
gcc/testsuite/gcc.dg/cpp/line8.c
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/* Test that "" is not specially interpreted as "<stdin>" in a #line
|
||||||
|
directive. PR 39646. */
|
||||||
|
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-pedantic-errors" } */
|
||||||
|
|
||||||
|
extern int x;
|
||||||
|
|
||||||
|
#line 24 ""
|
||||||
|
extern char z[sizeof __FILE__ == 1];
|
|
@ -1,3 +1,11 @@
|
||||||
|
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR preprocessor/39646
|
||||||
|
* include/line-map.h (enum lc_reason): Add LC_RENAME_VERBATIM.
|
||||||
|
* line-map.c (linemap_add): Handle LC_RENAME_VERBATIM.
|
||||||
|
* directives.c (do_line, do_linemarker): Use LC_RENAME_VERBATIM in
|
||||||
|
place of LC_RENAME.
|
||||||
|
|
||||||
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
2009-04-18 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
PR preprocessor/39647
|
PR preprocessor/39647
|
||||||
|
|
|
@ -924,7 +924,7 @@ do_line (cpp_reader *pfile)
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_rest_of_line (pfile);
|
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);
|
map_sysp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,7 +940,7 @@ do_linemarker (cpp_reader *pfile)
|
||||||
const char *new_file = map->to_file;
|
const char *new_file = map->to_file;
|
||||||
linenum_type new_lineno;
|
linenum_type new_lineno;
|
||||||
unsigned int new_sysp = map->sysp;
|
unsigned int new_sysp = map->sysp;
|
||||||
enum lc_reason reason = LC_RENAME;
|
enum lc_reason reason = LC_RENAME_VERBATIM;
|
||||||
int flag;
|
int flag;
|
||||||
bool wrapped;
|
bool wrapped;
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,9 @@ along with this program; see the file COPYING3. If not see
|
||||||
when including a new file, e.g. a #include directive in C.
|
when including a new file, e.g. a #include directive in C.
|
||||||
LC_LEAVE is when reaching a file's end. LC_RENAME is when a file
|
LC_LEAVE is when reaching a file's end. LC_RENAME is when a file
|
||||||
name or line number changes for neither of the above reasons
|
name or line number changes for neither of the above reasons
|
||||||
(e.g. a #line directive in C). */
|
(e.g. a #line directive in C); LC_RENAME_VERBATIM is like LC_RENAME
|
||||||
enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME};
|
but a filename of "" is not specially interpreted as standard input. */
|
||||||
|
enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME, LC_RENAME_VERBATIM};
|
||||||
|
|
||||||
/* The type of line numbers. */
|
/* The type of line numbers. */
|
||||||
typedef unsigned int linenum_type;
|
typedef unsigned int linenum_type;
|
||||||
|
|
|
@ -109,9 +109,12 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
|
||||||
|
|
||||||
map = &set->maps[set->used];
|
map = &set->maps[set->used];
|
||||||
|
|
||||||
if (to_file && *to_file == '\0')
|
if (to_file && *to_file == '\0' && reason != LC_RENAME_VERBATIM)
|
||||||
to_file = "<stdin>";
|
to_file = "<stdin>";
|
||||||
|
|
||||||
|
if (reason == LC_RENAME_VERBATIM)
|
||||||
|
reason = LC_RENAME;
|
||||||
|
|
||||||
/* If we don't keep our line maps consistent, we can easily
|
/* If we don't keep our line maps consistent, we can easily
|
||||||
segfault. Don't rely on the client to do it for us. */
|
segfault. Don't rely on the client to do it for us. */
|
||||||
if (set->depth == 0)
|
if (set->depth == 0)
|
||||||
|
|
Loading…
Add table
Reference in a new issue