template <typename derived>
struct test_base {
derived baz() { return *static_cast<derived *>(this); }
};
template <int N>
struct test : public test_base<test<N>> {
};
template <>
struct test<2> : public test_base<test<2>> {
test bar() { return *this; }
};
int main() {
test<1> a = {};
test<2> b = {};
auto c = a.baz();
auto d = b.baz();
auto e = b.bar();
if (&c && &d && &e)
return 0;
else
return 1;
}
dGVtcGxhdGUgPHR5cGVuYW1lIGRlcml2ZWQ+CnN0cnVjdCB0ZXN0X2Jhc2UgewogIGRlcml2ZWQgYmF6KCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PGRlcml2ZWQgKj4odGhpcyk7IH0KfTsKIAp0ZW1wbGF0ZSA8aW50IE4+CnN0cnVjdCB0ZXN0IDogcHVibGljIHRlc3RfYmFzZTx0ZXN0PE4+PiB7Cn07CiAKdGVtcGxhdGUgPD4Kc3RydWN0IHRlc3Q8Mj4gOiBwdWJsaWMgdGVzdF9iYXNlPHRlc3Q8Mj4+IHsKICB0ZXN0IGJhcigpIHsgcmV0dXJuICp0aGlzOyB9Cn07CiAKaW50IG1haW4oKSB7CiAgdGVzdDwxPiBhID0ge307CiAgdGVzdDwyPiBiID0ge307CgogIGF1dG8gYyA9IGEuYmF6KCk7CiAgYXV0byBkID0gYi5iYXooKTsKICBhdXRvIGUgPSBiLmJhcigpOwogCiAgaWYgKCZjICYmICZkICYmICZlKQogICAgcmV0dXJuIDA7CiAgZWxzZQogICAgcmV0dXJuIDE7Cn0=