diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C')
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C new file mode 100644 index 0000000..22054ea --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/not_special.C @@ -0,0 +1,52 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test that move constructor and move assignement are special. +// That is, their presence should cause compiler declared +// copy ctor or assignment to be deleted. + +// { dg-do compile { target c++11 } } + +#include <assert.h> + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +int copy = 0; +int assign = 0; + +struct base +{ + base() {} + base(const base&) {++copy;} + base& operator=(const base&) {++assign; return *this;} +}; + +struct derived // { dg-message "declares a move" } + : base +{ + derived() {} + derived(derived&&) {} + derived& operator=(derived&&) {return *this;} +}; + +int test1() +{ + derived d; + derived d2(static_cast<derived&&>(d)); // should not call base::(const base&) + assert(copy == 0); + derived d3(d); // { dg-error "deleted" } + assert(copy == 1); + d2 = static_cast<derived&&>(d); // should not call base::operator= + assert(assign == 0); + d3 = d; // { dg-error "deleted" } + assert(assign == 1); + return 0; +} + +int main() +{ + return test1(); +} |