1*89a1d03eSRichard // RUN: %check_clang_tidy %s cert-dcl50-cpp %t
2*89a1d03eSRichard
3*89a1d03eSRichard // Variadic function definitions are diagnosed.
f1(int,...)4*89a1d03eSRichard void f1(int, ...) {}
5*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: do not define a C-style variadic function; consider using a function parameter pack or currying instead [cert-dcl50-cpp]
6*89a1d03eSRichard
7*89a1d03eSRichard // Variadic function *declarations* are not diagnosed.
8*89a1d03eSRichard void f2(int, ...); // ok
9*89a1d03eSRichard
10*89a1d03eSRichard // Function parameter packs are good, however.
11*89a1d03eSRichard template <typename Arg, typename... Ts>
f3(Arg F,Ts...Rest)12*89a1d03eSRichard void f3(Arg F, Ts... Rest) {}
13*89a1d03eSRichard
14*89a1d03eSRichard struct S {
15*89a1d03eSRichard void f(int, ...); // ok
f1S16*89a1d03eSRichard void f1(int, ...) {}
17*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: do not define a C-style variadic function; consider using a function parameter pack or currying instead
18*89a1d03eSRichard };
19*89a1d03eSRichard
20*89a1d03eSRichard // Function definitions that are extern "C" are good.
f4(int,...)21*89a1d03eSRichard extern "C" void f4(int, ...) {} // ok
22*89a1d03eSRichard extern "C" {
f5(int,...)23*89a1d03eSRichard void f5(int, ...) {} // ok
24*89a1d03eSRichard }
25