re PR c/61854 (Warning single-line comment for -std=c89?)

PR c/61854
libcpp/
	* init.c (struct lang_flags): Remove cplusplus_comments.
	(cpp_set_lang): Likewise.
	(post_options): Likewise.
	* lex.c (_cpp_lex_direct): Disallow C++ style comments in C90/C94.
testsuite/
	* gcc.dg/cpp/pr61854-1.c: New test.
	* gcc.dg/cpp/pr61854-2.c: New test.
	* gcc.dg/cpp/pr61854-3.c: New test.
	* gcc.dg/cpp/pr61854-3.h: New test.
	* gcc.dg/cpp/pr61854-4.c: New test.
	* gcc.dg/cpp/pr61854-5.c: New test.
	* gcc.dg/cpp/pr61854-6.c: New test.
	* gcc.dg/cpp/pr61854-7.c: New test.
	* gcc.dg/cpp/pr61854-c90.c: New test.
	* gcc.dg/cpp/pr61854-c94.c: New test.

From-SVN: r215339
This commit is contained in:
Marek Polacek 2014-09-17 21:49:46 +00:00 committed by Marek Polacek
parent 010718fc37
commit 909eb89ca5
14 changed files with 206 additions and 26 deletions

View File

@ -1,3 +1,17 @@
2014-09-17 Marek Polacek <polacek@redhat.com>
PR c/61854
* gcc.dg/cpp/pr61854-1.c: New test.
* gcc.dg/cpp/pr61854-2.c: New test.
* gcc.dg/cpp/pr61854-3.c: New test.
* gcc.dg/cpp/pr61854-3.h: New test.
* gcc.dg/cpp/pr61854-4.c: New test.
* gcc.dg/cpp/pr61854-5.c: New test.
* gcc.dg/cpp/pr61854-6.c: New test.
* gcc.dg/cpp/pr61854-7.c: New test.
* gcc.dg/cpp/pr61854-c90.c: New test.
* gcc.dg/cpp/pr61854-c94.c: New test.
2014-09-17 Jakub Jelinek <jakub@redhat.com> 2014-09-17 Jakub Jelinek <jakub@redhat.com>
PR debug/63284 PR debug/63284

View File

