https://gcc.gnu.org/g:5ef73ba1cc17b8893ad9a4e95f9cd191dbc0bfa3

commit r15-3654-g5ef73ba1cc17b8893ad9a4e95f9cd191dbc0bfa3
Author: Jason Merrill <ja...@redhat.com>
Date:   Sun Sep 15 16:02:13 2024 +0200

    c++: conversion location
    
    It seems more useful for a conversion to have the location of the source
    expression rather than the enclosing expression, such as a call that might
    convert multiple arguments in different ways.
    
    As a result, in srcloc17.C the recorded location of 'e' when
    copy-initialized became that of the initializer rather than the variable,
    since the semantic was to convert the initializer (at its location) and then
    initialize the variable from the resulting prvalue.  If we instead
    direct-initialize the variable, the location of the constructor call is that
    of the variable.
    
    gcc/cp/ChangeLog:
    
            * call.cc (convert_like_internal) [ck_user]: Use iloc_sentinel.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/srcloc17.C: Adjust initialization.

Diff:
---
 gcc/cp/call.cc                        | 4 ++++
 gcc/testsuite/g++.dg/cpp2a/srcloc17.C | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index d30f36d49ff6..664088eed9c7 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -8669,6 +8669,10 @@ convert_like_internal (conversion *convs, tree expr, 
tree fn, int argnum,
           rvalue, but we know it's read.  */
        mark_exp_read (expr);
 
+       /* Give the conversion call the location of EXPR rather than the
+          location of the context that caused the conversion.  */
+       iloc_sentinel ils (loc);
+
        /* Pass LOOKUP_NO_CONVERSION so rvalue/base handling knows not to allow
           any more UDCs.  */
        expr = build_over_call (cand, LOOKUP_NORMAL|LOOKUP_NO_CONVERSION,
diff --git a/gcc/testsuite/g++.dg/cpp2a/srcloc17.C 
b/gcc/testsuite/g++.dg/cpp2a/srcloc17.C
index a02ea487eef8..4462038d5886 100644
--- a/gcc/testsuite/g++.dg/cpp2a/srcloc17.C
+++ b/gcc/testsuite/g++.dg/cpp2a/srcloc17.C
@@ -90,7 +90,7 @@ bar ()
        return false;
     }
 
-  S<N> e = __LINE__;
+  S<N> e (__LINE__);
   //   ^ column 8
   S<N> f = 1.0;
   if (cmp (e.loc.file_name (), file1))

Reply via email to