[cfe-dev] Problem with default member initialization and noexcept default constructor

Joe Sylve via cfe-dev cfe-dev at lists.llvm.org
Tue Jul 11 07:58:03 PDT 2017


I went ahead and submitted a bug report.
https://bugs.llvm.org/show_bug.cgi?id=33736

On Tue, Jul 11, 2017, 09:54 Joe Sylve <joe.sylve at gmail.com> wrote:

> It is, but I'm not sure that libc++ is the cause or just points out the
> bug. If you look at the stack overflow link, you'll see an example of
> different code that triggers a similar error without the use of any library
> stuff.
>
> On Tue, Jul 11, 2017, 03:45 Dimitry Andric <dimitry at andric.com> wrote:
>
>> FYI, this looks like an issue in libc++.  If I compile your sample with
>> the latest and greatest clang, but point it to the g++ 7.1.1 libstdc++
>> headers, it works just fine.
>>
>> -Dimitry
>>
>> On 10 Jul 2017, at 20:55, Joe Sylve via cfe-dev <cfe-dev at lists.llvm.org>
>> wrote:
>>
>> I'm seeing an error that is similar to the question raised at
>> https://stackoverflow.com/questions/43819314.  That question seems to
>> not have any consensus as to what the problem may be.
>>
>> I would appreciate if someone could shed some light on my issue and let
>> me know if this is a known compiler bug or if clang is working as intended.
>>
>> The following code produces a compile-time error in clang++ 4.0.0 and
>> later, but works fine in gcc as well as previous versions of clang.
>>
>> #include <memory>
>>
>> struct A {
>>     A() noexcept = default;
>>     A(const A&) noexcept = default;
>>
>>     std::shared_ptr<int> _a {};
>> };
>>
>> int main() {
>>     return 0;
>> }
>>
>> It's worth noting that if I remove the copy constructor, this compiles
>> fine.  If I remove the noexcept qualification from the default constructor
>> it also compiles fine.
>>
>> The error I'm getting is as follows:
>>
>> <source>:4:5: error: default member initializer for '_a' needed within
>> definition of enclosing class 'A' outside of member functions
>>     A() noexcept = default;
>>     ^
>> /opt/compiler-explorer/clang-4.0.0/bin/../include/c++/v1/type_traits:1306:29:
>> note: in instantiation of template class 'std::__1::is_class<int *>'
>> requested here
>> template <class _Tp, bool = is_class<_Tp>::value>
>>                             ^
>> /opt/compiler-explorer/clang-4.0.0/bin/../include/c++/v1/type_traits:1311:71:
>> note: in instantiation of default argument for '__libcpp_abstract<int *>'
>> required here
>> template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_abstract : public
>> __libcpp_abstract<_Tp> {};
>>
>> ^~~~~~~~~~~~~~~~~~~~~~
>> /opt/compiler-explorer/clang-4.0.0/bin/../include/c++/v1/type_traits:1384:39:
>> note: in instantiation of template class 'std::__1::is_abstract<int *>'
>> requested here
>>                                      !is_abstract<_T2>::value> {};
>>                                       ^
>> /opt/compiler-explorer/clang-4.0.0/bin/../include/c++/v1/memory:3918:39:
>> note: in instantiation of template class 'std::__1::is_convertible<int *,
>> int *>' requested here
>>                    typename enable_if<is_convertible<_Yp*,
>> element_type*>::value, __nat>::type = __nat())
>>                                       ^
>> /opt/compiler-explorer/clang-4.0.0/bin/../include/c++/v1/memory:3883:28:
>> note: while substituting deduced template arguments into function template
>> 'shared_ptr' [with _Yp = int]
>> class _LIBCPP_TEMPLATE_VIS shared_ptr
>>                            ^
>> <source>:7:26: note: default member initializer declared here
>>     std::shared_ptr<int> _a {};
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170711/eca8eb47/attachment.html>


More information about the cfe-dev mailing list