#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=