• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple i686-pc-win32 -cxx-abi microsoft -fms-extensions -verify %s
2 
3 // Pointers to free functions
4 void            free_func_default();
5 void __cdecl    free_func_cdecl();
6 void __stdcall  free_func_stdcall(); // expected-note {{previous declaration is here}}
7 void __fastcall free_func_fastcall(); // expected-note 2 {{previous declaration is here}}
8 
9 void __cdecl    free_func_default(); // expected-note 2 {{previous declaration is here}}
10 void __stdcall  free_func_default(); // expected-error {{function declared 'stdcall' here was previously declared without calling convention}}
11 void __fastcall free_func_default(); // expected-error {{function declared 'fastcall' here was previously declared without calling convention}}
12 
13 void            free_func_cdecl(); // expected-note 2 {{previous declaration is here}}
14 void __stdcall  free_func_cdecl(); // expected-error {{function declared 'stdcall' here was previously declared 'cdecl'}}
15 void __fastcall free_func_cdecl(); // expected-error {{function declared 'fastcall' here was previously declared 'cdecl'}}
16 
17 void __cdecl    free_func_stdcall(); // expected-error {{function declared 'cdecl' here was previously declared 'stdcall'}}
18 void            free_func_stdcall(); // expected-note {{previous declaration is here}}
19 void __fastcall free_func_stdcall(); // expected-error {{function declared 'fastcall' here was previously declared 'stdcall'}}
20 
21 void __cdecl    free_func_fastcall(); // expected-error {{function declared 'cdecl' here was previously declared 'fastcall'}}
22 void __stdcall  free_func_fastcall(); // expected-error {{function declared 'stdcall' here was previously declared 'fastcall'}}
23 void            free_func_fastcall();
24 
25 // Overloaded functions may have different calling conventions
26 void __fastcall free_func_default(int);
27 void __cdecl    free_func_default(int *);
28 
29 void __thiscall free_func_cdecl(char *);
30 void __cdecl    free_func_cdecl(double);
31 
32 
33 // Pointers to member functions
34 struct S {
35   void            member_default1(); // expected-note {{previous declaration is here}}
36   void            member_default2();
37   void __cdecl    member_cdecl1();
38   void __cdecl    member_cdecl2(); // expected-note {{previous declaration is here}}
39   void __thiscall member_thiscall1();
40   void __thiscall member_thiscall2(); // expected-note {{previous declaration is here}}
41 
42   // Static member functions can't be __thiscall
43   static void            static_member_default1();
44   static void            static_member_default2(); // expected-note {{previous declaration is here}}
45   static void __cdecl    static_member_cdecl1();
46   static void __cdecl    static_member_cdecl2(); // expected-note {{previous declaration is here}}
47   static void __stdcall  static_member_stdcall1();
48   static void __stdcall  static_member_stdcall2();
49 
50   // Variadic functions can't be other than default or __cdecl
51   void            member_variadic_default(int x, ...);
52   void __cdecl    member_variadic_cdecl(int x, ...);
53 
54   static void            static_member_variadic_default(int x, ...);
55   static void __cdecl    static_member_variadic_cdecl(int x, ...);
56 };
57 
member_default1()58 void __cdecl    S::member_default1() {} // expected-error {{function declared 'cdecl' here was previously declared without calling convention}}
member_default2()59 void __thiscall S::member_default2() {}
60 
member_cdecl1()61 void            S::member_cdecl1() {}
member_cdecl2()62 void __thiscall S::member_cdecl2() {} // expected-error {{function declared 'thiscall' here was previously declared 'cdecl'}}
63 
member_thiscall1()64 void            S::member_thiscall1() {}
member_thiscall2()65 void __cdecl    S::member_thiscall2() {} // expected-error {{function declared 'cdecl' here was previously declared 'thiscall'}}
66 
static_member_default1()67 void __cdecl    S::static_member_default1() {}
static_member_default2()68 void __stdcall  S::static_member_default2() {} // expected-error {{function declared 'stdcall' here was previously declared without calling convention}}
69 
static_member_cdecl1()70 void            S::static_member_cdecl1() {}
static_member_cdecl2()71 void __stdcall  S::static_member_cdecl2() {} // expected-error {{function declared 'stdcall' here was previously declared 'cdecl'}}
72 
member_variadic_default(int x,...)73 void __cdecl    S::member_variadic_default(int x, ...) {
74   (void)x;
75 }
member_variadic_cdecl(int x,...)76 void            S::member_variadic_cdecl(int x, ...) {
77   (void)x;
78 }
79 
static_member_variadic_default(int x,...)80 void __cdecl    S::static_member_variadic_default(int x, ...) {
81   (void)x;
82 }
static_member_variadic_cdecl(int x,...)83 void            S::static_member_variadic_cdecl(int x, ...) {
84   (void)x;
85 }
86 
87