summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/lib/Sema/SemaStmt.cpp9
-rw-r--r--clang/test/Parser/objc-try-catch-1.m5
-rw-r--r--clang/test/SemaObjC/synchronized.m78
-rw-r--r--clang/test/SemaObjC/try-catch.m6
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}}
}
OpenPOWER on IntegriCloud