1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -Wno-strict-prototypes -fsyntax-only -verify %s -Wnonnull 2 3 void __attribute__((cpu_specific(ivybridge))) no_default(void); 4 void __attribute__((cpu_specific(sandybridge))) no_default(void); 5 6 void use1(void){ 7 // Should be OK, default not a problem. 8 no_default(); 9 } 10 11 int __attribute__((cpu_specific(atom))) addr_of(void); 12 int __attribute__((cpu_specific(ivybridge))) addr_of(void); 13 int __attribute__((cpu_specific(ivybridge))) addr_of2(void); 14 15 void use2(void){ 16 addr_of(); 17 addr_of2(); 18 // expected-error@+1{{reference to multiversioned function could not be resolved; did you mean to call it with no arguments?}} 19 (void)+addr_of; 20 // expected-error@+1{{reference to multiversioned function could not be resolved; did you mean to call it with no arguments?}} 21 (void)+addr_of2; 22 // expected-error@+1{{reference to multiversioned function could not be resolved; did you mean to call it with no arguments?}} 23 (void)&addr_of; 24 // expected-error@+1{{reference to multiversioned function could not be resolved; did you mean to call it with no arguments?}} 25 (void)&addr_of2; 26 } 27 28 // expected-error@+1 {{multiversioned function must have a prototype}} 29 int __attribute__((cpu_specific(atom))) no_proto(); 30 31 int __attribute__((cpu_specific(atom))) redecl1(void); 32 int __attribute__((cpu_specific(atom))) redecl1(void) { return 1; } 33 34 int __attribute__((cpu_dispatch(atom))) redecl2(void); 35 int __attribute__((cpu_dispatch(atom))) redecl2(void) { } 36 // expected-error@+2 {{redefinition of 'redecl2'}} 37 // expected-note@-2 {{previous definition is here}} 38 int __attribute__((cpu_dispatch(atom))) redecl2(void) { } 39 40 int allow_fwd_decl(void); 41 int __attribute__((cpu_dispatch(atom))) allow_fwd_decl(void) {} 42 43 int allow_fwd_decl2(void); 44 void use_fwd_decl(void) { 45 allow_fwd_decl2(); 46 } 47 // expected-error@+2 {{function declaration cannot become a multiversioned function after first usage}} 48 // expected-note@-5 {{previous declaration is here}} 49 int __attribute__((cpu_dispatch(atom))) allow_fwd_decl2(void) {} 50 51 52 int __attribute__((cpu_specific(atom))) redecl4(void); 53 // expected-error@+1 {{function declaration is missing 'cpu_specific' or 'cpu_dispatch' attribute in a multiversioned function}} 54 int redecl4(void); 55 56 // expected-warning@+1 {{CPU list contains duplicate entries; attribute ignored}} 57 int __attribute__((cpu_specific(atom, atom))) dup_procs(void); 58 59 int __attribute__((cpu_specific(ivybridge, atom))) dup_procs2(void); 60 // expected-error@+2 {{multiple 'cpu_specific' functions cannot specify the same CPU: 'atom'}} 61 // expected-note@-2 {{previous declaration is here}} 62 int __attribute__((cpu_specific(atom))) dup_procs2(void); 63 64 int __attribute__((cpu_specific(ivybridge, atom))) dup_procs3(void); 65 // expected-error@+2 {{multiple 'cpu_specific' functions cannot specify the same CPU: 'ivybridge'}} 66 // expected-note@-2 {{previous declaration is here}} 67 int __attribute__((cpu_specific(atom, ivybridge))) dup_procs3(void); 68 69 int __attribute__((cpu_specific(atom))) redef(void) { return 1; } 70 // expected-error@+2 {{redefinition of 'redef'}} 71 // expected-note@-2 {{previous definition is here}} 72 int __attribute__((cpu_specific(atom))) redef(void) { return 2; } 73 74 int __attribute((cpu_dispatch(atom))) mult_dispatch(void) {} 75 // expected-error@+2 {{'cpu_dispatch' function redeclared with different CPUs}} 76 // expected-note@-2 {{previous declaration is here}} 77 int __attribute((cpu_dispatch(ivybridge))) mult_dispatch(void) {} 78 79 // expected-error@+1 {{'cpu_dispatch' attribute takes at least 1 argument}} 80 int __attribute((cpu_dispatch())) no_dispatch(void) {} 81 // expected-error@+1 {{'cpu_specific' attribute takes at least 1 argument}} 82 int __attribute((cpu_specific())) no_specific(void) {} 83 84 //expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'used'}} 85 void __attribute__((used,cpu_specific(sandybridge))) addtl_attrs(void); 86 87 void __attribute__((target("default"))) addtl_attrs2(void); 88 // expected-error@+2 {{multiversioning attributes cannot be combined}} 89 // expected-note@-2 {{previous declaration is here}} 90 void __attribute__((cpu_specific(sandybridge))) addtl_attrs2(void); 91 92 // expected-error@+2 {{'cpu_dispatch' and 'cpu_specific' attributes are not compatible}} 93 // expected-note@+1 {{conflicting attribute is here}} 94 void __attribute((cpu_specific(sandybridge), cpu_dispatch(atom, sandybridge))) 95 combine_attrs(void); 96 97 int __attribute__((cpu_dispatch(ivybridge))) diff_cc(void){} 98 // expected-error@+1 {{multiversioned function declaration has a different calling convention}} 99 __vectorcall int __attribute__((cpu_specific(sandybridge))) diff_cc(void); 100 101 // expected-warning@+2 {{body of cpu_dispatch function will be ignored}} 102 int __attribute__((cpu_dispatch(atom))) disp_with_body(void) { 103 return 5; 104 } 105 106 // expected-error@+1 {{invalid option 'INVALID'}} 107 int __attribute__((cpu_specific(INVALID))) called_invalid_value(void){ return 1;} 108 // expected-warning@+3 {{attribute declaration must precede definition}} 109 // expected-note@-2 2 {{previous definition is here}} 110 // expected-error@+1 {{redefinition of}} 111 int __attribute__((cpu_specific(pentium_iii))) called_invalid_value(void){ return 2;} 112 int __attribute__((cpu_specific(pentium_4))) called_invalid_value(void){ return 3;} 113 114 int use3(void) { 115 return called_invalid_value(); 116 } 117 118 // expected-warning@+1 {{CPU list contains duplicate entries; attribute ignored}} 119 int __attribute__((cpu_dispatch(pentium_iii, pentium_iii_no_xmm_regs))) dupe_p3(void); 120 121 void __attribute__((cpu_specific(atom), nothrow, nonnull(1))) addtl_attrs(int*); 122 123 int __attribute__((cpu_specific(atom))) bad_overload1(void); 124 int __attribute__((cpu_specific(ivybridge))) bad_overload1(void); 125 // expected-error@+1 {{function declaration is missing 'cpu_specific' or 'cpu_dispatch' attribute in a multiversioned function}} 126 int bad_overload1(int); 127 128 int bad_overload2(int); 129 // expected-error@+2 {{conflicting types for 'bad_overload2'}} 130 // expected-note@-2 {{previous declaration is here}} 131 int __attribute__((cpu_specific(atom))) bad_overload2(void); 132 int __attribute__((cpu_specific(ivybridge))) bad_overload2(void); 133 134 int __attribute__((cpu_dispatch(generic))) bad_overload3(void); 135 int __attribute__((cpu_specific(ivybridge))) bad_overload3(void); 136 // expected-error@+1 {{function declaration is missing 'cpu_specific' or 'cpu_dispatch' attribute in a multiversioned function}} 137 int bad_overload3(int); 138 139 int bad_overload4(int); 140 // expected-error@+2 {{conflicting types for 'bad_overload4'}} 141 // expected-note@-2 {{previous declaration is here}} 142 int __attribute__((cpu_dispatch(generic))) bad_overload4(void); 143 int __attribute__((cpu_specific(ivybridge))) bad_overload4(void); 144 145 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 146 int __attribute__((__overloadable__)) __attribute__((cpu_specific(generic))) bad_overload5(void); 147 int __attribute__((cpu_specific(ivybridge))) bad_overload5(void); 148 149 int __attribute__((cpu_specific(generic))) bad_overload6(void); 150 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 151 int __attribute__((__overloadable__)) __attribute__((cpu_specific(ivybridge))) bad_overload6(void); 152 153 int __attribute__((cpu_specific(atom))) good_overload1(void); 154 int __attribute__((cpu_specific(ivybridge))) good_overload1(void); 155 int __attribute__((__overloadable__)) good_overload1(int); 156 157 int __attribute__((__overloadable__)) good_overload2(int); 158 int __attribute__((cpu_specific(atom))) good_overload2(void); 159 int __attribute__((cpu_specific(ivybridge))) good_overload2(void); 160 161 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 162 int __attribute__((__overloadable__)) __attribute__((cpu_specific(atom))) good_overload3(void); 163 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 164 int __attribute__((__overloadable__)) __attribute__((cpu_specific(ivybridge))) good_overload3(void); 165 int good_overload3(int); 166 167 int good_overload4(int); 168 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 169 int __attribute__((__overloadable__)) __attribute__((cpu_specific(atom))) good_overload4(void); 170 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 171 int __attribute__((__overloadable__)) __attribute__((cpu_specific(ivybridge))) good_overload4(void); 172 173 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 174 int __attribute__((__overloadable__)) __attribute__((cpu_specific(atom))) good_overload5(void); 175 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 176 int __attribute__((__overloadable__)) __attribute__((cpu_specific(ivybridge))) good_overload5(int); 177 178 int __attribute__((cpu_specific(atom))) good_overload6(void); 179 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 180 int __attribute__((__overloadable__)) __attribute__((cpu_specific(ivybridge))) good_overload6(int); 181 182 // expected-error@+1 {{attribute 'cpu_specific' multiversioning cannot be combined with attribute 'overloadable'}} 183 int __attribute__((__overloadable__)) __attribute__((cpu_specific(atom))) good_overload7(void); 184 int __attribute__((cpu_specific(ivybridge))) good_overload7(int); 185 186 // expected-error@+1 {{invalid option 'x86_64'}} 187 int __attribute__((cpu_specific(x86_64))) baseline(void); 188 // expected-error@+1 {{invalid option 'x86_64_v2'}} 189 int __attribute__((cpu_specific(x86_64_v2))) baseline(void); 190