any (any::operator=(const any&)): Check for self-assignment.
authorJonathan Wakely <jwakely@redhat.com>
Thu, 30 Jul 2015 10:00:39 +0000 (11:00 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 30 Jul 2015 10:00:39 +0000 (11:00 +0100)
* include/experimental/any (any::operator=(const any&)): Check for
self-assignment.
* testsuite/experimental/any/assign/self.cc: New.
* testsuite/experimental/any/misc/any_cast_neg.cc: Adjust dg-error.

From-SVN: r226393

libstdc++-v3/ChangeLog
libstdc++-v3/include/experimental/any
libstdc++-v3/testsuite/experimental/any/assign/self.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/any/misc/any_cast_neg.cc

index 98758f4186299102039cde38ed067790ef2f61b1..fc4eca92bdf8a9016165e128aa3c7aad3374ee1c 100644 (file)
@@ -1,3 +1,10 @@
+2015-07-30  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/experimental/any (any::operator=(const any&)): Check for
+       self-assignment.
+       * testsuite/experimental/any/assign/self.cc: New.
+       * testsuite/experimental/any/misc/any_cast_neg.cc: Adjust dg-error.
+
 2015-07-29  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/66829
index 7b5e5ecbcbae42735988bd127e41f00895a450b2..fbb70a7ae55c6fde4be6536143b5806568d26054 100644 (file)
@@ -175,6 +175,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     /// Copy the state of another object.
     any& operator=(const any& __rhs)
     {
+      if (this == &__rhs)
+       return *this;
+
       if (__rhs.empty())
        clear();
       else
diff --git a/libstdc++-v3/testsuite/experimental/any/assign/self.cc b/libstdc++-v3/testsuite/experimental/any/assign/self.cc
new file mode 100644 (file)
index 0000000..0fb9566
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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/>.
+
+// { dg-options "-std=gnu++14" }
+
+#include <experimental/any>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  using std::experimental::any;
+
+  any a;
+  a = a;
+  VERIFY( a.empty() );
+
+  a = 1;
+  a = a;
+  VERIFY( !a.empty() );
+}
+
+int
+main()
+{
+  test01();
+}
index 39e322642aa4b7f08c17564a2f1c26b0ced98578..b88592a108da5bd44c831638cfa91539824a0250 100644 (file)
@@ -26,5 +26,5 @@ void test01()
   using std::experimental::any_cast;
 
   const any y(1);
-  any_cast<int&>(y); // { dg-error "qualifiers" "" { target { *-*-* } } 356 }
+  any_cast<int&>(y); // { dg-error "qualifiers" "" { target { *-*-* } } 359 }
 }