Clang Project

clang_source_code/test/Sema/warn-strict-prototypes.c
1// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -verify %s
2// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
3
4// function declaration with unspecified params
5void foo1(); // expected-warning {{this function declaration is not a prototype}}
6             // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:"void"
7// function declaration with 0 params
8void foo2(void);
9
10// function definition with 0 params(for both cases),
11// valid according to 6.7.5.3/14
12void foo1() {}
13void foo2(void) {}
14
15// function type typedef unspecified params
16typedef void foo3(); // expected-warning {{this function declaration is not a prototype}}
17                     // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:19-[[@LINE-1]]:19}:"void"
18
19// global fp unspecified params
20void (*foo4)(); // expected-warning {{this function declaration is not a prototype}}
21                // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"void"
22
23// struct member fp unspecified params
24struct { void (*foo5)(); } s; // expected-warning {{this function declaration is not a prototype}}
25                              // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:23-[[@LINE-1]]:23}:"void"
26
27// param fp unspecified params
28void bar2(void (*foo6)()) { // expected-warning {{this function declaration is not a prototype}}
29                            // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:24-[[@LINE-1]]:24}:"void"
30  // local fp unspecified params
31  void (*foo7)() = 0; // expected-warning {{this function declaration is not a prototype}}
32                      // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:16-[[@LINE-1]]:16}:"void"
33  // array fp unspecified params
34  void (*foo8[2])() = {0}; // expected-warning {{this function declaration is not a prototype}}
35                           // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:19-[[@LINE-1]]:19}:"void"
36}
37
38// function type cast using using an anonymous function declaration
39void bar3(void) {
40  // casting function w/out prototype to unspecified params function type
41  (void)(void(*)()) foo1; // expected-warning {{this function declaration is not a prototype}}
42                          // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:18-[[@LINE-1]]:18}:"void"
43  // .. specified params
44  (void)(void(*)(void)) foo1;
45}
46
47// K&R function definition not preceded by full prototype
48int foo9(a, b) // expected-warning {{old-style function definition is not preceded by a prototype}}
49  int a, b;
50{
51  return a + b;
52}
53
54// Function declaration with no types
55void foo10(); // expected-warning {{this function declaration is not a prototype}}
56              // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:12-[[@LINE-1]]:12}:"void"
57// K&R function definition with incomplete param list declared
58void foo10(p, p2) void *p; {} // expected-warning {{old-style function definition is not preceded by a prototype}}
59
60// K&R function definition with previous prototype declared is not diagnosed.
61void foo11(int p, int p2);
62void foo11(p, p2) int p; int p2; {}
63
64// PR31020
65void __attribute__((cdecl)) foo12(d) // expected-warning {{this old-style function definition is not preceded by a prototype}}
66  short d;
67{}
68
69// No warnings for variadic functions. Overloadable attribute is required
70// to avoid err_ellipsis_first_param error.
71// rdar://problem/33251668
72void foo13(...) __attribute__((overloadable));
73void foo13(...) __attribute__((overloadable)) {}
74