https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113219

            Bug ID: 113219
           Summary: Overloaded ref-qualified conversion operator triggers
                    bogus -Wconversion
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m.cencora at gmail dot com
  Target Milestone: ---

Following code when compiled on any gcc version (checked all available on
godbolt since gcc-7) triggers conversion warnings.
I consider it bogus because it tells user that it has chosen a better overload
(which is good thing, right?).
Clang doesn't print any related warning even with -Weverything

g++ -std=c++17 -Wconversion

template <typename T>
struct wrapper
{
    operator T() const&;

    operator T&&() &&;
};

wrapper<int> createInt();

int test()
{
    return createInt();
}

Output is:
<source>:13:21: warning: choosing 'wrapper<T>::operator T&&() && [with T =
int]' over 'wrapper<T>::operator T() const & [with T = int]' [-Wconversion]
   13 |     return createInt();
      |            ~~~~~~~~~^~
<source>:13:21: warning:   for conversion from 'wrapper<int>' to 'int'
[-Wconversion]
<source>:13:21: note:   because conversion sequence for the argument is better

Reply via email to