diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-26 22:41:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-26 22:41:58 +0000 |
commit | efcadc64ee200ae74b3859097e3e7ec5fa93a252 (patch) | |
tree | a673f1f7e2b70f6558c47209a9f4f1a4f79ee8ec /lib/Parse/ParseInit.cpp | |
parent | 0eec2b58678f71af6b5fcf4c439290c0d640546b (diff) |
improve MayBeDesignationStart to do the entire determination
about whether a leading identifier is a designator.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58207 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseInit.cpp')
-rw-r--r-- | lib/Parse/ParseInit.cpp | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index 84e3166473..4c49a6eca3 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -21,13 +21,14 @@ using namespace clang; /// MayBeDesignationStart - Return true if this token might be the start of a /// designator. If we can tell it is impossible that it is a designator, return /// false. -static bool MayBeDesignationStart(tok::TokenKind K) { +static bool MayBeDesignationStart(tok::TokenKind K, Preprocessor &PP) { switch (K) { default: return false; case tok::period: // designator: '.' identifier case tok::l_square: // designator: array-designator + return true; case tok::identifier: // designation: identifier ':' - return true; + return PP.LookAhead(0).is(tok::colon); } } @@ -64,23 +65,17 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations, // Handle it as a field designator. Otherwise, this must be the start of a // normal expression. if (Tok.is(tok::identifier)) { - if (NextToken().is(tok::colon)) { - Diag(Tok, diag::ext_gnu_old_style_field_designator); - - Designation &D = Designations.CreateDesignation(InitNum); - D.AddDesignator(Designator::getField(Tok.getIdentifierInfo())); - ConsumeToken(); // Eat the identifier. - - assert(Tok.is(tok::colon) && "NextToken() not working properly!"); - ConsumeToken(); - return ParseInitializer(); - } + Diag(Tok, diag::ext_gnu_old_style_field_designator); + + Designation &D = Designations.CreateDesignation(InitNum); + D.AddDesignator(Designator::getField(Tok.getIdentifierInfo())); + ConsumeToken(); // Eat the identifier. - // Otherwise, parse the assignment-expression. - return ParseAssignmentExpression(); + assert(Tok.is(tok::colon) && "NextToken() not working properly!"); + ConsumeToken(); + return ParseInitializer(); } - // Parse each designator in the designator list until we find an initializer. while (1) { switch (Tok.getKind()) { @@ -208,7 +203,7 @@ Parser::ExprResult Parser::ParseBraceInitializer() { // If we know that this cannot be a designation, just parse the nested // initializer directly. ExprResult SubElt; - if (!MayBeDesignationStart(Tok.getKind())) + if (!MayBeDesignationStart(Tok.getKind(), PP)) SubElt = ParseInitializer(); else SubElt = ParseInitializerWithPotentialDesignator(InitExprDesignations, |