diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-09-23 14:14:52 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-09-23 14:14:52 +0000 |
commit | bbd6fcf320460f29c1ef8c3b42d571238b0f86e5 (patch) | |
tree | 4c2c701cee2b268d267262bed245ca34c5893ec9 /gcc/input.c | |
parent | 30faeb0f99e8618739217ff3efa930cc382d8448 (diff) | |
download | gcc-bbd6fcf320460f29c1ef8c3b42d571238b0f86e5.zip gcc-bbd6fcf320460f29c1ef8c3b42d571238b0f86e5.tar.gz gcc-bbd6fcf320460f29c1ef8c3b42d571238b0f86e5.tar.bz2 |
Provide location information for terminator characters (PR preprocessor/77672)
substring_loc::get_location currently fails for the final terminator
character in a STRING_CST from the C frontend, so that format_warning_va
falls back to using the location of the string as a whole.
This patch tweaks things [1] so that we use the final closing quote
as the location of the terminator character, as requested in
PR preprocessor/77672.
[1] specifically, cpp_interpret_string_1.
gcc/ChangeLog:
PR preprocessor/77672
* input.c (selftest::test_lexer_string_locations_simple): Update
test to expect location information of the terminator character
at the location of the final closing quote.
(selftest::test_lexer_string_locations_hex): Likewise.
(selftest::test_lexer_string_locations_oct): Likewise.
(selftest::test_lexer_string_locations_letter_escape_1): Likewise.
(selftest::test_lexer_string_locations_letter_escape_2): Likewise.
(selftest::test_lexer_string_locations_ucn4): Likewise.
(selftest::test_lexer_string_locations_ucn8): Likewise.
(selftest::test_lexer_string_locations_u8): Likewise.
(selftest::test_lexer_string_locations_utf8_source): Likewise.
(selftest::test_lexer_string_locations_concatenation_1): Likewise.
(selftest::test_lexer_string_locations_concatenation_2): Likewise.
(selftest::test_lexer_string_locations_concatenation_3): Likewise.
(selftest::test_lexer_string_locations_macro): Likewise.
(selftest::test_lexer_string_locations_long_line): Likewise.
gcc/testsuite/ChangeLog:
PR preprocessor/77672
* gcc.dg/plugin/diagnostic-test-string-literals-1.c
(test_terminator_location): New function.
libcpp/ChangeLog:
PR preprocessor/77672
* charset.c (cpp_interpret_string_1): Add a source_range for the
NUL-terminator, using the location of the trailing quote of the
final string.
From-SVN: r240434
Diffstat (limited to 'gcc/input.c')
-rw-r--r-- | gcc/input.c | 81 |
1 files changed, 49 insertions, 32 deletions
diff --git a/gcc/input.c b/gcc/input.c index 55bff48..9b26378 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -2239,12 +2239,12 @@ test_lexer_string_locations_simple (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. */ - for (int i = 0; i <= 9; i++) + opening quote, but does include the closing quote. */ + for (int i = 0; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 10); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 11); } /* As test_lexer_string_locations_simple, but use an EBCDIC execution @@ -2339,14 +2339,14 @@ test_lexer_string_locations_hex (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. */ + opening quote, but does include the closing quote. */ for (int i = 0; i <= 4; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, 5, 1, 15, 18); - for (int i = 6; i <= 9; i++) + for (int i = 6; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 13 + i, 13 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 10); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 11); } /* Lex a string literal containing an octal-escaped character. @@ -2380,14 +2380,14 @@ test_lexer_string_locations_oct (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. */ + opening quote, but does include the closing quote. */ for (int i = 0; i < 5; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, 5, 1, 15, 18); - for (int i = 6; i <= 9; i++) + for (int i = 6; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 13 + i, 13 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 10); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 11); } /* Test of string literal containing letter escapes. */ @@ -2420,12 +2420,12 @@ test_lexer_string_locations_letter_escape_1 (const line_table_case &case_) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, 5, 1, 17, 18); - /* "bar". */ - for (int i = 6; i <= 8; i++) + /* "bar" and closing quote for nul-terminator. */ + for (int i = 6; i <= 9; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, i, 1, 13 + i, 13 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 9); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 10); } /* Another test of a string literal containing a letter escape. @@ -2455,7 +2455,11 @@ test_lexer_string_locations_letter_escape_2 (const line_table_case &case_) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, 3, 1, 13, 14); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 4); + /* Closing quote for nul-terminator. */ + ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, + 4, 1, 15, 15); + + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 5); } /* Lex a string literal containing UCN 4 characters. @@ -2498,6 +2502,7 @@ test_lexer_string_locations_ucn4 (const line_table_case &case_) 11 0x37 '7' 27 12 0x38 '8' 28 13 0x39 '9' 29 + 14 0x00 30 (closing quote) ----------- ---- ----- ------- ---------------. */ cpp_string dst_string; @@ -2510,7 +2515,7 @@ test_lexer_string_locations_ucn4 (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. + opening quote, but does include the closing quote. '01234'. */ for (int i = 0; i <= 4; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); @@ -2520,11 +2525,11 @@ test_lexer_string_locations_ucn4 (const line_table_case &case_) /* U+2175. */ for (int i = 8; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 21, 26); - /* '789'. */ - for (int i = 11; i <= 13; i++) + /* '789' and nul terminator */ + for (int i = 11; i <= 14; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 16 + i, 16 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 14); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 15); } /* Lex a string literal containing UCN 8 characters. @@ -2561,7 +2566,7 @@ test_lexer_string_locations_ucn8 (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. + opening quote, but does include the closing quote. '01234'. */ for (int i = 0; i <= 4; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); @@ -2574,8 +2579,10 @@ test_lexer_string_locations_ucn8 (const line_table_case &case_) /* '789' at columns 35-37 */ for (int i = 11; i <= 13; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 24 + i, 24 + i); + /* Closing quote/nul-terminator at column 38. */ + ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, 14, 1, 38, 38); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 14); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 15); } /* Fetch a big-endian 32-bit value and convert to host endianness. */ @@ -2751,8 +2758,8 @@ test_lexer_string_locations_u8 (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. */ - for (int i = 0; i <= 9; i++) + opening quote, but does include the closing quote. */ + for (int i = 0; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); } @@ -2829,13 +2836,15 @@ test_lexer_string_locations_utf8_source (const line_table_case &case_) free (const_cast <unsigned char *> (dst_string.text)); /* Verify ranges of individual characters. This no longer includes the - quotes. + opening quote, but does include the closing quote. Assuming that both source and execution encodings are UTF-8, we have - a run of 25 octets in each. */ + a run of 25 octets in each, plus the NUL terminator. */ for (int i = 0; i < 25; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, i, 1, 10 + i, 10 + i); + /* NUL-terminator should use the closing quote at column 35. */ + ASSERT_CHAR_AT_RANGE (test, tok->src_loc, type, 25, 1, 35, 35); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 25); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, type, 26); } /* Test of string literal concatenation. */ @@ -2881,12 +2890,14 @@ test_lexer_string_locations_concatenation_1 (const line_table_case &case_) location_t initial_loc = input_locs[0]; + /* "01234" on line 1. */ for (int i = 0; i <= 4; i++) ASSERT_CHAR_AT_RANGE (test, initial_loc, type, i, 1, 10 + i, 10 + i); - for (int i = 5; i <= 9; i++) + /* "56789" in line 2, plus its closing quote for the nul terminator. */ + for (int i = 5; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, initial_loc, type, i, 2, 5 + i, 5 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 10); + ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 11); } /* Another test of string literal concatenation. */ @@ -2958,7 +2969,10 @@ test_lexer_string_locations_concatenation_2 (const line_table_case &case_) ASSERT_CHAR_AT_RANGE (test, initial_loc, type, (i * 2) + j, i + 1, 10 + j, 10 + j); - ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 10); + /* NUL-terminator should use the final closing quote at line 5 column 12. */ + ASSERT_CHAR_AT_RANGE (test, initial_loc, type, 10, 5, 12, 12); + + ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 11); } /* Another test of string literal concatenation, this time combined with @@ -3009,7 +3023,10 @@ test_lexer_string_locations_concatenation_3 (const line_table_case &case_) for (int i = 7; i <= 9; i++) ASSERT_CHAR_AT_RANGE (test, initial_loc, type, i, 1, 28 + i, 28 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 10); + /* NUL-terminator should use the location of the final closing quote. */ + ASSERT_CHAR_AT_RANGE (test, initial_loc, type, 10, 1, 38, 38); + + ASSERT_NUM_SUBSTRING_RANGES (test, initial_loc, type, 11); } /* Test of string literal in a macro. */ @@ -3034,11 +3051,11 @@ test_lexer_string_locations_macro (const line_table_case &case_) /* Verify ranges of individual characters. We ought to see columns within the macro definition. */ - for (int i = 0; i <= 9; i++) + for (int i = 0; i <= 10; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, i, 1, 20 + i, 20 + i); - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 10); + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 11); tok = test.get_token (); ASSERT_EQ (tok->type, CPP_PADDING); @@ -3132,8 +3149,8 @@ test_lexer_string_locations_long_line (const line_table_case &case_) return; /* Verify ranges of individual characters. */ - ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 130); - for (int i = 0; i < 130; i++) + ASSERT_NUM_SUBSTRING_RANGES (test, tok->src_loc, CPP_STRING, 131); + for (int i = 0; i < 131; i++) ASSERT_CHAR_AT_RANGE (test, tok->src_loc, CPP_STRING, i, 2, 7 + i, 7 + i); } |