#include <utility>
#include <type_traits>
struct B;
struct A {
void operator * ( const B & ) { }
} ;
struct B {
void operator * ( int x) const { }
} ;
inline void operator * ( int a, const B & b) {
return b * a;
}
template < typename T, typename C = std:: remove_reference < decltype( std:: declval < T> ) > :: type > T & f( C c = C( ) ) {
return c;
}
int main( ) {
f< A> ( ) ;
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnN0cnVjdCBCOwoKc3RydWN0IEEgewogICAgdm9pZCBvcGVyYXRvciAqKGNvbnN0IEIgJikge30KfTsKc3RydWN0IEIgewogICAgdm9pZCBvcGVyYXRvciAqKGludCB4KSBjb25zdCB7fQp9OwoKaW5saW5lIHZvaWQgb3BlcmF0b3IgKihpbnQgYSwgY29uc3QgQiAmIGIpIHsKICAgIHJldHVybiBiICogYTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEMgPSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoc3RkOjpkZWNsdmFsPFQ+KT46OnR5cGU+IFQgJiBmKEMgYyA9IEMoKSkgewogICAgcmV0dXJuIGM7Cn0KCmludCBtYWluKCkgewogICAgCiAgICBmPEE+KCk7CiAgICAKfQ==