forked from checkedc/checkedc-clang
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathvalist.c
More file actions
66 lines (60 loc) · 2.45 KB
/
Copy pathvalist.c
File metadata and controls
66 lines (60 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// RUN: rm -rf %t*
// RUN: 3c -base-dir=%S -alltypes -addcr %s -- | FileCheck -match-full-lines -check-prefixes="CHECK_ALL","CHECK" %s
// RUN: 3c -base-dir=%S -addcr %s -- | FileCheck -match-full-lines -check-prefixes="CHECK_NOALL","CHECK" %s
// RUN: 3c -base-dir=%S -addcr %s -- | %clang -c -fcheckedc-extension -x c -o /dev/null -
// RUN: 3c -base-dir=%S -output-dir=%t.checked -alltypes %s --
// RUN: 3c -base-dir=%t.checked -alltypes %t.checked/valist.c -- | diff %t.checked/valist.c -
#include <stdarg.h>
typedef int lua_State;
extern void lua_lock(lua_State *);
extern void luaC_checkGC(lua_State *);
extern void lua_unlock(lua_State *);
extern const char *luaO_pushvfstring(lua_State *L, const char *fmt,
va_list argp);
const char *lua_pushfstring(lua_State *L, const char *fmt, ...) {
//CHECK: const char *lua_pushfstring(lua_State *L : itype(_Ptr<lua_State>), const char *fmt : itype(_Ptr<const char>), ...) : itype(_Ptr<const char>) {
const char *ret;
//CHECK: const char *ret;
va_list argp;
lua_lock(L);
va_start(argp, fmt);
ret = luaO_pushvfstring(L, fmt, argp);
va_end(argp);
luaC_checkGC(L);
lua_unlock(L);
return ret;
}
void foo(int i, ...) {
va_list ap;
va_start(ap, i);
char *c = (char *)va_arg(ap, char *);
//CHECK: char *c = (char *)va_arg(ap, char *);
va_end(ap);
}
// Test for issue 484. va_list should not be expanded to anything else.
// Expanding it to struct __va_list_tag * causes compiler error on libtiff.
// Expanding to __builtin_va_list doesn't cause an error, but va_list is still
// preferable.
void bar(va_list y, int *z) {}
//CHECK: void bar(va_list y, _Ptr<int> z) {}
void (*baz)(va_list, int *);
//CHECK: _Ptr<void (va_list, _Ptr<int>)> baz = ((void *)0);
typedef void (*fiz)(va_list, int *);
//CHECK: typedef _Ptr<void (va_list, _Ptr<int>)> fiz;
typedef void fuz(va_list, int *);
//CHECK: typedef void fuz(va_list, _Ptr<int>);
/*force output*/
int *p;
//CHECK: _Ptr<int> p = ((void *)0);
// This tests va_list correctness using windows builtins
void ms_test_foo( const char *fmt, __builtin_ms_va_list argp);
__attribute__((ms_abi)) int *ms_test_bar(const char *fmt, ...) {
//CHECK: __attribute__((ms_abi)) _Ptr<int> ms_test_bar(const char *fmt : itype(_Ptr<const char>), ...) {
__builtin_ms_va_list argp;
__builtin_ms_va_start(argp, fmt);
//CHECK: __builtin_ms_va_start(argp, fmt);
ms_test_foo(fmt, argp);
__builtin_ms_va_end(argp);
//CHECK: __builtin_ms_va_end(argp);
return 0;
}