70 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.9 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}}
 | |
| }
 | |
| 
 | |
| typedef void ft(void);
 | |
| _AS1 ft qf; // expected-error {{function type may not be qualified with an address space}}
 | |
| typedef _AS1 ft qft; // expected-error {{function type may not be qualified with an address space}}
 | |
| 
 | |
| 
 | |
| typedef _AS2 int AS2Int;
 | |
| 
 | |
| struct HasASFields
 | |
| {
 | |
|   _AS2 int as_field; // expected-error {{field may not be qualified with an address space}}
 | |
|    AS2Int typedef_as_field; // expected-error {{field may not be qualified with an address space}}
 | |
| };
 | |
| 
 | |
| // Assertion failure was when the field was accessed
 | |
| void access_as_field()
 | |
| {
 | |
|     struct HasASFields x;
 | |
|     (void) bar.as_field;
 | |
| }
 | |
| 
 | |
| typedef int PR4997 __attribute__((address_space(Foobar))); // expected-error {{use of undeclared identifier 'Foobar'}}
 | |
| __attribute__((address_space("12"))) int *i; // expected-error {{'address_space' attribute requires an integer constant}}
 | 
