#include <iostream>
using namespace std;
template <class, int, class=void> struct is_complete : std::false_type {};
template <class T, int i>
struct is_complete<T, i, decltype(void(sizeof(T)))> : std::true_type {};
#define IS_COMPLETE(...) is_complete<__VA_ARGS__, __COUNTER__>::value
struct A;
struct Foo {};
int main() {
IS_COMPLETE(A);
static_assert(IS_COMPLETE(Foo), "Type is not defined!");
return 0;
}
struct A
{
};
void func()
{
static_assert(IS_COMPLETE(Foo), "Type is not defined!");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzLCBpbnQsIGNsYXNzPXZvaWQ+IHN0cnVjdCBpc19jb21wbGV0ZSA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKdGVtcGxhdGUgPGNsYXNzIFQsIGludCBpPgpzdHJ1Y3QgaXNfY29tcGxldGU8VCwgaSwgZGVjbHR5cGUodm9pZChzaXplb2YoVCkpKT4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKCiNkZWZpbmUgSVNfQ09NUExFVEUoLi4uKSBpc19jb21wbGV0ZTxfX1ZBX0FSR1NfXywgX19DT1VOVEVSX18+Ojp2YWx1ZQkKCnN0cnVjdCBBOwpzdHJ1Y3QgRm9vIHt9OwppbnQgbWFpbigpIHsKCQoJSVNfQ09NUExFVEUoQSk7CglzdGF0aWNfYXNzZXJ0KElTX0NPTVBMRVRFKEZvbyksICJUeXBlIGlzIG5vdCBkZWZpbmVkISIpOwoKCXJldHVybiAwOwp9CgpzdHJ1Y3QgQQp7CgkKfTsKCgp2b2lkIGZ1bmMoKQp7CglzdGF0aWNfYXNzZXJ0KElTX0NPTVBMRVRFKEZvbyksICJUeXBlIGlzIG5vdCBkZWZpbmVkISIpOwp9