[llvm-bugs] [Bug 43400] New: template friend is redefinition

via llvm-bugs llvm-bugs at lists.llvm.org
Sun Sep 22 11:00:52 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=43400

            Bug ID: 43400
           Summary: template friend is redefinition
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: Casey at Carter.net
                CC: blitzrakete at gmail.com, dgregor at apple.com,
                    erik.pilkington at gmail.com, llvm-bugs at lists.llvm.org,
                    richard-llvm at metafoo.co.uk

Created attachment 22540
  --> https://bugs.llvm.org/attachment.cgi?id=22540&action=edit
Repro

Compiling this well-formed program:

    template<class>
    constexpr bool is_lvalue_reference = false;
    template<class T>
    constexpr bool is_lvalue_reference<T&> = true;

    template<bool> struct int_if_ {};
    template<> struct int_if_<true> { using type = int; };
    template<bool B> using int_if = typename int_if_<B>::type;

    struct Derived;

    struct Base {
        template<class T>
        friend void operator|(T&, Derived const&) = delete;

        template<class T, int_if<!is_lvalue_reference<T>> = 0>
        friend T operator|(T&& t, Derived const&) {
            return static_cast<T&&>(t);
        }
    };

    struct Derived : Base {};

    int main() {
        struct vector {};
        vector v;
        v = static_cast<vector&&>(v) | Derived{};
    }

produces diagnostics:

    repro.cpp(15,17): error: redefinition of 'operator|'
        friend void operator|(T&, Derived const&) = delete;
                    ^
    repro.cpp(28,34): note: in instantiation of function template
specialization 'operator|<vector>' requested here
        v = static_cast<vector&&>(v) | Derived{};
                                     ^
    repro.cpp(15,17): note: previous definition is here
        friend void operator|(T&, Derived const&) = delete;
                    ^
    1 error generated.

The problem seems to reproduce on every version of Clang I try, with C++11 or
later.

This doesn't seem to be a duplicate of the other "friend redefinition" bugs
(#35012 and #41523), since it's a template friend of a non-template class, but
I could be mistaken.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20190922/a15fe7c0/attachment.html>


More information about the llvm-bugs mailing list