• Russ Cox's avatar
    cc: add two new #pragma varargck · fe2ccb53
    Russ Cox authored
    #pragma varargck countpos f 1
    says that the first argument to f is
    the count of variadic arguments that follow.
    
    #pragma varargck type f t
    says that t is one of the allowed types for
    a variadic argument to f.
    (can be repeated)
    
    combined, these can be used to check the
    runtime.stdcall functions in the windows port
    or in any other port that needs a vararg list of
    uintptrs even on a 64-bit platform (where it is
    very easy to pass a less-than-uintptr in the ...).
    
    demo:
    
    typedef unsigned int uintptr;
    
    #pragma varargck countpos f 1
    #pragma varargck type f uintptr
    #pragma varargck type f void*
    
    int f(int count, ...);
    
    void *v;
    char *p;
    
    void
    main(void)
    {
            f(1, v);  // ok
            f(1, main);  // ok
            f(1, p);  // ok
            f(2, v, v);  // ok
    
            f(2, v);  // found 1 argument after count 2
            f(1, 'a');  // invalid type INT in call to f
            f(1, 0);  // invalid type INT in call to f
    }
    
    R=ken, r, alex.brainman
    CC=golang-dev
    https://golang.org/cl/4634103
    fe2ccb53
dpchk.c 12.3 KB