forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic -std=c99
 | 
						|
 | 
						|
int __attribute__(()) x;
 | 
						|
 | 
						|
__inline void __attribute__((__always_inline__, __nodebug__))
 | 
						|
foo(void) {
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
__attribute__(()) y;   // expected-warning {{defaults to 'int'}}
 | 
						|
 | 
						|
// PR2796
 | 
						|
int (__attribute__(()) *z)(long y);
 | 
						|
 | 
						|
 | 
						|
void f1(__attribute__(()) int x);
 | 
						|
 | 
						|
int f2(y, __attribute__(()) x);     // expected-error {{expected identifier}}
 | 
						|
 | 
						|
// This is parsed as a normal argument list (with two args that are implicit
 | 
						|
// int) because the __attribute__ is a declspec.
 | 
						|
void f3(__attribute__(()) x,  // expected-warning {{defaults to 'int'}}
 | 
						|
        y);               // expected-warning {{defaults to 'int'}}
 | 
						|
 | 
						|
void f4(__attribute__(()));   // expected-error {{expected parameter declarator}}
 | 
						|
 | 
						|
 | 
						|
// This is ok, the __attribute__ applies to the pointer.
 | 
						|
int baz(int (__attribute__(()) *x)(long y));
 | 
						|
 | 
						|
void g1(void (*f1)(__attribute__(()) int x));
 | 
						|
void g2(int (*f2)(y, __attribute__(()) x));    // expected-error {{expected identifier}}
 | 
						|
void g3(void (*f3)(__attribute__(()) x, int y));  // expected-warning {{defaults to 'int'}}
 | 
						|
void g4(void (*f4)(__attribute__(())));  // expected-error {{expected parameter declarator}}
 | 
						|
 | 
						|
 | 
						|
void (*h1)(void (*f1)(__attribute__(()) int x));
 | 
						|
void (*h2)(int (*f2)(y, __attribute__(()) x));    // expected-error {{expected identifier}}
 | 
						|
 | 
						|
void (*h3)(void (*f3)(__attribute__(()) x));   // expected-warning {{defaults to 'int'}}
 | 
						|
void (*h4)(void (*f4)(__attribute__(())));  // expected-error {{expected parameter declarator}}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// rdar://6131260
 | 
						|
int foo42(void) {
 | 
						|
  int x, __attribute__((unused)) y, z;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
// rdar://6096491
 | 
						|
void __attribute__((noreturn)) d0(void), __attribute__((noreturn)) d1(void);
 | 
						|
 | 
						|
void d2(void) __attribute__((noreturn)), d3(void) __attribute__((noreturn));
 | 
						|
 | 
						|
 | 
						|
// PR6287
 | 
						|
void __attribute__((returns_twice)) returns_twice_test();
 | 
						|
 | 
						|
int aligned(int);
 | 
						|
int __attribute__((vec_type_hint(char, aligned(16) )) missing_rparen_1; // expected-error 2{{expected ')'}} expected-note {{to match}} expected-warning {{does not declare anything}}
 | 
						|
int __attribute__((mode(x aligned(16) )) missing_rparen_2; // expected-error {{expected ')'}}
 | 
						|
int __attribute__((format(printf, 0 aligned(16) )) missing_rparen_3; // expected-error {{expected ')'}}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
int testFundef1(int *a) __attribute__((nonnull(1))) { // \
 | 
						|
    // expected-warning {{GCC does not allow 'nonnull' attribute in this position on a function definition}}
 | 
						|
  return *a;
 | 
						|
}
 | 
						|
 | 
						|
// noreturn is lifted to type qualifier
 | 
						|
void testFundef2() __attribute__((noreturn)) { // \
 | 
						|
    // expected-warning {{GCC does not allow 'noreturn' attribute in this position on a function definition}}
 | 
						|
  testFundef2();
 | 
						|
}
 | 
						|
 | 
						|
int testFundef3(int *a) __attribute__((nonnull(1), // \
 | 
						|
    // expected-warning {{GCC does not allow 'nonnull' attribute in this position on a function definition}}
 | 
						|
                                     pure)) { // \
 | 
						|
    // expected-warning {{GCC does not allow 'pure' attribute in this position on a function definition}}
 | 
						|
  return *a;
 | 
						|
}
 | 
						|
 | 
						|
int testFundef4(int *a) __attribute__((nonnull(1))) // \
 | 
						|
    // expected-warning {{GCC does not allow 'nonnull' attribute in this position on a function definition}}
 | 
						|
                      __attribute((pure)) { // \
 | 
						|
    // expected-warning {{GCC does not allow 'pure' attribute in this position on a function definition}}
 | 
						|
  return *a;
 | 
						|
}
 | 
						|
 | 
						|
// GCC allows these
 | 
						|
void testFundef5() __attribute__(()) { }
 | 
						|
 | 
						|
__attribute__((pure)) int testFundef6(int a) { return a; }
 | 
						|
 | 
						|
void deprecatedTestFun(void) __attribute__((deprecated()));
 | 
						|
 | 
						|
struct s {
 | 
						|
  int a;
 | 
						|
};
 | 
						|
 | 
						|
// This test ensure compatibility with parsing GNU-style attributes
 | 
						|
// where the attribute is on a separate line from the elaborated type
 | 
						|
// specifier.
 | 
						|
struct s
 | 
						|
__attribute__((used)) bar;
 |