How about
test(default, default, 42);
test(1, default, 42);
or some other keyword?
This is dangerous because it can lead to errors when the function signature is changed, take the following example:
procedure Test(A: Integer = 0; B: Integer = 0);
And later someone amends it with:
procedure Test(const AName: String = ''; A: Integer = 0; B: Integer = 0);
If you have the following callsite code:
The compiler will throw an error because the types don't match the new function signature. But if you would have a type ambigous value like default:
would compile, but instead of setting B, it is now setting A and ignoring B.
Default values for parameters are already dangerous in itself (I once encountered a bug in a program that has laid dorment for probably years, because it was a function taking all integer arguments with all default values, and when one parameter was added, all callsites didn't match up anymore), but with strong typing, and under the assumptions that most of the parameters are of different types the risk can be avoided (still I try to avoid having more than one parameter of the same type with a default value directly next to each other because of this).
I think if you want to do something like this, named parameters on the callsite are the way to go, as it is much more robust to errors, and frankly also easier to understand.