aboutsummaryrefslogtreecommitdiff
path: root/gcc/cpplib.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@wolery.cumb.org>2000-01-27 22:29:07 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-01-27 22:29:07 +0000
commit75ec21db305f832534b2072c02a2a785c3cc0b4c (patch)
tree8fbdbe32865dcaea5f37fa4f80adc6849f91f96d /gcc/cpplib.c
parent73b5cdf98ad368b41766577395b2a5bbd91e3f1b (diff)
downloadgcc-75ec21db305f832534b2072c02a2a785c3cc0b4c.zip
gcc-75ec21db305f832534b2072c02a2a785c3cc0b4c.tar.gz
gcc-75ec21db305f832534b2072c02a2a785c3cc0b4c.tar.bz2
cppinit.c (cpp_handle_option): Recognize C++ comments under -std=gnu89.
* cppinit.c (cpp_handle_option): Recognize C++ comments under -std=gnu89. * cpplib.c (skip_block_comment, skip_line_comment): Split code out of... (skip_comment) ... here. Permit C++ comments in system headers always. Warn about C++ comments in user code under -std=gnu89 -pedantic. (copy_comment): Use skip_comment. (cpp_skip_hspace, cpp_get_token): skip_comment can no longer return EOF. (consider_directive_while_skipping, do_else, do_endif): Call validate_else unconditionally. (validate_else): Check CPP_PEDANTIC here. Accept non-comment text after the conditional in a system header. * cpplib.h (struct cpp_buffer): Add flag warned_cplusplus_comments. From-SVN: r31654
Diffstat (limited to 'gcc/cpplib.c')
-rw-r--r--gcc/cpplib.c244
1 files changed, 114 insertions, 130 deletions
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index c03692e..44134e6 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -255,11 +255,70 @@ null_cleanup (pbuf, pfile)
return 0;
}
+/* Skip a C-style block comment. We know it's a comment, and point is
+ at the second character of the starter. */
+static void
+skip_block_comment (pfile)
+ cpp_reader *pfile;
+{
+ int c, prev_c = -1;
+ long line, col;
+
+ FORWARD(1);
+ cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
+ for (;;)
+ {
+ c = GETC ();
+ if (c == EOF)
+ {
+ cpp_error_with_line (pfile, line, col, "unterminated comment");
+ return;
+ }
+ else if (c == '\n' || c == '\r')
+ /* \r cannot be a macro escape marker here. */
+ CPP_BUMP_LINE (pfile);
+ else if (c == '/' && prev_c == '*')
+ return;
+ else if (c == '*' && prev_c == '/'
+ && CPP_OPTIONS (pfile)->warn_comments)
+ cpp_warning (pfile, "`/*' within comment");
+
+ prev_c = c;
+ }
+}
+
+/* Skip a C++/Chill line comment. We know it's a comment, and point
+ is at the second character of the initiator. */
+static void
+skip_line_comment (pfile)
+ cpp_reader *pfile;
+{
+ FORWARD(1);
+ for (;;)
+ {
+ int c = GETC ();
+
+ /* We don't have to worry about EOF in here. */
+ if (c == '\n')
+ {
+ /* Don't consider final '\n' to be part of comment. */
+ FORWARD(-1);
+ return;
+ }
+ else if (c == '\r')
+ {
+ /* \r cannot be a macro escape marker here. */
+ CPP_BUMP_LINE (pfile);
+ if (CPP_OPTIONS (pfile)->warn_comments)
+ cpp_warning (pfile, "backslash-newline within line comment");
+ }
+ }
+}
+
/* Skip a comment - C, C++, or Chill style. M is the first character
of the comment marker. If this really is a comment, skip to its
- end and return ' '. If we hit end-of-file before end-of-comment,
- return EOF. If this is not a comment, return M (which will be
- '/' or '-'). */
+ end and return ' '. If this is not a comment, return M (which will
+ be '/' or '-'). */
static int
skip_comment (pfile, m)
@@ -268,52 +327,42 @@ skip_comment (pfile, m)
{
if (m == '/' && PEEKC() == '*')
{
- int c, prev_c = -1;
- long line, col;
-
- FORWARD(1);
- cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
- for (;;)
+ skip_block_comment (pfile);
+ return ' ';
+ }
+ else if (m == '/' && PEEKC() == '/')
+ {
+ if (CPP_BUFFER (pfile)->system_header_p)
{
- c = GETC ();
- if (c == EOF)
+ /* We silently allow C++ comments in system headers, irrespective
+ of conformance mode, because lots of busted systems do that
+ and trying to clean it up in fixincludes is a nightmare. */
+ skip_line_comment (pfile);
+ return ' ';
+ }
+ else if (CPP_OPTIONS (pfile)->cplusplus_comments)
+ {
+ if (CPP_OPTIONS (pfile)->c89
+ && CPP_PEDANTIC (pfile)
+ && ! CPP_BUFFER (pfile)->warned_cplusplus_comments)
{
- cpp_error_with_line (pfile, line, col, "unterminated comment");
- return EOF;
+ cpp_pedwarn (pfile,
+ "C++ style comments are not allowed in ISO C89");
+ cpp_pedwarn (pfile,
+ "(this will be reported only once per input file)");
+ CPP_BUFFER (pfile)->warned_cplusplus_comments = 1;
}
- else if (c == '\n' || c == '\r')
- /* \r cannot be a macro escape marker here. */
- CPP_BUMP_LINE (pfile);
- else if (c == '/' && prev_c == '*')
- return ' ';
- else if (c == '*' && prev_c == '/'
- && CPP_OPTIONS (pfile)->warn_comments)
- cpp_warning (pfile, "`/*' within comment");
-
- prev_c = c;
+ skip_line_comment (pfile);
+ return ' ';
}
+ else
+ return m;
}
- else if ((m == '/' && PEEKC() == '/'
- && CPP_OPTIONS (pfile)->cplusplus_comments)
- || (m == '-' && PEEKC() == '-'
- && CPP_OPTIONS (pfile)->chill))
+ else if (m == '-' && PEEKC() == '-'
+ && CPP_OPTIONS (pfile)->chill)
{
- FORWARD(1);
- for (;;)
- {
- int c = GETC ();
- if (c == EOF)
- return ' '; /* Allow // to be terminated by EOF. */
- if (c == '\n')
- {
- /* Don't consider final '\n' to be part of comment. */
- FORWARD(-1);
- return ' ';
- }
- else if (c == '\r')
- /* \r cannot be a macro escape marker here. */
- CPP_BUMP_LINE (pfile);
- }
+ skip_line_comment (pfile);
+ return ' ';
}
else
return m;
@@ -326,77 +375,18 @@ copy_comment (pfile, m)
cpp_reader *pfile;
int m;
{
- if (m == '/' && PEEKC() == '*')
- {
- int c, prev_c = -1;
- long line, col;
+ U_CHAR *start = CPP_BUFFER (pfile)->cur; /* XXX Layering violation */
+ U_CHAR *limit;
- CPP_PUTC (pfile, '/');
- CPP_PUTC (pfile, '*');
- FORWARD(1);
- cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
- for (;;)
- {
- c = GETC ();
- if (c == EOF)
- {
- cpp_error_with_line (pfile, line, col, "unterminated comment");
- /* We must pretend this was a legitimate comment, so that the
- output in token_buffer is not passed back tagged CPP_POP. */
- return ' ';
- }
- else if (c == '\r')
- {
- /* \r cannot be a macro escape marker here. */
- CPP_BUMP_LINE (pfile);
- continue;
- }
-
- CPP_PUTC (pfile, c);
- if (c == '\n')
- {
- pfile->lineno++;
- CPP_BUMP_LINE (pfile);
- }
- else if (c == '/' && prev_c == '*')
- return ' ';
- else if (c == '*' && prev_c == '/'
- && CPP_OPTIONS (pfile)->warn_comments)
- cpp_warning (pfile, "`/*' within comment");
-
- prev_c = c;
- }
- }
- else if ((m == '/' && PEEKC() == '/'
- && CPP_OPTIONS (pfile)->cplusplus_comments)
- || (m == '-' && PEEKC() == '-'
- && CPP_OPTIONS (pfile)->chill))
- {
- CPP_PUTC (pfile, m);
- CPP_PUTC (pfile, m);
- FORWARD(1);
- for (;;)
- {
- int c = GETC ();
- if (c == EOF)
- return ' '; /* Allow line comments to be terminated by EOF. */
- else if (c == '\n')
- {
- /* Don't consider final '\n' to be part of comment. */
- FORWARD(-1);
- return ' ';
- }
- else if (c == '\r')
- /* \r cannot be a macro escape marker here. */
- CPP_BUMP_LINE (pfile);
-
- CPP_PUTC (pfile, c);
- }
- }
- else
+ if (skip_comment (pfile, m) == m)
return m;
-}
+ CPP_PUTC (pfile, m);
+ for (limit = CPP_BUFFER (pfile)->cur; start <= limit; start++)
+ if (*start != '\r')
+ CPP_PUTC (pfile, *start);
+ return ' ';
+}
/* Skip whitespace \-newline and comments. Does not macro-expand. */
@@ -433,9 +423,7 @@ cpp_skip_hspace (pfile)
else if (c == '/' || c == '-')
{
c = skip_comment (pfile, c);
- if (c == EOF)
- return;
- else if (c != ' ')
+ if (c != ' ')
break;
}
else
@@ -2008,7 +1996,7 @@ consider_directive_while_skipping (pfile, stack)
return 0;
case T_ELSE:
- if (CPP_PEDANTIC (pfile) && pfile->if_stack != stack)
+ if (pfile->if_stack != stack)
validate_else (pfile, "#else");
/* fall through */
case T_ELIF:
@@ -2024,7 +2012,7 @@ consider_directive_while_skipping (pfile, stack)
}
case T_ENDIF:
- if (CPP_PEDANTIC (pfile) && pfile->if_stack != stack)
+ if (pfile->if_stack != stack)
validate_else (pfile, "#endif");
if (pfile->if_stack == stack)
@@ -2140,8 +2128,7 @@ do_else (pfile, keyword)
{
cpp_buffer *ip = CPP_BUFFER (pfile);
- if (CPP_PEDANTIC (pfile))
- validate_else (pfile, "#else");
+ validate_else (pfile, "#else");
skip_rest_of_line (pfile);
if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack) {
@@ -2180,8 +2167,7 @@ do_endif (pfile, keyword)
cpp_reader *pfile;
const struct directive *keyword ATTRIBUTE_UNUSED;
{
- if (CPP_PEDANTIC (pfile))
- validate_else (pfile, "#endif");
+ validate_else (pfile, "#endif");
skip_rest_of_line (pfile);
if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack)
@@ -2226,19 +2212,20 @@ do_endif (pfile, keyword)
return 0;
}
-/* When an #else or #endif is found while skipping failed conditional,
- if -pedantic was specified, this is called to warn about text after
- the command name. P points to the first char after the command name. */
+/* Issue -pedantic warning for text which is not a comment following
+ an #else or #endif. Do not warn in system headers, as this is harmless
+ and very common on old systems. */
static void
validate_else (pfile, directive)
cpp_reader *pfile;
const char *directive;
{
- int c;
+ if (! CPP_PEDANTIC (pfile) || CPP_BUFFER (pfile)->system_header_p)
+ return;
+
cpp_skip_hspace (pfile);
- c = PEEKC ();
- if (c != EOF && c != '\n')
+ if (PEEKC () != '\n')
cpp_pedwarn (pfile,
"text following `%s' violates ANSI standard", directive);
}
@@ -2277,7 +2264,6 @@ cpp_get_token (pfile)
c = GETC();
if (c == EOF)
{
- handle_eof:
if (CPP_BUFFER (pfile)->manual_pop)
/* If we've been reading from redirected input, the
frontend will pop the buffer. */
@@ -2339,9 +2325,7 @@ cpp_get_token (pfile)
c = copy_comment (pfile, c);
else
c = skip_comment (pfile, c);
- if (c == EOF)
- goto handle_eof;
- else if (c != ' ')
+ if (c != ' ')
goto randomchar;
/* Comments are equivalent to spaces.