xref: /llvm-project/clang/test/Headers/stdargneeds.c (revision 9a7a6dd3c358ca7becef75c0a9581dcfa3e6b5f4)
1*9a7a6dd3SIan Anderson // RUN: rm -fR %t
262f769aaSIan Anderson // RUN: split-file %s %t
362f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds0.c
4*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds0.c
562f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds1.c
6*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds1.c
762f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds2.c
8*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds2.c
962f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds3.c
10*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds3.c
1162f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds4.c
12*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds4.c
1362f769aaSIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify -Werror=implicit-function-declaration -std=c89 %t/stdargneeds5.c
14*9a7a6dd3SIan Anderson // RUN: %clang_cc1 -fsyntax-only -verify=expected-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=implicit-function-declaration -std=c89 %t/stdargneeds5.c
1562f769aaSIan Anderson 
1662f769aaSIan Anderson // Split the file so that the "implicitly declaring library function" errors get repeated.
1762f769aaSIan Anderson // Use C89 to verify that __need_ can be used to get types that wouldn't normally be available.
1862f769aaSIan Anderson 
1962f769aaSIan Anderson //--- stdargneeds0.c
f(int p,...)2062f769aaSIan Anderson static void f(int p, ...) {
21*9a7a6dd3SIan Anderson     __gnuc_va_list g; // expected-error{{undeclared identifier '__gnuc_va_list'}} expected-modules-error{{undeclared identifier}}
22*9a7a6dd3SIan Anderson     va_list v; // expected-error{{undeclared identifier 'va_list'}} expected-modules-error{{undeclared identifier}}
23*9a7a6dd3SIan Anderson     va_start(v, p); // expected-error{{implicitly declaring library function 'va_start'}} expected-note{{include the header <stdarg.h> or explicitly provide a declaration for 'va_start'}} expected-error{{undeclared identifier 'v'}} \
24*9a7a6dd3SIan Anderson                        expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}} expected-modules-error{{undeclared identifier}}
25*9a7a6dd3SIan Anderson     int i = va_arg(v, int); // expected-error{{implicit declaration of function 'va_arg'}} expected-error{{expected expression}} expected-error{{use of undeclared identifier 'v'}} \
26*9a7a6dd3SIan Anderson                                expected-modules-error{{implicit declaration of function}} expected-modules-error{{expected expression}} expected-modules-error{{undeclared identifier}}
27*9a7a6dd3SIan Anderson     va_end(v); // expected-error{{implicitly declaring library function 'va_end'}} expected-note{{include the header <stdarg.h> or explicitly provide a declaration for 'va_end'}} expected-error{{undeclared identifier 'v'}} \
28*9a7a6dd3SIan Anderson                   expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}} expected-modules-error{{undeclared identifier}}
29*9a7a6dd3SIan Anderson     __va_copy(g, v); // expected-error{{implicit declaration of function '__va_copy'}} expected-error{{use of undeclared identifier 'g'}} expected-error{{use of undeclared identifier 'v'}} \
30*9a7a6dd3SIan Anderson                         expected-modules-error{{implicit declaration of function}} expected-modules-error{{undeclared identifier}} expected-modules-error{{undeclared identifier}}
31*9a7a6dd3SIan Anderson     va_copy(g, v); // expected-error{{implicitly declaring library function 'va_copy'}} expected-note{{include the header <stdarg.h> or explicitly provide a declaration for 'va_copy'}} expected-error{{use of undeclared identifier 'g'}} expected-error{{use of undeclared identifier 'v'}} \
32*9a7a6dd3SIan Anderson                       expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}} expected-modules-error{{undeclared identifier}} expected-modules-error{{undeclared identifier}}
3362f769aaSIan Anderson }
3462f769aaSIan Anderson 
3562f769aaSIan Anderson //--- stdargneeds1.c
3662f769aaSIan Anderson #define __need___va_list
3762f769aaSIan Anderson #include <stdarg.h>
f(int p,...)3862f769aaSIan Anderson static void f(int p, ...) {
3962f769aaSIan Anderson     __gnuc_va_list g;
40*9a7a6dd3SIan Anderson     va_list v; // expected-error{{undeclared identifier}} \
41*9a7a6dd3SIan Anderson                   expected-modules-error{{'va_list' must be declared before it is used}} expected-modules-note@__stdarg_va_list.h:*{{declaration here is not visible}}
42*9a7a6dd3SIan Anderson     va_start(v, p); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} expected-error{{undeclared identifier}} \
43*9a7a6dd3SIan Anderson                        expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
44*9a7a6dd3SIan Anderson     int i = va_arg(v, int); // expected-error{{implicit declaration of function}} expected-error{{expected expression}} expected-error{{undeclared identifier}} \
45*9a7a6dd3SIan Anderson                                expected-modules-error{{implicit declaration of function}} expected-modules-error{{expected expression}}
46*9a7a6dd3SIan Anderson     va_end(v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} expected-error{{undeclared identifier}} \
47*9a7a6dd3SIan Anderson                   expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
48*9a7a6dd3SIan Anderson     __va_copy(g, v); // expected-error{{implicit declaration of function}} expected-error{{undeclared identifier}} \
49*9a7a6dd3SIan Anderson                         expected-modules-error{{implicit declaration of function}}
50*9a7a6dd3SIan Anderson     va_copy(g, v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} expected-error{{undeclared identifier}} \
51*9a7a6dd3SIan Anderson                       expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
5262f769aaSIan Anderson }
5362f769aaSIan Anderson 
5462f769aaSIan Anderson //--- stdargneeds2.c
5562f769aaSIan Anderson #define __need_va_list
5662f769aaSIan Anderson #include <stdarg.h>
f(int p,...)5762f769aaSIan Anderson static void f(int p, ...) {
58*9a7a6dd3SIan Anderson     __gnuc_va_list g; // expected-error{{undeclared identifier}} \
59*9a7a6dd3SIan Anderson                          expected-modules-error{{'__gnuc_va_list' must be declared before it is used}} expected-modules-note@__stdarg___gnuc_va_list.h:*{{declaration here is not visible}}
6062f769aaSIan Anderson     va_list v;
61*9a7a6dd3SIan Anderson     va_start(v, p); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
62*9a7a6dd3SIan Anderson                        expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
63*9a7a6dd3SIan Anderson     int i = va_arg(v, int); // expected-error{{implicit declaration of function}} expected-error{{expected expression}} \
64*9a7a6dd3SIan Anderson                                expected-modules-error{{implicit declaration of function}} expected-modules-error{{expected expression}}
65*9a7a6dd3SIan Anderson     va_end(v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
66*9a7a6dd3SIan Anderson                   expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
67*9a7a6dd3SIan Anderson     __va_copy(g, v); // expected-error{{implicit declaration of function}} expected-error{{undeclared identifier}} \
68*9a7a6dd3SIan Anderson                         expected-modules-error{{implicit declaration of function}}
69*9a7a6dd3SIan Anderson     va_copy(g, v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} expected-error{{undeclared identifier}} \
70*9a7a6dd3SIan Anderson                       expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
7162f769aaSIan Anderson }
7262f769aaSIan Anderson 
7362f769aaSIan Anderson //--- stdargneeds3.c
7462f769aaSIan Anderson #define __need_va_list
7562f769aaSIan Anderson #define __need_va_arg
7662f769aaSIan Anderson #include <stdarg.h>
f(int p,...)7762f769aaSIan Anderson static void f(int p, ...) {
78*9a7a6dd3SIan Anderson     __gnuc_va_list g; // expected-error{{undeclared identifier}} \
79*9a7a6dd3SIan Anderson                          expected-modules-error{{'__gnuc_va_list' must be declared before it is used}} expected-modules-note@__stdarg___gnuc_va_list.h:*{{declaration here is not visible}}
8062f769aaSIan Anderson     va_list v;
8162f769aaSIan Anderson     va_start(v, p);
8262f769aaSIan Anderson     int i = va_arg(v, int);
8362f769aaSIan Anderson     va_end(v);
84*9a7a6dd3SIan Anderson     __va_copy(g, v); // expected-error{{implicit declaration of function}} expected-error{{undeclared identifier}} \
85*9a7a6dd3SIan Anderson                         expected-modules-error{{implicit declaration of function}}
86*9a7a6dd3SIan Anderson     va_copy(g, v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} expected-error{{undeclared identifier}} \
87*9a7a6dd3SIan Anderson                       expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
8862f769aaSIan Anderson }
8962f769aaSIan Anderson 
9062f769aaSIan Anderson //--- stdargneeds4.c
9162f769aaSIan Anderson #define __need___va_list
9262f769aaSIan Anderson #define __need_va_list
9362f769aaSIan Anderson #define __need___va_copy
9462f769aaSIan Anderson #include <stdarg.h>
f(int p,...)9562f769aaSIan Anderson static void f(int p, ...) {
9662f769aaSIan Anderson     __gnuc_va_list g;
9762f769aaSIan Anderson     va_list v;
98*9a7a6dd3SIan Anderson     va_start(v, p); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
99*9a7a6dd3SIan Anderson                        expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
100*9a7a6dd3SIan Anderson     int i = va_arg(v, int); // expected-error{{implicit declaration of function}} expected-error{{expected expression}} \
101*9a7a6dd3SIan Anderson                                expected-modules-error{{implicit declaration of function}} expected-modules-error{{expected expression}}
102*9a7a6dd3SIan Anderson     va_end(v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
103*9a7a6dd3SIan Anderson                   expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
10462f769aaSIan Anderson     __va_copy(g, v);
105*9a7a6dd3SIan Anderson     va_copy(g, v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
106*9a7a6dd3SIan Anderson                       expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
10762f769aaSIan Anderson }
10862f769aaSIan Anderson 
10962f769aaSIan Anderson //--- stdargneeds5.c
11062f769aaSIan Anderson #define __need___va_list
11162f769aaSIan Anderson #define __need_va_list
11262f769aaSIan Anderson #define __need_va_copy
11362f769aaSIan Anderson #include <stdarg.h>
f(int p,...)11462f769aaSIan Anderson static void f(int p, ...) {
11562f769aaSIan Anderson     __gnuc_va_list g;
11662f769aaSIan Anderson     va_list v;
117*9a7a6dd3SIan Anderson     va_start(v, p); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
118*9a7a6dd3SIan Anderson                        expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
119*9a7a6dd3SIan Anderson     int i = va_arg(v, int); // expected-error{{implicit declaration of function}} expected-error{{expected expression}} \
120*9a7a6dd3SIan Anderson                                expected-modules-error{{implicit declaration of function}} expected-modules-error{{expected expression}}
121*9a7a6dd3SIan Anderson     va_end(v); // expected-error{{implicitly declaring library function}} expected-note{{provide a declaration}} \
122*9a7a6dd3SIan Anderson                   expected-modules-error{{implicitly declaring library function}} expected-modules-note{{provide a declaration}}
123*9a7a6dd3SIan Anderson     __va_copy(g, v); // expected-error{{implicit declaration of function}} expected-modules-error{{implicit declaration of function}}
12462f769aaSIan Anderson     va_copy(g, v);
12562f769aaSIan Anderson }
126