diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-08-10 20:34:17 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-08-10 20:34:17 +0000 |
commit | dbd6945b7f4397f44fe6a1f1acf62ab6671e84f5 (patch) | |
tree | e706ae5494f6b0b253927938555d5aaa7e838fc6 | |
parent | ee2f032fe0fc86762608458c2a167ae504579a64 (diff) |
objective-C++: delay parsing of ctor with try block
with member initializer list defined inside
an objc implementation block. wip.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161692 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Parse/ParseObjc.cpp | 10 | ||||
-rw-r--r-- | test/SemaObjCXX/delay-parsing-func-tryblock.mm | 21 |
2 files changed, 30 insertions, 1 deletions
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 9b7e85f211..2471d9441b 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -1931,6 +1931,16 @@ void Parser::StashAwayMethodOrFunctionBodyTokens(Decl *MDecl) { Toks.push_back(Tok); if (Tok.is(tok::kw_try)) { ConsumeToken(); + if (Tok.is(tok::colon)) { + Toks.push_back(Tok); + ConsumeToken(); + while (Tok.isNot(tok::l_brace)) { + ConsumeAndStoreUntil(tok::l_paren, Toks, /*StopAtSemi=*/false); + ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false); + } + } + assert(Tok.is(tok::l_brace) + && "StashAwayMethodOrFunctionBodyTokens - '{' not found"); Toks.push_back(Tok); // also store '{' } ConsumeBrace(); diff --git a/test/SemaObjCXX/delay-parsing-func-tryblock.mm b/test/SemaObjCXX/delay-parsing-func-tryblock.mm index d0acc3f9b1..8cf615ec32 100644 --- a/test/SemaObjCXX/delay-parsing-func-tryblock.mm +++ b/test/SemaObjCXX/delay-parsing-func-tryblock.mm @@ -8,7 +8,9 @@ struct BadReturn { BadReturn(MyClass * myObject); int bar(MyClass * myObject); + void MemFunc(MyClass * myObject); int i; + MyClass *CObj; }; @implementation MyClass @@ -21,12 +23,29 @@ int BadReturn::bar(MyClass * myObject) { return 0; } -BadReturn::BadReturn(MyClass * myObject) try { +BadReturn::BadReturn(MyClass * myObject) try : CObj(myObject) { } catch(...) { try { [myObject privateMethod]; [myObject privateMethod1]; getMe = bar(myObject); + [CObj privateMethod1]; + } catch(int ei) { + i = ei; + } catch(...) { + { + i = 0; + } + } +} + +void BadReturn::MemFunc(MyClass * myObject) try { +} catch(...) { + try { + [myObject privateMethod]; + [myObject privateMethod1]; + getMe = bar(myObject); + [CObj privateMethod1]; } catch(int ei) { i = ei; } catch(...) { |