It is true that it is struct test_structnot completely defined before closing ;, and in line 4 you define a pointer to an incomplete type, which is fine.
struct test_struct, . - .
, :
struct test_struct
{
int val;
struct test_struct value;
};
value . struct test_struct* .