1 // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST1 2 // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST2 3 // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST3 4 // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST4 5 6 struct S { 7 __attribute__((always_inline, target("avx512f"))) fooS8 void foo(){} 9 __attribute__((always_inline, target("avx512f"))) operator intS10 operator int(){ return 0; } 11 __attribute__((always_inline, target("avx512f"))) operator ()S12 void operator()(){ } 13 14 }; 15 __attribute__((always_inline, target("avx512f"))) free_func()16void free_func(){} 17 18 19 #ifdef TEST1 usage(S & s)20void usage(S & s) { 21 s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} 22 (void)(int)s; // expected-error {{'operator int' requires target feature 'avx512f'}} 23 s(); // expected-error {{'operator()' requires target feature 'avx512f'}} 24 free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} 25 26 } 27 #endif 28 29 #ifdef TEST2 30 __attribute__((target("avx512f"))) usage(S & s)31void usage(S & s) { 32 s.foo(); 33 (void)(int)s; 34 s(); 35 36 [&s] { 37 s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} 38 (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}} 39 s(); // expected-error {{'operator()' requires target feature 'avx512f'}} 40 free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} 41 }(); 42 } 43 #endif 44 45 #ifdef TEST3 usage(S & s)46void usage(S & s) { 47 48 [&s] () __attribute__((target("avx512f"))) { 49 s.foo(); 50 (void)(int) s; 51 s(); 52 free_func(); 53 }(); 54 55 [&s] { 56 s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} 57 (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}} 58 s(); // expected-error {{'operator()' requires target feature 'avx512f'}} 59 free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} 60 }(); 61 } 62 #endif 63 64 #ifdef TEST4 65 namespace PR45468 { 66 struct CtorAndDTor { 67 __attribute__((always_inline, target("avx512f"))) CtorAndDTor(); 68 __attribute__((always_inline, target("avx512f"))) ~CtorAndDTor(); 69 }; 70 usage()71 void usage() { 72 //expected-error@+1{{'CtorAndDTor' requires target feature 'avx512f'}} 73 CtorAndDTor c; 74 { 75 //expected-error@+1{{'CtorAndDTor' requires target feature 'avx512f'}} 76 CtorAndDTor c2; 77 //expected-error@+1{{'~CtorAndDTor' requires target feature 'avx512f'}} 78 c2.~CtorAndDTor(); 79 } 80 // FIXME: These need to be given a line number, however theres no good way 81 // to get to the SourceLocation of anything by the time we're doing CodeGen 82 // cleanups. 83 //expected-error@*{{'~CtorAndDTor' requires target feature 'avx512f'}} 84 //expected-error@*{{'~CtorAndDTor' requires target feature 'avx512f'}} 85 } 86 } 87 #endif 88