re PR preprocessor/57824 (Raw string literals not handled correctly in macro argument...
authorJakub Jelinek <jakub@redhat.com>
Wed, 10 Jul 2013 16:52:19 +0000 (18:52 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 10 Jul 2013 16:52:19 +0000 (18:52 +0200)
PR preprocessor/57824
* lex.c (lex_raw_string): Allow reading new-lines if
in_deferred_pragma or if parsing_args and there is still
data in the current buffer.

* c-c++-common/raw-string-17.c: New test.
* c-c++-common/gomp/pr57824.c: New test.

From-SVN: r200879

gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/pr57824.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/raw-string-17.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/lex.c

index c32ac8452b2d6fd9277a55beb2adf81e2fe552a6..cbe3ae02b1bdeee1de49eb8ca3614c618e9ea147 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR preprocessor/57824
+       * c-c++-common/raw-string-17.c: New test.
+       * c-c++-common/gomp/pr57824.c: New test.
+
 2013-07-10  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/57869
diff --git a/gcc/testsuite/c-c++-common/gomp/pr57824.c b/gcc/testsuite/c-c++-common/gomp/pr57824.c
new file mode 100644 (file)
index 0000000..a303da2
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR preprocessor/57824 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fopenmp" { target c } } */
+/* { dg-options "-std=c++11 -fopenmp" { target c++ } } */
+
+void bar ();
+
+void foo ()
+{
+#pragma omp parallel num_threads(sizeof R"(
+abc
+)")
+  bar ();
+}
diff --git a/gcc/testsuite/c-c++-common/raw-string-17.c b/gcc/testsuite/c-c++-common/raw-string-17.c
new file mode 100644 (file)
index 0000000..30df020
--- /dev/null
@@ -0,0 +1,30 @@
+/* PR preprocessor/57824 */
+/* { dg-do run } */
+/* { dg-options "-std=gnu99" { target c } } */
+/* { dg-options "-std=c++11" { target c++ } } */
+
+#define S(s) s
+#define T(s) s "\n"
+
+const char x[] = R"(
+abc
+)";
+const char y[] = S(R"(
+abc
+)");
+const char z[] = "\nabc\n";
+const char w[] = T(R"(
+abc)");
+
+int
+main ()
+{
+  if (sizeof x != sizeof y
+      || sizeof x != sizeof z
+      || sizeof x != sizeof w
+      || __builtin_memcmp (x, y, sizeof x)
+      || __builtin_memcmp (x, z, sizeof x)
+      || __builtin_memcmp (x, w, sizeof x))
+    __builtin_abort ();
+  return 0;
+}
index 195d728440ccedcb25040de09e2e9d070442eaae..9213232aa9873a7b465b996745b3aed8f2ce7a8a 100644 (file)
@@ -1,5 +1,10 @@
 2013-07-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR preprocessor/57824
+       * lex.c (lex_raw_string): Allow reading new-lines if
+       in_deferred_pragma or if parsing_args and there is still
+       data in the current buffer.
+
        * include/cpplib.h (cpp_token_val_index): Change parameter type to
        const cpp_token *.
        * lex.c (cpp_token_val_index): Likewise.
index 84e2af695d12a9ee537e3bea6a19f3b07c82e696..fc89bafd81b27b15b3e6654a978908369f9a6324 100644 (file)
@@ -1543,8 +1543,8 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
       else if (c == '\n')
        {
          if (pfile->state.in_directive
-             || pfile->state.parsing_args
-             || pfile->state.in_deferred_pragma)
+             || (pfile->state.parsing_args
+                 && pfile->buffer->next_line >= pfile->buffer->rlimit))
            {
              cur--;
              type = CPP_OTHER;