]> granicus.if.org Git - clang/commitdiff
objective-C++: delay parsing of ctor with try block
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Aug 2012 20:34:17 +0000 (20:34 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Aug 2012 20:34:17 +0000 (20:34 +0000)
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

lib/Parse/ParseObjc.cpp
test/SemaObjCXX/delay-parsing-func-tryblock.mm

index 9b7e85f21119e7a3e5501513b9c40b5e6478bf2c..2471d9441b3b7f6c5650774272ef17bff0405c96 100644 (file)
@@ -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();
index d0acc3f9b1aaf78c4770f6938080b5f20a7f6cb8..8cf615ec32648dd6d313aa024173dfa857b63019 100644 (file)
@@ -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(...) {