validate and coerce vararg arguments to correct type in validate

for vararg, the following promotions are made:
    float -> double
    char -> int
    short -> int
    char[] -> char^ -> void^
    sometype^ -> void^