xref: /llvm-project/clang/test/SemaObjCXX/attr-nonblocking-constraints.mm (revision cef66aa04d3713afc4d0dfa66491b7af77322090)
17fe43adaSDoug Wyatt// RUN: %clang_cc1 -fsyntax-only -fblocks -fcxx-exceptions -fobjc-exceptions -verify -Wfunction-effects %s
27fe43adaSDoug Wyatt
37fe43adaSDoug Wyatt#pragma clang diagnostic ignored "-Wperf-constraint-implies-noexcept"
47fe43adaSDoug Wyatt
57fe43adaSDoug Wyatt// Objective-C
67fe43adaSDoug Wyatt@interface OCClass
77fe43adaSDoug Wyatt- (void)method;
87fe43adaSDoug Wyatt@end
97fe43adaSDoug Wyatt
107fe43adaSDoug Wyattvoid nb1(OCClass *oc) [[clang::nonblocking]] {
117fe43adaSDoug Wyatt	[oc method]; // expected-warning {{function with 'nonblocking' attribute must not access ObjC methods or properties}}
127fe43adaSDoug Wyatt}
137fe43adaSDoug Wyattvoid nb2(OCClass *oc) {
147fe43adaSDoug Wyatt	[oc method]; // expected-note {{function cannot be inferred 'nonblocking' because it accesses an ObjC method or property}}
157fe43adaSDoug Wyatt}
167fe43adaSDoug Wyattvoid nb3(OCClass *oc) [[clang::nonblocking]] {
177fe43adaSDoug Wyatt	nb2(oc); // expected-warning {{function with 'nonblocking' attribute must not call non-'nonblocking' function 'nb2'}}
187fe43adaSDoug Wyatt}
197fe43adaSDoug Wyatt
207fe43adaSDoug Wyattvoid nb4() [[clang::nonblocking]] {
217fe43adaSDoug Wyatt	@try {
227fe43adaSDoug Wyatt		@throw @"foo"; // expected-warning {{function with 'nonblocking' attribute must not throw or catch exceptions}}
237fe43adaSDoug Wyatt	}
247fe43adaSDoug Wyatt	@catch (...) { // expected-warning {{function with 'nonblocking' attribute must not throw or catch exceptions}}
257fe43adaSDoug Wyatt	}
26*cef66aa0SDoug Wyatt	@finally { // expected-warning {{function with 'nonblocking' attribute must not throw or catch exceptions}}
27*cef66aa0SDoug Wyatt	}
28*cef66aa0SDoug Wyatt}
29*cef66aa0SDoug Wyatt
30*cef66aa0SDoug Wyatt@class Lock;
31*cef66aa0SDoug Wyattextern Lock *someLock;
32*cef66aa0SDoug Wyatt
33*cef66aa0SDoug Wyattvoid nb5() [[clang::nonblocking]] {
34*cef66aa0SDoug Wyatt	@autoreleasepool { // expected-warning {{function with 'nonblocking' attribute must not access ObjC methods or properties}}
35*cef66aa0SDoug Wyatt	}
36*cef66aa0SDoug Wyatt
37*cef66aa0SDoug Wyatt	@synchronized(someLock) { // expected-warning {{function with 'nonblocking' attribute must not access ObjC methods or properties}}
38*cef66aa0SDoug Wyatt	}
397fe43adaSDoug Wyatt}
40