re PR libstdc++/40654 ([C++0x] atomic.cc: 'd' is used uninitialized warning)

2009-10-15  Benjamin Kosnik  <bkoz@redhat.com>

	PR libstdc++/40654
	PR libstdc++/40826
	* src/atomic.cc (atomic_flag_test_and_set_explicit): Add
	static_cast from base to derived.
	(atomic_flag_clear_explicit): Same.
	* include/bits/atomic_2.h (__atomic2::atomic_flag): Public derivation.
	Remove value type constructor.
	* include/bits/atomic_0.h (__atomic0::atomic_flag): Same.
	* include/std/future (_Future_state): Use ATOMIC_FLAG_INIT to
	initialized the atomic_flag member.

From-SVN: r152895
This commit is contained in:
Benjamin Kosnik 2009-10-16 07:47:33 +00:00 committed by Benjamin Kosnik
parent a3e1ddfc64
commit 3808dfec58
7 changed files with 91 additions and 9 deletions

View File

@ -1,3 +1,16 @@
2009-10-15 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/40654
PR libstdc++/40826
* src/atomic.cc (atomic_flag_test_and_set_explicit): Add
static_cast from base to derived.
(atomic_flag_clear_explicit): Same.
* include/bits/atomic_2.h (__atomic2::atomic_flag): Public derivation.
Remove value type constructor.
* include/bits/atomic_0.h (__atomic0::atomic_flag): Same.
* include/std/future (_Future_state): Use ATOMIC_FLAG_INIT to
initialized the atomic_flag member.
2009-10-14 Benjamin Kosnik <bkoz@redhat.com>
* doc/xml/authors.xml: Update.

View File

@ -82,14 +82,15 @@ namespace __atomic0
__r; })
/// atomic_flag
struct atomic_flag : private __atomic_flag_base
struct atomic_flag : public __atomic_flag_base
{
atomic_flag() = default;
~atomic_flag() = default;
atomic_flag(const atomic_flag&) = delete;
atomic_flag& operator=(const atomic_flag&) = delete;
atomic_flag(bool __i) { _M_i = __i; } // XXX deleted copy ctor != agg
// Conversion to ATOMIC_FLAG_INIT.
atomic_flag(bool __i): __atomic_flag_base({ __i }) { }
bool
test_and_set(memory_order __m = memory_order_seq_cst) volatile;

View File

@ -44,14 +44,15 @@
namespace __atomic2
{
/// atomic_flag
struct atomic_flag : private __atomic_flag_base
struct atomic_flag : public __atomic_flag_base
{
atomic_flag() = default;
~atomic_flag() = default;
atomic_flag(const atomic_flag&) = delete;
atomic_flag& operator=(const atomic_flag&) = delete;
atomic_flag(bool __i) { _M_i = __i; } // XXX deleted copy ctor != agg
// Conversion to ATOMIC_FLAG_INIT.
atomic_flag(bool __i): __atomic_flag_base({ __i }) { }
bool
test_and_set(memory_order __m = memory_order_seq_cst) volatile

View File

@ -150,7 +150,7 @@ namespace std
typedef _Future_ptr<_Future_result_base>::type _Future_ptr_type;
public:
_Future_state() : _M_result(), _M_retrieved(false) { }
_Future_state() : _M_result(), _M_retrieved(ATOMIC_FLAG_INIT) { }
_Future_state(const _Future_state&) = delete;
_Future_state& operator=(const _Future_state&) = delete;

View File

@ -80,16 +80,16 @@ namespace std
atomic_flag_test_and_set_explicit(volatile __atomic_flag_base* __a,
memory_order __m) throw ()
{
volatile atomic_flag d(__a->_M_i);
return d.test_and_set(__m);
volatile atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
return d->test_and_set(__m);
}
void
atomic_flag_clear_explicit(volatile __atomic_flag_base* __a,
memory_order __m) throw ()
{
volatile atomic_flag d(__a->_M_i);
return d.clear(__m);
volatile atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
return d->clear(__m);
}
void

View File

@ -0,0 +1,34 @@
// { dg-options "-x c -shared-libgcc -lstdc++" }
// Copyright (C) 2009 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
// <http://www.gnu.org/licenses/>.
#include <cassert>
#include <stdatomic.h>
// libstdc++/40826
// libstdc++/40654
int main()
{
atomic_flag f = ATOMIC_FLAG_INIT;
atomic_flag_clear(&f); // set to false
assert( false == atomic_flag_test_and_set(&f) ); // return previous false, set to true
assert( true == atomic_flag_test_and_set(&f) ); // return true
return 0;
}

View File

@ -0,0 +1,33 @@
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2009 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
// <http://www.gnu.org/licenses/>.
#include <cstdatomic>
#include <testsuite_hooks.h>
int main()
{
bool test __attribute__((unused)) = true;
std::atomic_flag f = ATOMIC_FLAG_INIT;
f.clear(); // set to false
VERIFY( false == f.test_and_set() ); // return previous false, set to true
VERIFY( true == f.test_and_set() ); // return true
return 0;
}