diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-31 23:45:58 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-31 23:45:58 +0000 |
commit | 986ca3568e2c360f762d3304ec739c3affb96eb4 (patch) | |
tree | ce308977cf7e39a7110238524fc15f921883e86a /libcpp | |
parent | bb8dad56465cee82440a0c54c9a8f32d709d396a (diff) | |
download | gcc-986ca3568e2c360f762d3304ec739c3affb96eb4.tar.gz |
PR c++/25294
* directives.c (do_pragma): If pragma line ends with multi-line
block comment, end the saved deferred pragma string before that
comment. Handle embedded '\0' chars on the pragma line.
* gcc.dg/pragma-pack-3.c: New test.
* g++.dg/parse/pragma3.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109201 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 7 | ||||
-rw-r--r-- | libcpp/directives.c | 53 |
2 files changed, 56 insertions, 4 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index e21ea6dc524..b2f0c9a2bf9 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2006-01-01 Jakub Jelinek <jakub@redhat.com> + + PR c++/25294 + * directives.c (do_pragma): If pragma line ends with multi-line + block comment, end the saved deferred pragma string before that + comment. Handle embedded '\0' chars on the pragma line. + 2005-12-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de> PR c++/23333 diff --git a/libcpp/directives.c b/libcpp/directives.c index 7159f07a688..2de65fbeaa3 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -1,6 +1,7 @@ /* CPP Library. (Directive handling.) Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. Contributed by Per Bothner, 1994-95. Based on CCCP program by Paul Rubin, June 1986 Adapted to ANSI C, Richard Stallman, Jan 1987 @@ -1280,15 +1281,59 @@ do_pragma (cpp_reader *pfile) /* Squirrel away the pragma text. Pragmas are newline-terminated. */ const uchar *line_end; - uchar *s; + uchar *s, c, cc; cpp_string body; cpp_token *ptok; - line_end = ustrchr (line_start, '\n'); + for (line_end = line_start; (c = *line_end) != '\n'; line_end++) + if (c == '"' || c == '\'') + { + /* Skip over string literal. */ + do + { + cc = *++line_end; + if (cc == '\\' && line_end[1] != '\n') + line_end++; + else if (cc == '\n') + { + line_end--; + break; + } + } + while (cc != c); + } + else if (c == '/') + { + if (line_end[1] == '*') + { + /* Skip over C block comment, unless it is multi-line. + When encountering multi-line block comment, terminate + the pragma token right before that block comment. */ + const uchar *le = line_end + 2; + while (*le != '\n') + if (*le++ == '*' && *le == '/') + { + line_end = le; + break; + } + if (line_end < le) + break; + } + else if (line_end[1] == '/' + && (CPP_OPTION (pfile, cplusplus_comments) + || cpp_in_system_header (pfile))) + { + line_end += 2; + while (*line_end != '\n') + line_end++; + break; + } + } body.len = (line_end - line_start) + 1; s = _cpp_unaligned_alloc (pfile, body.len + 1); - memcpy (s, line_start, body.len); + memcpy (s, line_start, body.len - 1); + s[body.len - 1] = '\n'; s[body.len] = '\0'; body.text = s; |