@ -0,0 +1,15 @@
/* PR c/61854 */
/* { dg-do run } */
/* { dg-options "-std=c89" } */
int
main (void)
{
int i = 1 //**/ 2
;
int j = 1 //**/ 2
;
if (i != 0 || j != 0)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,15 @@
/* PR c/61854 */
/* { dg-do run } */
/* { dg-options "-std=gnu89" } */
int
main (void)
{
int i = 1 //**/ 2
;
int j = 1 //**/ 2
;
if (i != 1 || j != 1)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,6 @@
/* PR c/61854 */
/* { dg-do preprocess } */
/* { dg-options "-std=c89" } */
#include "pr61854-3.h"
int i;

View File

@ -0,0 +1,4 @@
#pragma GCC system_header
// X
// Y
// Z

View File

@ -0,0 +1,16 @@
/* PR c/61854 */
/* { dg-do preprocess } */
/* { dg-options "-std=c89" } */
void
foo (void)
{
#if 0
// Do not error here.
#endif
#if 1
// But error here.
#endif
/* { dg-error "C\\+\\+ style comments are not allowed in ISO C90" "comments" { target *-*-*} 12 } */
/* { dg-error "reported only once" "" { target *-*-*} 12 } */
}

View File

@ -0,0 +1,15 @@
/* PR c/61854 */
/* { dg-do run } */
/* { dg-options "-std=c89" } */
#define h(x) #x
#define s(x) h(x)
#define foo //
int
main (void)
{
if (__builtin_memcmp (s(foo), "//", 3) != 0)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,19 @@
/* PR c/61854 */
/* { dg-do run } */
/* { dg-options "-std=gnu89" } */
int
main (void)
{
int i = 0
#if 0
// /*
#else
// */
+1
#endif
;
if (i != 1)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,19 @@
/* PR c/61854 */
/* { dg-do run } */
/* { dg-options "-std=c89" } */
int
main (void)
{
int i = 0
#if 0
// /*
#else
// */
+1
#endif
;
if (i != 0)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,13 @@
/* PR c/61854 */
/* { dg-do preprocess } */
/* { dg-options "-std=iso9899:1990" } */
void
foo (void)
{
// 1st
/* { dg-error "C\\+\\+ style comments are not allowed in ISO C90" "comments" { target *-*-*} 8 } */
/* { dg-error "reported only once" "" { target *-*-*} 8 } */
// 2nd
// 3rd
}

View File

@ -0,0 +1,13 @@
/* PR c/61854 */
/* { dg-do preprocess } */
/* { dg-options "-std=iso9899:199409" } */
void
foo (void)
{
// 1st
/* { dg-error "C\\+\\+ style comments are not allowed in ISO C90" "comments" { target *-*-*} 8 } */
/* { dg-error "reported only once" "" { target *-*-*} 8 } */
// 2nd
// 3rd
}

View File

@ -1,3 +1,11 @@
2014-09-17 Marek Polacek <polacek@redhat.com>
PR c/61854
* init.c (struct lang_flags): Remove cplusplus_comments.
(cpp_set_lang): Likewise.
(post_options): Likewise.
* lex.c (_cpp_lex_direct): Disallow C++ style comments in C90/C94.
2014-09-09 Manuel López-Ibáñez <manu@gcc.gnu.org> 2014-09-09 Manuel López-Ibáñez <manu@gcc.gnu.org>
* include/cpplib.h (struct cpp_options): Declare warn_normalize as * include/cpplib.h (struct cpp_options): Declare warn_normalize as

View File

@ -83,7 +83,6 @@ struct lang_flags
char extended_identifiers; char extended_identifiers;
char c11_identifiers; char c11_identifiers;
char std; char std;
char cplusplus_comments;
char digraphs; char digraphs;
char uliterals; char uliterals;
char rliterals; char rliterals;
@ -94,23 +93,23 @@ struct lang_flags
}; };
static const struct lang_flags lang_defaults[] = static const struct lang_flags lang_defaults[] =
{ /* c99 c++ xnum xid c11 std // digr ulit rlit udlit bincst digsep trig */ { /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig */
/* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
/* GNUC99 */ { 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 }, /* GNUC99 */ { 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
/* GNUC11 */ { 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0 }, /* GNUC11 */ { 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 },
/* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 }, /* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
/* STDC94 */ { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 }, /* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
/* STDC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* STDC99 */ { 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
/* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, /* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 },
/* GNUCXX */ { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
/* CXX98 */ { 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* CXX98 */ { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 },
/* GNUCXX11 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0 }, /* GNUCXX11 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0 },
/* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }, /* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1 },
/* GNUCXX14 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0 }, /* GNUCXX14 */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 },
/* CXX14 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* CXX14 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
/* GNUCXX1Z */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0 }, /* GNUCXX1Z */ { 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 },
/* CXX1Z */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, /* CXX1Z */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
/* ASM */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
/* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11, /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11,
GNUCXX14, and CXX14 when no longer experimental (when all uses of GNUCXX14, and CXX14 when no longer experimental (when all uses of
identifiers in the compiler have been audited for correct handling identifiers in the compiler have been audited for correct handling
@ -131,7 +130,6 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers; CPP_OPTION (pfile, extended_identifiers) = l->extended_identifiers;
CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers; CPP_OPTION (pfile, c11_identifiers) = l->c11_identifiers;
CPP_OPTION (pfile, std) = l->std; CPP_OPTION (pfile, std) = l->std;
CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
CPP_OPTION (pfile, digraphs) = l->digraphs; CPP_OPTION (pfile, digraphs) = l->digraphs;
CPP_OPTION (pfile, uliterals) = l->uliterals; CPP_OPTION (pfile, uliterals) = l->uliterals;
CPP_OPTION (pfile, rliterals) = l->rliterals; CPP_OPTION (pfile, rliterals) = l->rliterals;
@ -775,8 +773,6 @@ post_options (cpp_reader *pfile)
if (CPP_OPTION (pfile, traditional)) if (CPP_OPTION (pfile, traditional))
{ {
CPP_OPTION (pfile, cplusplus_comments) = 0;
CPP_OPTION (pfile, trigraphs) = 0; CPP_OPTION (pfile, trigraphs) = 0;
CPP_OPTION (pfile, warn_trigraphs) = 0; CPP_OPTION (pfile, warn_trigraphs) = 0;
} }

View File

@ -2322,12 +2322,15 @@ _cpp_lex_direct (cpp_reader *pfile)
if (_cpp_skip_block_comment (pfile)) if (_cpp_skip_block_comment (pfile))
cpp_error (pfile, CPP_DL_ERROR, "unterminated comment"); cpp_error (pfile, CPP_DL_ERROR, "unterminated comment");
} }
else if (c == '/' && (CPP_OPTION (pfile, cplusplus_comments) else if (c == '/' && ! CPP_OPTION (pfile, traditional))
|| cpp_in_system_header (pfile)))
{ {
/* Don't warn for system headers. */
if (cpp_in_system_header (pfile))
;
/* Warn about comments if pedantically GNUC89, and not /* Warn about comments if pedantically GNUC89, and not
in system headers. */ in system headers. */
if (CPP_OPTION (pfile, lang) == CLK_GNUC89 && CPP_PEDANTIC (pfile) else if (CPP_OPTION (pfile, lang) == CLK_GNUC89
&& CPP_PEDANTIC (pfile)
&& ! buffer->warned_cplusplus_comments) && ! buffer->warned_cplusplus_comments)
{ {
cpp_error (pfile, CPP_DL_PEDWARN, cpp_error (pfile, CPP_DL_PEDWARN,
@ -2347,7 +2350,31 @@ _cpp_lex_direct (cpp_reader *pfile)
"(this will be reported only once per input file)"); "(this will be reported only once per input file)");
buffer->warned_cplusplus_comments = 1; buffer->warned_cplusplus_comments = 1;
} }
/* In C89/C94, C++ style comments are forbidden. */
else if ((CPP_OPTION (pfile, lang) == CLK_STDC89
|| CPP_OPTION (pfile, lang) == CLK_STDC94))
{
/* But don't be confused about valid code such as
- // immediately followed by *,
- // in a preprocessing directive,
- // in an #if 0 block. */
if (buffer->cur[1] == '*'
|| pfile->state.in_directive
|| pfile->state.skipping)
{
result->type = CPP_DIV;
break;
}
else if (! buffer->warned_cplusplus_comments)
{
cpp_error (pfile, CPP_DL_ERROR,
"C++ style comments are not allowed in ISO C90");
cpp_error (pfile, CPP_DL_ERROR,
"(this will be reported only once per input "
"file)");
buffer->warned_cplusplus_comments = 1;
}
}
if (skip_line_comment (pfile) && CPP_OPTION (pfile, warn_comments)) if (skip_line_comment (pfile) && CPP_OPTION (pfile, warn_comments))
cpp_warning (pfile, CPP_W_COMMENTS, "multi-line comment"); cpp_warning (pfile, CPP_W_COMMENTS, "multi-line comment");
} }