2013-10-21 03:04:19 +08:00
// RUN: %clang_cc1 %s -verify
void f1 ( void ) __attribute__ ( ( ownership_takes ( " foo " ) ) ) ; // expected-error {{'ownership_takes' attribute requires parameter 1 to be an identifier}}
2014-01-03 05:26:14 +08:00
void * f2 ( void ) __attribute__ ( ( ownership_returns ( foo , 1 , 2 ) ) ) ; // expected-error {{'ownership_returns' attribute takes no more than 1 argument}}
2013-10-21 03:04:19 +08:00
void f3 ( void ) __attribute__ ( ( ownership_holds ( foo , 1 ) ) ) ; // expected-error {{'ownership_holds' attribute parameter 1 is out of bounds}}
void * f4 ( void ) __attribute__ ( ( ownership_returns ( foo ) ) ) ;
2014-01-03 05:26:14 +08:00
void f5 ( void ) __attribute__ ( ( ownership_holds ( foo ) ) ) ; // expected-error {{'ownership_holds' attribute takes at least 2 arguments}}
2013-10-21 03:04:19 +08:00
void f6 ( void ) __attribute__ ( ( ownership_holds ( foo , 1 , 2 , 3 ) ) ) ; // expected-error {{'ownership_holds' attribute parameter 1 is out of bounds}}
2014-01-03 05:26:14 +08:00
void f7 ( void ) __attribute__ ( ( ownership_takes ( foo ) ) ) ; // expected-error {{'ownership_takes' attribute takes at least 2 arguments}}
2013-10-21 03:04:19 +08:00
void f8 ( int * i , int * j , int k ) __attribute__ ( ( ownership_holds ( foo , 1 , 2 , 4 ) ) ) ; // expected-error {{'ownership_holds' attribute parameter 3 is out of bounds}}
2016-01-03 23:55:40 +08:00
int f9 __attribute__ ( ( ownership_takes ( foo , 1 ) ) ) ; // expected-warning {{'ownership_takes' attribute only applies to non-K&R-style functions}}
2013-10-21 03:04:19 +08:00
void f10 ( int i ) __attribute__ ( ( ownership_holds ( foo , 1 ) ) ) ; // expected-error {{'ownership_holds' attribute only applies to pointer arguments}}
void * f11 ( float i ) __attribute__ ( ( ownership_returns ( foo , 1 ) ) ) ; // expected-error {{'ownership_returns' attribute only applies to integer arguments}}
void * f12 ( float i , int k , int f , int * j ) __attribute__ ( ( ownership_returns ( foo , 4 ) ) ) ; // expected-error {{'ownership_returns' attribute only applies to integer arguments}}
void f13 ( int * i , int * j ) __attribute__ ( ( ownership_holds ( foo , 1 ) ) ) __attribute__ ( ( ownership_takes ( foo , 2 ) ) ) ;
void f14 ( int i , int j , int * k ) __attribute__ ( ( ownership_holds ( foo , 3 ) ) ) __attribute__ ( ( ownership_takes ( foo , 3 ) ) ) ; // expected-error {{'ownership_holds' and 'ownership_takes' attributes are not compatible}}
2014-08-01 04:44:26 +08:00
void f15 ( int , int )
2016-01-03 23:55:40 +08:00
__attribute__ ( ( ownership_returns ( foo , 1 ) ) ) // expected-note {{declared with index 1 here}}
__attribute__ ( ( ownership_returns ( foo , 2 ) ) ) ; // expected-error {{'ownership_returns' attribute index does not match; here it is 2}}
void f16 ( int * i , int * j ) __attribute__ ( ( ownership_holds ( foo , 1 ) ) ) __attribute__ ( ( ownership_holds ( foo , 1 ) ) ) ; // OK, same index
void f17 ( void * ) __attribute__ ( ( ownership_takes ( __ , 1 ) ) ) ;
void f18 ( ) __attribute__ ( ( ownership_takes ( foo , 1 ) ) ) ; // expected-warning {{'ownership_takes' attribute only applies to non-K&R-style functions}}