summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/pmf2.C
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.old-deja/g++.mike/pmf2.C
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/pmf2.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/pmf2.C55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/pmf2.C b/gcc/testsuite/g++.old-deja/g++.mike/pmf2.C
new file mode 100644
index 000000000..209c5ebea
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/pmf2.C
@@ -0,0 +1,55 @@
+// { dg-do run }
+extern "C" int printf(const char *, ...);
+
+class A_table {
+ int c;
+public:
+ A_table() { c = 3;}
+ virtual void func2(int &item) { printf("func2(%d,) c=%d\n",item,c);}
+};
+
+class B_table : private A_table {
+public:
+ typedef void (B_table::* B_ti_fn) (int &item);
+ B_table() { j = 0x4321;}
+ virtual void call_fn_fn1(int &item, void *pfn1);
+ void func1(int &item) { printf("func1(%d)\n",item);}
+ virtual void func2(int &item) { printf("func2(%d) j=%d\n",item,j);}
+ int j;
+};
+
+class foo : public A_table {
+public:
+ int i;
+ virtual ~foo();
+ virtual void func2(int &item) { printf("func2(%d) i=%d\n",item,i);}
+};
+foo::~foo() { i = 0;}
+
+class bar :public foo,public B_table {
+public:
+ int w;
+ virtual ~bar();
+ virtual void func2(int &item) { printf("func2(%d) w=%d\n",item,w);}
+};
+bar::~bar() { w = 0;}
+
+void B_table::call_fn_fn1(int &item, void *pfn1) {
+ (this->*(*(B_ti_fn*)pfn1))(item);
+}
+
+B_table b;
+bar jar;
+
+int main() {
+ printf("ptr to B_table=%x, ptr to A_table=%x\n",&b,(A_table*)&b);
+ B_table::B_ti_fn z = &B_table::func1;
+ int j = 1;
+ jar.call_fn_fn1(j,(void *)&z);
+ j++;
+ z = &B_table::func2;
+ b.call_fn_fn1(j,(void *)&z);
+ j++;
+ jar.call_fn_fn1(j,(void *)&z);
+ return 0;
+}