aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.mike/p5840.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.mike/p5840.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/p5840.C33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p5840.C b/gcc/testsuite/g++.old-deja/g++.mike/p5840.C
new file mode 100644
index 00000000000..46a161beec8
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/p5840.C
@@ -0,0 +1,33 @@
+// prms-id: 5840
+
+class Signal {
+public:
+ int Name(void) { return 1; }
+};
+
+class Derived : public Signal {
+public:
+ int Name(void) { return 2; }
+};
+
+template <class Foo , int (Foo::*Id)(void)>
+class Bar
+{
+public:
+ int value (Foo* a) { return (a->*Id)(); }
+};
+
+template class Bar <Derived, &Signal::Name>;
+template class Bar <Signal, &Signal::Name>;
+template class Bar <Derived, &Derived::Name>;
+
+Derived a;
+
+Bar<Derived, &Signal::Name> dispatcher1;
+Bar<Derived, &Derived::Name> dispatcher2;
+
+main() {
+ int i1 = dispatcher1.value(&a);
+ int i2 = dispatcher2.value(&a);
+ return i1 != 1 || i2 != 2;
+}