After answering this question I was trying to find is_complete template in Boost library and I realized that there is no such template in Boost.TypeTraits. Why
I'm afraid you can't implement such an is_complete type traits. The implementation given by @Alexey fails to compile on G++ 4.4.2 and G++ 4.5.0:
error: initializing argument 1 of ‘static char (& is_complete::pass(T))[2] [with T = Foo]’
On my Mac, with G++ 4.0.1 evaluating is_complete where struct Foo; is incomplete yields to true which is even worse than a compiler error.
T can be both complete and incomplete in the same program, depending on the translation unit but it's always the same type. As a consequence, as commented above, is_complete is always the same type as well.
So if you respect ODR it is not possible to have is_complete evaluating to different values depending on where it is used; otherwise it would mean you have different definitions for is_complete which ODR forbids.
EDIT: As the accepted answer, I myself hacked around a solution that uses the __COUNTER__ macro to instantiate a different is_complete type everytime the IS_COMPLETE macro is used. However, with gcc, I couldn't get SFINAE to work in the first place.