]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: conversion location
authorJason Merrill <jason@redhat.com>
Sun, 15 Sep 2024 14:02:13 +0000 (16:02 +0200)
committerJason Merrill <jason@redhat.com>
Sun, 15 Sep 2024 15:47:28 +0000 (17:47 +0200)
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.

gcc/cp/call.cc
gcc/testsuite/g++.dg/cpp2a/srcloc17.C

index d30f36d49ff69c520e31a5b2c9fbb75eb76c4095..664088eed9c79a4c0df950d22b81f4ef1ba27bd2 100644 (file)
@@ -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,
index a02ea487eef8310451bb83aa63d1b8b97568a1dc..4462038d58866548e5f1e84b371b0eceb22f2032 100644 (file)
@@ -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))