It is intentional. What did you mean by

void test_warn();

?

In C up to C17 that is a function declaration without a prototype. This declaration gives no information on the type and number of arguments. E.g.

void f(void)
{
    char c = 7;
    test_warn(7, "test");
}

Would result in a call to test_warn where the first argument is an int (the char gets promoted to int), and the second is a char *.

However, in my experience, most users actually wanted the C2X meaning (which is the same as C++), i.e. test_warn should be a function that takes no arguments. So the warning tells them that what they wrote is very likely not what they meant. In C up to C17, function declarations without a prototype were obsolescent anyway, so it makes sense to warn about them.

If you meant test_warn to be a function that takes no arguments you should either state so using

void test_warn(void);

or compile in C2X mode.