Advertencia de compilador extraño C: advertencia: "estructura" declarada dentro de la lista de parámetros

Acabo de encontrar una peculiaridad en C que me parece realmente confusa. En C es posible usar un puntero a una estructura antes de que se haya declarado. Esta es una característica muy útil que tiene sentido porque la declaración es irrelevante cuando se trata de un puntero a ella. Sin embargo, acabo de encontrar un caso en la esquina donde esto (sorprendentemente) no es cierto, y realmente no puedo explicar por qué. A mi me parece un error en el diseño del lenguaje.

Toma este código:

#include <stdio.h>

#include <stdlib.h>


typedef void (*a)(struct lol* etc);

void a2(struct lol* etc) {

}

int main(void) {
        return 0;
}

Da:

foo.c:6:26: warning: ‘struct lol’ declared inside parameter list [enabled by default]
foo.c:6:26: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
foo.c:8:16: warning: ‘struct lol’ declared inside parameter list [enabled by default]

Para eliminar este problema podemos simplemente hacer esto:

#include <stdio.h>

#include <stdlib.h>

struct lol* wut;

typedef void (*a)(struct lol* etc);

void a2(struct lol* etc) {

}

int main(void) {
        return 0;
}

El problema inexplicable ahora se ha ido por una razón inexplicable. ¿Por qué?

Tenga en cuenta que esta pregunta es sobre el comportamiento del lenguaje C (o el comportamiento posible del compilador de gcc y clang) y no del ejemplo específico que pegué.

EDITAR:

No aceptaré "el orden de la declaración es importante" como respuesta a menos que también explique por qué C advierte sobre el uso de un puntero de estructura por primera vez en una lista de argumentos de función, pero lo permite en cualquier otro contexto. ¿Por qué eso posiblemente sería un problema?

Respuestas a la pregunta(3)

Su respuesta a la pregunta