2014-03-21 08:07:27 +08:00
// RUN: %clang_cc1 -fsyntax-only -Wthread-safety -verify %s
2014-03-25 03:29:19 +08:00
typedef int __attribute__ ( ( capability ( " role " ) ) ) ThreadRole ;
2014-03-21 08:07:27 +08:00
struct __attribute__ ( ( shared_capability ( " mutex " ) ) ) Mutex { } ;
struct NotACapability { } ;
2015-09-30 00:24:18 +08:00
// Put capability attributes on unions
union __attribute__ ( ( capability ( " mutex " ) ) ) MutexUnion { int a ; char * b ; } ;
typedef union { int a ; char * b ; } __attribute__ ( ( capability ( " mutex " ) ) ) MutexUnion2 ;
2014-03-21 08:07:27 +08:00
// Test an invalid capability name
struct __attribute__ ( ( capability ( " wrong " ) ) ) IncorrectName { } ; // expected-warning {{invalid capability name 'wrong'; capability name must be 'mutex' or 'role'}}
2015-09-30 00:24:18 +08:00
int Test1 __attribute__ ( ( capability ( " test1 " ) ) ) ; // expected-error {{'capability' attribute only applies to structs, unions, and typedefs}}
int Test2 __attribute__ ( ( shared_capability ( " test2 " ) ) ) ; // expected-error {{'shared_capability' attribute only applies to structs, unions, and typedefs}}
2014-03-21 08:07:27 +08:00
int Test3 __attribute__ ( ( acquire_capability ( " test3 " ) ) ) ; // expected-warning {{'acquire_capability' attribute only applies to functions}}
int Test4 __attribute__ ( ( try_acquire_capability ( " test4 " ) ) ) ; // expected-error {{'try_acquire_capability' attribute only applies to functions}}
int Test5 __attribute__ ( ( release_capability ( " test5 " ) ) ) ; // expected-warning {{'release_capability' attribute only applies to functions}}
struct __attribute__ ( ( capability ( 12 ) ) ) Test3 { } ; // expected-error {{'capability' attribute requires a string}}
struct __attribute__ ( ( shared_capability ( Test2 ) ) ) Test4 { } ; // expected-error {{'shared_capability' attribute requires a string}}
struct __attribute__ ( ( capability ) ) Test5 { } ; // expected-error {{'capability' attribute takes one argument}}
struct __attribute__ ( ( shared_capability ( " test1 " , 12 ) ) ) Test6 { } ; // expected-error {{'shared_capability' attribute takes one argument}}
struct NotACapability BadCapability ;
2014-03-25 03:29:19 +08:00
ThreadRole GUI , Worker ;
2014-03-21 08:07:27 +08:00
void Func1 ( void ) __attribute__ ( ( requires_capability ( GUI ) ) ) { }
void Func2 ( void ) __attribute__ ( ( requires_shared_capability ( Worker ) ) ) { }
void Func3 ( void ) __attribute__ ( ( requires_capability ) ) { } // expected-error {{'requires_capability' attribute takes at least 1 argument}}
void Func4 ( void ) __attribute__ ( ( requires_shared_capability ) ) { } // expected-error {{'requires_shared_capability' attribute takes at least 1 argument}}
2014-03-25 03:29:19 +08:00
void Func5 ( void ) __attribute__ ( ( requires_capability ( 1 ) ) ) { } // expected-warning {{'requires_capability' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}}
2014-03-21 08:07:27 +08:00
void Func6 ( void ) __attribute__ ( ( requires_shared_capability ( BadCapability ) ) ) { } // expected-warning {{'requires_shared_capability' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'struct NotACapability'}}
void Func7 ( void ) __attribute__ ( ( assert_capability ( GUI ) ) ) { }
void Func8 ( void ) __attribute__ ( ( assert_shared_capability ( GUI ) ) ) { }
void Func9 ( void ) __attribute__ ( ( assert_capability ( ) ) ) { } // expected-error {{'assert_capability' attribute takes one argument}}
void Func10 ( void ) __attribute__ ( ( assert_shared_capability ( ) ) ) { } // expected-error {{'assert_shared_capability' attribute takes one argument}}
void Func11 ( void ) __attribute__ ( ( acquire_capability ( GUI ) ) ) { }
void Func12 ( void ) __attribute__ ( ( acquire_shared_capability ( GUI ) ) ) { }
void Func15 ( void ) __attribute__ ( ( release_capability ( GUI ) ) ) { }
void Func16 ( void ) __attribute__ ( ( release_shared_capability ( GUI ) ) ) { }
void Func17 ( void ) __attribute__ ( ( release_generic_capability ( GUI ) ) ) { }
void Func21 ( void ) __attribute__ ( ( try_acquire_capability ( 1 ) ) ) { }
void Func22 ( void ) __attribute__ ( ( try_acquire_shared_capability ( 1 ) ) ) { }
void Func23 ( void ) __attribute__ ( ( try_acquire_capability ( 1 , GUI ) ) ) { }
void Func24 ( void ) __attribute__ ( ( try_acquire_shared_capability ( 1 , GUI ) ) ) { }
void Func25 ( void ) __attribute__ ( ( try_acquire_capability ( ) ) ) { } // expected-error {{'try_acquire_capability' attribute takes at least 1 argument}}
2014-04-04 23:13:57 +08:00
void Func26 ( void ) __attribute__ ( ( try_acquire_shared_capability ( ) ) ) { } // expected-error {{'try_acquire_shared_capability' attribute takes at least 1 argument}}
// Test that boolean logic works with capability attributes
void Func27 ( void ) __attribute__ ( ( requires_capability ( ! GUI ) ) ) ;
void Func28 ( void ) __attribute__ ( ( requires_capability ( GUI & & Worker ) ) ) ;
void Func29 ( void ) __attribute__ ( ( requires_capability ( GUI | | Worker ) ) ) ;
void Func30 ( void ) __attribute__ ( ( requires_capability ( ( Worker | | Worker ) & & ! GUI ) ) ) ;
int AlsoNotACapability ;
void Func31 ( void ) __attribute__ ( ( requires_capability ( GUI & & AlsoNotACapability ) ) ) ; // expected-warning {{'requires_capability' attribute requires arguments whose type is annotated with 'capability' attribute; type here is 'int'}}