forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			47 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 %s -fsyntax-only -verify
 | |
| 
 | |
| #define _AS1 __attribute__((address_space(1)))
 | |
| #define _AS2 __attribute__((address_space(2)))
 | |
| #define _AS3 __attribute__((address_space(3)))
 | |
| 
 | |
| void bar(_AS2 int a); // expected-error {{parameter may not be qualified with an address space}}
 | |
| 
 | |
| void foo(_AS3 float *a, 
 | |
|          _AS1 float b) // expected-error {{parameter may not be qualified with an address space}}
 | |
| {
 | |
|   _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}}
 | |
|   _AS1 float * _AS2 *B;
 | |
| 
 | |
|   int _AS1 _AS2 *Y;   // expected-error {{multiple address spaces specified for type}}
 | |
|   int *_AS1 _AS2 *Z;  // expected-error {{multiple address spaces specified for type}}
 | |
| 
 | |
|   _AS1 int local;     // expected-error {{automatic variable qualified with an address space}}
 | |
|   _AS1 int array[5];  // expected-error {{automatic variable qualified with an address space}}
 | |
|   _AS1 int arrarr[5][5]; // expected-error {{automatic variable qualified with an address space}}
 | |
| 
 | |
|   __attribute__((address_space(-1))) int *_boundsA; // expected-error {{address space is negative}}
 | |
|   __attribute__((address_space(0xFFFFFF))) int *_boundsB;
 | |
|   __attribute__((address_space(0x1000000))) int *_boundsC; // expected-error {{address space is larger than the maximum supported}}
 | |
|   // chosen specifically to overflow 32 bits and come out reasonable
 | |
|   __attribute__((address_space(4294967500))) int *_boundsD; // expected-error {{address space is larger than the maximum supported}}
 | |
| 
 | |
|   *a = 5.0f + b;
 | |
| }
 | |
| 
 | |
| struct _st {
 | |
|  int x, y;
 | |
| } s __attribute ((address_space(1))) = {1, 1};
 | |
| 
 | |
| 
 | |
| // rdar://6774906
 | |
| __attribute__((address_space(256))) void * * const base = 0;
 | |
| void * get_0(void) {
 | |
|   return base[0];  // expected-error {{returning '__attribute__((address_space(256))) void *' from a function with result type 'void *' changes address space of pointer}}
 | |
| }
 | |
| 
 | |
| __attribute__((address_space(1))) char test3_array[10];
 | |
| void test3(void) {
 | |
|   extern void test3_helper(char *p); // expected-note {{passing argument to parameter 'p' here}}
 | |
|   test3_helper(test3_array); // expected-error {{changes address space of pointer}}
 | |
| }
 |