objective-C modern translator: Fixes a mistranslation
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 11 Feb 2013 19:30:33 +0000 (19:30 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 11 Feb 2013 19:30:33 +0000 (19:30 +0000)
of @throw statement by finding location of the ';'
correctly. // rdar://13186010

llvm-svn: 174898

clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp
clang/test/Rewriter/rewrite-modern-throw.m

index 34ffd22..f688603 100644 (file)
@@ -2093,7 +2093,9 @@ Stmt *RewriteModernObjC::RewriteObjCThrowStmt(ObjCAtThrowStmt *S) {
   assert((*wBuf == 'w') && "@throw: can't find 'w'");
   ReplaceText(startLoc, wBuf-startBuf+1, buf);
 
-  const char *semiBuf = strchr(startBuf, ';');
+  SourceLocation endLoc = S->getLocEnd();
+  const char *endBuf = SM->getCharacterData(endLoc);
+  const char *semiBuf = strchr(endBuf, ';');
   assert((*semiBuf == ';') && "@throw: can't find ';'");
   SourceLocation semiLoc = startLoc.getLocWithOffset(semiBuf-startBuf);
   if (S->getThrowExpr())
index 1912384..1564611 100644 (file)
@@ -65,3 +65,29 @@ int main()
   }
 }
 @end
+
+// rdar://13186010
+@class NSDictionary, NSException;
+@class NSMutableDictionary;
+
+@interface NSString
++ (id)stringWithFormat:(NSString *)format, ... ;
+@end
+
+@interface  NSException
++ (NSException *)exceptionWithName:(NSString *)name reason:(NSString *)reason userInfo:(NSDictionary *)userInfo;
+@end
+id *_imp__NSInvalidArgumentException;
+
+@interface NSSetExpression @end
+
+@implementation NSSetExpression
+-(id)expressionValueWithObject:(id)object context:(NSMutableDictionary*)bindings {
+    id leftSet;
+    id rightSet;
+    @throw [NSException exceptionWithName: *_imp__NSInvalidArgumentException reason: [NSString stringWithFormat: @"Can't evaluate set expression; left subexpression not a set (lhs = %@ rhs = %@)", leftSet, rightSet] userInfo: 0];
+
+    return leftSet ;
+}
+@end
+