diff options
-rw-r--r-- | clang/lib/Parse/ParseObjc.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/objc-synchronized.m | 75 |
2 files changed, 81 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index 933a7a606c0..17450747e0d 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -1143,7 +1143,13 @@ Parser::StmtResult Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) { Diag (Tok, diag::err_expected_lbrace); return true; } + // Enter a scope to hold everything within the compound stmt. Compound + // statements can always hold declarations. + EnterScope(Scope::DeclScope); + StmtResult SynchBody = ParseCompoundStatementBody(); + + ExitScope(); if (SynchBody.isInvalid) SynchBody = Actions.ActOnNullStmt(Tok.getLocation()); return Actions.ActOnObjCAtSynchronizedStmt(atLoc, Res.Val, SynchBody.Val); diff --git a/clang/test/Sema/objc-synchronized.m b/clang/test/Sema/objc-synchronized.m new file mode 100644 index 00000000000..365da92dd4b --- /dev/null +++ b/clang/test/Sema/objc-synchronized.m @@ -0,0 +1,75 @@ +// RUN: clang -fsyntax-only -verify %s +typedef signed char BOOL; +typedef unsigned int NSUInteger; +typedef struct _NSZone NSZone; +@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; + +@protocol NSObject +- (BOOL)isEqual:(id)object; +@end + +@protocol NSCopying +- (id)copyWithZone:(NSZone *)zone; +@end + +@protocol NSMutableCopying +- (id)mutableCopyWithZone:(NSZone *)zone; +@end + +@protocol NSCoding +- (void)encodeWithCoder:(NSCoder *)aCoder; +@end + +@interface NSObject <NSObject> {} @end + +typedef float CGFloat; +typedef struct { int a; } NSFastEnumerationState; + +@protocol NSFastEnumeration +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; +@end + +typedef unsigned short unichar; + +@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> +- (NSUInteger)length; +@end + +@interface NSSimpleCString : NSString {} @end + +@interface NSConstantString : NSSimpleCString @end + +extern void *_NSConstantStringClassReference; + +@interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> +- (NSUInteger)count; +@end + +@interface NSMutableDictionary : NSDictionary +- (void)removeObjectForKey:(id)aKey; +@end + +@class NSArray, NSSet, NSHashTable; + +@protocol PBXTrackableTask <NSObject> +- (float) taskPercentComplete; +- taskIdentifier; +@end + +@interface PBXTrackableTaskManager : NSObject { + NSMutableDictionary *_trackableTasks; +} +@end + +NSString *XCExecutableDebugTaskIdentifier = @"XCExecutableDebugTaskIdentifier"; + +@implementation PBXTrackableTaskManager +- (id) init {} +- (void) unregisterTask:(id <PBXTrackableTask>) task { + @synchronized (self) { + id taskID = [task taskIdentifier]; + id task = [_trackableTasks objectForKey:taskID]; // expected-warning{{method '-objectForKey:' not found (return type defaults to 'id')}} + } +} +@end + |