> The patch uses the weak version of compare_exchange universally, which
> is incorrect in a number of cases. You wouldn't see this on x86_64;
> you'd have to use a ll/sc target such as powerpc.
>
> In addition to changing several uses to strong compare_exchange, I
> also optimize the idiom
>
> do
> {
> var = *m;
> newval = ...;
> }
> while (!atomic_compare_exchange(m, &var, newval, ...));
>
> With the new builtins, VAR is updated with the current value of the
> memory (regardless of the weak setting), so the initial read from *M
> can be hoisted outside the loop.
nice!
>
> Ok?
cool, thanks for reviewing this.
I fixed up the line numbers for the header file edits.
-benjamin
2012-02-13 Benjamin Kosnik <[email protected]>
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust line numbers.
* testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc: Same.
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
index 0d51663..39f9ce3 100644
--- a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
@@ -32,9 +32,9 @@ void test01()
{
X* px = 0;
std::shared_ptr<X> p1(px); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 773 }
+ // { dg-error "incomplete" "" { target *-*-* } 771 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 867 }
+ // { dg-error "incomplete" "" { target *-*-* } 865 }
}
diff --git a/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc b/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc
index ae902dc..0309f8f 100644
--- a/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc
+++ b/libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc
@@ -1,6 +1,6 @@
// { dg-do compile }
-// Copyright (C) 2010 Free Software Foundation
+// Copyright (C) 2010, 2012 Free Software Foundation
//
// 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
@@ -30,9 +30,9 @@ void test01()
{
X* px = 0;
std::tr1::shared_ptr<X> p1(px); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 565 }
+ // { dg-error "incomplete" "" { target *-*-* } 563 }
std::tr1::shared_ptr<X> p9(ap()); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 604 }
+ // { dg-error "incomplete" "" { target *-*-* } 602 }
}