1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
3 // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -x c++ %s 2>&1 | FileCheck %s
4 
5 // expected-note@+1 5{{previous definition is here}}
main()6 int main() {
7   return 0;
8 }
9 
10 // expected-error@+3 {{conflicting types for 'main}}
11 // expected-warning@+2 {{return type of 'main' is not 'int'}}
12 // expected-note@+1 {{change return type to 'int'}}
main()13 void main() {
14 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:5}:"int"
15 }
16 
17 // expected-error@+3 {{conflicting types for 'main}}
18 // expected-warning@+2 {{return type of 'main' is not 'int'}}
19 // expected-note@+1 {{change return type to 'int'}}
main()20 double main() {
21 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:7}:"int"
22   return 0.0;
23 }
24 
25 // TODO: Store qualifier source locations for return types so
26 // we can replace the full type with this fix-it.
27 //
28 // expected-error@+3 {{conflicting types for 'main}}
29 // expected-warning@+2 {{return type of 'main' is not 'int'}}
30 // expected-note@+1 {{change return type to 'int'}}
main()31 const float main() {
32 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:12}:"int"
33   return 0.0f;
34 }
35 
36 typedef void *(*fptr)(int a);
37 
38 // expected-error@+3 {{conflicting types for 'main}}
39 // expected-warning@+2 {{return type of 'main' is not 'int'}}
40 // expected-note@+1 {{change return type to 'int'}}
main()41 fptr main() {
42 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:5}:"int"
43   return (fptr) 0;
44 }
45 
46 // expected-error@+2 {{conflicting types for 'main}}
47 // expected-warning@+1 {{return type of 'main' is not 'int'}}
main()48 void *(*main())(int a) {
49   return (fptr) 0;
50 }
51 
52