From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20226 invoked by alias); 29 Aug 2019 10:50:10 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 20218 invoked by uid 89); 29 Aug 2019 10:50:10 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=1.3 required=5.0 tests=AWL,BAYES_00,BIZ_BODY,KAM_INFOUSMEBIZ,SPF_PASS autolearn=no version=3.3.1 spammy=H*F:D*biz, H*M:biz, cschneider@radiodata.biz, cschneiderradiodatabiz X-HELO: smtp.radiodata.biz Received: from smtp.radiodata.biz (HELO smtp.radiodata.biz) (116.203.112.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 29 Aug 2019 10:50:08 +0000 Received: from localhost (localhost [127.0.0.1]) by smtp.radiodata.biz (Postfix) with ESMTP id 58E863E8F2; Thu, 29 Aug 2019 12:50:05 +0200 (CEST) Received: from smtp.radiodata.biz ([116.203.112.52]) by localhost (smtp.radiodata.biz [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m_AjY_4lRDA3; Thu, 29 Aug 2019 12:49:58 +0200 (CEST) Received: from mail.radiodata.biz (p578044f8.dip0.t-ipconnect.de [87.128.68.248]) by smtp.radiodata.biz (Postfix) with ESMTPSA id 233D63E8E6; Thu, 29 Aug 2019 12:49:58 +0200 (CEST) Received: from [192.168.2.143] (radiobox-gentoo.radiodata.xx [192.168.2.143]) by mail.radiodata.biz (Postfix) with ESMTPSA id C86BE2004A; Thu, 29 Aug 2019 12:49:57 +0200 (CEST) Subject: Re: enable_shared_from_this fails at runtime when inherited privately To: Jonathan Wakely Cc: llvm-dev@lists.llvm.org, "gcc@gcc.gnu.org" , christian@ch-sc.de, premmers@radiodata.biz References: <271ebc76-2e27-d4b4-6cd6-9f7a5c8ff7a1@radiodata.biz> From: Christian Schneider Message-ID: <0deb1007-1622-2487-8fe1-5f7557204f37@radiodata.biz> Date: Thu, 29 Aug 2019 10:50:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2019-08/txt/msg00225.txt.bz2 Am 29.08.19 um 12:07 schrieb Jonathan Wakely: > On Thu, 29 Aug 2019 at 10:15, Christian Schneider > wrote: >> >> Hello, >> I just discovered, that, when using enable_shared_from_this and >> inheriting it privately, this fails at runtime. >> I made a small example: >> >> #include >> #include >> #include >> #include >> >> #ifndef prefix >> #define prefix std >> #endif >> >> class foo: >> prefix::enable_shared_from_this >> { >> public: >> prefix::shared_ptr get_sptr() >> { >> return shared_from_this(); >> } >> }; >> >> int main() >> { >> auto a = prefix::make_shared(); >> auto b = a->get_sptr(); >> return 0; >> } >> >> This compiles fine, but throws a weak_ptr exception at runtime. >> I'm aware, that the implementation requires, that >> enable_shared_from_this needs to be publicly inherited, but as a first >> time user, I had to find this out the hard way, as documentations (I >> use, ie. cppreference.com) don't mention it, probably because it's not a >> requirement of the standard. > > It definitely is a requirement of the standard. The new wording we > added via http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0033r1.html#spec > says that the base's weak_ptr is only initialized when the base class > is "unambiguous and accessible". It doesn't say that an ambiguous or > inaccessible base class makes the program ill-formed, so we're not > allowed to reject such a program. > I see. As far as I understand, this sentence was removed: Requires: enable_shared_from_this shall be an accessible base class of T. *this shall be a subobject of an object t of type T. There shall be at least one shared_ptr instance p that owns &t. As far as I read it, this required enable_shared_from_this to be public accessible. Do you know (or someone else), why it was removed? I find it a little, umm..., inconvenient, that the compiler happily accepts it when it is clear that it never ever can work... >> On the other hand, if you compile the code with additional >> -Dprefix=boost (and needed boost stuff installed, of course), it gives a >> compiler error ( >> gcc: 'boost::enable_shared_from_this' is an inaccessible base of 'foo'; >> clang: error: cannot cast 'boost::shared_ptr::element_type' (aka >> 'foo') to its private base class 'boost::enable_shared_from_this') > > That seems like a bug in Boost. > When Boost wants to follow the standard, then yes. If not i would see it as a feature, see above :) >> I'm think, it would be helpful, if the std implemntions also would fail >> at compile time already, and wanted to ask if this would be >> possible/feasible. > > No, that would not conform to the standard. > Clear.