Commit 3808dfec by Benjamin Kosnik Committed by Benjamin Kosnik

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
parent a3e1ddfc
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.
......
......@@ -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;
......
......@@ -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
......
......@@ -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;
......
......@@ -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
......
// { 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;
}
// { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment