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
This commit is contained in:
Jakub Jelinek 2006-01-01 00:45:58 +01:00 committed by Jakub Jelinek
parent 2984956b2f
commit d09e893f10
5 changed files with 115 additions and 4 deletions

View file

@ -1,3 +1,9 @@
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

View file

@ -0,0 +1,26 @@
// 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;
}

View file

@ -0,0 +1,27 @@
/* 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;
}

View file

@ -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

View file

@ -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;