20 D& operator=(const D&) throw() { return *this; }
25 E& operator=(const E&) throw(int) { return *this; }
30 E1& operator=(const E1&) throw(int) { throw int(); return *this; }
40 G() throw(int) { throw int(); }
45 H& operator=(H&) throw(int) { return *this; }
50 H1& operator=(H1&) throw(int) { throw int(); return *this; }
55 I& operator=(I&) throw(int) { return *this; }
56 I& operator=(const I&) throw() { return *this; }
61 I1& operator=(I1&) throw(int) { throw int(); return *this; }
62 I1& operator=(const I1&) throw() { return *this; }
67 J& operator=(J&) throw() { return *this; }
68 J& operator=(const J&) throw() { return *this; }
69 J& operator=(volatile J&) throw() { return *this; }
70 J& operator=(const volatile J&) throw() { return *this; }
75 K& operator=(K&) throw() { return *this; }
80 L& operator=(const L&) throw() { return *this; }
86 { return __has_nothrow_assign(T); }
94 { return !!__has_nothrow_assign(T); }
101 static const bool trait = __has_nothrow_assign(T);
105 const bool My2<T>::trait;
107 template<typename T, bool b = __has_nothrow_assign(T)>
109 { static const bool trait = b; };
111 template<typename T, bool b>
112 const bool My3_help<T, b>::trait;
120 { return My3_help<T>::trait; }
123 #define PTEST(T) (__has_nothrow_assign(T) && f<T>() \
124 && My<T>().f() && My2<T>::trait && My3<T>().f())
126 #define NTEST(T) (!__has_nothrow_assign(T) && !f<T>() \
127 && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
131 assert (PTEST (int));
132 assert (NTEST (int (int)));
133 assert (NTEST (void));
137 assert (PTEST (C[]));
148 assert (NTEST (const K));
149 assert (NTEST (const L));