diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/constexpr-virtual6.C')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-virtual6.C | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual6.C new file mode 100644 index 00000000000..f5abf2cf9b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual6.C @@ -0,0 +1,49 @@ +// PR c++/70393 +// { dg-do run { target c++11 } } + +/* 'ab' has a static initializer, but we flubbed the initializer, + because of B being the primary base. */ + +struct A +{ + int a = 1; +}; + +struct B +{ + B *element = (B*)2; + + virtual int vfunc() = 0; + + int call_element() + { + return element->vfunc(); + } + + void set_element() + { + element = this; + } +}; + +struct AB : public A, public B +{ + int vfunc() + { + return 0; + } +}; + +static AB ab; + +int main() +{ + if (ab.a != 1) + return 1; + if (ab.element != (void*)2) + return 2; + + ab.set_element(); + return ab.call_element(); +} + |