summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-12-10 23:18:06 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-12-10 23:18:06 +0000
commit88b6898085e8b7d5a577eb0cfb16bf489842324c (patch)
tree6a0b1854422ef0cb9ac8f8ab031c9eddd467d53d
parenteeb15653c61f4969a9f4e2343b6f58ae04c8ca3c (diff)
downloadbcm5719-llvm-88b6898085e8b7d5a577eb0cfb16bf489842324c.tar.gz
bcm5719-llvm-88b6898085e8b7d5a577eb0cfb16bf489842324c.zip
ObjectiveC. Provide a property-dot syntax for fixit
when selector in objc_bridge_related attribute names a property. // rdar://15517899 llvm-svn: 196984
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp28
-rw-r--r--clang/test/FixIt/fixit-objc-bridge-related-property.m23
2 files changed, 43 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index aeb934c3811..c73a0b13878 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -3467,16 +3467,28 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
else {
// Implicit conversion from ObjC type to CF object is needed.
if (InstanceMethod) {
- // Provide a fixit: [ObjectExpr InstanceMethod];
- std::string ExpressionString = " ";
- ExpressionString += InstanceMethod->getSelector().getAsString();
- ExpressionString += "]";
+ std::string ExpressionString;
SourceLocation SrcExprEndLoc = PP.getLocForEndOfToken(SrcExpr->getLocEnd());
+ if (InstanceMethod->isPropertyAccessor())
+ if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) {
+ // fixit: ObjectExpr.propertyname when it is aproperty accessor.
+ ExpressionString = ".";
+ ExpressionString += PDecl->getNameAsString();
+ Diag(Loc, diag::err_objc_bridged_related_known_method)
+ << SrcType << DestType << InstanceMethod->getSelector() << true
+ << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
+ }
+ if (ExpressionString.empty()) {
+ // Provide a fixit: [ObjectExpr InstanceMethod]
+ ExpressionString = " ";
+ ExpressionString += InstanceMethod->getSelector().getAsString();
+ ExpressionString += "]";
- Diag(Loc, diag::err_objc_bridged_related_known_method)
- << SrcType << DestType << InstanceMethod->getSelector() << true
- << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
- << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
+ Diag(Loc, diag::err_objc_bridged_related_known_method)
+ << SrcType << DestType << InstanceMethod->getSelector() << true
+ << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
+ << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
+ }
}
else
Diag(Loc, diag::err_objc_bridged_related_unknown_method)
diff --git a/clang/test/FixIt/fixit-objc-bridge-related-property.m b/clang/test/FixIt/fixit-objc-bridge-related-property.m
new file mode 100644
index 00000000000..5b13645d49a
--- /dev/null
+++ b/clang/test/FixIt/fixit-objc-bridge-related-property.m
@@ -0,0 +1,23 @@
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fdiagnostics-parseable-fixits -x objective-c %s 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-arc -fdiagnostics-parseable-fixits -x objective-c %s 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fdiagnostics-parseable-fixits -x objective-c++ %s 2>&1 | FileCheck %s
+// rdar://15517899
+
+typedef struct __attribute__((objc_bridge_related(NSColor,colorWithCGColor:,CGColor))) CGColor *CGColorRef;
+
+@interface NSColor
++ (NSColor *)colorWithCGColor:(CGColorRef)cgColor;
+@property CGColorRef CGColor;
+@end
+
+@interface NSTextField
+- (void)setBackgroundColor:(NSColor *)color;
+- (NSColor *)backgroundColor;
+@end
+
+CGColorRef Test(NSTextField *textField, CGColorRef newColor) {
+ newColor = textField.backgroundColor;
+ return textField.backgroundColor;
+}
+// CHECK:{19:38-19:38}:".CGColor"
+// CHECK:{20:34-20:34}:".CGColor"
OpenPOWER on IntegriCloud