forked from OSchip/llvm-project
objective-C++: dalyed parsing of ctors with member
initializer list defined inside an objc class implementation. wip llvm-svn: 161699
This commit is contained in:
parent
d6ef704fe4
commit
f64b4722eb
|
@ -1927,7 +1927,7 @@ void Parser::StashAwayMethodOrFunctionBodyTokens(Decl *MDecl) {
|
|||
LexedMethod* LM = new LexedMethod(this, MDecl);
|
||||
CurParsedObjCImpl->LateParsedObjCMethods.push_back(LM);
|
||||
CachedTokens &Toks = LM->Toks;
|
||||
// Begin by storing the '{' or 'try' token.
|
||||
// Begin by storing the '{' or 'try' or ':' token.
|
||||
Toks.push_back(Tok);
|
||||
if (Tok.is(tok::kw_try)) {
|
||||
ConsumeToken();
|
||||
|
@ -1939,8 +1939,14 @@ void Parser::StashAwayMethodOrFunctionBodyTokens(Decl *MDecl) {
|
|||
ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
|
||||
}
|
||||
}
|
||||
assert(Tok.is(tok::l_brace)
|
||||
&& "StashAwayMethodOrFunctionBodyTokens - '{' not found");
|
||||
Toks.push_back(Tok); // also store '{'
|
||||
}
|
||||
else if (Tok.is(tok::colon)) {
|
||||
ConsumeToken();
|
||||
while (Tok.isNot(tok::l_brace)) {
|
||||
ConsumeAndStoreUntil(tok::l_paren, Toks, /*StopAtSemi=*/false);
|
||||
ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
|
||||
}
|
||||
Toks.push_back(Tok); // also store '{'
|
||||
}
|
||||
ConsumeBrace();
|
||||
|
@ -2881,8 +2887,9 @@ void Parser::ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod) {
|
|||
// Consume the previously pushed token.
|
||||
ConsumeAnyToken();
|
||||
|
||||
assert((Tok.is(tok::l_brace) || Tok.is(tok::kw_try)) &&
|
||||
"Inline objective-c method not starting with '{' or 'try'");
|
||||
assert((Tok.is(tok::l_brace) || Tok.is(tok::kw_try) ||
|
||||
Tok.is(tok::colon)) &&
|
||||
"Inline objective-c method not starting with '{' or 'try' or ':'");
|
||||
// Enter a scope for the method or c-fucntion body.
|
||||
ParseScope BodyScope(this,
|
||||
parseMethod
|
||||
|
@ -2897,8 +2904,11 @@ void Parser::ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod) {
|
|||
Actions.ActOnStartOfFunctionDef(getCurScope(), MCDecl);
|
||||
if (Tok.is(tok::kw_try))
|
||||
MCDecl = ParseFunctionTryBlock(MCDecl, BodyScope);
|
||||
else
|
||||
else {
|
||||
if (Tok.is(tok::colon))
|
||||
ParseConstructorInitializer(MCDecl);
|
||||
MCDecl = ParseFunctionStatementBody(MCDecl, BodyScope);
|
||||
}
|
||||
|
||||
if (Tok.getLocation() != OrigLoc) {
|
||||
// Due to parsing error, we either went over the cached tokens or
|
||||
|
|
|
@ -1026,8 +1026,9 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,
|
|||
return DP;
|
||||
}
|
||||
else if (CurParsedObjCImpl &&
|
||||
(Tok.is(tok::l_brace) || Tok.is(tok::kw_try)) &&
|
||||
!TemplateInfo.TemplateParams &&
|
||||
!TemplateInfo.TemplateParams &&
|
||||
(Tok.is(tok::l_brace) || Tok.is(tok::kw_try) ||
|
||||
Tok.is(tok::colon)) &&
|
||||
Actions.CurContext->isTranslationUnit()) {
|
||||
MultiTemplateParamsArg TemplateParameterLists(Actions, 0, 0);
|
||||
ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
|
||||
|
|
|
@ -10,6 +10,12 @@ struct S {
|
|||
|
||||
int gorfbar(MyClass * myObject);
|
||||
|
||||
S();
|
||||
S(MyClass *O1, MyClass *O2);
|
||||
S(MyClass *O1);
|
||||
|
||||
MyClass * Obj1, *Obj2;
|
||||
|
||||
};
|
||||
|
||||
@implementation MyClass
|
||||
|
@ -29,6 +35,14 @@ int S::gorfbar(MyClass * myObject) {
|
|||
return getMe + bar(myObject);
|
||||
}
|
||||
|
||||
S::S(MyClass *O1, MyClass *O2) : Obj1(O1), Obj2(O2) {
|
||||
[O1 privateMethod];
|
||||
[O2 privateMethod1];
|
||||
}
|
||||
S::S(MyClass *O1) : Obj1(O1){ Obj2 = 0; }
|
||||
|
||||
S::S() {}
|
||||
|
||||
- (void)privateMethod1 {
|
||||
getMe = getMe+1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue