diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 9 | ||||
-rw-r--r-- | clang/test/Parser/objc-try-catch-1.m | 5 | ||||
-rw-r--r-- | clang/test/SemaObjC/synchronized.m | 78 | ||||
-rw-r--r-- | clang/test/SemaObjC/try-catch.m | 6 |
5 files changed, 32 insertions, 70 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b270feccc88..acfc006738b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1079,7 +1079,9 @@ def warn_bad_receiver_type : Warning< "casting it to 'id'">; def err_bad_receiver_type : Error<"bad receiver type %0">; def error_objc_throw_expects_object : Error< - "invalid %0 argument (expected an ObjC object type)">; + "@throw requires an Objective-C object type (%0 invalid)">; +def error_objc_synchronized_expects_object : Error< + "@synchronized requires an Objective-C object type (%0 invalid)">; def error_rethrow_used_outside_catch : Error< "@throw (rethrow) used outside of a @catch block">; def err_attribute_multiple_objc_gc : Error< diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 26cba5bec74..fb8a8ece437 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -1092,6 +1092,15 @@ Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, ExprArg SynchExpr, StmtArg SynchBody) { CurFunctionNeedsScopeChecking = true; + // Make sure the expression type is an ObjC pointer or "void *". + Expr *SyncExpr = static_cast<Expr*>(SynchExpr.get()); + if (!Context.isObjCObjectPointerType(SyncExpr->getType())) { + const PointerType *PT = SyncExpr->getType()->getAsPointerType(); + if (!PT || !PT->getPointeeType()->isVoidType()) + return StmtError(Diag(AtLoc, diag::error_objc_synchronized_expects_object) + << SyncExpr->getType() << SyncExpr->getSourceRange()); + } + return Owned(new (Context) ObjCAtSynchronizedStmt(AtLoc, static_cast<Stmt*>(SynchExpr.release()), static_cast<Stmt*>(SynchBody.release()))); diff --git a/clang/test/Parser/objc-try-catch-1.m b/clang/test/Parser/objc-try-catch-1.m index 2c41cac3ee6..a8d37f0ab95 100644 --- a/clang/test/Parser/objc-try-catch-1.m +++ b/clang/test/Parser/objc-try-catch-1.m @@ -27,7 +27,10 @@ void * foo() return proc(); } @catch (Frob* ex) { - @throw 1,2; // expected-error {{invalid 'int' argument (expected an ObjC object type)}} + @throw 1,2; // expected-error {{@throw requires an Objective-C object type ('int' invalid)}} + } + @catch (float x) { // expected-error {{@catch parameter is not a pointer to an interface type}} + } @catch(...) { @throw (4,3,proc()); diff --git a/clang/test/SemaObjC/synchronized.m b/clang/test/SemaObjC/synchronized.m index d4914fd895f..e8e668fd8bc 100644 --- a/clang/test/SemaObjC/synchronized.m +++ b/clang/test/SemaObjC/synchronized.m @@ -1,75 +1,23 @@ // RUN: clang-cc -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"; +@class PBXTrackableTaskManager; @implementation PBXTrackableTaskManager - (id) init {} -- (void) unregisterTask:(id <PBXTrackableTask>) task { +- (void) unregisterTask:(id) task { @synchronized (self) { - id taskID = [task taskIdentifier]; - id task = [_trackableTasks objectForKey:taskID]; // expected-warning{{method '-objectForKey:' not found (return type defaults to 'id')}} + id taskID = [task taskIdentifier]; // expected-warning {{method '-taskIdentifier' not found (return type defaults to 'id')}} } } @end + +struct x { int a; } b; + +void test1() { + @synchronized (b) { // expected-error {{@synchronized requires an Objective-C object type ('struct x' invalid)}} + } + + @synchronized (42) { // expected-error {{@synchronized requires an Objective-C object type ('int' invalid)}} + } +} diff --git a/clang/test/SemaObjC/try-catch.m b/clang/test/SemaObjC/try-catch.m index bcb4e506d5f..076eff54296 100644 --- a/clang/test/SemaObjC/try-catch.m +++ b/clang/test/SemaObjC/try-catch.m @@ -40,8 +40,8 @@ typedef struct _NSZone NSZone; int foo() { struct s { int a, b; } agg, *pagg; - @throw 42; // expected-error {{invalid 'int' argument (expected an ObjC object type)}} - @throw agg; // expected-error {{invalid 'struct s' argument (expected an ObjC object type)}} - @throw pagg; // expected-error {{invalid 'struct s *' argument (expected an ObjC object type)}} + @throw 42; // expected-error {{@throw requires an Objective-C object type ('int' invalid))}} + @throw agg; // expected-error {{@throw requires an Objective-C object type ('struct s' invalid)}} + @throw pagg; // expected-error {{@throw requires an Objective-C object type ('struct s *' invalid)}} @throw; // expected-error {{@throw (rethrow) used outside of a @catch block}} } |