Commit d09e893f by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/25294 (Bogus "unterminated comment" error from #pragma comment)

	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.

From-SVN: r109201
parent 2984956b
2006-01-01 Jakub Jelinek <jakub@redhat.com>
PR c++/25294
* gcc.dg/pragma-pack-3.c: New test.
* g++.dg/parse/pragma3.C: New test.
2005-12-30 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR middle-end/24827
// PR c++/25294
// { dg-do run }
extern "C" void abort (void);
struct S
{
char a[3];
#pragma pack(1) /* A block comment
that ends on the next line. */
struct T
{
char b;
int c;
} d;
#pragma pack /*/ */ () // C++ comment
int e;
} s;
int
main ()
{
if (sizeof (int) == 4 && sizeof (s) != 12)
abort ();
return 0;
}
/* PR c++/25294 */
/* { dg-options "-std=gnu99" } */
/* { dg-do run } */
extern void abort (void);
struct S
{
char a[3];
#pragma pack(1) /* A block comment
that ends on the next line. */
struct T
{
char b;
int c;
} d;
#pragma pack /*/ */ () // C++ comment
int e;
} s;
int
main ()
{
if (sizeof (int) == 4 && sizeof (s) != 12)
abort ();
return 0;
}
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
......
/* 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;
......
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