input_location is not always up-to-date in the preprocessor. Using the actual token's location is always best. Bootstrapped & regtested on x86-64-linux-gnu & committed as obvious https://gcc.gnu.org/r227096
Cheers, Manuel. Fix column location in c_lex_with_flags errors gcc/testsuite/ChangeLog: 2015-08-22 Manuel López-Ibáñez <m...@gcc.gnu.org> * gcc.dg/cpp/multiline-2.c: Add column numbers. * gcc.dg/dollar.c: Likewise. * gcc.dg/pragma-message.c: Likewise. * g++.dg/cpp1y/digit-sep-neg.C: Likewise. * c-c++-common/raw-string-14.c: Likewise. gcc/c-family/ChangeLog: 2015-08-22 Manuel López-Ibáñez <m...@gcc.gnu.org> * c-lex.c (c_lex_with_flags): Use explicit locations.
Index: gcc/c-family/c-lex.c =================================================================== --- gcc/c-family/c-lex.c (revision 226953) +++ gcc/c-family/c-lex.c (working copy) @@ -521,15 +521,15 @@ c_lex_with_flags (tree *value, location_ case CPP_OTHER: { cppchar_t c = tok->val.str.text[0]; if (c == '"' || c == '\'') - error ("missing terminating %c character", (int) c); + error_at (*loc, "missing terminating %c character", (int) c); else if (ISGRAPH (c)) - error ("stray %qc in program", (int) c); + error_at (*loc, "stray %qc in program", (int) c); else - error ("stray %<\\%o%> in program", (int) c); + error_at (*loc, "stray %<\\%o%> in program", (int) c); } goto retry; case CPP_CHAR_USERDEF: case CPP_WCHAR_USERDEF: Index: gcc/testsuite/gcc.dg/cpp/multiline-2.c =================================================================== --- gcc/testsuite/gcc.dg/cpp/multiline-2.c (revision 226953) +++ gcc/testsuite/gcc.dg/cpp/multiline-2.c (working copy) @@ -7,8 +7,8 @@ const char *p = "line 1 " ""; /* The compiler front end sees this. */ -/* { dg-error "missing term" "multiline strings" { target *-*-* } 8 } */ +/* { dg-error "17:missing term" "multiline strings" { target *-*-* } 8 } */ /* { dg-error "missing term" "multiline strings" { target *-*-* } 9 } */ Index: gcc/testsuite/gcc.dg/dollar.c =================================================================== --- gcc/testsuite/gcc.dg/dollar.c (revision 226953) +++ gcc/testsuite/gcc.dg/dollar.c (working copy) @@ -4,6 +4,6 @@ /* { dg-options -fno-dollars-in-identifiers } */ /* Test that -fno-dollars-in-identifiers is honoured. Neil Booth, 17 May 2003. */ -int foobar$; /* { dg-error "stray '\\$'" } */ +int foobar$; /* { dg-error "11:stray '\\$'" } */ Index: gcc/testsuite/gcc.dg/pragma-message.c =================================================================== --- gcc/testsuite/gcc.dg/pragma-message.c (revision 226953) +++ gcc/testsuite/gcc.dg/pragma-message.c (working copy) @@ -14,17 +14,17 @@ then 'note: #pragma message: ', allowing dg-message to check output. If unexpected pragma messages are printed (anything not caught by a matching dg-message), dejagnu will report these as excess errors. */ #pragma message " -/* { dg-error "missing terminating" "" { target *-*-* } 18 } */ +/* { dg-error "17:missing terminating" "" { target *-*-* } 18 } */ /* { dg-warning "expected a string" "" { target *-*-* } 18 } */ #pragma message "Bad 1 -/* { dg-error "missing terminating" "" { target *-*-* } 21 } */ +/* { dg-error "17:missing terminating" "" { target *-*-* } 21 } */ /* { dg-warning "expected a string" "" { target *-*-* } 21 } */ #pragma message ("Bad 2 -/* { dg-error "missing terminating" "" { target *-*-* } 24 } */ +/* { dg-error "18:missing terminating" "" { target *-*-* } 24 } */ /* { dg-warning "expected a string" "" { target *-*-* } 24 } */ #pragma message ("Bad 3" /* { dg-warning "malformed '#pragma message" "" { target *-*-* } 27 } */ #pragma message "" junk Index: gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C =================================================================== --- gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C (revision 226953) +++ gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C (working copy) @@ -8,22 +8,22 @@ main() i = 0X'100000; // { dg-error "digit separator after base indicator" } i = 0x'100000; // { dg-error "digit separator after base indicator" } i = 0004''000'000; // { dg-error "adjacent digit separators" } i = 0B1'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0; // OK i = 0b'0001'0000'0000'0000'0000'0000; // { dg-error "digit separator after base indicator" } - i = 0b0001'0000'0000'0000'0000'0000'; // { dg-error "missing terminating" } + i = 0b0001'0000'0000'0000'0000'0000'; // { dg-error "38:missing terminating" } unsigned u = 0b0001'0000'0000'0000'0000'0000'U; // { dg-error "digit separator outside digit sequence" } double d = 0.0; d = 1'.602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" } d = 1.'602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" } d = 1.602''176'565e-19; // { dg-error "adjacent digit separators" } d = 1.602'176'565'e-19; // { dg-error "digit separator adjacent to exponent" } - d = 1.602'176'565e'-19; // { dg-error "missing terminating" } + d = 1.602'176'565e'-19; // { dg-error "21:missing terminating" } d = 1.602'176'565e-'19; // { dg-error "digit separator adjacent to exponent" } d = 1.602'176'565e-1'9; // OK - d = 1.602'176'565e-19'; // { dg-error "missing terminating" } + d = 1.602'176'565e-19'; // { dg-error "24:missing terminating" } float f = 1.602'176'565e-19'F; // { dg-error "digit separator outside digit sequence" } } // { dg-error "exponent has no digits" "exponent has no digits" { target *-*-* } 21 } // { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 14 } Index: gcc/testsuite/c-c++-common/raw-string-14.c =================================================================== --- gcc/testsuite/c-c++-common/raw-string-14.c (revision 226953) +++ gcc/testsuite/c-c++-common/raw-string-14.c (working copy) @@ -10,11 +10,11 @@ def()abcdef"; const void *s1 = R"??/ ()??/"; // { dg-error "invalid new-line" "invalid" { target *-*-* } 10 } // { dg-error "stray" "stray" { target *-*-* } 10 } // { dg-warning "missing terminating" "missing" { target *-*-* } 10 } - // { dg-error "missing terminating" "missing" { target *-*-* } 10 } + // { dg-error "19:missing terminating" "missing" { target *-*-* } 10 } const void *s2 = R"abcdefghijklmn??/(a)abcdefghijklmn???"; // { dg-error "raw string delimiter longer" "longer" { target *-*-* } 16 } // { dg-error "stray" "stray" { target *-*-* } 16 } // { dg-error "expected" "expected" { target *-*-* } 16 } const void *s3 = R"abcdefghijklmno??/(a)abcdefghijklmno???";