#include <functional>
#include <memory>
template<typename T>
struct identity
{
using type = T;
};
template<int a> struct bar;
template<int a, int b> struct foo {
operator bar<a> const (); // operator-based conversion
};
template<int a> struct bar : public foo<a, a> {
bar() { }
template<int b> bar(const foo<a, b>&) { } // constructor-based conversion
};
template<int a, int b> foo<a, b>::operator bar<a> const () { return bar<a>(); }
template<int a> void f(bar<a> x, typename identity<bar<a>>::type y) { }
int main() {
bar<1> x;
foo<1, 2> y;
f(x, y);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxtZW1vcnk+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgaWRlbnRpdHkKewogIHVzaW5nIHR5cGUgPSBUOwp9OwoKdGVtcGxhdGU8aW50IGE+IHN0cnVjdCBiYXI7Cgp0ZW1wbGF0ZTxpbnQgYSwgaW50IGI+IHN0cnVjdCBmb28gewogIG9wZXJhdG9yIGJhcjxhPiBjb25zdCAoKTsgLy8gb3BlcmF0b3ItYmFzZWQgY29udmVyc2lvbgp9OwoKdGVtcGxhdGU8aW50IGE+IHN0cnVjdCBiYXIgOiBwdWJsaWMgZm9vPGEsIGE+IHsKICBiYXIoKSB7IH0KICB0ZW1wbGF0ZTxpbnQgYj4gYmFyKGNvbnN0IGZvbzxhLCBiPiYpIHsgfSAvLyBjb25zdHJ1Y3Rvci1iYXNlZCBjb252ZXJzaW9uCn07Cgp0ZW1wbGF0ZTxpbnQgYSwgaW50IGI+IGZvbzxhLCBiPjo6b3BlcmF0b3IgYmFyPGE+IGNvbnN0ICgpIHsgcmV0dXJuIGJhcjxhPigpOyB9Cgp0ZW1wbGF0ZTxpbnQgYT4gdm9pZCBmKGJhcjxhPiB4LCB0eXBlbmFtZSBpZGVudGl0eTxiYXI8YT4+Ojp0eXBlIHkpIHsgfQoKaW50IG1haW4oKSB7CiAgYmFyPDE+IHg7CiAgZm9vPDEsIDI+IHk7CiAgZih4LCB5KTsKfQo=