diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-19 21:48:35 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-19 21:48:35 +0000 |
| commit | f3b9b9583e38fe18937f465658ec76b32dd5a337 (patch) | |
| tree | 8c01115d6f14e88a358c2a049abc0d3d8b306121 | |
| parent | 936b0d314406f17c88212766d8b77a8594f4c016 (diff) | |
| download | bcm5719-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.cpp | 14 | ||||
| -rw-r--r-- | clang/test/Rewriter/rewrite-typeof.mm | 20 |
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; +} + |

