You may use restrict on parameters in function declarations whether they are definitions or not, as it is allowed by the C grammar and there is no rule against it. However, they have no effect to the compiler in declarations that are not definitions. This is because 6.5.2.2 7 says qualifiers are removed when passing arguments to functions with prototypes:
… the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type.
Thus, if a function declaration has a parameter of type int * restrict a, whatever argument you pass is converted to the unqualified type, int *.
Further, two otherwise identical function declarations are compatible even if the qualifiers on parameters are changed, because C 2018 6.7.6.3 15 says:
… (In the determination of type compatibility and of a composite type, … each parameter declared with qualified type is taken as having the unqualified version of its declared type.)
However, this applies only to the parameter itself. The parameter is not affected by a restrict that qualifies it. But it can point to a pointer that is restrict-qualified. For example, void foo(void * restrict *a); and void foo(void **a); declare different function types.
Although qualifiers on parameters in declarations have no effect to the compiler, they can signal to humans that the arguments are expected to conform to the restriction. Inside the function definition, the parameter is restrict-qualified, and anybody calling the function should respect that.