summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-01-19 21:48:35 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-01-19 21:48:35 +0000
commitf3b9b9583e38fe18937f465658ec76b32dd5a337 (patch)
tree8c01115d6f14e88a358c2a049abc0d3d8b306121
parent936b0d314406f17c88212766d8b77a8594f4c016 (diff)
downloadbcm5719-llvm-f3b9b9583e38fe18937f465658ec76b32dd5a337.tar.gz
bcm5719-llvm-f3b9b9583e38fe18937f465658ec76b32dd5a337.zip
Rewriteing of gnu extension __typeof in objective-c rewriter.
Fixes radar 6358225. llvm-svn: 93917
-rw-r--r--clang/lib/Frontend/RewriteObjC.cpp14
-rw-r--r--clang/test/Rewriter/rewrite-typeof.mm20
2 files changed, 33 insertions, 1 deletions
diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp
index 5a5b0eada3a..2e101f402b7 100644
--- a/clang/lib/Frontend/RewriteObjC.cpp
+++ b/clang/lib/Frontend/RewriteObjC.cpp
@@ -4293,7 +4293,19 @@ void RewriteObjC::RewriteCastExpr(CStyleCastExpr *CE) {
const char *startBuf = SM->getCharacterData(LocStart);
const char *endBuf = SM->getCharacterData(LocEnd);
-
+ QualType QT = CE->getType();
+ const Type* TypePtr = QT->getAs<Type>();
+ if (isa<TypeOfExprType>(TypePtr)) {
+ const TypeOfExprType *TypeOfExprTypePtr = cast<TypeOfExprType>(TypePtr);
+ QT = TypeOfExprTypePtr->getUnderlyingExpr()->getType();
+ std::string TypeAsString = "(";
+ TypeAsString += QT.getAsString();
+ TypeAsString += ")";
+ ReplaceText(LocStart, endBuf-startBuf+1,
+ TypeAsString.c_str(), TypeAsString.size());
+ return;
+ }
+
// advance the location to startArgList.
const char *argPtr = startBuf;
diff --git a/clang/test/Rewriter/rewrite-typeof.mm b/clang/test/Rewriter/rewrite-typeof.mm
new file mode 100644
index 00000000000..f95cd9ac7c7
--- /dev/null
+++ b/clang/test/Rewriter/rewrite-typeof.mm
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc -o - %s
+
+extern "C" {
+extern "C" void *_Block_copy(const void *aBlock);
+extern "C" void _Block_release(const void *aBlock);
+}
+
+int main() {
+ __attribute__((__blocks__(byref))) int a = 42;
+ int save_a = a;
+
+ void (^b)(void) = ^{
+ ((__typeof(^{ a = 2; }))_Block_copy((const void *)(^{ a = 2; })));
+ };
+
+ ((__typeof(b))_Block_copy((const void *)(b)));
+
+ return 0;
+}
+
OpenPOWER on IntegriCloud