From patchwork Tue Nov 4 03:41:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 406422 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id F0DEE1400A4 for ; Tue, 4 Nov 2014 15:43:33 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=dQ29eHx+XZ9xz6Edt /PLnAb+FGkp8Yc9E9Jo5Mo2kCGYLCBcJIMcYjTrgdb4z32fLTA1Ih1FoAFV2EDdl bXmgRF7LRWGygQosk6B6OBUjDgwsYm5GIDvE2ASpVvrqpDDBbUFVErI6sa0gd7+I 2rokp/ZRGbdkMbOJQx+Nuaqj58= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=default; bh=AcpL7aEaThrewnKatn3Hr11 D2d4=; b=cLmeVIJ7H7k4m181t25oDVYQY1mTs7zM1bOc2TCde2/Rh/BxYWpg0hr uTBTKESdnHq4b6OqjE2mK2+slwHeSq0HHO3awBhSXq5d02K4UncKLHIQgnL86Gbl 2sujnENDmzWW2iqCZSbGtyiU4XvPWDsagckjd8iKiJ0ONEL1KLiY= Received: (qmail 24688 invoked by alias); 4 Nov 2014 03:41:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 24656 invoked by uid 89); 4 Nov 2014 03:41:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 3 recipients X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 04 Nov 2014 03:41:28 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA43fKKG011450 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 3 Nov 2014 22:41:21 -0500 Received: from localhost (ovpn-116-19.ams2.redhat.com [10.36.116.19]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA43fJSi007468; Mon, 3 Nov 2014 22:41:20 -0500 Date: Tue, 4 Nov 2014 03:41:18 +0000 From: Jonathan Wakely To: Jonathan Wakely Cc: Paolo Carlini , Rainer Emrich , "gcc@gcc.gnu.org" , libstdc++ , gcc-patches@gcc.gnu.org Subject: Re: libstdc++ testsuite make targets check-parallel and check-performance don't work anymore Message-ID: <20141104034118.GG3961@redhat.com> References: <54579773.60601@emrich-ebersheim.de> <5457AAF8.5060403@oracle.com> <5457C09A.60303@oracle.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) On 03/11/14 22:07 +0000, Jonathan Wakely wrote: >On 3 November 2014 17:51, Paolo Carlini wrote: >> .. other than the above issue, I see a segmentation fault for: >> >> performance/ext/pb_ds/multimap_text_insert_mem_large.cc >> >> and a compile error for: >> >> performance/ext/pb_ds/priority_queue_text_pop_mem.cc >> >> which boils down to a an error at include/bits/stl_deque.h:519 (likely pd_ds >> is misusing std::deque). Jon, can you double check the latter? > >I think it's a bug I introduced to std::deque -- I'm assuming that >MoveConstructible allocators are also MoveAssignable, which is not a >valid assumption. I'll fix it. Fixed by this patch, committed to trunk. commit f84f372dceab9cd9401caf326f942557e8ccfcac Author: Jonathan Wakely Date: Tue Nov 4 03:16:55 2014 +0000 Do not assume allocator is assignable. * include/bits/stl_deque.h (_Deque_base(_Deque_base&&)): Copy allocator instead of moving. * testsuite/23_containers/deque/allocator/move-2.cc: New. diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index acb7715..d50d3c90 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -503,23 +503,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #if __cplusplus >= 201103L _Deque_base(_Deque_base&& __x) - : _M_impl(std::move(__x._M_get_Tp_allocator())) + : _M_impl(__x._M_get_Tp_allocator()) { + _M_initialize_map(0); if (__x._M_impl._M_map) - { - this->_M_impl._M_swap_data(__x._M_impl); - __try - { - // Re-initialize __x using its moved-from allocator. - __x._M_initialize_map(0); - } - __catch (...) - { - this->_M_impl._M_swap_data(__x._M_impl); - __x._M_get_Tp_allocator() = std::move(_M_get_Tp_allocator()); - __throw_exception_again; - } - } + this->_M_impl._M_swap_data(__x._M_impl); } _Deque_base(_Deque_base&& __x, const allocator_type& __a, size_type __n) diff --git a/libstdc++-v3/testsuite/23_containers/deque/allocator/move-2.cc b/libstdc++-v3/testsuite/23_containers/deque/allocator/move-2.cc new file mode 100644 index 0000000..3932676 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/deque/allocator/move-2.cc @@ -0,0 +1,53 @@ +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +template +struct Alloc +{ + using value_type = T; + + Alloc() = default; + + template + Alloc(const Alloc&) { } + + Alloc& operator=(const Alloc&) = delete; + + T* allocate(std::size_t n) + { return std::allocator{}.allocate(n); } + + void deallocate(T* p, std::size_t n) + { std::allocator{}.deallocate(p, n); } +}; + +template +bool operator==(const Alloc&, const Alloc&) { return true; } + +template +bool operator!=(const Alloc&, const Alloc&) { return false; } + +void +test01() +{ + std::deque> d; + auto d2 = std::move(d); +}