| /* Test lock/trylock/unlock annotations with unsupported or unrecognized lock |
| names/expressions. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-Wthread-safety -Wthread-unsupported-lock-name -O" } */ |
| |
| #include "thread_annot_common_c.h" |
| |
| int pthread_mutex_lock(int i) EXCLUSIVE_LOCK_FUNCTION(((&f)->mu)); /* { dg-warning "Unsupported argument of 'exclusive_lock' attribute ignored" } */ |
| int pthread_mutex_unlock() UNLOCK_FUNCTION(f[0].mu); /* { dg-warning "Unsupported argument of 'unlock' attribute ignored" } */ |
| int pthread_mutex_trylock() EXCLUSIVE_TRYLOCK_FUNCTION(0, t->mu1); /* { dg-warning "Unsupported argument of 'exclusive_trylock' attribute ignored" } */ |
| |
| struct Mutex *mu3; |
| int p GUARDED_BY(mu3); |
| int r GUARDED_BY(mu3); |
| |
| void my_lock() EXCLUSIVE_LOCK_FUNCTION(mu3); |
| void my_unlock() UNLOCK_FUNCTION(mu3); |
| |
| static int foo(int i, int j, struct Mutex *mu) EXCLUSIVE_LOCKS_REQUIRED(3) |
| { |
| int *q PT_GUARDED_BY(mu); |
| int t = *q; |
| *q = 4; |
| pthread_mutex_unlock(); |
| /* Since the annotation on pthread_mutex_unlock contains an |
| unrecognized lock name, the analysis would conservatively disable |
| the check for mismatched lock acquire/release. Therefore even though |
| my_unlock is trying to release mu3 which is never acquired, we don't |
| emit a warning. */ |
| my_unlock(); |
| return t; |
| } |
| |
| int main() |
| { |
| my_lock(); |
| foo(2, 3, mu3); |
| my_unlock(); |
| pthread_mutex_lock(2); |
| p = r + 5; |
| /* Because the annotation on pthread_mutex_lock contains an unrecognized |
| lock, we don't emit a warning even though there is no corresponding |
| unlock call. */ |
| } |