[cfe-commits] r46644 - in /cfe/trunk: Driver/RewriteTest.cpp test/Rewriter/rewrite-try-catch.m

Fariborz Jahanian fjahanian at apple.com
Fri Feb 1 12:31:06 PST 2008


Later on we want to preserve "..." in the AST and check for it in the  
rewriter/ast-print etc. This is instead of assuming null catchStmt to  
mean "..."

- Fariborz

On Feb 1, 2008, at 12:02 PM, Steve Naroff wrote:

> Author: snaroff
> Date: Fri Feb  1 14:02:07 2008
> New Revision: 46644
>
> URL: http://llvm.org/viewvc/llvm-project?rev=46644&view=rev
> Log:
>
> Fix two rewriter bugs with @catch.
>
> - Support @catch(...), rather than crash:-)
> - Make sure all catch bodies get rewritten. This "fix" is really a  
> workaround until the iterator for the "try" AST is fixed. Will fix  
> this in a separate commit.
>
>
> Modified:
>    cfe/trunk/Driver/RewriteTest.cpp
>    cfe/trunk/test/Rewriter/rewrite-try-catch.m
>
> Modified: cfe/trunk/Driver/RewriteTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=46644&r1=46643&r2=46644&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/Driver/RewriteTest.cpp (original)
> +++ cfe/trunk/Driver/RewriteTest.cpp Fri Feb  1 14:02:07 2008
> @@ -1203,7 +1203,20 @@
>
>     const char *lParenLoc = strchr(startBuf, '(');
>
> -    if (DeclStmt *declStmt = dyn_cast<DeclStmt>(catchStmt)) {
> +    if (!catchStmt) { // handle "..."
> +      // Now rewrite the body...
> +      lastCatchBody = catchList->getCatchBody();
> +      SourceLocation rParenLoc = catchList->getRParenLoc();
> +      SourceLocation bodyLoc = lastCatchBody->getLocStart();
> +      const char *bodyBuf = SM->getCharacterData(bodyLoc);
> +      const char *rParenBuf = SM->getCharacterData(rParenLoc);
> +      assert((*rParenBuf == ')') && "bogus @catch paren location");
> +      assert((*bodyBuf == '{') && "bogus @catch body location");
> +
> +      buf += "1) { id _tmp = _caught;";
> +      Rewrite.ReplaceText(startLoc, bodyBuf-startBuf+1,
> +                          buf.c_str(), buf.size());
> +    } else if (DeclStmt *declStmt = dyn_cast<DeclStmt>(catchStmt)) {
>       QualType t = dyn_cast<ValueDecl>(declStmt->getDecl())- 
> >getType();
>       if (t == Context->getObjCIdType()) {
>         buf += "1) { ";
> @@ -1236,6 +1249,10 @@
>     } else if (!isa<NullStmt>(catchStmt)) {
>       assert(false && "@catch rewrite bug");
>     }
> +    // make sure all the catch bodies get rewritten!
> +    // FIXME: this call should be removed when the iterator for  
> ObjCAtTryStmt
> +    // is fixed. Currently, it only returns the first catch  
> statement!
> +    RewriteFunctionBodyOrGlobalInitializer(lastCatchBody);
>     catchList = catchList->getNextCatchStmt();
>   }
>   // Complete the catch list...
>
> Modified: cfe/trunk/test/Rewriter/rewrite-try-catch.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/rewrite-try-catch.m?rev=46644&r1=46643&r2=46644&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/Rewriter/rewrite-try-catch.m (original)
> +++ cfe/trunk/test/Rewriter/rewrite-try-catch.m Fri Feb  1 14:02:07  
> 2008
> @@ -1,8 +1,13 @@
> // RUN: clang -rewrite-test %s | clang
>
> - at interface foo @end
> + at interface Foo @end
> @interface GARF @end
>
> +void foo() {
> +  @try  { TRY(); }
> +  @catch (...) { SPLATCH(); @throw; }
> +}
> +
> int main()
> {
>
> @@ -10,7 +15,7 @@
>    MYTRY();
> }
>
> - at catch (foo* localException) {
> + at catch (Foo* localException) {
>    MYCATCH();
>    @throw;
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list