From: Nathan Sidwell Date: Tue, 12 May 2020 20:33:11 +0000 (-0700) Subject: preprocessor: EOF location is at end of file [PR95013] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2a0225e47868fbfceaecaa5e2de96c1c5a2251ea;p=gcc.git preprocessor: EOF location is at end of file [PR95013] 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. --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 24a42765cc2..b84acda5a67 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,61 @@ +2020-05-12 Nathan Sidwell + + 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 PR c++/95074 diff --git a/gcc/testsuite/c-c++-common/goacc/pr79428-1.c b/gcc/testsuite/c-c++-common/goacc/pr79428-1.c index cf4aeaf6841..68dea5b145e 100644 --- a/gcc/testsuite/c-c++-common/goacc/pr79428-1.c +++ b/gcc/testsuite/c-c++-common/goacc/pr79428-1.c @@ -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 } diff --git a/gcc/testsuite/c-c++-common/gomp/pr79428-2.c b/gcc/testsuite/c-c++-common/gomp/pr79428-2.c index a26c462dbbd..0914963b8f9 100644 --- a/gcc/testsuite/c-c++-common/gomp/pr79428-2.c +++ b/gcc/testsuite/c-c++-common/gomp/pr79428-2.c @@ -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 } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype63.C b/gcc/testsuite/g++.dg/cpp0x/decltype63.C index 7dded0aedd8..b588bc3e5ef 100644 --- a/gcc/testsuite/g++.dg/cpp0x/decltype63.C +++ b/gcc/testsuite/g++.dg/cpp0x/decltype63.C @@ -5,4 +5,4 @@ template class C{ T t; decltype(t)::a:: // { dg-error "expected" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-64.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-64.C index 7fb7c3358fc..822b64ea460 100644 --- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-64.C +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-64.C @@ -2,4 +2,4 @@ // { dg-do compile { target c++11 } } namespace alignas() N {} // { dg-error "expected" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr68726.C b/gcc/testsuite/g++.dg/cpp0x/pr68726.C index 262a1027c43..636a20c83be 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr68726.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr68726.C @@ -5,4 +5,4 @@ template struct A { template using __has_construct typename __construct_helper<_Args...>::type; // { dg-error "expected" } } struct : A { // { dg-error "expected" } - // { dg-error "-:expected" } + // { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr78341.C b/gcc/testsuite/g++.dg/cpp0x/pr78341.C index dbf0059a6ff..8573f9f0824 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr78341.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr78341.C @@ -2,4 +2,4 @@ // { dg-do compile { target c++11 } } alignas (alignas double // { dg-error "expected" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr65202.C b/gcc/testsuite/g++.dg/cpp1y/pr65202.C index 0d217c7bc4e..a76f8da689c 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr65202.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr65202.C @@ -25,4 +25,4 @@ int main() foo f; adl::swap(f, f) // { dg-error "expected ';'" } } -// { dg-error "-:expected '.'" "expected end of namespace" } +// { dg-error "-:expected '.'" "expected end of namespace" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr65340.C b/gcc/testsuite/g++.dg/cpp1y/pr65340.C index 848eff965e5..d3e03f75df3 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr65340.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr65340.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr68578.C b/gcc/testsuite/g++.dg/cpp1y/pr68578.C index 3fe07230117..18edd83cd7f 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr68578.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr68578.C @@ -1,3 +1,4 @@ // { dg-do compile { target c++14 } } -template struct bar foo; template <> struct foo<>: // { dg-error "class template|expected" } +template struct bar foo; template <> struct foo<>: // { dg-error "class template" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C index af91c89e463..95caa992a21 100644 --- a/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C @@ -3,4 +3,4 @@ template struct A; template struct B : A < B { , // { dg-error "" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C b/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C index 4a2519b3a7c..f905e4f3cc9 100644 --- a/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C +++ b/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C @@ -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 } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/unclosed-function.C b/gcc/testsuite/g++.dg/diagnostic/unclosed-function.C index c3a0bc67868..4d841d5c6f4 100644 --- a/gcc/testsuite/g++.dg/diagnostic/unclosed-function.C +++ b/gcc/testsuite/g++.dg/diagnostic/unclosed-function.C @@ -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 } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/unclosed-namespace.C b/gcc/testsuite/g++.dg/diagnostic/unclosed-namespace.C index 959354fc912..0887bc1e813 100644 --- a/gcc/testsuite/g++.dg/diagnostic/unclosed-namespace.C +++ b/gcc/testsuite/g++.dg/diagnostic/unclosed-namespace.C @@ -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 } */ diff --git a/gcc/testsuite/g++.dg/diagnostic/unclosed-struct.C b/gcc/testsuite/g++.dg/diagnostic/unclosed-struct.C index cf8f1e419bb..e68e5996204 100644 --- a/gcc/testsuite/g++.dg/diagnostic/unclosed-struct.C +++ b/gcc/testsuite/g++.dg/diagnostic/unclosed-struct.C @@ -1,3 +1,3 @@ struct unclosed { /* { dg-message "17: to match this '.'" } */ int dummy; - // { dg-error "-:expected" } + // { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/ext/pr84598.C b/gcc/testsuite/g++.dg/ext/pr84598.C index 4b2cc07b474..8b78e0fddea 100644 --- a/gcc/testsuite/g++.dg/ext/pr84598.C +++ b/gcc/testsuite/g++.dg/ext/pr84598.C @@ -1,4 +1,4 @@ // { dg-options "-fpermissive -w" } template __attribute__ a([] { class c, __attribute__(vector_size(operator+()))) d; // { dg-error "" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/other/switch4.C b/gcc/testsuite/g++.dg/other/switch4.C index 63203460a39..5d0047b89c8 100644 --- a/gcc/testsuite/g++.dg/other/switch4.C +++ b/gcc/testsuite/g++.dg/other/switch4.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/attr4.C b/gcc/testsuite/g++.dg/parse/attr4.C index 7713fc96c64..160c33e2625 100644 --- a/gcc/testsuite/g++.dg/parse/attr4.C +++ b/gcc/testsuite/g++.dg/parse/attr4.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/cond4.C b/gcc/testsuite/g++.dg/parse/cond4.C index ae210e0d750..893caeaa571 100644 --- a/gcc/testsuite/g++.dg/parse/cond4.C +++ b/gcc/testsuite/g++.dg/parse/cond4.C @@ -4,3 +4,4 @@ void foo() { if (struct A{}// { dg-error "types may not be defined|expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/crash10.C b/gcc/testsuite/g++.dg/parse/crash10.C index 0a1a70349f1..7e2dec6bcb3 100644 --- a/gcc/testsuite/g++.dg/parse/crash10.C +++ b/gcc/testsuite/g++.dg/parse/crash10.C @@ -9,4 +9,4 @@ class { typename:: ; // { dg-error "expected" } - // { dg-error "-:expected" } + // { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/crash18.C b/gcc/testsuite/g++.dg/parse/crash18.C index bf68be1a73c..596d3109ccc 100644 --- a/gcc/testsuite/g++.dg/parse/crash18.C +++ b/gcc/testsuite/g++.dg/parse/crash18.C @@ -4,4 +4,4 @@ // PR 18095: ICE // Origin: Volker Reichelt -struct A // { dg-error "-:expected" } +struct A // { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/crash27.C b/gcc/testsuite/g++.dg/parse/crash27.C index 217928781d3..08977b2a4a8 100644 --- a/gcc/testsuite/g++.dg/parse/crash27.C +++ b/gcc/testsuite/g++.dg/parse/crash27.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/crash34.C b/gcc/testsuite/g++.dg/parse/crash34.C index 181e5841747..86f79cc4aef 100644 --- a/gcc/testsuite/g++.dg/parse/crash34.C +++ b/gcc/testsuite/g++.dg/parse/crash34.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/crash35.C b/gcc/testsuite/g++.dg/parse/crash35.C index 3cae70949db..05f0a631a31 100644 --- a/gcc/testsuite/g++.dg/parse/crash35.C +++ b/gcc/testsuite/g++.dg/parse/crash35.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/crash52.C b/gcc/testsuite/g++.dg/parse/crash52.C index bc7f03c8d97..5dfb69c41d6 100644 --- a/gcc/testsuite/g++.dg/parse/crash52.C +++ b/gcc/testsuite/g++.dg/parse/crash52.C @@ -1,3 +1,4 @@ // PR c++/39053 -void foo() = // { dg-error "initialized|expected" } +void foo() = // { dg-error "initialized" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/crash59.C b/gcc/testsuite/g++.dg/parse/crash59.C index 59947515943..7526b08e105 100644 --- a/gcc/testsuite/g++.dg/parse/crash59.C +++ b/gcc/testsuite/g++.dg/parse/crash59.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/crash61.C b/gcc/testsuite/g++.dg/parse/crash61.C index e41e15105af..713fe9f15e1 100644 --- a/gcc/testsuite/g++.dg/parse/crash61.C +++ b/gcc/testsuite/g++.dg/parse/crash61.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/crash67.C b/gcc/testsuite/g++.dg/parse/crash67.C index 8ae6e32aa50..2a5bb3f1d91 100644 --- a/gcc/testsuite/g++.dg/parse/crash67.C +++ b/gcc/testsuite/g++.dg/parse/crash67.C @@ -4,4 +4,4 @@ class x0; template x2() { // { dg-error "declared|type" } x0 x3 = x3. // { dg-error "incomplete type" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/error14.C b/gcc/testsuite/g++.dg/parse/error14.C index 15ebe24f4d7..fd654180007 100644 --- a/gcc/testsuite/g++.dg/parse/error14.C +++ b/gcc/testsuite/g++.dg/parse/error14.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/error56.C b/gcc/testsuite/g++.dg/parse/error56.C index aa0b5d2bed2..11d31973138 100644 --- a/gcc/testsuite/g++.dg/parse/error56.C +++ b/gcc/testsuite/g++.dg/parse/error56.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/invalid1.C b/gcc/testsuite/g++.dg/parse/invalid1.C index 72bc720bedc..cb4ef1a6902 100644 --- a/gcc/testsuite/g++.dg/parse/invalid1.C +++ b/gcc/testsuite/g++.dg/parse/invalid1.C @@ -3,4 +3,4 @@ // { dg-options "-w" } int foo ( foo += *[ // { dg-error "expected" } -// { dg-error "-:invalid|expected" } +// { dg-error "-:invalid|expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C index 98e82c89223..c6106d5206e 100644 --- a/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C +++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C @@ -4,4 +4,4 @@ struct { a(void = 0; a(0), a(0) // { dg-error "" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C index bf329248f6b..28048bd1a9a 100644 --- a/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152.C b/gcc/testsuite/g++.dg/parse/parser-pr28152.C index 048cb501a57..34617340fab 100644 --- a/gcc/testsuite/g++.dg/parse/parser-pr28152.C +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/parse/pr68722.C b/gcc/testsuite/g++.dg/parse/pr68722.C index 2901cbfe191..26f6d11cfe1 100644 --- a/gcc/testsuite/g++.dg/parse/pr68722.C +++ b/gcc/testsuite/g++.dg/parse/pr68722.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/pr46852.C b/gcc/testsuite/g++.dg/pr46852.C index 9be1b92413c..5cfeaf96e19 100644 --- a/gcc/testsuite/g++.dg/pr46852.C +++ b/gcc/testsuite/g++.dg/pr46852.C @@ -5,4 +5,4 @@ template < class { // { dg-error "" } -// { dg-error "-:" } +// { dg-error "-:" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/pr46868.C b/gcc/testsuite/g++.dg/pr46868.C index dec79aaf114..25b8c966f4d 100644 --- a/gcc/testsuite/g++.dg/pr46868.C +++ b/gcc/testsuite/g++.dg/pr46868.C @@ -2,4 +2,4 @@ // { dg-do compile } template < int > struct S { S < // { dg-error "" } - // { dg-error "-:expected" } + // { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/template/crash115.C b/gcc/testsuite/g++.dg/template/crash115.C index 84b284770ee..c1a72352714 100644 --- a/gcc/testsuite/g++.dg/template/crash115.C +++ b/gcc/testsuite/g++.dg/template/crash115.C @@ -1,4 +1,4 @@ // PR c++/56534 template < struct template rebind < > // { dg-error "expected|must follow" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.dg/template/crash43.C b/gcc/testsuite/g++.dg/template/crash43.C index a5161d887b9..3647a17cad8 100644 --- a/gcc/testsuite/g++.dg/template/crash43.C +++ b/gcc/testsuite/g++.dg/template/crash43.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/template/crash90.C b/gcc/testsuite/g++.dg/template/crash90.C index 4cfc40822a8..e2a58e31819 100644 --- a/gcc/testsuite/g++.dg/template/crash90.C +++ b/gcc/testsuite/g++.dg/template/crash90.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/template/error-recovery1.C b/gcc/testsuite/g++.dg/template/error-recovery1.C index 05f39803071..6f9ce6d6bc2 100644 --- a/gcc/testsuite/g++.dg/template/error-recovery1.C +++ b/gcc/testsuite/g++.dg/template/error-recovery1.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/template/error57.C b/gcc/testsuite/g++.dg/template/error57.C index f3d87c53bca..121fbb1d523 100644 --- a/gcc/testsuite/g++.dg/template/error57.C +++ b/gcc/testsuite/g++.dg/template/error57.C @@ -2,4 +2,4 @@ template struct a; template a < b // { dg-error "int" } -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash31.C b/gcc/testsuite/g++.old-deja/g++.other/crash31.C index 734c3f4e31a..610dfe11270 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/crash31.C +++ b/gcc/testsuite/g++.old-deja/g++.other/crash31.C @@ -7,4 +7,4 @@ struct foo { foo(); }; -// { dg-error "-:expected" } +// { dg-error "-:expected" "" { target *-*-* } .+1 } diff --git a/gcc/testsuite/gcc.dg/empty-source-2.c b/gcc/testsuite/gcc.dg/empty-source-2.c index e0180ec9475..67906f9e8dd 100644 --- a/gcc/testsuite/gcc.dg/empty-source-2.c +++ b/gcc/testsuite/gcc.dg/empty-source-2.c @@ -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 } */ diff --git a/gcc/testsuite/gcc.dg/empty-source-3.c b/gcc/testsuite/gcc.dg/empty-source-3.c index f8c58b3ef3f..f2877159fe4 100644 --- a/gcc/testsuite/gcc.dg/empty-source-3.c +++ b/gcc/testsuite/gcc.dg/empty-source-3.c @@ -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 } */ diff --git a/gcc/testsuite/gcc.dg/noncompile/pr30552-3.c b/gcc/testsuite/gcc.dg/noncompile/pr30552-3.c index 7b48e763ece..23cc7e6b253 100644 --- a/gcc/testsuite/gcc.dg/noncompile/pr30552-3.c +++ b/gcc/testsuite/gcc.dg/noncompile/pr30552-3.c @@ -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 } */ diff --git a/gcc/testsuite/gcc.dg/noncompile/pr35447-1.c b/gcc/testsuite/gcc.dg/noncompile/pr35447-1.c index b9bbb733fae..499b9595f3c 100644 --- a/gcc/testsuite/gcc.dg/noncompile/pr35447-1.c +++ b/gcc/testsuite/gcc.dg/noncompile/pr35447-1.c @@ -4,4 +4,5 @@ void foo() { ({ int i().; }); /* { dg-error "expected" } */ -} /* { dg-error "-:expected" } */ +} /* { dg-error "expected declaration" } +/* { dg-error "-:expected" "" { target *-*-* } .+1 } */ diff --git a/gcc/testsuite/gcc.dg/pr20245-1.c b/gcc/testsuite/gcc.dg/pr20245-1.c index b5767d88b7b..ac880740662 100644 --- a/gcc/testsuite/gcc.dg/pr20245-1.c +++ b/gcc/testsuite/gcc.dg/pr20245-1.c @@ -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 } */ diff --git a/gcc/testsuite/gcc.dg/pr28419.c b/gcc/testsuite/gcc.dg/pr28419.c index 9974864034b..d418a165b1e 100644 --- a/gcc/testsuite/gcc.dg/pr28419.c +++ b/gcc/testsuite/gcc.dg/pr28419.c @@ -1,4 +1,4 @@ /* { dg-do compile } */ void foo() const char* p = __FUNCTION__; /* { dg-error "" } */ -/* { dg-error "-:expected" "" } */ +/* { dg-error "-:expected" "" { target *-*-* } .+1 } */ diff --git a/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c b/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c index fffb4d7011a..28d898bba92 100644 --- a/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c +++ b/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c @@ -1,2 +1,2 @@ void __RTL test (void) -{ /* { dg-error "-:no closing brace" } */ +{ /* { dg-error "-:no closing brace" "" { target *-*-* } .+1 } */ diff --git a/gcc/testsuite/gcc.dg/unclosed-init.c b/gcc/testsuite/gcc.dg/unclosed-init.c index 3deb88e777c..16c42c43e55 100644 --- a/gcc/testsuite/gcc.dg/unclosed-init.c +++ b/gcc/testsuite/gcc.dg/unclosed-init.c @@ -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 } */ diff --git a/gcc/testsuite/obj-c++.dg/property/property-neg-6.mm b/gcc/testsuite/obj-c++.dg/property/property-neg-6.mm index c4a22eb6d20..1db6f0ba1b8 100644 --- a/gcc/testsuite/obj-c++.dg/property/property-neg-6.mm +++ b/gcc/testsuite/obj-c++.dg/property/property-neg-6.mm @@ -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 } */ diff --git a/gcc/testsuite/obj-c++.dg/syntax-error-10.mm b/gcc/testsuite/obj-c++.dg/syntax-error-10.mm index e45abccfc7d..6fcf96f769e 100644 --- a/gcc/testsuite/obj-c++.dg/syntax-error-10.mm +++ b/gcc/testsuite/obj-c++.dg/syntax-error-10.mm @@ -1 +1,2 @@ -@interface /* { dg-error "expected identifier" } */ +@interface +/* { dg-error "-:expected identifier" "" { target *-*-* } .+1 } */ diff --git a/gcc/testsuite/obj-c++.dg/syntax-error-8.mm b/gcc/testsuite/obj-c++.dg/syntax-error-8.mm index 731ffda5f5e..f7cfe0e0895 100644 --- a/gcc/testsuite/obj-c++.dg/syntax-error-8.mm +++ b/gcc/testsuite/obj-c++.dg/syntax-error-8.mm @@ -1 +1 @@ -@interface A /* { dg-error "expected ..end." } */ \ No newline at end of file +@interface A /* { dg-error "-:expected ..end." "" { target *-*-* } .+1 } */ diff --git a/gcc/testsuite/obj-c++.dg/syntax-error-9.mm b/gcc/testsuite/obj-c++.dg/syntax-error-9.mm index 352dd34cf94..ae104e5c140 100644 --- a/gcc/testsuite/obj-c++.dg/syntax-error-9.mm +++ b/gcc/testsuite/obj-c++.dg/syntax-error-9.mm @@ -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 } */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index f6b7c01af97..7c41c4e1539 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,17 @@ +2020-05-12 Nathan Sidwell + + 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 * Makefile.in (CET_HOST_FLAGS): New. diff --git a/libcpp/lex.c b/libcpp/lex.c index 3bcf073710e..043852d14e2 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -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. */ diff --git a/libcpp/traditional.c b/libcpp/traditional.c index 039fcfe27f5..77adb3bf595 100644 --- a/libcpp/traditional.c +++ b/libcpp/traditional.c @@ -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);