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

Dimitry Andric via cfe-dev cfe-dev at lists.llvm.org
Tue Jul 11 01:45:41 PDT 2017


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 <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/b9ece11b/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170711/b9ece11b/attachment.sig>


More information about the cfe-dev mailing list