#include <memory>
#include <cstdio>
template <class T,class R> struct call_ifn0_t {
R (*f)(T);
void operator()(T t) { if ( t ) f(t); }
};
template <class T,class R> call_ifn0_t<T,R> call_ifn0(R(*f)(T)) {
return { f };
}
typedef std::shared_ptr<void> ptrdtor;
#define MACRO_CONCAT1(a,b) a##b
#define MACRO_CONCAT(a,b) MACRO_CONCAT1(a,b)
#define UNIQNAME MACRO_CONCAT(local_uniqname_at_line_,__LINE__)
int main()
{
FILE *f; ptrdtor UNIQNAME( f = fopen(".","r"), call_ifn0(fclose) );
printf("file: %p",f);
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGNzdGRpbz4KdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgUj4gc3RydWN0IGNhbGxfaWZuMF90IHsgCiAgUiAoKmYpKFQpOyAKICB2b2lkIG9wZXJhdG9yKCkoVCB0KSB7IGlmICggdCApIGYodCk7IH0gCn07CiAKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgUj4gY2FsbF9pZm4wX3Q8VCxSPiBjYWxsX2lmbjAoUigqZikoVCkpIHsgCiAgcmV0dXJuIHsgZiB9OyAKfQogCnR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IHB0cmR0b3I7CiNkZWZpbmUgTUFDUk9fQ09OQ0FUMShhLGIpIGEjI2IKI2RlZmluZSBNQUNST19DT05DQVQoYSxiKSBNQUNST19DT05DQVQxKGEsYikgCiNkZWZpbmUgVU5JUU5BTUUgTUFDUk9fQ09OQ0FUKGxvY2FsX3VuaXFuYW1lX2F0X2xpbmVfLF9fTElORV9fKQogCmludCBtYWluKCkKewoJRklMRSAqZjsgcHRyZHRvciBVTklRTkFNRSggZiA9IGZvcGVuKCIuIiwiciIpLCBjYWxsX2lmbjAoZmNsb3NlKSApOwoJcHJpbnRmKCJmaWxlOiAlcCIsZik7Cn0K