preprocessor: EOF location is at end of file [PR95013]
authorNathan Sidwell <nathan@acm.org>
Tue, 12 May 2020 20:33:11 +0000 (13:33 -0700)
committerNathan Sidwell <nathan@acm.org>
Tue, 12 May 2020 20:40:29 +0000 (13:40 -0700)
My recent C++ parser change to pay attention to EOF location uncovered
a separate bug.  The preprocesor's EOF logic would set the EOF
location to be the beginning of the last line of text in the file --
not the 'line' after that, which contains no characters.  Mostly.
This fixes things so that when we attempt to read the last line of the
main file, we don't pop the buffer until the tokenizer has a chance to
create an EOF token with the correct location information.  It is then
responsible for popping the buffer.  As it happens, raw string literal
tokenizing contained a bug -- it would increment the line number
prematurely, because it cached buffer->cur in a local variable, but
checked buffer->cur before updating it to figure out if it was at end
of file.   We fix up that too.

The EOF token intentionally doesn't have a column number -- it's not a
position on a line, it's a non-existant line.

The testsuite churn is just correcting the EOF location diagnostics.

libcpp/
PR preprocessor/95013
* lex.c (lex_raw_string): Process line notes before incrementing.
Correct incrementing condition.  Adjust for new
_cpp_get_fresh_line EOF behaviour.
(_cpp_get_fresh_line): Do not pop buffer at EOF, increment line
instead.
(_cpp_lex_direct): Adjust for new _cpp_get_fresh_line behaviour.
(cpp_directive_only_process): Assert we got a fresh line.
* traditional.c (_cpp_read_logical_line_trad): Adjust for new
_cpp_get_fresh_line behaviour.

gcc/testsuite/
* c-c++-common/goacc/pr79428-1.c: Adjust EOF diagnostic location.
* c-c++-common/gomp/pr79428-2.c: Likewise.
* g++.dg/cpp0x/decltype63.C: Likewise.
* g++.dg/cpp0x/gen-attrs-64.C: Likewise.
* g++.dg/cpp0x/pr68726.C: Likewise.
* g++.dg/cpp0x/pr78341.C: Likewise.
* g++.dg/cpp1y/pr65202.C: Likewise.
* g++.dg/cpp1y/pr65340.C: Likewise.
* g++.dg/cpp1y/pr68578.C: Likewise.
* g++.dg/cpp1z/class-deduction44.C: Likewise.
* g++.dg/diagnostic/unclosed-extern-c.C: Likewise.
* g++.dg/diagnostic/unclosed-function.C: Likewise.
* g++.dg/diagnostic/unclosed-namespace.C: Likewise.
* g++.dg/diagnostic/unclosed-struct.C: Likewise.
* g++.dg/ext/pr84598.C: Likewise.
* g++.dg/other/switch4.C: Likewise.
* g++.dg/parse/attr4.C: Likewise.
* g++.dg/parse/cond4.C: Likewise.
* g++.dg/parse/crash10.C: Likewise.
* g++.dg/parse/crash18.C: Likewise.
* g++.dg/parse/crash27.C: Likewise.
* g++.dg/parse/crash34.C: Likewise.
* g++.dg/parse/crash35.C: Likewise.
* g++.dg/parse/crash52.C: Likewise.
* g++.dg/parse/crash59.C: Likewise.
* g++.dg/parse/crash61.C: Likewise.
* g++.dg/parse/crash67.C: Likewise.
* g++.dg/parse/error14.C: Likewise.
* g++.dg/parse/error56.C: Likewise.
* g++.dg/parse/invalid1.C: Likewise.
* g++.dg/parse/parameter-declaration-1.C: Likewise.
* g++.dg/parse/parser-pr28152-2.C: Likewise.
* g++.dg/parse/parser-pr28152.C: Likewise.
* g++.dg/parse/pr68722.C: Likewise.
* g++.dg/pr46852.C: Likewise.
* g++.dg/pr46868.C: Likewise.
* g++.dg/template/crash115.C: Likewise.
* g++.dg/template/crash43.C: Likewise.
* g++.dg/template/crash90.C: Likewise.
* g++.dg/template/error-recovery1.C: Likewise.
* g++.dg/template/error57.C: Likewise.
* g++.old-deja/g++.other/crash31.C: Likewise.
* gcc.dg/empty-source-2.c: Likewise.
* gcc.dg/empty-source-3.c: Likewise.
* gcc.dg/noncompile/pr30552-3.c: Likewise.
* gcc.dg/noncompile/pr35447-1.c: Likewise.
* gcc.dg/pr20245-1.c: Likewise.
* gcc.dg/pr28419.c: Likewise.
* gcc.dg/rtl/truncated-rtl-file.c: Likewise.
* gcc.dg/unclosed-init.c: Likewise.
* obj-c++.dg/property/property-neg-6.mm: Likewise.
* obj-c++.dg/syntax-error-10.mm: Likewise.
* obj-c++.dg/syntax-error-8.mm: Likewise.
* obj-c++.dg/syntax-error-9.mm: Likewise.

