Tail call verification rules require that no managed pointers to be passed from caller to callee if it points to a stack frame that to be removed. ArgIterator does not satisfy the condition. Therefore below code will not be verifiable.
.method public hidebysig static void Main(string[] A_0) cil managed { .entrypoint .maxstack 8 .locals init ( [0] valuetype [mscorlib]System.ArgIterator args) L_0000: ldloc args L_0004: tail L_0006: call void TestClass::t(valuetype [mscorlib]System.ArgIterator) L_000b: ret }
The PEverify result is
[IL]: Error: [xxx.exe : TestClass::Main][mdToken=0x6000002][offset 0x00000006][found value 'System.ArgIterator'] Cannot pass ByRef to a tail call.(Error: 0x80131899)