aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/p10769a.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/p10769a.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/p10769a.C45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p10769a.C b/gcc/testsuite/g++.old-deja/g++.mike/p10769a.C
new file mode 100644
index 00000000000..784465ce8ee
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/p10769a.C
@@ -0,0 +1,45 @@
+// Special g++ Options: -Wno-pmf-conversions
+// prms-id: 10769
+
+#define PMF2PF(PMF) ((void (*)())(PMF))
+
+int ok = 0;
+
+class A {
+public:
+ void f1a() { ok += 3; }
+ void f1b() { ok += 5; }
+ void f2a() { ok += 7; }
+ void f2b() { }
+ const static void (*table[2][2])();
+ void main();
+} a;
+
+const void (*A::table[2][2])()
+ = { { PMF2PF(&A::f1a), PMF2PF(&A::f1b) },
+ { PMF2PF(&A::f2a), PMF2PF(&A::f1b) },
+ };
+
+void
+dispatch (A *obj, int i, int j)
+{
+ (*(void (*)(A *))A::table[i][j])(obj);
+}
+
+void A::main() {
+ dispatch (&a, 0, 0);
+ void (A::*mPtr)(A*) = &A::f1a;
+
+ (*(void (*)(A*))PMF2PF(mPtr))(&a);
+ (*(void (*)(A*))PMF2PF(f2a))(&a);
+}
+
+int main() {
+ a.A::main();
+ dispatch (&a, 0, 1);
+ void (A::*mPtr)(A*) = &A::f1b;
+
+ (*(void (*)(A*))PMF2PF(a.*mPtr))(&a);
+ (*(void (*)(A*))PMF2PF(a.f2a))(&a);
+ return ok != 3+3+5+5+7+7;
+}