llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.68k stars 11.86k forks source link

clang-cl error : no matching function for call to `get` #35106

Open 2b6a7eb7-d316-41f0-a774-6eb0f997b236 opened 6 years ago

2b6a7eb7-d316-41f0-a774-6eb0f997b236 commented 6 years ago
Bugzilla Link 35758
Version 5.0
OS Windows NT
Attachments preprocessed
CC @CaseyCarter,@dwblaikie,@DougGregor,@zygoloid,@rnk,@StephanTLavavej

Extended Description

Works for other compilers: https://godbolt.org/g/qABFqf

>type Source.cpp
#include <tuple>

struct S : std::tuple<int> {};

int main() {
  S s;
  return std::get<0>(s);
}
>"c:\Program Files\LLVM\msbuild-bin\cl.exe" -c Source.cpp
Source.cpp(7,10):  error: no matching function for call to 'get'
  return std::get<0>(s);
         ^~~~~~~~~~~
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(572,3):  note: candidate template ignored: could not match 'pair<type-parameter-0-1, type-parameter-0-2>'
      against 'S'
                get(pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(596,3):  note: candidate template ignored: could not match 'pair<type-parameter-0-1, type-parameter-0-2>'
      against 'S'
                get(const pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(620,3):  note: candidate template ignored: could not match 'pair<type-parameter-0-1, type-parameter-0-2>'
      against 'S'
                get(pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(644,3):  note: candidate template ignored: could not match 'pair<type-parameter-0-1, type-parameter-0-2>'
      against 'S'
                get(const pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(785,3):  note: candidate template ignored: failed template argument deduction
                get(tuple<_Types...>& _Tuple) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(794,3):  note: candidate template ignored: failed template argument deduction
                get(const tuple<_Types...>& _Tuple) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(803,3):  note: candidate template ignored: failed template argument deduction
                get(tuple<_Types...>&& _Tuple) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(813,3):  note: candidate template ignored: failed template argument deduction
                get(const tuple<_Types...>&& _Tuple) _NOEXCEPT
                ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(927,28):  note: candidate template ignored: could not match 'array<type-parameter-0-1, _Size>' against 'S'
        _NODISCARD constexpr _Ty& get(array<_Ty, _Size>& _Arr) _NOEXCEPT;
                                  ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(932,34):  note: candidate template ignored: could not match 'array<type-parameter-0-1, _Size>' against 'S'
        _NODISCARD constexpr const _Ty& get(const array<_Ty, _Size>& _Arr) _NOEXCEPT;
                                        ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(937,29):  note: candidate template ignored: could not match 'array<type-parameter-0-1, _Size>' against 'S'
        _NODISCARD constexpr _Ty&& get(array<_Ty, _Size>&& _Arr) _NOEXCEPT;
                                   ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(942,35):  note: candidate template ignored: could not match 'array<type-parameter-0-1, _Size>' against 'S'
        _NODISCARD constexpr const _Ty&& get(const array<_Ty, _Size>&& _Arr) _NOEXCEPT;
                                         ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(580,29):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty1'
        _NODISCARD constexpr _Ty1& get(pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                                   ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(587,29):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty2'
        _NODISCARD constexpr _Ty2& get(pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                                   ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(604,35):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty1'
        _NODISCARD constexpr const _Ty1& get(const pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                                         ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(611,35):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty2'
        _NODISCARD constexpr const _Ty2& get(const pair<_Ty1, _Ty2>& _Pr) _NOEXCEPT
                                         ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(628,30):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty1'
        _NODISCARD constexpr _Ty1&& get(pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                                    ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(635,30):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty2'
        _NODISCARD constexpr _Ty2&& get(pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                                    ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(652,36):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty1'
        _NODISCARD constexpr const _Ty1&& get(const pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                                          ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\utility(659,36):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty2'
        _NODISCARD constexpr const _Ty2&& get(const pair<_Ty1, _Ty2>&& _Pr) _NOEXCEPT
                                          ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(823,28):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty'
        _NODISCARD constexpr _Ty& get(tuple<_Types...>& _Tuple) _NOEXCEPT
                                  ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(831,34):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty'
        _NODISCARD constexpr const _Ty& get(const tuple<_Types...>& _Tuple) _NOEXCEPT
                                        ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(839,29):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty'
        _NODISCARD constexpr _Ty&& get(tuple<_Types...>&& _Tuple) _NOEXCEPT
                                   ^
C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.12.25907\include\tuple(847,35):  note: candidate template ignored: invalid explicitly-specified argument for template parameter
      '_Ty'
        _NODISCARD constexpr const _Ty&& get(const tuple<_Types...>&& _Tuple) _NOEXCEPT
                                         ^
1 error generated.
CaseyCarter commented 6 years ago

This happens because tuple in the MSFT STL is defined recursively: tuple<First, Rest...> is derived from tuple<Rest...>. Consequently S in the sample code is derived from tuple<int> which derives from tuple<>. Per the standard, the conversion from S to tuple<> is no worse than the conversion from S to tuple<int> - and both are valid conversion sequences when passing S to std::get - so the call is ambiguous. MSVC as an "extension" prefers the conversion from S to tuple<int> and thus non-conformingly resolves the call to std::get as unambiguous.

rnk commented 6 years ago

C++ people, is this code supposed to work? I'm guessing the std::tuple overload is supposed to be chosen and object slicing is supposed to occur, right?