58 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/pr79428-1.c
gcc/testsuite/c-c++-common/gomp/pr79428-2.c
gcc/testsuite/g++.dg/cpp0x/decltype63.C
gcc/testsuite/g++.dg/cpp0x/gen-attrs-64.C
gcc/testsuite/g++.dg/cpp0x/pr68726.C
gcc/testsuite/g++.dg/cpp0x/pr78341.C
gcc/testsuite/g++.dg/cpp1y/pr65202.C
gcc/testsuite/g++.dg/cpp1y/pr65340.C
gcc/testsuite/g++.dg/cpp1y/pr68578.C
gcc/testsuite/g++.dg/cpp1z/class-deduction44.C
gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C
gcc/testsuite/g++.dg/diagnostic/unclosed-function.C
gcc/testsuite/g++.dg/diagnostic/unclosed-namespace.C
gcc/testsuite/g++.dg/diagnostic/unclosed-struct.C
gcc/testsuite/g++.dg/ext/pr84598.C
gcc/testsuite/g++.dg/other/switch4.C
gcc/testsuite/g++.dg/parse/attr4.C
gcc/testsuite/g++.dg/parse/cond4.C
gcc/testsuite/g++.dg/parse/crash10.C
gcc/testsuite/g++.dg/parse/crash18.C
gcc/testsuite/g++.dg/parse/crash27.C
gcc/testsuite/g++.dg/parse/crash34.C
gcc/testsuite/g++.dg/parse/crash35.C
gcc/testsuite/g++.dg/parse/crash52.C
gcc/testsuite/g++.dg/parse/crash59.C
gcc/testsuite/g++.dg/parse/crash61.C
gcc/testsuite/g++.dg/parse/crash67.C
gcc/testsuite/g++.dg/parse/error14.C
gcc/testsuite/g++.dg/parse/error56.C
gcc/testsuite/g++.dg/parse/invalid1.C
gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
gcc/testsuite/g++.dg/parse/parser-pr28152-2.C
gcc/testsuite/g++.dg/parse/parser-pr28152.C
gcc/testsuite/g++.dg/parse/pr68722.C
gcc/testsuite/g++.dg/pr46852.C
gcc/testsuite/g++.dg/pr46868.C
gcc/testsuite/g++.dg/template/crash115.C
gcc/testsuite/g++.dg/template/crash43.C
gcc/testsuite/g++.dg/template/crash90.C
gcc/testsuite/g++.dg/template/error-recovery1.C
gcc/testsuite/g++.dg/template/error57.C
gcc/testsuite/g++.old-deja/g++.other/crash31.C
gcc/testsuite/gcc.dg/empty-source-2.c
gcc/testsuite/gcc.dg/empty-source-3.c
gcc/testsuite/gcc.dg/noncompile/pr30552-3.c
gcc/testsuite/gcc.dg/noncompile/pr35447-1.c
gcc/testsuite/gcc.dg/pr20245-1.c
gcc/testsuite/gcc.dg/pr28419.c
gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
gcc/testsuite/gcc.dg/unclosed-init.c
gcc/testsuite/obj-c++.dg/property/property-neg-6.mm
gcc/testsuite/obj-c++.dg/syntax-error-10.mm
gcc/testsuite/obj-c++.dg/syntax-error-8.mm
gcc/testsuite/obj-c++.dg/syntax-error-9.mm
libcpp/ChangeLog
libcpp/lex.c
libcpp/traditional.c

