http://llvm.org/bugs/show_bug.cgi?id=13730

             Bug #: 13730
           Summary: decltype in declaration does not match up with
                    definition, causing ambiguous overload
           Product: clang
           Version: 3.1
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected], [email protected]
    Classification: Unclassified


Consider this:

#include <utility> // std::declval

using namespace std;

template<typename T>
struct vec {
};

template<typename S, typename T>
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>& v1, const
vec<T>& v2);

template<typename S, typename T>
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>&, const
vec<T>&) {
    return vec<decltype(declval<S>() * declval<T>())>();
}

int main() {
    vec<double> v1, v2;
    v1 * v2;
}

This gives:

amb.cpp:19:5: fatal error: use of overloaded operator '*' is ambiguous (with
operand types 'vec<double>' and 'vec<double>')
        v1 * v2;
        ~~ ^ ~~
amb.cpp:10:44: note: candidate function [with S = double, T = double]
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>& v1, const
vec<T>& v2);
                                           ^
amb.cpp:13:44: note: candidate function [with S = double, T = double]
vec<decltype(declval<S>() * declval<T>())> operator*(const vec<S>&, const
vec<T>&) {
                                           ^
1 error generated.

I only intend there to be one function "operator*", that is first declared and
then defined.

Somehow, the presence of "decltype" and "declval" in the return type prevents
the definition from matching up with the declaration, causing an ambiguous
overload?

This is:

Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.1.0
Thread model: posix

With -stdlib=libc++

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to