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

            Bug ID: 90546
           Summary: [9.1 regression] Incorrect template argument deduction
                    for conversion functions
           Product: gcc
           Version: 9.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ndkrempel at gmail dot com
  Target Milestone: ---

The following code deduces T = Foo using gcc 9.1, whereas gcc 8.3 (and clang 7
up) deduced T = const Foo. My reading of the standard (see below) is that T =
const Foo is correct.

struct Foo {};
void test(const Foo&);
struct Bar {
  template <typename T> operator T&&();
};
int main() {
  test(Bar{});
}

(compiled with -std=c++2a, but same behaviour with all language versions)

Relevant standards text: http://eel.is/c++draft/temp.deduct.conv
My reading of this applied to the above program is:
P is T&&, A is const Foo&
P is a reference type -> just treat as T from here on
A is not cv-qualified
A is a reference type -> use const Foo for type deduction
Now attempting to match T with const Foo succeeds with T = const Foo, so we
don't even need to consider the four bulleted exceptional cases ("These
alternatives are considered only if type deduction would otherwise fail.")

Reply via email to