[libcxx-dev] Commit implementing LWG 2510 (r372777) breaks compilation of LLVM

Ilya Biryukov via libcxx-dev libcxx-dev at lists.llvm.org
Wed Sep 25 08:30:30 PDT 2019


Awesome, thanks!
Let me know if I can be of any more help.

On Wed, Sep 25, 2019 at 5:30 PM Louis Dionne <ldionne.2 at gmail.com> wrote:

> I was able to reproduce the failure. I don't understand it yet but it
> looks like we might have exposed a Clang bug. FWIW, here's the repro:
>
> #include <utility>
> #include <type_traits>
>
> struct Base { };
> struct Derived : Base { protected: Derived() = default; };
> static_assert(!std::is_default_constructible<std::pair<Derived, int>
> >::value, "");
>
>
> Louis
>
> On Wed, Sep 25, 2019 at 5:18 AM Ilya Biryukov <ibiryukov at google.com>
> wrote:
>
>> Reverted in r372832.
>>
>> On Wed, Sep 25, 2019 at 11:00 AM Ilya Biryukov <ibiryukov at google.com>
>> wrote:
>>
>>> I'll have to revert the change to unbreak our integrate.
>>> Sorry about the inconvenience.
>>>
>>>
>>> On Wed, Sep 25, 2019 at 10:41 AM Ilya Biryukov <ibiryukov at google.com>
>>> wrote:
>>>
>>>> Hi Louis,
>>>>
>>>> I'm seeing compilation failures while trying to compile clang with
>>>> libc++ after r372777.
>>>> This is blocking our integrates.
>>>>
>>>> Checking for implicitly default-constructible types results in errors
>>>> coming from access-checking.
>>>> I would expect this shouldn't happen, given that the check is done in
>>>> SFINAE context.
>>>> Is there a quick workaround? Should we revert the change until it's
>>>> found?
>>>>
>>>> Here is the compilation error itself:
>>>>
>>>> .../include/c++/v1/type_traits:2820:110: error: calling a protected
>>>> constructor of class 'clang::ento::Loc'
>>>> struct __is_implicitly_default_constructible<_Tp,
>>>> decltype(__test_implicit_default_constructible<_Tp const&>({}))>
>>>>
>>>>                                      ^
>>>> .../include/c++/v1/utility:350:18: note: in instantiation of template
>>>> class 'std::__u::__is_implicitly_default_constructible<clang::ento::Loc,
>>>> void>' requested here
>>>>           return __is_implicitly_default_constructible<_U1>::value
>>>>                  ^
>>>> .../include/c++/v1/utility:341:19: note: in instantiation of function
>>>> template specialization 'std::__u::pair<clang::ento::Loc,
>>>> clang::ento::SVal>::_CheckArgs::__enable_implicit_default<clang::ento::Loc,
>>>> clang::ento::SVal>' requested here
>>>>               && !__enable_implicit_default<_U1, _U2>();
>>>>                   ^
>>>> .../include/c++/v1/utility:403:45: note: in instantiation of function
>>>> template specialization 'std::__u::pair<clang::ento::Loc,
>>>> clang::ento::SVal>::_CheckArgs::__enable_explicit_default<clang::ento::Loc,
>>>> clang::ento::SVal>' requested here
>>>>             _CheckArgsDep<_Dummy>::template
>>>> __enable_explicit_default<_T1, _T2>()
>>>>                                             ^
>>>> .../include/c++/v1/utility:406:5: note: while substituting prior
>>>> template arguments into non-type template parameter [with _Dummy = true]
>>>>     pair()
>>>> _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value &&
>>>>
>>>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>> ../include/c++/v1/utility:297:29: note: while substituting deduced
>>>> template arguments into function template 'pair' [with _Dummy = (no value),
>>>> $1 = (no value)]
>>>> struct _LIBCPP_TEMPLATE_VIS pair
>>>>                             ^
>>>> third_party/llvm/llvm/include/llvm/Support/type_traits.h:90:7: note:
>>>> (skipping 3 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see
>>>> all)
>>>> union trivial_helper {
>>>>       ^
>>>> third_party/llvm/llvm/include/llvm/Support/type_traits.h:176:40: note:
>>>> in instantiation of static data member
>>>> 'llvm::is_trivially_copyable<std::__u::pair<clang::ento::Loc,
>>>> clang::ento::SVal> >::has_trivial_move_constructor' requested here
>>>>       (has_deleted_move_constructor || has_trivial_move_constructor) &&
>>>>                                        ^
>>>> third_party/llvm/llvm/include/llvm/ADT/SmallVector.h:178:56: note: in
>>>> instantiation of static data member
>>>> 'llvm::is_trivially_copyable<std::__u::pair<clang::ento::Loc,
>>>> clang::ento::SVal> >::value' requested here
>>>> template <typename T, bool = is_trivially_copyable<T>::value>
>>>>                                                        ^
>>>> third_party/llvm/llvm/include/llvm/ADT/SmallVector.h:315:32: note: in
>>>> instantiation of default argument for
>>>> 'SmallVectorTemplateBase<std::__u::pair<clang::ento::Loc,
>>>> clang::ento::SVal> >' required here
>>>> class SmallVectorImpl : public SmallVectorTemplateBase<T> {
>>>>                                ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>> third_party/llvm/llvm/include/llvm/ADT/SmallVector.h:837:28: note: in
>>>> instantiation of template class
>>>> 'llvm::SmallVectorImpl<std::__u::pair<clang::ento::Loc, clang::ento::SVal>
>>>> >' requested here
>>>> class SmallVector : public SmallVectorImpl<T>, SmallVectorStorage<T, N>
>>>> {
>>>>                            ^
>>>> third_party/llvm/llvm/tools/clang/lib/StaticAnalyzer/Core/Store.cpp:51:46:
>>>> note: in instantiation of template class
>>>> 'llvm::SmallVector<std::__u::pair<clang::ento::Loc, clang::ento::SVal>,
>>>> 16>' requested here
>>>>   SmallVector<CallEvent::FrameBindingTy, 16> InitialBindings;
>>>>                                              ^
>>>> third_party/llvm/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h:322:3:
>>>> note: declared protected here
>>>>   Loc() = default;
>>>>
>>>> --
>>>> Regards,
>>>> Ilya Biryukov
>>>>
>>>
>>>
>>> --
>>> Regards,
>>> Ilya Biryukov
>>>
>>
>>
>> --
>> Regards,
>> Ilya Biryukov
>>
>

-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libcxx-dev/attachments/20190925/ba77ad34/attachment-0001.html>


More information about the libcxx-dev mailing list