index 24a42765cc225a573c2719a37a0f7753b85f8a97..b84acda5a67f104d9f26b215ddce65cf03bbe1fb 100644 (file)
@@ -1,3 +1,61 @@
+2020-05-12  Nathan Sidwell  <nathan@acm.org>
+
+       PR preprocessor/95013
+       * c-c++-common/goacc/pr79428-1.c: Adjust EOF diagnostic location.
+       * c-c++-common/gomp/pr79428-2.c: Likewise.
+       * g++.dg/cpp0x/decltype63.C: Likewise.
+       * g++.dg/cpp0x/gen-attrs-64.C: Likewise.
+       * g++.dg/cpp0x/pr68726.C: Likewise.
+       * g++.dg/cpp0x/pr78341.C: Likewise.
+       * g++.dg/cpp1y/pr65202.C: Likewise.
+       * g++.dg/cpp1y/pr65340.C: Likewise.
+       * g++.dg/cpp1y/pr68578.C: Likewise.
+       * g++.dg/cpp1z/class-deduction44.C: Likewise.
+       * g++.dg/diagnostic/unclosed-extern-c.C: Likewise.
+       * g++.dg/diagnostic/unclosed-function.C: Likewise.
+       * g++.dg/diagnostic/unclosed-namespace.C: Likewise.
+       * g++.dg/diagnostic/unclosed-struct.C: Likewise.
+       * g++.dg/ext/pr84598.C: Likewise.
+       * g++.dg/other/switch4.C: Likewise.
+       * g++.dg/parse/attr4.C: Likewise.
+       * g++.dg/parse/cond4.C: Likewise.
+       * g++.dg/parse/crash10.C: Likewise.
+       * g++.dg/parse/crash18.C: Likewise.
+       * g++.dg/parse/crash27.C: Likewise.
+       * g++.dg/parse/crash34.C: Likewise.
+       * g++.dg/parse/crash35.C: Likewise.
+       * g++.dg/parse/crash52.C: Likewise.
+       * g++.dg/parse/crash59.C: Likewise.
+       * g++.dg/parse/crash61.C: Likewise.
+       * g++.dg/parse/crash67.C: Likewise.
+       * g++.dg/parse/error14.C: Likewise.
+       * g++.dg/parse/error56.C: Likewise.
+       * g++.dg/parse/invalid1.C: Likewise.
+       * g++.dg/parse/parameter-declaration-1.C: Likewise.
+       * g++.dg/parse/parser-pr28152-2.C: Likewise.
+       * g++.dg/parse/parser-pr28152.C: Likewise.
+       * g++.dg/parse/pr68722.C: Likewise.
+       * g++.dg/pr46852.C: Likewise.
+       * g++.dg/pr46868.C: Likewise.
+       * g++.dg/template/crash115.C: Likewise.
+       * g++.dg/template/crash43.C: Likewise.
+       * g++.dg/template/crash90.C: Likewise.
+       * g++.dg/template/error-recovery1.C: Likewise.
+       * g++.dg/template/error57.C: Likewise.
+       * g++.old-deja/g++.other/crash31.C: Likewise.
+       * gcc.dg/empty-source-2.c: Likewise.
+       * gcc.dg/empty-source-3.c: Likewise.
+       * gcc.dg/noncompile/pr30552-3.c: Likewise.
+       * gcc.dg/noncompile/pr35447-1.c: Likewise.
+       * gcc.dg/pr20245-1.c: Likewise.
+       * gcc.dg/pr28419.c: Likewise.
+       * gcc.dg/rtl/truncated-rtl-file.c: Likewise.
+       * gcc.dg/unclosed-init.c: Likewise.
+       * obj-c++.dg/property/property-neg-6.mm: Likewise.
+       * obj-c++.dg/syntax-error-10.mm: Likewise.
+       * obj-c++.dg/syntax-error-8.mm: Likewise.
+       * obj-c++.dg/syntax-error-9.mm: Likewise.
+
 2020-05-12  Marek Polacek  <polacek@redhat.com>
 
        PR c++/95074
