diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2012-07-06 00:42:20 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-07-06 00:42:20 +0000 |
| commit | 97920394c00ca2d8246fb8aabc8252d023cfa2ce (patch) | |
| tree | f5a987cd2c1a240b48cb792c1de68b37d571685e /clang | |
| parent | 6b45660f144e461e5335c79f3db7596cc050a520 (diff) | |
| download | bcm5719-llvm-97920394c00ca2d8246fb8aabc8252d023cfa2ce.tar.gz bcm5719-llvm-97920394c00ca2d8246fb8aabc8252d023cfa2ce.zip | |
Added a new memberfor Parser, to be used soon
for doing delayed parsing of c++ method defined in
objc class implementations.
llvm-svn: 159792
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Parse/Parser.h | 1 | ||||
| -rw-r--r-- | clang/lib/Parse/Parser.cpp | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index 66e8662aeb6..b9414a4051e 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -1045,6 +1045,7 @@ private: ParsingDeclSpec *DS = 0); bool isDeclarationAfterDeclarator(); bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator); + bool isStartOfDelayParsedFunctionDefinition(const ParsingDeclarator &Declarator); DeclGroupPtrTy ParseDeclarationOrFunctionDefinition( ParsedAttributesWithRange &attrs, ParsingDeclSpec *DS = 0, diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 4cc5fdeae0b..07031338499 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -797,6 +797,27 @@ bool Parser::isStartOfFunctionDefinition(const ParsingDeclarator &Declarator) { Tok.is(tok::kw_try); // X() try { ... } } +/// \brief Determine whether the current token, if it occurs after a +/// a function declarator, indicates the start of a function definition +/// inside an objective-C class implementation and thus can be delay parsed. +bool Parser::isStartOfDelayParsedFunctionDefinition( + const ParsingDeclarator &Declarator) { + if (!CurParsedObjCImpl || + !Declarator.isFunctionDeclarator()) + return false; + if (Tok.is(tok::l_brace)) // int X() {} + return true; + + // Handle K&R C argument lists: int X(f) int f; {} + if (!getLangOpts().CPlusPlus && + Declarator.getFunctionTypeInfo().isKNRPrototype()) + return isDeclarationSpecifier(); + + return getLangOpts().CPlusPlus && + (Tok.is(tok::colon) || // X() : Base() {} (used for ctors) + Tok.is(tok::kw_try)); // X() try { ... } +} + /// ParseDeclarationOrFunctionDefinition - Parse either a function-definition or /// a declaration. We can't tell which we have until we read up to the /// compound-statement in function-definition. TemplateParams, if |

