re PR c/61854 (Warning single-line comment for -std=c89?)
authorMarek Polacek <polacek@redhat.com>
Wed, 17 Sep 2014 21:49:46 +0000 (21:49 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 17 Sep 2014 21:49:46 +0000 (21:49 +0000)
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

14 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/pr61854-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-3.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-6.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-7.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-c90.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/pr61854-c94.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/init.c
libcpp/lex.c

index 0362744727bd7081b8d7aee38651a7f6bd52e86f..28157924c47bbc051002edbe101bc751018a120a 100644 (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>
 
        PR debug/63284
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-1.c b/gcc/testsuite/gcc.dg/cpp/pr61854-1.c
new file mode 100644 (file)
index 0000000..364a511
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-2.c b/gcc/testsuite/gcc.dg/cpp/pr61854-2.c
new file mode 100644 (file)
index 0000000..883db21
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-3.c b/gcc/testsuite/gcc.dg/cpp/pr61854-3.c
new file mode 100644 (file)
index 0000000..916c12e
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR c/61854 */
+/* { dg-do preprocess } */
+/* { dg-options "-std=c89" } */
+
+#include "pr61854-3.h"
+int i;
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-3.h b/gcc/testsuite/gcc.dg/cpp/pr61854-3.h
new file mode 100644 (file)
index 0000000..fd798bd
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma GCC system_header
+// X
+// Y
+// Z
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-4.c b/gcc/testsuite/gcc.dg/cpp/pr61854-4.c
new file mode 100644 (file)
index 0000000..5cfa5a7
--- /dev/null
@@ -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 } */
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-5.c b/gcc/testsuite/gcc.dg/cpp/pr61854-5.c
new file mode 100644 (file)
index 0000000..a7628dc
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-6.c b/gcc/testsuite/gcc.dg/cpp/pr61854-6.c
new file mode 100644 (file)
index 0000000..1b60cc3
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-7.c b/gcc/testsuite/gcc.dg/cpp/pr61854-7.c
new file mode 100644 (file)
index 0000000..8bf479b
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-c90.c b/gcc/testsuite/gcc.dg/cpp/pr61854-c90.c
new file mode 100644 (file)
index 0000000..37eecbe
--- /dev/null
@@ -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
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/pr61854-c94.c b/gcc/testsuite/gcc.dg/cpp/pr61854-c94.c
new file mode 100644 (file)
index 0000000..64f1e18
--- /dev/null
@@ -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
+}
index d98611925d22154e9a4a1595e9f8e588129f6834..77713476d4c7727172aceed47938562cbeb93de9 100644 (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>
 
        * include/cpplib.h (struct cpp_options): Declare warn_normalize as
index d61237490a4dfa787f905793eca32d8355a28194..1121962148b490bf4a7a59346f2feeb628ba1787 100644 (file)
@@ -83,7 +83,6 @@ struct lang_flags
   char extended_identifiers;
   char c11_identifiers;
   char std;
-  char cplusplus_comments;
   char digraphs;
   char uliterals;
   char rliterals;
@@ -94,23 +93,23 @@ struct lang_flags
 };
 
 static const struct lang_flags lang_defaults[] =
