diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ced4bd5a0e5..d0477c42afe 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7564,6 +7564,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, tsubst_flags_t complain = complain_flags (decltype_p); vec *args; location_t close_paren_loc = UNKNOWN_LOCATION; + location_t combined_loc = UNKNOWN_LOCATION; is_member_access = false; @@ -7669,6 +7670,17 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, } } + /* Temporarily set input_location to the combined location + with call expression range, as e.g. build_out_target_exprs + called from convert_default_arg relies on input_location, + so updating it only when the call is fully built results + in inconsistencies between location handling in templates + and outside of templates. */ + if (close_paren_loc != UNKNOWN_LOCATION) + combined_loc = make_location (token->location, start_loc, + close_paren_loc); + iloc_sentinel ils (combined_loc); + if (TREE_CODE (postfix_expression) == COMPONENT_REF) { tree instance = TREE_OPERAND (postfix_expression, 0); @@ -7726,12 +7738,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, complain); if (close_paren_loc != UNKNOWN_LOCATION) - { - location_t combined_loc = make_location (token->location, - start_loc, - close_paren_loc); - postfix_expression.set_location (combined_loc); - } + postfix_expression.set_location (combined_loc); /* The POSTFIX_EXPRESSION is certainly no longer an id. */ idk = CP_ID_KIND_NONE; diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic2.C b/gcc/testsuite/g++.dg/concepts/diagnostic2.C index 004c7a378e7..6550ed6b3bd 100644 --- a/gcc/testsuite/g++.dg/concepts/diagnostic2.C +++ b/gcc/testsuite/g++.dg/concepts/diagnostic2.C @@ -25,6 +25,6 @@ baz() bar(); // { dg-error "no match" } /* { dg-begin-multiline-output "" } bar(); - ^ + ~~~~~~~~^~ { dg-end-multiline-output "" } */ } diff --git a/gcc/testsuite/g++.dg/cpp1y/builtin_location.C b/gcc/testsuite/g++.dg/cpp1y/builtin_location.C index b3b9b435b2c..1f8a7fd7bb6 100644 --- a/gcc/testsuite/g++.dg/cpp1y/builtin_location.C +++ b/gcc/testsuite/g++.dg/cpp1y/builtin_location.C @@ -103,10 +103,10 @@ A (0 == __builtin_strcmp (f3, FILE_3)); #define FILE_4 "next_file_name.another_suffix" #line 1 "foobar" constexpr const char* f4 = this_file - ( #line 1 FILE_4 - ) + ( #line 1 "foobar" + ) ; A (0 == __builtin_strcmp (f4, FILE_4)); @@ -167,9 +167,9 @@ A (n5 == 9); // of the function call. #line 1 constexpr int n6 = this_line - ( #line 99 - ) + ( #line 1 + ) ; A (n6 == 99); diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc1.C b/gcc/testsuite/g++.dg/cpp2a/srcloc1.C index 029a0370f3c..2e9797443c1 100644 --- a/gcc/testsuite/g++.dg/cpp2a/srcloc1.C +++ b/gcc/testsuite/g++.dg/cpp2a/srcloc1.C @@ -80,7 +80,7 @@ constexpr source_location s2 = baz <1> (); const source_location *p1 = &s1; const source_location *p2 = &s2; static_assert (source_location::current ().line () == __LINE__); -static_assert (source_location::current ().column () == 42); +static_assert (source_location::current ().column () == 41); constexpr bool quux () @@ -106,7 +106,7 @@ quux () return false; if (line1 != line2) return false; - if (column != 33) + if (column != 32) return false; return true; } diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc15.C b/gcc/testsuite/g++.dg/cpp2a/srcloc15.C index d02617e11ee..3bb3958a44b 100644 --- a/gcc/testsuite/g++.dg/cpp2a/srcloc15.C +++ b/gcc/testsuite/g++.dg/cpp2a/srcloc15.C @@ -69,8 +69,8 @@ bar () source_location a = foo (); source_location b = source_location::current (); source_location c = foo (); - // ^ column 28 - // ^ column 49 + // ^ column 27 + // ^ column 48 const source_location *d[3] = { &a, &b, &c }; const char *file1 = __FILE__; const char *function1 = __PRETTY_FUNCTION__; @@ -83,7 +83,7 @@ bar () return false; if (d[j]->line () != line + j + 1) return false; - if (d[j]->column () != (j == 1 ? 49 : 28)) + if (d[j]->column () != (j == 1 ? 48 : 27)) return false; } diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc16.C b/gcc/testsuite/g++.dg/cpp2a/srcloc16.C index c8bd28169d2..0ecd636c9aa 100644 --- a/gcc/testsuite/g++.dg/cpp2a/srcloc16.C +++ b/gcc/testsuite/g++.dg/cpp2a/srcloc16.C @@ -79,10 +79,10 @@ foo () || u.u.line () + 1 != v.line () || s.a.column () != 18 || s.b.column () != 18 - || s.c.column () != 50 + || s.c.column () != 49 || t.u.column () != 21 || u.u.column () != 13 - || v.column () != 49) + || v.column () != 48) return false; return true; } diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc19.C b/gcc/testsuite/g++.dg/cpp2a/srcloc19.C new file mode 100644 index 00000000000..b7e8c37a6c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/srcloc19.C @@ -0,0 +1,44 @@ +// PR c++/99672 +// { dg-do compile { target c++20 } } + +namespace std { + struct source_location { + struct __impl { + const char *_M_file_name; + const char *_M_function_name; + unsigned int _M_line, _M_column; + }; + const __impl *__ptr; + constexpr source_location () : __ptr (nullptr) {} + static consteval source_location + current (const void *__p = __builtin_source_location ()) { + source_location __ret; + __ret.__ptr = static_cast (__p); + return __ret; + } + constexpr const char *file_name () const { + return __ptr ? __ptr->_M_file_name : ""; + } + constexpr const char *function_name () const { + return __ptr ? __ptr->_M_function_name : ""; + } + constexpr unsigned line () const { + return __ptr ? __ptr->_M_line : 0; + } + constexpr unsigned column () const { + return __ptr ? __ptr->_M_column : 0; + } + }; +} + +constexpr int g(auto...) { +return std::source_location::current().column(); +} + +constexpr int f() { +return std::source_location::current().column(); +} + +constexpr int a = g(); +constexpr int b = f(); +static_assert (a == b); diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc2.C b/gcc/testsuite/g++.dg/cpp2a/srcloc2.C index 4e0b960bf83..3f91a644884 100644 --- a/gcc/testsuite/g++.dg/cpp2a/srcloc2.C +++ b/gcc/testsuite/g++.dg/cpp2a/srcloc2.C @@ -84,7 +84,7 @@ const source_location *p1 = &s1; const source_location *p2 = &s2; static_assert (source_location::current ().line () == __LINE__); -static_assert (source_location::current ().column () == 42); +static_assert (source_location::current ().column () == 41); constexpr bool quux () @@ -110,7 +110,7 @@ quux () return false; if (line1 != line2) return false; - if (column != 33) + if (column != 32) return false; return true; } diff --git a/gcc/testsuite/g++.dg/modules/adhoc-1_b.C b/gcc/testsuite/g++.dg/modules/adhoc-1_b.C index 59907a01d20..7fd5701463e 100644 --- a/gcc/testsuite/g++.dg/modules/adhoc-1_b.C +++ b/gcc/testsuite/g++.dg/modules/adhoc-1_b.C @@ -6,7 +6,7 @@ void foo () massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea (); } -// { dg-regexp "\n\[^\n]*adhoc-1_b.C:6:74: error: no matching function for call to 'massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea\\(\\)'\n massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea \\(\\);\n \\^$" } +// { dg-regexp "\n\[^\n]*adhoc-1_b.C:6:73: error: no matching function for call to 'massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea\\(\\)'\n massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea \\(\\);\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\^~$" } // { dg-regexp "\nIn module bob, imported at \[^\n]*adhoc-1_b.C:3:\n\[^\n]*adhoc-1_a.C:5:12: note: candidate: 'int massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea@bob\\(int\\)'\n export int massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea \\(int\\);\n \\^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$" } // { dg-regexp "\nIn module bob, imported at \[^\n]*adhoc-1_b.C:3:\n\[^\n]*adhoc-1_a.C:6:188: note: candidate: 'void massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea@bob\\(float\\)'\n\[ \t]*export void massivelongnamethatcausesadhoclocationsokeepaddingcharsyourgettheidea \\(float\\);\n\[ \t]*\\^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?$" } // For some reason dg-regexp inserts a blank line diff --git a/gcc/testsuite/g++.dg/modules/macloc-1_c.C b/gcc/testsuite/g++.dg/modules/macloc-1_c.C index 9b8f7fb9d59..5865a34687e 100644 --- a/gcc/testsuite/g++.dg/modules/macloc-1_c.C +++ b/gcc/testsuite/g++.dg/modules/macloc-1_c.C @@ -8,6 +8,6 @@ void gru () you (1); } -// { dg-regexp "\[^\n]*macloc-1_c.C:7:8: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } +// { dg-regexp "\[^\n]*macloc-1_c.C:7:6: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } -// { dg-regexp "\[^\n]*macloc-1_c.C:8:9: error: too many arguments to function 'int you@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:12:14: note: declared here\n\[^\n]*macloc-1_a.C:9:22: note: in definition of macro 'KEVIN'\n" } +// { dg-regexp "\[^\n]*macloc-1_c.C:8:7: error: too many arguments to function 'int you@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:12:14: note: declared here\n\[^\n]*macloc-1_a.C:9:22: note: in definition of macro 'KEVIN'\n" } diff --git a/gcc/testsuite/g++.dg/modules/macloc-1_d.C b/gcc/testsuite/g++.dg/modules/macloc-1_d.C index 5b2b7ba3034..282a31c4a2d 100644 --- a/gcc/testsuite/g++.dg/modules/macloc-1_d.C +++ b/gcc/testsuite/g++.dg/modules/macloc-1_d.C @@ -9,5 +9,5 @@ void margo () gru (2); } -// { dg-regexp "\[^\n]*macloc-1_d.C:8:8: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_d.C:4:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } -// { dg-regexp "\[^\n]*macloc-1_d.C:9:9: error: too many arguments to function 'void gru@edith\\(\\)'\nIn module edith, imported at \[^\n]*macloc-1_d.C:3:\n\[^\n]*macloc-1_b.C:10:20: note: declared here\n\[^\n]*macloc-1_b.C:6:19: note: in definition of macro 'STUART'\n" } +// { dg-regexp "\[^\n]*macloc-1_d.C:8:6: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_d.C:4:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } +// { dg-regexp "\[^\n]*macloc-1_d.C:9:7: error: too many arguments to function 'void gru@edith\\(\\)'\nIn module edith, imported at \[^\n]*macloc-1_d.C:3:\n\[^\n]*macloc-1_b.C:10:20: note: declared here\n\[^\n]*macloc-1_b.C:6:19: note: in definition of macro 'STUART'\n" } diff --git a/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C b/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C index 288da2cecff..70778e9368a 100644 --- a/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C +++ b/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C @@ -900,7 +900,7 @@ void test_methods () ((base *)1)->priv (); // { dg-error " is private " } /* { dg-begin-multiline-output "" } ((base *)1)->priv (); - ^ + ~~~~~~~~~~~~~~~~~~^~ { dg-end-multiline-output "" } { dg-begin-multiline-output "" } int priv (); diff --git a/libstdc++-v3/testsuite/18_support/source_location/1.cc b/libstdc++-v3/testsuite/18_support/source_location/1.cc index 83430d4d494..687047a3d6a 100644 --- a/libstdc++-v3/testsuite/18_support/source_location/1.cc +++ b/libstdc++-v3/testsuite/18_support/source_location/1.cc @@ -87,37 +87,37 @@ int main () std::string_view main_sl_fn_name(main_sl.function_name()); std::string_view main_sl_fi_name(main_sl.file_name()); VERIFY(main_sl.line() == main_sl_line); - // closing paren of call - VERIFY(main_sl.column() == 64); + // opening paren of call + VERIFY(main_sl.column() == 63); VERIFY(main_sl_fn_name.ends_with("main()"sv)); VERIFY(main_sl_fi_name.ends_with("1.cc"sv)); std::string_view f_arg_sl_fn_name(f_arg_sl.function_name()); std::string_view f_arg_sl_fi_name(f_arg_sl.file_name()); VERIFY(f_arg_sl.line() == f_arg_sl_line); - // closing paren of call - VERIFY(f_arg_sl.column() == 64); + // opening paren of call + VERIFY(f_arg_sl.column() == 63); VERIFY(f_arg_sl_fn_name.ends_with("main()"sv)); VERIFY(f_arg_sl_fi_name.ends_with("1.cc"sv)); std::string_view g_sl_fn_name(g_sl.function_name()); std::string_view g_sl_fi_name(g_sl.file_name()); VERIFY(g_sl.line() == g_sl_line); - VERIFY(g_sl.column() == 58); // closing paren of call + VERIFY(g_sl.column() == 57); // opening paren of call VERIFY(g_sl_fn_name.ends_with("g()"sv)); VERIFY(g_sl_fi_name.ends_with("1.cc"sv)); std::string_view h_sl_fn_name(h_sl.function_name()); std::string_view h_sl_fi_name(h_sl.file_name()); VERIFY(h_sl.line() == 23); - VERIFY(h_sl.column() == 58); // closing paren of call + VERIFY(h_sl.column() == 57); // opening paren of call VERIFY(h_sl_fn_name.ends_with("h()"sv)); VERIFY(h_sl_fi_name.ends_with("srcloc.h"sv)); std::string_view member_main_sl_fn_name(member_main_sl.member.function_name()); std::string_view member_main_sl_fi_name(member_main_sl.member.file_name()); VERIFY(member_main_sl.member.line() == main_sl_line); - VERIFY(member_main_sl.member.column() == 64); + VERIFY(member_main_sl.member.column() == 63); VERIFY(member_main_sl_fn_name.ends_with("main()"sv)); VERIFY(member_main_sl_fi_name.ends_with("1.cc"sv)); @@ -144,8 +144,8 @@ int main () std::string_view f_sl_fi_name(f_sl.file_name()); std::string_view f_sl_fn_name(f_sl.function_name()); VERIFY(f_sl.line() == f_sl_line); - // closing paren of call - VERIFY(f_sl.column() == 33); + // opening paren of call + VERIFY(f_sl.column() == 32); VERIFY(f_sl_fn_name.ends_with("main()"sv)); VERIFY(f_sl_fi_name.ends_with("1.cc"sv)); diff --git a/libstdc++-v3/testsuite/18_support/source_location/consteval.cc b/libstdc++-v3/testsuite/18_support/source_location/consteval.cc index 85bc9c287b4..62e0469d01a 100644 --- a/libstdc++-v3/testsuite/18_support/source_location/consteval.cc +++ b/libstdc++-v3/testsuite/18_support/source_location/consteval.cc @@ -75,43 +75,43 @@ int main () using namespace std::string_view_literals; static_assert (std::source_location::current ().line () == __LINE__); - static_assert (std::source_location::current ().column () == 49); + static_assert (std::source_location::current ().column () == 48); constexpr std::string_view main_sl_fn_name(main_sl.function_name()); constexpr std::string_view main_sl_fi_name(main_sl.file_name()); static_assert(main_sl.line() == main_sl_line); - // closing paren of call - static_assert(main_sl.column() == 74); + // opening paren of call + static_assert(main_sl.column() == 73); static_assert(main_sl_fn_name.ends_with("main()"sv)); static_assert(main_sl_fi_name.ends_with("consteval.cc"sv)); constexpr std::string_view f_arg_sl_fn_name(f_arg_sl.function_name()); constexpr std::string_view f_arg_sl_fi_name(f_arg_sl.file_name()); static_assert(f_arg_sl.line() == f_arg_sl_line); - // closing paren of call - static_assert(f_arg_sl.column() == 74); + // opening paren of call + static_assert(f_arg_sl.column() == 73); static_assert(f_arg_sl_fn_name.ends_with("main()"sv)); static_assert(f_arg_sl_fi_name.ends_with("consteval.cc"sv)); constexpr std::string_view g_sl_fn_name(g_sl.function_name()); constexpr std::string_view g_sl_fi_name(g_sl.file_name()); static_assert(g_sl.line() == g_sl_line); - static_assert(g_sl.column() == 58); // closing paren of call + static_assert(g_sl.column() == 57); // opening paren of call static_assert(g_sl_fn_name.ends_with("g()"sv)); static_assert(g_sl_fi_name.ends_with("consteval.cc"sv)); constexpr std::string_view h_sl_fn_name(h_sl.function_name()); constexpr std::string_view h_sl_fi_name(h_sl.file_name()); static_assert(h_sl.line() == 23); - static_assert(h_sl.column() == 58); // closing paren of call + static_assert(h_sl.column() == 57); // opening paren of call static_assert(h_sl_fn_name.ends_with("h()"sv)); static_assert(h_sl_fi_name.ends_with("srcloc.h"sv)); constexpr std::string_view member_main_sl_fn_name(member_main_sl.member.function_name()); constexpr std::string_view member_main_sl_fi_name(member_main_sl.member.file_name()); static_assert(member_main_sl.member.line() == main_sl_line); - static_assert(member_main_sl.member.column() == 74); + static_assert(member_main_sl.member.column() == 73); static_assert(member_main_sl_fn_name.ends_with("main()"sv)); static_assert(member_main_sl_fi_name.ends_with("consteval.cc"sv)); @@ -138,8 +138,8 @@ int main () constexpr std::string_view f_sl_fi_name(f_sl.file_name()); constexpr std::string_view f_sl_fn_name(f_sl.function_name()); static_assert(f_sl.line() == f_sl_line); - // closing paren of call - static_assert(f_sl.column() == 43); + // opening paren of call + static_assert(f_sl.column() == 42); static_assert(f_sl_fn_name.ends_with("main()"sv)); static_assert(f_sl_fi_name.ends_with("consteval.cc"sv));