forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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
 | |
| 
 | |
| 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
 |