-{ /*              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 },
-  /* GNUC99   */  { 1,  0,  1,  0,  0,  0,  1,  1,  1,   1,   0,    0,     0,     0 },
-  /* GNUC11   */  { 1,  0,  1,  0,  1,  0,  1,  1,  1,   1,   0,    0,     0,     0 },
-  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,  0,  0,   0,   0,    0,     0,     1 },
-  /* STDC94   */  { 0,  0,  0,  0,  0,  1,  0,  1,  0,   0,   0,    0,     0,     1 },
-  /* STDC99   */  { 1,  0,  1,  0,  0,  1,  1,  1,  0,   0,   0,    0,     0,     1 },
-  /* STDC11   */  { 1,  0,  1,  0,  1,  1,  1,  1,  1,   0,   0,    0,     0,     1 },
-  /* GNUCXX   */  { 0,  1,  1,  0,  0,  0,  1,  1,  0,   0,   0,    0,     0,     0 },
-  /* CXX98    */  { 0,  1,  0,  0,  0,  1,  1,  1,  0,   0,   0,    0,     0,     1 },
-  /* GNUCXX11 */  { 1,  1,  1,  0,  1,  0,  1,  1,  1,   1,   1,    0,     0,     0 },
-  /* CXX11    */  { 1,  1,  1,  0,  1,  1,  1,  1,  1,   1,   1,    0,     0,     1 },
-  /* GNUCXX14 */  { 1,  1,  1,  0,  1,  0,  1,  1,  1,   1,   1,    1,     1,     0 },
-  /* CXX14    */  { 1,  1,  1,  0,  1,  1,  1,  1,  1,   1,   1,    1,     1,     1 },
-  /* GNUCXX1Z */  { 1,  1,  1,  0,  1,  0,  1,  1,  1,   1,   1,    1,     1,     0 },
-  /* CXX1Z    */  { 1,  1,  1,  0,  1,  1,  1,  1,  1,   1,   1,    1,     1,     0 },
-  /* ASM      */  { 0,  0,  1,  0,  0,  0,  1,  0,  0,   0,   0,    0,     0,     0 }
+{ /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig */
+  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   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,   0,    0,     0,     0 },
+  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   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,   0,   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,   0,   0,   0,    0,     0,     0 },
+  /* 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,    0,     0,     0 },
+  /* 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,     0 },
+  /* 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,     0 },
+  /* CXX1Z    */  { 1,  1,  1,  0,  1,  1,  1,   1,   1,   1,    1,     1,     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,
      GNUCXX14, and CXX14 when no longer experimental (when all uses of
      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, c11_identifiers)           = l->c11_identifiers;
   CPP_OPTION (pfile, std)                       = l->std;
-  CPP_OPTION (pfile, cplusplus_comments)        = l->cplusplus_comments;
   CPP_OPTION (pfile, digraphs)                  = l->digraphs;
   CPP_OPTION (pfile, uliterals)                         = l->uliterals;
   CPP_OPTION (pfile, rliterals)                         = l->rliterals;
@@ -775,8 +773,6 @@ post_options (cpp_reader *pfile)
 
   if (CPP_OPTION (pfile, traditional))
     {
-      CPP_OPTION (pfile, cplusplus_comments) = 0;
-
       CPP_OPTION (pfile, trigraphs) = 0;
       CPP_OPTION (pfile, warn_trigraphs) = 0;
     }
index 5366dad9e44f1dfa5918d6680d08ca6a3c54417c..bdaa0705bc7962bc89ac7a2594b4658b540530ac 100644 (file)
@@ -2322,13 +2322,16 @@ _cpp_lex_direct (cpp_reader *pfile)
          if (_cpp_skip_block_comment (pfile))
            cpp_error (pfile, CPP_DL_ERROR, "unterminated comment");
        }
-      else if (c == '/' && (CPP_OPTION (pfile, cplusplus_comments)
-                           || cpp_in_system_header (pfile)))
+      else if (c == '/' && ! CPP_OPTION (pfile, traditional))
        {
+         /* Don't warn for system headers.  */
+         if (cpp_in_system_header (pfile))
+           ;
          /* Warn about comments if pedantically GNUC89, and not
             in system headers.  */
-         if (CPP_OPTION (pfile, lang) == CLK_GNUC89 && CPP_PEDANTIC (pfile)
-             && ! buffer->warned_cplusplus_comments)
+         else if (CPP_OPTION (pfile, lang) == CLK_GNUC89
+                  && CPP_PEDANTIC (pfile)
+                  && ! buffer->warned_cplusplus_comments)
            {
              cpp_error (pfile, CPP_DL_PEDWARN,
                         "C++ style comments are not allowed in ISO C90");
@@ -2347,7 +2350,31 @@ _cpp_lex_direct (cpp_reader *pfile)
                         "(this will be reported only once per input file)");
              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))
            cpp_warning (pfile, CPP_W_COMMENTS, "multi-line comment");
        }