On Tue, Mar 23, 2021 at 04:53:54PM -0400, Jason Merrill via Gcc-patches wrote:
> It's simpler to use iloc_sentinel for this.

Indeed, it is.
Here is the new version, bootstrapped on x86_64-linux and i686-linux,
so far regtested on i686-linux, regtest on x86_64 ongoing, ok for trunk
if it passes?

2021-03-23  Jakub Jelinek  <ja...@redhat.com>

        PR c++/99672
        * parser.c (cp_parser_postfix_expression): For calls, create
        combined_loc and temporarily set input_location to it before
        calling finish_call_expr.

        * g++.dg/concepts/diagnostic2.C: Adjust expected caret line.
        * g++.dg/cpp1y/builtin_location.C (f4, n6): Move #line directives
        to match locus changes.
        * g++.dg/cpp2a/srcloc1.C: Adjust expected column numbers.
        * g++.dg/cpp2a/srcloc2.C: Likewise.
        * g++.dg/cpp2a/srcloc15.C: Likewise.
        * g++.dg/cpp2a/srcloc16.C: Likewise.
        * g++.dg/cpp2a/srcloc19.C: New test.
        * g++.dg/modules/adhoc-1_b.C: Adjust expected column numbers
        and caret line.
        * g++.dg/modules/macloc-1_c.C: Adjust expected column numbers.
        * g++.dg/modules/macloc-1_d.C: Likewise.
        * g++.dg/plugin/diagnostic-test-expressions-1.C: Adjust expected
        caret line.

        * testsuite/18_support/source_location/consteval.cc (main): Adjust
        expected column numbers.
        * testsuite/18_support/source_location/1.cc (main): Likewise.

--- gcc/cp/parser.c.jj  2021-03-19 10:14:37.449724617 +0100
+++ gcc/cp/parser.c     2021-03-19 17:35:11.216322995 +0100
@@ -7564,6 +7564,7 @@ cp_parser_postfix_expression (cp_parser
            tsubst_flags_t complain = complain_flags (decltype_p);
            vec<tree, va_gc> *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
                  }
              }
 
+           /* 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
                                    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;
--- gcc/testsuite/g++.dg/concepts/diagnostic2.C.jj      2020-08-24 
21:41:17.644520408 +0200
+++ gcc/testsuite/g++.dg/concepts/diagnostic2.C 2021-03-22 19:04:59.947515357 
+0100
@@ -25,6 +25,6 @@ baz()
   bar<int>(); // { dg-error "no match" }
 /* { dg-begin-multiline-output "" }
    bar<int>();
-            ^
+   ~~~~~~~~^~
    { dg-end-multiline-output "" } */
 }
--- gcc/testsuite/g++.dg/cpp1y/builtin_location.C.jj    2020-01-14 
20:02:46.771610014 +0100
+++ gcc/testsuite/g++.dg/cpp1y/builtin_location.C       2021-03-22 
17:27:59.121756869 +0100
@@ -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);
--- gcc/testsuite/g++.dg/cpp2a/srcloc1.C.jj     2020-12-04 16:02:57.300153753 
+0100
+++ gcc/testsuite/g++.dg/cpp2a/srcloc1.C        2021-03-20 00:30:14.245469602 
+0100
@@ -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;
 }
--- gcc/testsuite/g++.dg/cpp2a/srcloc2.C.jj     2020-12-04 16:02:57.300153753 
+0100
+++ gcc/testsuite/g++.dg/cpp2a/srcloc2.C        2021-03-20 00:30:14.245469602 
+0100
@@ -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;
 }
--- gcc/testsuite/g++.dg/cpp2a/srcloc15.C.jj    2020-12-04 16:02:57.300153753 
+0100
+++ gcc/testsuite/g++.dg/cpp2a/srcloc15.C       2021-03-20 00:30:14.246469591 
+0100
@@ -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;
     }
 
--- gcc/testsuite/g++.dg/cpp2a/srcloc16.C.jj    2020-12-03 23:21:57.709534533 
+0100
+++ gcc/testsuite/g++.dg/cpp2a/srcloc16.C       2021-03-20 00:30:14.246469591 
+0100
@@ -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;
 }
--- gcc/testsuite/g++.dg/cpp2a/srcloc19.C.jj    2021-03-20 00:30:14.246469591 
+0100
+++ gcc/testsuite/g++.dg/cpp2a/srcloc19.C       2021-03-20 00:30:14.246469591 
+0100
@@ -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 <const __impl *> (__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);
--- gcc/testsuite/g++.dg/modules/adhoc-1_b.C.jj 2020-12-22 23:50:17.054972550 
+0100
+++ gcc/testsuite/g++.dg/modules/adhoc-1_b.C    2021-03-22 19:08:19.338344945 
+0100
@@ -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 
--- gcc/testsuite/g++.dg/modules/macloc-1_c.C.jj        2020-12-22 
23:50:17.061972472 +0100
+++ gcc/testsuite/g++.dg/modules/macloc-1_c.C   2021-03-22 18:53:29.682029033 
+0100
@@ -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" }
--- gcc/testsuite/g++.dg/modules/macloc-1_d.C.jj        2020-12-22 
23:50:17.061972472 +0100
+++ gcc/testsuite/g++.dg/modules/macloc-1_d.C   2021-03-22 18:53:57.817722777 
+0100
@@ -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" }
--- gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C.jj      
2020-01-14 20:02:46.923607737 +0100
+++ gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C 2021-03-22 
19:05:54.528921226 +0100
@@ -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 ();
--- libstdc++-v3/testsuite/18_support/source_location/consteval.cc.jj   
2021-01-05 00:13:58.354296528 +0100
+++ libstdc++-v3/testsuite/18_support/source_location/consteval.cc      
2021-03-22 22:17:46.427025787 +0100
@@ -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));
 
--- libstdc++-v3/testsuite/18_support/source_location/1.cc.jj   2021-01-05 
00:13:58.354296528 +0100
+++ libstdc++-v3/testsuite/18_support/source_location/1.cc      2021-03-22 
22:19:16.624026315 +0100
@@ -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));
 


        Jakub

Reply via email to