Case 1
Here we consider the statement static test t2;
From static documentation:
The declaration inside the class body is not a definition and may declare the member to be of incomplete type (other than void), including the type in which the member is declared:
struct S
{
static S s; // declaration, incomplete type (inside its own definition)
};
For the exact same reason your statement static test t2;
is allowed/valid.
Case 2
Here we consider int get(test t1);
The above statement is a member function declaration and not a definition so this is also valid. That is, since it is a function declaraion you can use the incomplete type as parameter.
Case 3
Here we are considering:
int get(test t1){}
This works because:
The type of a parameter or the return type for a function definition shall not be an incomplete class type (possibly cv-qualified) unless the function definition is nested within the member-specification for that class (including definitions in nested classes defined within the class).