| // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST1 |
| // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST2 |
| // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST3 |
| // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST4 |
| |
| struct S { |
| __attribute__((always_inline, target("avx512f"))) |
| void foo(){} |
| __attribute__((always_inline, target("avx512f"))) |
| operator int(){ return 0; } |
| __attribute__((always_inline, target("avx512f"))) |
| void operator()(){ } |
| |
| }; |
| __attribute__((always_inline, target("avx512f"))) |
| void free_func(){} |
| |
| |
| #ifdef TEST1 |
| void usage(S & s) { |
| s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} |
| (void)(int)s; // expected-error {{'operator int' requires target feature 'avx512f'}} |
| s(); // expected-error {{'operator()' requires target feature 'avx512f'}} |
| free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} |
| |
| } |
| #endif |
| |
| #ifdef TEST2 |
| __attribute__((target("avx512f"))) |
| void usage(S & s) { |
| s.foo(); |
| (void)(int)s; |
| s(); |
| |
| [&s] { |
| s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} |
| (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}} |
| s(); // expected-error {{'operator()' requires target feature 'avx512f'}} |
| free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} |
| }(); |
| } |
| #endif |
| |
| #ifdef TEST3 |
| void usage(S & s) { |
| |
| [&s] () __attribute__((target("avx512f"))) { |
| s.foo(); |
| (void)(int) s; |
| s(); |
| free_func(); |
| }(); |
| |
| [&s] { |
| s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}} |
| (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}} |
| s(); // expected-error {{'operator()' requires target feature 'avx512f'}} |
| free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}} |
| }(); |
| } |
| #endif |
| |
| #ifdef TEST4 |
| namespace PR45468 { |
| struct CtorAndDTor { |
| __attribute__((always_inline, target("avx512f"))) CtorAndDTor(); |
| __attribute__((always_inline, target("avx512f"))) ~CtorAndDTor(); |
| }; |
| |
| void usage() { |
| //expected-error@+1{{'CtorAndDTor' requires target feature 'avx512f'}} |
| CtorAndDTor c; |
| { |
| //expected-error@+1{{'CtorAndDTor' requires target feature 'avx512f'}} |
| CtorAndDTor c2; |
| //expected-error@+1{{'~CtorAndDTor' requires target feature 'avx512f'}} |
| c2.~CtorAndDTor(); |
| } |
| // FIXME: These need to be given a line number, however theres no good way |
| // to get to the SourceLocation of anything by the time we're doing CodeGen |
| // cleanups. |
| //expected-error@*{{'~CtorAndDTor' requires target feature 'avx512f'}} |
| //expected-error@*{{'~CtorAndDTor' requires target feature 'avx512f'}} |
| } |
| } |
| #endif |