summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/other/copy1.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/other/copy1.C')
-rw-r--r--gcc/testsuite/g++.dg/other/copy1.C83
1 files changed, 83 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/other/copy1.C b/gcc/testsuite/g++.dg/other/copy1.C
new file mode 100644
index 000000000..d02b08fce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/copy1.C
@@ -0,0 +1,83 @@
+// { dg-do run }
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 Nov 2001 <nathan@nathan@codesourcery.com>
+
+// PR 87
+
+int assign = 0;
+int ctor = 0;
+int assignC = 0;
+
+struct A {
+ int i;
+
+ template<class T>
+ void operator=(const T&) const
+ {
+ assign = 1;
+ }
+
+ A () : i (0) {}
+
+ template <typename T> A (const T &)
+ {
+ ctor = 1;
+ }
+};
+
+struct B : A
+{
+};
+
+struct C
+{
+ int i;
+
+ C (int i_) :i (i_) {}
+
+ template <int I>
+ void operator= (const C &)
+ {
+ assignC = 1;
+ }
+};
+
+
+int main()
+{
+ const A a;
+ A b;
+ B c;
+
+ b = a;
+ if (assign)
+ return 5;
+
+ b.i = 100;
+ c.i = 200;
+
+ a = b;
+
+ if (!assign)
+ return 1;
+ if (a.i)
+ return 2;
+
+ A e (b);
+ if (ctor)
+ return 3;
+
+ A d (c);
+ if (!ctor)
+ return 4;
+
+ C c0 (0);
+ C c1 (1);
+
+ c0 = c1;
+ if (assignC)
+ return 5;
+
+ return 0;
+}