On 11/04/17 22:25, Richard Smith wrote:
On 11 April 2017 at 08:35, Marshall Clow via Phabricator via cfe-commits <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    mclow.lists added a comment.

    Complete reproducer:

    // Tested with with:  clang++ -std=c++14 -Wunused-function
    UnusedFVassily.cpp
    //
    // UnusedFVassily.cpp:8:39: warning: unused function '__test'
    [-Wunused-function]
    //     template <class _Up> static __two __test(...);
    //                                       ^
    // UnusedFVassily.cpp:9:38: warning: unused function '__test'
    [-Wunused-function]
    //     template <class _Up> static char __test(typename
    _Up::pointer* = 0);
    //                                      ^
    // 2 warnings generated.

    #include <type_traits>

    namespace foo {

    struct __two {char __lx; char __lxx;};
    namespace __has_pointer_type_imp
    {

      template <class _Up> static __two __test(...);
      template <class _Up> static char __test(typename _Up::pointer* = 0);

    }

    template <class _Tp>
    struct __has_pointer_type

      : public std::integral_constant<bool,
    sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1>


This is a bug in libc++. If this header is included into two translation units, they will be referencing different __test functions here (because the template has internal linkage due to the 'static'), resulting in an ODR violation.
Richard, shall we warn on template definitions marked static? This would keep this pattern still working.


    {
    };

    }

    struct S1 {};
    struct S2 { typedef void *pointer; };

    int main () {
            static_assert (!foo::__has_pointer_type<S1>::value, "" );
            static_assert ( foo::__has_pointer_type<S2>::value, "" );
    }


    https://reviews.llvm.org/D29877 <https://reviews.llvm.org/D29877>



    _______________________________________________
    cfe-commits mailing list
    cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
    <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to