index cf4aeaf684133c05a18fba9932130230168bd7dc..68dea5b145e8352ce9497fd0339412084b4f074d 100644 (file)
@@ -3,4 +3,6 @@
 void
 foo ()
 {
-#pragma acc routine /* { dg-error ".#pragma acc routine. must be at file scope|expected" } */
+#pragma acc routine /* { dg-error ".#pragma acc routine. must be at file scope" } */
+// { dg-error "expected" "end" { target c } .-1 }
+// { dg-error "-:expected" "end" { target c++ } .+1 }
index a26c462dbbdfbf2fd2e4822398ffe9268ee1a17a..0914963b8f9b18d19c7fbdb7c2e9e0a07df0c7ae 100644 (file)
@@ -4,4 +4,6 @@ void
 foo ()
 {
 #pragma omp sections
-#pragma omp section /* { dg-error "'#pragma omp section' may only be used in '#pragma omp sections' construct|not allowed|expected" } */
+#pragma omp section /* { dg-error "'#pragma omp section' may only be used in '#pragma omp sections' construct|not allowed" } */
+// { dg-error "expected" "end" { target c } .-1 }
+// { dg-error "-:expected" "end" { target c++ } .+1 }
index 7dded0aedd8e01e33e16e554c39035ee81d05d0f..b588bc3e5ef5185970ad53aa4518c67c5cd2818e 100644 (file)
@@ -5,4 +5,4 @@ template<typename T>
 class C{
  T t;
   decltype(t)::a:: // { dg-error "expected" }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 7fb7c3358fc77bc88547d4cc990e94e7065be664..822b64ea460eefaa20f378f43e58ad776af9f353 100644 (file)
@@ -2,4 +2,4 @@
 // { dg-do compile { target c++11 } }
 
 namespace alignas() N  {} // { dg-error "expected"  }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 262a1027c43afac50e6e17b4e5ddeac7bae7805e..636a20c83be4954cdc4ed7380f00358209db3c1d 100644 (file)
@@ -5,4 +5,4 @@ template <typename> struct A {
   template <typename... _Args>
   using __has_construct typename __construct_helper<_Args...>::type;  // { dg-error "expected" }
 } struct : A<int> {   // { dg-error "expected" }
-  // { dg-error "-:expected" }
+  // { dg-error "-:expected" "" { target *-*-* } .+1 }
index dbf0059a6ff8cc6cf6fa971fe18381569ec0d8b0..8573f9f0824d23e8641b940cc8b99d79c1bb2bca 100644 (file)
@@ -2,4 +2,4 @@
 // { dg-do compile { target c++11 } }
 
 alignas (alignas double // { dg-error "expected" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 0d217c7bc4efb69427ade24dfb13833f52550780..a76f8da689cba761e8d412b8a6134f550745aee0 100644 (file)
@@ -25,4 +25,4 @@ int main()
     foo<ns::bar> f;
     adl::swap(f, f) // { dg-error "expected ';'" }
 }
-// { dg-error "-:expected '.'" "expected end of namespace" }
+// { dg-error "-:expected '.'" "expected end of namespace" { target *-*-* } .+1 }
index 848eff965e5e7ae88b38cbb67a933207b6f564e0..d3e03f75df33647ef2cdc4a556083458a6426cbc 100644 (file)
@@ -16,4 +16,5 @@ struct traverse {
 };
 }
 auto &traverse = constant < functors :: traverse > ;
-operator()()->decltype(traverse(0, 0)) // { dg-error "no match|expected" }
+operator()()->decltype(traverse(0, 0))// { dg-error "no match"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 3fe07230117b0e9191b98347af18a1f547d7c3b8..18edd83cd7f3c83a7e6f3fdb4c6249f3f0ff3adf 100644 (file)
@@ -1,3 +1,4 @@
 // { dg-do compile { target c++14 } }
 
-template <typename> struct bar foo; template <> struct foo<>:  // { dg-error "class template|expected" }
+template <typename> struct bar foo; template <> struct foo<>:  // { dg-error "class template" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index af91c89e463f28f25599958e91aaba6e8bcf716d..95caa992a21ab692f47b37acc9ab5122890ccf1a 100644 (file)
@@ -3,4 +3,4 @@
 
 template <typename> struct A;
 template <typename> struct B : A < B { , // { dg-error ""  }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 4a2519b3a7c216d720ec43d5023d1362de2fa698..f905e4f3cc915f8747e2f33b791d75c8cecbd995 100644 (file)
@@ -10,4 +10,4 @@ void bar (void);
 
 void test (void);
 // { message "12: to match this '.'" "" { target *-*-* } open_extern_c }
-/* { dg-error "-:expected '.' at end of input"  } */
+/* { dg-error "-:expected '.' at end of input" "" { target *-*-* } .+1 } */
index c3a0bc67868bc55eacfcba88a754cfc5ee7103f0..4d841d5c6f4bb1c2d2d7f834e80a067b579be335 100644 (file)
@@ -1,4 +1,4 @@
 void test (void)
 { /* { dg-message "1: to match this '.'" } */
   int filler;
-  /* { dg-error "-:expected '.' at end of input" } */
+  /* { dg-error "-:expected '.' at end of input" "" { target *-*-* } .+1 } */
index 959354fc912cc0f446d271cff7b795fdb1113ffe..0887bc1e81366c47be07a6ca4a02c7d2da34693d 100644 (file)
@@ -1,3 +1,3 @@
 namespace unclosed { /* { dg-message "20: to match this '.'" } */
 int filler;
-/* { dg-error "-:expected '.' at end of input" } */
+/* { dg-error "-:expected '.' at end of input" "" { target *-*-* } .+1 } */
index cf8f1e419bb3efd7d11bd3b53b48865f32ac89f8..e68e599620418759bf66cc4846adc6f1c37d9611 100644 (file)
@@ -1,3 +1,3 @@
 struct unclosed { /* { dg-message "17: to match this '.'" } */
   int dummy;
-  // { dg-error "-:expected"  }
+  // { dg-error "-:expected" "" { target *-*-* } .+1 }
index 4b2cc07b47484f6d72279c01b56364da7a4e297c..8b78e0fddeab4cea042ebe74e434227175170db6 100644 (file)
@@ -1,4 +1,4 @@
 // { dg-options "-fpermissive -w" }
 
 template<int b> __attribute__ a([] { class c, __attribute__(vector_size(operator+()))) d; // { dg-error "" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 63203460a39fea0ca832f5daf7f9edefe9c6481f..5d0047b89c8d99cffac2d756bb75e864d39b46ed 100644 (file)
@@ -4,4 +4,4 @@ class a b;  // { dg-error "aggregate" }
 void c() {
   switch ()  // { dg-error "expected" }
   case b  // { dg-error "expected" }
-    // { dg-error "-:expected" }
+    // { dg-error "-:expected" "" { target *-*-* } .+1 }
index 7713fc96c64d25ed77036e8991a47c9db67da282..160c33e2625ce237ecf7109ab3e5a3cd4da98c8d 100644 (file)
@@ -1,3 +1,4 @@
 // PR c++/93684 - ICE-on-invalid with broken attribute.
 
-[[a:: // { dg-error "expected|expected" }
+[[a:: // { dg-error "expected" }
+  // { dg-error "-:expected" "" { target c++14 } .+1 }
index ae210e0d750c56cb60e6aa7ac4ca9e3c3892d2b8..893caeaa571729e38ff13163c0c6ff3676b95843 100644 (file)
@@ -4,3 +4,4 @@
 void foo()                                                                                                                              
 {                                                                                                                                       
   if (struct A{}// { dg-error "types may not be defined|expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 0a1a70349f1655227293705fec6b41eea8cdf928..7e2dec6bcb39ccaefbc0df1ffe58375f3809cc9a 100644 (file)
@@ -9,4 +9,4 @@ class
 {
   typename::
 ; // { dg-error "expected" }
- // { dg-error "-:expected" }
+ // { dg-error "-:expected" "" { target *-*-* } .+1 }
index bf68be1a73c0da42505f50a0b4b05e206d679dc8..596d3109ccccbd49ceae972aa2cca624d9d6e382 100644 (file)
@@ -4,4 +4,4 @@
 // PR 18095: ICE
 // Origin: Volker Reichelt <reichelt@gcc.gnu.org>
 
-struct A // { dg-error "-:expected" }
+struct A // { dg-error "-:expected" "" { target *-*-* } .+1 }
index 217928781d332901ddc2ee4fc3d98a0f6b485371..08977b2a4a8e917c8477cc89c196737f42bbcc41 100644 (file)
@@ -1,4 +1,5 @@
 // Bug: 23225
 
 void Dispatcher()
-        (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize|end of input" }
+        (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 181e5841747c16cc51649d99b833b17c3b37fd4b..86f79cc4aef7f44ac327fa6f21a13c4833aeddfd 100644 (file)
@@ -3,4 +3,5 @@
 
 void foo()
 {
-  namespace N { /* { dg-error "is not allowed|at end of input" } */
+  namespace N { /* { dg-error "is not allowed" } */
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 3cae70949db9b4619a39286aa67e6fbb4ffa338b..05f0a631a31365dd01f57cac1c9224e319bf715e 100644 (file)
@@ -4,4 +4,4 @@
 struct a {};
 
 class foo : public a, a                // { dg-error "duplicate base" }
-{ // { dg-error "-:at end of input" } 
+{ // { dg-error "-:at end of input" "" { target *-*-* } .+1 
index bc7f03c8d972351ee2e00d42b33ee807901c7d18..5dfb69c41d633fe0eb6fbc04b8445b20f1961415 100644 (file)
@@ -1,3 +1,4 @@
 // PR c++/39053
 
-void foo() = // { dg-error "initialized|expected" }
+void foo() = // { dg-error "initialized" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 5994751594348ecfb450be72e4bfbe447492cc74..7526b08e1053d05db4fe1f85dfb15d6a4e631822 100644 (file)
@@ -1,4 +1,4 @@
 // PR c++/53003
 
 struct A{ void a{} return b  // { dg-error "16:function definition" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index e41e15105aff3a35c206b943c984890674f0b947..713fe9f15e1897c1ecf82484b61a2f5edbd691c6 100644 (file)
@@ -5,4 +5,4 @@
 struct pair { constexpr pair (const) : }; // { dg-error "" }
 template <0> make_pair () {}             // { dg-error "" }
 pair prefix[] = { 0, make_pair }         // { dg-error "" }
-// { dg-error "-:expected" "" { target c++11 } }
+// { dg-error "-:expected" "" { target c++11 } .+1 }
index 8ae6e32aa50edafe2529bbcc76b54ca46fc0282e..2a5bb3f1d917c93b22222651331b1e0d1ea44197 100644 (file)
@@ -4,4 +4,4 @@
 class x0;
 template <x1> x2() {  // { dg-error "declared|type" }
 x0 x3 = x3. // { dg-error "incomplete type" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 15ebe24f4d78503a943e464b21df5e1e4aac675a..fd6541800071abc8812538a321dd1283857ecda0 100644 (file)
@@ -20,4 +20,4 @@ struct X
                  //    }
 
 };   // { dg-error "1:expected primary-expression before '.' token" "primary"  }
-// { dg-error "-:expected" "at end of input" }
+// { dg-error "-:expected" "at end of input" { target *-*-* } .+1 }
index aa0b5d2bed28026211e4e518ebd5c527d9c7fcc7..11d319731386ea92f3270e2fa9b825967f377c76 100644 (file)
@@ -4,4 +4,4 @@ template <0> int __copy_streambufs_eof; // { dg-error "" }
 class {
 // { dg-error "forbids" "" { target *-*-* } .+1 }
     friend __copy_streambufs_eof <> ( // { dg-error "" }
- // { dg-error "-:expected" }
+ // { dg-error "-:expected" "" { target *-*-* } .+1 }
index 72bc720bedcfaeb53c95e1a7d18089b68d419542..cb4ef1a69023678239fed32a5b37ea15c7aa21ff 100644 (file)
@@ -3,4 +3,4 @@
 // { dg-options "-w" }
 
 int foo ( foo += *[ // { dg-error "expected" }
-// { dg-error "-:invalid|expected" }
+// { dg-error "-:invalid|expected" "" { target *-*-* } .+1 }
index 98e82c892232a640d836caf78300cb6066f97849..c6106d5206e3999c07f89deecac3595f96bbac23 100644 (file)
@@ -4,4 +4,4 @@
 
 struct {
   a(void = 0; a(0), a(0) // { dg-error "" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index bf329248f6bfa43fc15befa6bcbf7e66689cd9c6..28048bd1a9a52b4a6157e61ade57c38f4040b807 100644 (file)
@@ -8,4 +8,4 @@ main (void)
 
   z = __complex__ (1.90000007326203904e+19, 0.0);   // { dg-error "expected primary-expression before '__complex__'" "primary-expression" } 
   z = __complex__ (1.0e+0, 0.0) / z;    // { dg-error "expected primary-expression before '__complex__'" "primaty-expression" } 
-  // { dg-error "-:at end of input" "end" }
+  // { dg-error "-:at end of input" "end" { target *-*-* } .+1 }
index 048cb501a579739e411dbe06534fb21c965ede10..34617340fabcc8c17aab4ac61f100edff1ab41bb 100644 (file)
@@ -8,4 +8,4 @@ main (void)
 
   z = _Complex (1.90000007326203904e+19, 0.0);   // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } 
   z = _Complex (1.0e+0, 0.0) / z;    // { dg-error "expected primary-expression before '_Complex'" "primary-expression" } 
-  // { dg-error "-:at end of input" "end" }
+  // { dg-error "-:at end of input" "end" { target *-*-* } .+1 }
index 2901cbfe191877dcef6d786114cbcf7108cae792..26f6d11cfe18756509d24a56bdf0dcd816714a0b 100644 (file)
@@ -6,4 +6,4 @@ class A {
   A _M_ios_locale ios_base(ios_base &) template <_Traits> class basic_ios {  // { dg-error "" }
     basic_ios basic_ios = operator= // { dg-error "" }
 // { dg-prune-output "file ends in default argument" }
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 9be1b92413cdd1cf3217dad074044d8d30607b03..5cfeaf96e19ee4e4eb09e02c74e5e06d2387af67 100644 (file)
@@ -5,4 +5,4 @@ template
 <
 class
 { // { dg-error "" }
-// { dg-error "-:"  }
+// { dg-error "-:" "" { target *-*-* } .+1 }
index dec79aaf114faafd102a7074071eb73d6c612711..25b8c966f4d43edfcfa4ebdd9c920b2b419a37a3 100644 (file)
@@ -2,4 +2,4 @@
 // { dg-do compile }
 
 template < int > struct S { S < // { dg-error "" }
-  // { dg-error "-:expected" }
+  // { dg-error "-:expected" "" { target *-*-* } .+1 }
index 84b284770eeed6d6c0482264746904f752c30457..c1a72352714db4095005e6de9bd7332785825c9c 100644 (file)
@@ -1,4 +1,4 @@
 // PR c++/56534
 
 template < struct template rebind < > // { dg-error "expected|must follow" }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index a5161d887b9f073012def26cdfac958d946efd54..3647a17cad83e18015efeff9a39db2dadb0b4645 100644 (file)
@@ -5,4 +5,4 @@ extern "C" {
   struct ___is_pod {
     enum {
       __value = (sizeof(__gnu_internal::__test_type<_Tp>(0)))}; // { dg-error "expected|declared"  }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 4cfc40822a864857af38cec1793f3a1aa577fbab..e2a58e31819b252094729b8f52ef205d78032c74 100644 (file)
@@ -4,4 +4,6 @@ template < unsigned >
 struct A ;
 template < typename >
 struct B ;
-template < typename T , A < B < T > {}// { dg-error "initializer|parse error|type|expected" }
+template < typename T , A < B < T > {} // { dg-error "parse error|non-type|initializer" }
+
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 05f398030711d5607710c55baefa522a5c0eed5b..6f9ce6d6bc2bb9dbc255ae53955dc67dca1546d3 100644 (file)
@@ -7,4 +7,4 @@ template < typename > struct T
   template < bool > struct T < S > // { dg-error "" }
   {
     void f () { // { dg-error "expected" }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index f3d87c53bcab7444d47eba6889e2a5e891d2d6fc..121fbb1d523c134d4587f6bad9eee89127992242 100644 (file)
@@ -2,4 +2,4 @@
 
 template <int()> struct a;
 template <int(b)> a < b                // { dg-error "int" }
-// { dg-error "-:expected"  }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index 734c3f4e31aec43ec12133a0dd956fa7cab37000..610dfe11270bb4ed526610eb786d09663df5d68d 100644 (file)
@@ -7,4 +7,4 @@ struct foo
 {
   foo();
 };
-// { dg-error "-:expected" }
+// { dg-error "-:expected" "" { target *-*-* } .+1 }
index e0180ec94751eac5ed5187fedd3296fb1023a22d..67906f9e8dd7807fde890d7ab253bc400eaa3305 100644 (file)
@@ -3,4 +3,4 @@
 /* { dg-do compile } */
 /* { dg-options "-pedantic" } */
 
-/* { dg-warning "-:ISO C forbids an empty translation unit" "empty" } */
+/* { dg-warning "-:ISO C forbids an empty translation unit" "empty" { target *-*-* } .+1 } */
index f8c58b3ef3fd503317d1472d089ff3b695113c03..f2877159fe4ae5184c5f215e041009cb58970264 100644 (file)
@@ -4,4 +4,4 @@
 /* { dg-do compile } */
 /* { dg-options "-pedantic-errors" } */
 
-/* { dg-error "-:ISO C forbids an empty translation unit" "empty" } */
+/* { dg-error "-:ISO C forbids an empty translation unit" "empty" { target *-*-* } .+1 } */
index 7b48e763ece01d2eced7133d254c160001ac2bf3..23cc7e6b253451e1c2d43943e675e6387a9b861a 100644 (file)
@@ -12,4 +12,5 @@ int main()
   int g()
     int a[( {int b} )]; /* { dg-error "braced-group within expression allowed only inside a function|declaration for parameter" } */
   return 0; /* { dg-error "expected declaration specifiers before" } */
-} /* { dg-error "expected declaration specifiers before|end of input|expected declaration or statement at end of input" } */
+} /* { dg-error "expected declaration" } */
+/* { dg-error "-:expected" "" { target *-*-* } .+1 } */
index b9bbb733fae4d146a536e2bc0e1a6abfc8447275..499b9595f3c42a76cce213d0e4a7bbe4d4a4b6f5 100644 (file)
@@ -4,4 +4,5 @@
 void foo()
 {
   ({ int i().; }); /* { dg-error "expected" } */
-} /* { dg-error "-:expected" } */
+} /* { dg-error "expected declaration" }
+/* { dg-error "-:expected" "" { target *-*-* } .+1 } */
index b5767d88b7bb15a7d9d5abd3ba7b418cf7480fdd..ac88074066269adea9eaf33cac524402eccaefda 100644 (file)
@@ -2,4 +2,5 @@
 /* { dg-do compile } */
 /* { dg-options "" } */
 
-void foo() x; /* { dg-error "-:expected" } */
+void foo() x; /* { dg-error "expected" } */
+/* { dg-error "-:expected" "" { target *-*-* } .+1 } */
index 9974864034bc4db384d0802ca5395396bea98db4..d418a165b1e8d5c34b8b13e3e063f7030417bcdd 100644 (file)
@@ -1,4 +1,4 @@
 /* { dg-do compile } */
 void foo() 
 const char* p = __FUNCTION__; /* { dg-error "" } */
-/* { dg-error "-:expected" "" } */
+/* { dg-error "-:expected" "" { target *-*-* } .+1 } */
index fffb4d7011af649615629fbec48c5614e5fc15bc..28d898bba9228436418f8048e5a966b2cc99567b 100644 (file)
@@ -1,2 +1,2 @@
 void __RTL test (void)
-{ /* { dg-error "-:no closing brace" } */
+{ /* { dg-error "-:no closing brace" "" { target *-*-* } .+1 } */
index 3deb88e777c90f2ec4886c5f8227373efbe173aa..16c42c43e55cc8d4032842f938f08607374d7d1a 100644 (file)
@@ -1,3 +1,3 @@
 int unclosed[] = { /* { dg-message "18: to match this '.'" } */
   42
- /* { dg-error "-: expected '.' at end of input" } */
+ /* { dg-error "-: expected '.' at end of input" { target *-*-* } .+1 } */
index c4a22eb6d203dee4ed69c802e15685f539a5d56d..1db6f0ba1b89d070eb6a0c7fb94063381ff56186 100644 (file)
@@ -6,4 +6,4 @@
   int iVar;
 }
 @property int FooBar /* { dg-error "expected ';' at end of input" } */
-                    /* { dg-error "expected '@end' at end of input" "" { target *-*-* } .-1 } */
+                    /* { dg-error "-:expected '@end' at end of input" "" { target *-*-* } .+1 } */
index e45abccfc7d33bc3471e1b84769f1c11fe7d09d6..6fcf96f769e53d6c0793ba87f92c10b764449b4d 100644 (file)
@@ -1 +1,2 @@
-@interface /* { dg-error "expected identifier" } */
+@interface
+/* { dg-error "-:expected identifier" "" { target *-*-* } .+1 } */
index 731ffda5f5e1064f0acaf0f20aa3da3c462f169e..f7cfe0e0895a6fb738b42ad7d20ce39bb575958f 100644 (file)
@@ -1 +1 @@
-@interface A /* { dg-error "expected ..end." } */
\ No newline at end of file
+@interface A /* { dg-error "-:expected ..end." "" { target *-*-* } .+1 } */
index 352dd34cf9433ac9bcdd0bf8d2e2598edf4f2cdc..ae104e5c140e0aed58200e89c275211f8b1025a1 100644 (file)
@@ -1,3 +1,3 @@
 @implementation SaturnDoc /* { dg-warning "cannot find interface declaration" } */
 - read: (void*)aStream ggg /* { dg-error "expected .:. at end of input" } */
-/* { dg-error "expected ..end. at end of input" "" { target *-*-* } .-1 } */
\ No newline at end of file
+/* { dg-error "-:expected ..end. at end of input" "" { target *-*-* } .+1 } */
index f6b7c01af97b58a867c8a337e0d95f41aac6e559..7c41c4e15392d1e016ec356f1cdf8993fedd4307 100644 (file)
@@ -1,3 +1,17 @@
+2020-05-12  Nathan Sidwell  <nathan@acm.org>
+
+       EOF location is at end of file
+       PR preprocessor/95013
+       * lex.c (lex_raw_string): Process line notes before incrementing.
+       Correct incrementing condition.  Adjust for new
+       _cpp_get_fresh_line EOF behaviour.
+       (_cpp_get_fresh_line): Do not pop buffer at EOF, increment line
+       instead.
+       (_cpp_lex_direct): Adjust for new _cpp_get_fresh_line behaviour.
+       (cpp_directive_only_process): Assert we got a fresh line.
+       * traditional.c (_cpp_read_logical_line_trad): Adjust for new
+       _cpp_get_fresh_line behaviour.
+
 2020-05-12  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.in (CET_HOST_FLAGS): New.
index 3bcf073710eb91984265db1fee4a3d862eba60a6..043852d14e2062759d3e99c51f1dd22f6c21e731 100644 (file)
@@ -1897,12 +1897,13 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
 
          BUF_APPEND (base, cur - base);
 
-         if (pfile->buffer->cur < pfile->buffer->rlimit)
+         pfile->buffer->cur = cur-1;
+         _cpp_process_line_notes (pfile, false);
+
+         if (pfile->buffer->next_line < pfile->buffer->rlimit)
            CPP_INCREMENT_LINE (pfile, 0);
          pfile->buffer->need_line = true;
 
-         pfile->buffer->cur = cur-1;
-         _cpp_process_line_notes (pfile, false);
          if (!_cpp_get_fresh_line (pfile))
            {
              location_t src_loc = token->src_loc;
@@ -1914,6 +1915,8 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
                _cpp_release_buff (pfile, first_buff);
              cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0,
                                   "unterminated raw string");
+             /* Now pop the buffer that _cpp_get_fresh_line did not.  */
+             _cpp_pop_buffer (pfile);
              return;
            }
 
@@ -2651,8 +2654,6 @@ _cpp_lex_token (cpp_reader *pfile)
 bool
 _cpp_get_fresh_line (cpp_reader *pfile)
 {
-  int return_at_eof;
-
   /* We can't get a new line until we leave the current directive.  */
   if (pfile->state.in_directive)
     return false;
@@ -2683,10 +2684,17 @@ _cpp_get_fresh_line (cpp_reader *pfile)
          buffer->next_line = buffer->rlimit;
        }
 
-      return_at_eof = buffer->return_at_eof;
-      _cpp_pop_buffer (pfile);
-      if (pfile->buffer == NULL || return_at_eof)
-       return false;
+      if (buffer->prev && !buffer->return_at_eof)
+       _cpp_pop_buffer (pfile);
+      else
+       {
+         /* End of translation.  Do not pop the buffer yet. Increment
+            line number so that the EOF token is on a line of its own
+            (_cpp_lex_direct doesn't increment in that case, because
+            it's hard for it to distinguish this special case). */
+         CPP_INCREMENT_LINE (pfile, 0);
+         return false;
+       }
     }
 }
 
@@ -2740,6 +2748,8 @@ _cpp_lex_direct (cpp_reader *pfile)
              /* Tell the compiler the line number of the EOF token.  */
              result->src_loc = pfile->line_table->highest_line;
              result->flags = BOL;
+             /* Now pop the buffer that _cpp_get_fresh_line did not.  */
+             _cpp_pop_buffer (pfile);
            }
          return result;
        }
@@ -3975,7 +3985,8 @@ cpp_directive_only_process (cpp_reader *pfile,
                  /* Prep things for directive handling. */
                  buffer->next_line = pos;
                  buffer->need_line = true;
-                 _cpp_get_fresh_line (pfile);
+                 bool ok = _cpp_get_fresh_line (pfile);
+                 gcc_checking_assert (ok);
 
                  /* Ensure proper column numbering for generated
                     error messages. */
index 039fcfe27f547545e77edc3f9c2b9c9575f55540..77adb3bf595fe5f358528b192f8e8ca5d78ee5b2 100644 (file)
@@ -312,7 +312,11 @@ _cpp_read_logical_line_trad (cpp_reader *pfile)
   do
     {
       if (pfile->buffer->need_line && !_cpp_get_fresh_line (pfile))
-       return false;
+       {
+         /* Now pop the buffer that _cpp_get_fresh_line did not.  */
+         _cpp_pop_buffer (pfile);
+         return false;
+       }
     }
   while (!_cpp_scan_out_logical_line (pfile, NULL, false)
         || pfile->state.skipping);