Author: sebor
Date: Sat Jul 19 20:49:09 2008
New Revision: 678247
URL: http://svn.apache.org/viewvc?rev=678247&view=rev
Log:
2008-07-19 Martin Sebor <[EMAIL PROTECTED]>
* tests/utilities/20.meta.unary.nothrow.cpp: New test exercising
just the has_nothrow_xxx traits (so far has_nothrow_copy_constructor
only).
Added:
stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp (with
props)
Added: stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp
URL:
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp?rev=678247&view=auto
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp (added)
+++ stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp Sat Jul 19
20:49:09 2008
@@ -0,0 +1,727 @@
+/***************************************************************************
+ *
+ * 20.meta.unary.prop.cpp - test exercising meta.unary.prop,
+ * has_nothrow_xxx traits
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ **************************************************************************/
+
+#include <rw_driver.h>
+
+#ifndef _RWSTD_NO_EXT_CXX_0X
+
+// only compele when C++ 0x extensions are enabled
+
+#include <type_traits>
+
+#define THROW public: enum { value = 0 }
+#define NOTHROW public: enum { value = 1 }
+
+struct A {
+ struct A1 { NOTHROW; /* trivial copy ctor */ };
+ struct A2 { NOTHROW; A2 (A2&) throw (); };
+ struct A3 { NOTHROW; A3 (const A3&) throw (); };
+ struct A4 { NOTHROW; A4 (volatile A4&) throw (); };
+ struct A5 { NOTHROW; A5 (const volatile A5&) throw (); };
+
+#ifndef _RWSTD_NO_RVALUE_REFERENCES
+
+ // move ctor overloads (move ctor is not a copy ctor)
+ struct A6 { NOTHROW; A6 (A6&&) throw (); };
+ struct A7 { NOTHROW; A7 (const A6&&) throw (); };
+ struct A8 { NOTHROW; A8 (volatile A6&&) throw (); };
+ struct A9 { NOTHROW; A9 (const volatile A6&&) throw (); };
+
+#endif // _RWSTD_NO_RVALUE_REFERENCES
+
+};
+
+
+struct B {
+ struct B1 { THROW; B1 (B1&); };
+ struct B2 { THROW; B2 (const B2&); };
+ struct B3 { THROW; B3 (volatile B3&); };
+ struct B4 { THROW; B4 (const volatile B4&); };
+
+#ifndef _RWSTD_NO_RVALUE_REFERENCES
+
+ // move ctor overloads (move ctor is not a copy ctor)
+ struct B5 { NOTHROW; B5 (B5&&); };
+ struct B6 { NOTHROW; B6 (const B6&&); };
+ struct B7 { NOTHROW; B7 (volatile B7&&); };
+ struct B8 { NOTHROW; B8 (const volatile B8&&); };
+
+#endif // _RWSTD_NO_RVALUE_REFERENCES
+
+};
+
+
+struct C {
+ // same as A::A* but with inaccessible copy ctor
+
+ class C1 { NOTHROW; private: /* trivial copy ctor */ };
+ class C2 { NOTHROW; private: C2 (C2&) throw (); };
+ class C3 { NOTHROW; private: C3 (const C3&) throw (); };
+ class C4 { NOTHROW; private: C4 (volatile C4&) throw (); };
+ class C5 { NOTHROW; private: C5 (const volatile C5&) throw (); };
+
+#ifndef _RWSTD_NO_RVALUE_REFERENCES
+
+ // move ctor overloads (move ctor is not a copy ctor)
+ class C6 { NOTHROW; private: C6 (C6&&) throw (); };
+ class C7 { NOTHROW; private: C7 (const C7&&) throw (); };
+ class C8 { NOTHROW; private: C8 (volatile C8&&) throw (); };
+ class C9 { NOTHROW; private: C9 (const volatile C9&&) throw (); };
+
+#endif // _RWSTD_NO_RVALUE_REFERENCES
+
+};
+
+
+struct D {
+ // same as B::B* but with inaccessible copy ctor
+
+ class D1 { NOTHROW; /* trivial copy ctor */ };
+ class D2 { NOTHROW; D2 (D2&) throw (); };
+ class D3 { NOTHROW; D3 (const D3&) throw (); };
+ class D4 { NOTHROW; D4 (volatile D4&) throw (); };
+ class D5 { NOTHROW; D5 (const volatile D5&) throw (); };
+
+#ifndef _RWSTD_NO_RVALUE_REFERENCES
+
+ // move ctor overloads (move ctor is not a copy ctor)
+ class D6 { NOTHROW; D6 (D6&&) throw (); };
+ class D7 { NOTHROW; D7 (const D7&&) throw (); };
+ class D8 { NOTHROW; D8 (volatile D8&&) throw (); };
+ class D9 { NOTHROW; D9 (const volatile D9&&) throw (); };
+
+#endif // _RWSTD_NO_RVALUE_REFERENCES
+
+};
+
+
+struct E {
+ // both const and non-const copy ctors
+
+ struct E1 {
+ NOTHROW;
+ E1 (E1&) throw () { }
+ E1 (const E1&) throw () { }
+ };
+
+ struct E2 {
+ THROW;
+ E2 (E2&) throw () { }
+ E2 (const E2&);
+ };
+
+ struct E3 {
+ THROW;
+ E3 (E3&);
+ E3 (const E3&) throw () { }
+ };
+
+ struct E4 {
+ THROW;
+ E4 (E4&);
+ E4 (const E4&);
+ };
+};
+
+
+struct F {
+ // non-const, const, and volatile copy ctors
+
+ struct F1 {
+ NOTHROW;
+ F1 (F1&) throw () { }
+ F1 (const F1&) throw () { }
+ F1 (volatile F1&) throw () { }
+ };
+
+ struct F2 {
+ THROW;
+ F2 (F2&) throw () { }
+ F2 (const F2&) throw () { }
+ F2 (volatile F2&);
+ };
+
+ struct F3 {
+ THROW;
+ F3 (F3&) throw () { }
+ F3 (const F3&);
+ F3 (volatile F3&) throw () { }
+ };
+
+ struct F4 {
+ THROW;
+ F4 (F4&);
+ F4 (const F4&) throw () { }
+ F4 (volatile F4&) throw () { }
+ };
+};
+
+
+struct G {
+ // non-const, const, volatile, and const volatile copy ctors
+
+ struct G1 {
+ NOTHROW;
+ G1 (G1&) throw ();
+ G1 (const G1&) throw ();
+ G1 (volatile G1&) throw ();
+ G1 (const volatile G1&) throw ();
+ };
+
+ struct G2 {
+ THROW;
+ G2 (G2&) throw ();
+ G2 (const G2&) throw ();
+ G2 (volatile G2&) throw ();
+ G2 (const volatile G2&);
+ };
+
+ struct G3 {
+ THROW;
+ G3 (G3&) throw ();
+ G3 (const G3&) throw ();
+ G3 (volatile G3&);
+ G3 (const volatile G3&) throw ();
+ };
+
+ struct G4 {
+ THROW;
+ G4 (G4&) throw ();
+ G4 (const G4&);
+ G4 (volatile G4&) throw ();
+ G4 (const volatile G4&) throw ();
+ };
+
+ struct G5 {
+ THROW;
+ G5 (G5&);
+ G5 (const G5&) throw ();
+ G5 (volatile G5&) throw ();
+ G5 (const volatile G5&) throw ();
+ };
+};
+
+
+struct H {
+ // non-const, const, volatile, and const volatile copy ctors
+
+ struct H1 {
+ NOTHROW;
+ H1 (H1&) throw ();
+ H1 (const H1&) throw ();
+ H1 (volatile H1&) throw ();
+ H1 (const volatile H1&) throw ();
+ };
+
+ struct H2 {
+ THROW;
+ H2 (H2&) throw ();
+ H2 (const H2&) throw ();
+ H2 (volatile H2&) throw ();
+ H2 (const volatile H2&);
+ };
+
+ struct H3 {
+ THROW;
+ H3 (H3&) throw ();
+ H3 (const H3&) throw ();
+ H3 (volatile H3&);
+ H3 (const volatile H3&) throw ();
+ };
+
+ struct H4 {
+ THROW;
+ H4 (H4&) throw ();
+ H4 (const H4&);
+ H4 (volatile H4&) throw ();
+ H4 (const volatile H4&) throw ();
+ };
+
+ struct H5 {
+ THROW;
+ H5 (H5&);
+ H5 (const H5&) throw ();
+ H5 (volatile H5&) throw ();
+ H5 (const volatile H5&) throw ();
+ };
+};
+
+
+struct I {
+ // non-const, const, volatile, and const volatile copy ctors
+ // all with second argument
+
+ struct I1 {
+ NOTHROW;
+ I1 (I1&, int = 0) throw ();
+ I1 (const I1&, int = 0) throw ();
+ I1 (volatile I1&, int = 0) throw ();
+ I1 (const volatile I1&, int = 0) throw ();
+ };
+
+ struct I2 {
+ THROW;
+ I2 (I2&, int = 0) throw ();
+ I2 (const I2&, int = 0) throw ();
+ I2 (volatile I2&, int = 0) throw ();
+ I2 (const volatile I2&, int = 0);
+ };
+
+ struct I3 {
+ THROW;
+ I3 (I3&, int = 0) throw ();
+ I3 (const I3&, int = 0) throw ();
+ I3 (volatile I3&, int = 0);
+ I3 (const volatile I3&, int = 0) throw ();
+ };
+
+ struct I4 {
+ THROW;
+ I4 (I4&, int = 0) throw ();
+ I4 (const I4&, int = 0);
+ I4 (volatile I4&, int = 0) throw ();
+ I4 (const volatile I4&, int = 0) throw ();
+ };
+
+ struct I5 {
+ THROW;
+ I5 (I5&, int = 0);
+ I5 (const I5&, int = 0) throw ();
+ I5 (volatile I5&, int = 0) throw ();
+ I5 (const volatile I5&, int = 0) throw ();
+ };
+};
+
+
+struct J {
+ // non-const, const, volatile, and const volatile copy ctors
+ // plus a template ctor (a template ctor is never a copy ctor)
+
+ struct J1 {
+ NOTHROW;
+ J1 (J1&) throw ();
+ J1 (const J1&) throw ();
+ J1 (volatile J1&) throw ();
+ J1 (const volatile J1&) throw ();
+ template <class T> J1 (T); // not a copy ctor
+ };
+
+ struct J2 {
+ NOTHROW;
+ J2 (J2&) throw ();
+ J2 (const J2&) throw ();
+ J2 (volatile J2&) throw ();
+ J2 (const volatile J2&) throw ();
+ template <class T> J2 (const T&); // not a copy ctor
+ };
+
+ struct J3 {
+ NOTHROW;
+ J3 (J3&) throw ();
+ J3 (const J3&) throw ();
+ J3 (volatile J3&) throw ();
+ J3 (const volatile J3&) throw ();
+ template <class T> J3 (volatile T&); // not a copy ctor
+ };
+
+ struct J4 {
+ NOTHROW;
+ J4 (J4&) throw ();
+ J4 (const J4&) throw (){ }
+ J4 (volatile J4&) throw ();
+ J4 (const volatile J4&) throw ();
+ template <class T> J4 (const volatile T&); // not a copy ctor
+ };
+};
+
+
+struct K {
+ // nothrow non-const, const, volatile, and const volatile copy
+ // ctors plus a throwing non-copy ctor
+
+ struct K1 {
+ NOTHROW;
+ K1 (K1&) throw ();
+ K1 (const K1&) throw ();
+ K1 (volatile K1&) throw ();
+ K1 (const volatile K1&) throw ();
+ template <class T> K1 (T) throw (); // not a copy ctor
+ };
+
+#ifndef _RWSTD_NO_VARIADIC_TEMPLATES
+
+ struct K2 {
+ NOTHROW;
+ K2 (K2&) throw ();
+ K2 (const K2&) throw ();
+ K2 (volatile K2&) throw ();
+ K2 (const volatile K2&) throw ();
+ template <class ...T> K2 (T...); // not a copy ctor
+ };
+
+#endif // _RWSTD_NO_VARIADIC_TEMPLATES
+
+#ifndef _RWSTD_NO_RVALUE_REFERENCES
+
+ struct K3 {
+ NOTHROW;
+ K3 (K3&) throw ();
+ K3 (const K3&) throw ();
+ K3 (volatile K3&) throw ();
+ K3 (const volatile K3&) throw ();
+ K3 (K3&&); // not a copy ctor
+ };
+
+#endif // _RWSTD_NO_RVALUE_REFERENCES
+
+ struct K4 {
+ NOTHROW;
+ K4 (K4&) throw ();
+ K4 (const K4&) throw ();
+ K4 (volatile K4&) throw ();
+ K4 (const volatile K4&) throw ();
+ K4 (...); // not a copy ctor
+ };
+
+ struct K5 {
+ NOTHROW;
+ K5 (K5&) throw ();
+ K5 (const K5&) throw ();
+ K5 (volatile K5&) throw ();
+ K5 (const volatile K5&) throw ();
+ K5 (int); // not a copy ctor
+ };
+};
+
+struct L {
+
+ struct L1 {
+ THROW;
+ // member non-const copy ctor may throw
+ struct L1_1 { L1_1 (L1_1&); } l1_1;
+ };
+
+ struct L2 {
+ THROW;
+ // member const copy ctor may throw
+ struct L2_1 { L2_1 (const L2_1&); } l2_1;
+ };
+
+ struct L3 {
+ THROW;
+ // member volatile copy ctor may throw
+ struct L3_1 { L3_1 (volatile L3_1&); } l3_1;
+ };
+
+ struct L4 {
+ THROW;
+ // member const volatile copy ctor may throw
+ struct L4_1 { L4_1 (const volatile L4_1&); } l4_1;
+ };
+
+ struct L5 {
+ NOTHROW;
+ // member non-const copy ctor may throw
+ // but same copy ctor of parent class doesn't
+ L5 (L5&) throw ();
+ struct L5_1 { L5_1 (L5_1&); } l5_1;
+ };
+
+ struct L6 {
+ NOTHROW;
+ // member const copy ctor may throw
+ // but same copy ctor of parent class doesn't
+ L6 (const L6&) throw ();
+ struct L6_1 { L6_1 (const L6_1&); } l6_1;
+ };
+
+ struct L7 {
+ NOTHROW;
+ // member volatile copy ctor may throw
+ // but same copy ctor of parent class doesn't
+ L7 (volatile L7&) throw ();
+ struct L7_1 { L7_1 (volatile L7_1&); } l7_1;
+ };
+
+ struct L8 {
+ NOTHROW;
+ // member const volatile copy ctor may throw
+ // but same copy ctor of parent class doesn't
+ L8 (const volatile L8&) throw ();
+ struct L8_1 { L8_1 (const volatile L8_1&); } l8_1;
+ };
+
+ struct L9 {
+ NOTHROW;
+ // member const copy ctor may throw
+ // but non-const copy ctor of parent class doesn't
+ L9 (L9&) throw ();
+ struct L9_1 { L9_1 (const L9_1&); } l9_1;
+ };
+
+ struct L10 {
+ NOTHROW;
+ // member non-const copy ctor may throw
+ // but const copy ctor of parent class doesn't
+ L10 (const L10&) throw ();
+ struct L10_1 { L10_1 (L10_1&); } l10_1;
+ };
+
+ struct L11 {
+ NOTHROW;
+ L11 (L11&) throw ();
+ L11 (const L11&) throw ();
+
+ struct L11_1 {
+ L11_1 (L11_1&) throw (int);
+ L11_1 (const L11_1&) throw (int);
+ } l11_1;
+ };
+
+ struct L12 {
+ NOTHROW;
+ L12 (const L12&) throw ();
+
+ struct L12_1 {
+ L12_1 (L12_1&) throw (int);
+ L12_1 (const L12_1&) throw (int);
+ L12_1 (volatile L12_1&) throw (int);
+ L12_1 (const volatile L12_1&) throw (int);
+ } l12_1;
+ };
+
+ struct L13 {
+ NOTHROW;
+ L13 (const L13&) throw ();
+
+ struct L13_1 {
+ L13_1 (L13_1&) throw ();
+ L13_1 (const L13_1&) throw ();
+ L13_1 (volatile L13_1&) throw ();
+ L13_1 (const volatile L13_1&) throw ();
+ } l13_1;
+
+ struct L13_2 {
+ L13_2 (L13_2&) throw ();
+ L13_2 (const L13_2&) throw ();
+ L13_2 (volatile L13_2&) throw ();
+ L13_2 (const volatile L13_2&) throw (int); // may throw
+ } l13_2;
+ };
+
+ struct L14 {
+ NOTHROW;
+ L14 (const L14&) throw ();
+
+ struct L14_1 {
+ L14_1 (L14_1&) throw ();
+ L14_1 (const L14_1&) throw ();
+ L14_1 (volatile L14_1&) throw ();
+ L14_1 (const volatile L14_1&) throw ();
+ } l14_1;
+
+ struct L14_2 {
+ L14_2 (L14_2&) throw ();
+ L14_2 (const L14_2&) throw ();
+ L14_2 (volatile L14_2&) throw (int); // may throw
+ L14_2 (const volatile L14_2&) throw ();
+ } l14_2;
+ };
+
+ struct L15 {
+ NOTHROW;
+ L15 (const L15&) throw ();
+
+ struct L15_1 {
+ L15_1 (L15_1&) throw ();
+ L15_1 (const L15_1&) throw ();
+ L15_1 (volatile L15_1&) throw ();
+ L15_1 (const volatile L15_1&) throw ();
+ } l15_1;
+
+ struct L15_2 {
+ L15_2 (L15_2&) throw ();
+ L15_2 (const L15_2&) throw (int); // may throw
+ L15_2 (volatile L15_2&) throw ();
+ L15_2 (const volatile L15_2&) throw ();
+ } l15_2;
+ };
+
+ struct L16 {
+ NOTHROW;
+ L16 (const L16&) throw ();
+
+ struct L16_1 {
+ L16_1 (L16_1&) throw ();
+ L16_1 (const L16_1&) throw ();
+ L16_1 (volatile L16_1&) throw ();
+ L16_1 (const volatile L16_1&) throw ();
+ } l16_1;
+
+ struct L16_2 {
+ L16_2 (L16_2&) throw (int); // may throw
+ L16_2 (const L16_2&) throw ();
+ L16_2 (volatile L16_2&) throw ();
+ L16_2 (const volatile L16_2&) throw ();
+ } l16_2;
+ };
+};
+
+
+static int
+run_test (int, char*[])
+{
+ // exercise the has_nothrow_copy_constructor trait
+#define TEST(T) \
+ rw_assert (std::has_nothrow_copy_constructor<T>::value == T::value, \
+ 0, __LINE__, \
+ "std::has_nothrow_copy_constructor<%s>::value == %d", #T, \
+ std::has_nothrow_copy_constructor<T>::value)
+
+ TEST (A::A1);
+ TEST (A::A2);
+ TEST (A::A3);
+ TEST (A::A4);
+ TEST (A::A5);
+ TEST (A::A6);
+ TEST (A::A7);
+ TEST (A::A8);
+ TEST (A::A9);
+
+ TEST (B::B1);
+ TEST (B::B2);
+ TEST (B::B3);
+ TEST (B::B4);
+ TEST (B::B5);
+ TEST (B::B6);
+ TEST (B::B7);
+ TEST (B::B8);
+
+ TEST (C::C1);
+ TEST (C::C2);
+ TEST (C::C3);
+ TEST (C::C4);
+ TEST (C::C5);
+ TEST (C::C6);
+ TEST (C::C7);
+ TEST (C::C8);
+ TEST (C::C9);
+
+ TEST (D::D1);
+ TEST (D::D2);
+ TEST (D::D3);
+ TEST (D::D4);
+ TEST (D::D5);
+ TEST (D::D6);
+ TEST (D::D7);
+ TEST (D::D8);
+ TEST (D::D9);
+
+ TEST (E::E1);
+ TEST (E::E2);
+ TEST (E::E3);
+ TEST (E::E4);
+
+ TEST (F::F1);
+ TEST (F::F2);
+ TEST (F::F3);
+ TEST (F::F4);
+
+ TEST (G::G1);
+ TEST (G::G2);
+ TEST (G::G3);
+ TEST (G::G4);
+ TEST (G::G5);
+
+ TEST (H::H1);
+ TEST (H::H2);
+ TEST (H::H3);
+ TEST (H::H4);
+ TEST (H::H5);
+
+ TEST (I::I1);
+ TEST (I::I2);
+ TEST (I::I3);
+ TEST (I::I4);
+ TEST (I::I5);
+
+ TEST (J::J1);
+ TEST (J::J2);
+ TEST (J::J3);
+ TEST (J::J4);
+
+ TEST (K::K1);
+ TEST (K::K2);
+ TEST (K::K3);
+ TEST (K::K4);
+ TEST (K::K5);
+
+ TEST (L::L1);
+ TEST (L::L2);
+ TEST (L::L3);
+ TEST (L::L4);
+ TEST (L::L5);
+ TEST (L::L6);
+ TEST (L::L7);
+ TEST (L::L8);
+ TEST (L::L9);
+ TEST (L::L10);
+ TEST (L::L11);
+ TEST (L::L12);
+ TEST (L::L13);
+ TEST (L::L14);
+ TEST (L::L15);
+ TEST (L::L16);
+
+ return 0;
+}
+
+/**************************************************************************/
+
+#else // _RWSTD_NO_EXT_CXX_0X
+
+/**************************************************************************/
+
+static int run_test (int, char*[])
+{
+ rw_warn (0, 0, __LINE__,
+ "test disabled because _RWSTD_NO_EXT_CXX_0X is defined");
+ return 0;
+}
+
+#endif // !_RWSTD_NO_EXT_CXX_0X
+
+/**************************************************************************/
+
+int main (int argc, char*argv[])
+{
+ return rw_test (argc, argv, __FILE__,
+ "meta.unary.prop",
+ "std::has_nothrow_xxx traits",
+ run_test,
+ 0);
+}
Propchange: stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/branches/4.3.x/tests/utilities/20.meta.unary.nothrow.cpp
------------------------------------------------------------------------------
svn:keywords = Id