summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2013-12-18 08:46:25 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2013-12-18 08:46:25 +0000
commitcb164ab273cc7b751a47302e0246b890ad1b351f (patch)
treee70ef3ea5e2366fdd91773184a77d73ac6d47639 /clang/lib
parent3460b2546c1b76f0772d2b3f8edbea0b8aa7f47b (diff)
downloadbcm5719-llvm-cb164ab273cc7b751a47302e0246b890ad1b351f.tar.gz
bcm5719-llvm-cb164ab273cc7b751a47302e0246b890ad1b351f.zip
[OPENMP] Fix for parsing OpenMP directives with extra braces, brackets and parens
llvm-svn: 197553
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Parse/ParseOpenMP.cpp33
-rw-r--r--clang/lib/Parse/Parser.cpp60
-rw-r--r--clang/lib/Parse/RAIIObjectsForParser.h6
3 files changed, 60 insertions, 39 deletions
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 89e4147e285..c6d592571f6 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -48,7 +48,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirective() {
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
<< getOpenMPDirectiveName(OMPD_threadprivate);
- SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+ SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
}
// Skip the last annot_pragma_openmp_end.
ConsumeToken();
@@ -66,7 +66,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirective() {
<< getOpenMPDirectiveName(DKind);
break;
}
- SkipUntil(tok::annot_pragma_openmp_end);
+ SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
return DeclGroupPtrTy();
}
@@ -105,14 +105,14 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective() {
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
<< getOpenMPDirectiveName(OMPD_threadprivate);
- SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+ SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
}
DeclGroupPtrTy Res =
Actions.ActOnOpenMPThreadprivateDirective(Loc,
Identifiers);
Directive = Actions.ActOnDeclStmt(Res, Loc, Tok.getLocation());
}
- SkipUntil(tok::annot_pragma_openmp_end);
+ SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
break;
case OMPD_parallel: {
ConsumeToken();
@@ -171,13 +171,13 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective() {
break;
case OMPD_unknown:
Diag(Tok, diag::err_omp_unknown_directive);
- SkipUntil(tok::annot_pragma_openmp_end);
+ SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
break;
case OMPD_task:
case NUM_OPENMP_DIRECTIVES:
Diag(Tok, diag::err_omp_unexpected_directive)
<< getOpenMPDirectiveName(DKind);
- SkipUntil(tok::annot_pragma_openmp_end);
+ SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
break;
}
return Directive;
@@ -194,7 +194,8 @@ bool Parser::ParseOpenMPSimpleVarList(OpenMPDirectiveKind Kind,
bool AllowScopeSpecifier) {
VarList.clear();
// Parse '('.
- BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+ BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+ true);
if (T.expectAndConsume(diag::err_expected_lparen_after,
getOpenMPDirectiveName(Kind)))
return true;
@@ -214,17 +215,17 @@ bool Parser::ParseOpenMPSimpleVarList(OpenMPDirectiveKind Kind,
ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false)) {
IsCorrect = false;
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
- StopBeforeMatch);
+ StopBeforeMatch | NoBracketsCount);
} else if (ParseUnqualifiedId(SS, false, false, false, ParsedType(),
TemplateKWLoc, Name)) {
IsCorrect = false;
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
- StopBeforeMatch);
+ StopBeforeMatch | NoBracketsCount);
} else if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren) &&
Tok.isNot(tok::annot_pragma_openmp_end)) {
IsCorrect = false;
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
- StopBeforeMatch);
+ StopBeforeMatch | NoBracketsCount);
Diag(PrevTok.getLocation(), diag::err_expected_ident)
<< SourceRange(PrevTok.getLocation(), PrevTokLocation);
} else {
@@ -287,13 +288,13 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
case OMPC_unknown:
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
<< getOpenMPDirectiveName(DKind);
- SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+ SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
break;
case OMPC_threadprivate:
case NUM_OPENMP_CLAUSES:
Diag(Tok, diag::err_omp_unexpected_clause)
<< getOpenMPClauseName(CKind) << getOpenMPDirectiveName(DKind);
- SkipUntil(tok::comma, tok::annot_pragma_openmp_end, StopBeforeMatch);
+ SkipUntil(tok::comma, tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
break;
}
return ErrorFound ? 0 : Clause;
@@ -308,7 +309,8 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind) {
SourceLocation Loc = Tok.getLocation();
SourceLocation LOpen = ConsumeToken();
// Parse '('.
- BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+ BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+ true);
if (T.expectAndConsume(diag::err_expected_lparen_after,
getOpenMPClauseName(Kind)))
return 0;
@@ -342,7 +344,8 @@ OMPClause *Parser::ParseOpenMPVarListClause(OpenMPClauseKind Kind) {
SourceLocation Loc = Tok.getLocation();
SourceLocation LOpen = ConsumeToken();
// Parse '('.
- BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+ BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+ true);
if (T.expectAndConsume(diag::err_expected_lparen_after,
getOpenMPClauseName(Kind)))
return 0;
@@ -357,7 +360,7 @@ OMPClause *Parser::ParseOpenMPVarListClause(OpenMPClauseKind Kind) {
Vars.push_back(VarExpr.take());
} else {
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
- StopBeforeMatch);
+ StopBeforeMatch | NoBracketsCount);
}
// Skip ',' if any
IsComma = Tok.is(tok::comma);
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 79a02eea423..2dc3d2c8757 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -159,7 +159,8 @@ static bool IsCommonTypo(tok::TokenKind ExpectedTok, const Token &Tok) {
/// SkipToTok is specified, it calls SkipUntil(SkipToTok). Finally, true is
/// returned.
bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
- const char *Msg, tok::TokenKind SkipToTok) {
+ const char *Msg, tok::TokenKind SkipToTok,
+ bool NoCount) {
if (Tok.is(ExpectedTok) || Tok.is(tok::code_completion)) {
ConsumeAnyToken();
return false;
@@ -189,8 +190,12 @@ bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
} else
Diag(Tok, DiagID) << Msg;
- if (SkipToTok != tok::unknown)
- SkipUntil(SkipToTok, StopAtSemi);
+ if (SkipToTok != tok::unknown) {
+ SkipUntilFlags Flags = StopAtSemi;
+ if (NoCount)
+ Flags = Flags | NoBracketsCount;
+ SkipUntil(SkipToTok, Flags);
+ }
return true;
}
@@ -314,26 +319,32 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, SkipUntilFlags Flags) {
case tok::l_paren:
// Recursively skip properly-nested parens.
ConsumeParen();
- if (HasFlagsSet(Flags, StopAtCodeCompletion))
- SkipUntil(tok::r_paren, StopAtCodeCompletion);
- else
- SkipUntil(tok::r_paren);
+ if (!HasFlagsSet(Flags, NoBracketsCount)) {
+ if (HasFlagsSet(Flags, StopAtCodeCompletion))
+ SkipUntil(tok::r_paren, StopAtCodeCompletion);
+ else
+ SkipUntil(tok::r_paren);
+ }
break;
case tok::l_square:
// Recursively skip properly-nested square brackets.
ConsumeBracket();
- if (HasFlagsSet(Flags, StopAtCodeCompletion))
- SkipUntil(tok::r_square, StopAtCodeCompletion);
- else
- SkipUntil(tok::r_square);
+ if (!HasFlagsSet(Flags, NoBracketsCount)) {
+ if (HasFlagsSet(Flags, StopAtCodeCompletion))
+ SkipUntil(tok::r_square, StopAtCodeCompletion);
+ else
+ SkipUntil(tok::r_square);
+ }
break;
case tok::l_brace:
// Recursively skip properly-nested braces.
ConsumeBrace();
- if (HasFlagsSet(Flags, StopAtCodeCompletion))
- SkipUntil(tok::r_brace, StopAtCodeCompletion);
- else
- SkipUntil(tok::r_brace);
+ if (!HasFlagsSet(Flags, NoBracketsCount)) {
+ if (HasFlagsSet(Flags, StopAtCodeCompletion))
+ SkipUntil(tok::r_brace, StopAtCodeCompletion);
+ else
+ SkipUntil(tok::r_brace);
+ }
break;
// Okay, we found a ']' or '}' or ')', which we think should be balanced.
@@ -342,17 +353,17 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> Toks, SkipUntilFlags Flags) {
// higher level, we will assume that this matches the unbalanced token
// and return it. Otherwise, this is a spurious RHS token, which we skip.
case tok::r_paren:
- if (ParenCount && !isFirstTokenSkipped)
+ if (!HasFlagsSet(Flags, NoBracketsCount) && ParenCount && !isFirstTokenSkipped)
return false; // Matches something.
ConsumeParen();
break;
case tok::r_square:
- if (BracketCount && !isFirstTokenSkipped)
+ if (!HasFlagsSet(Flags, NoBracketsCount) && BracketCount && !isFirstTokenSkipped)
return false; // Matches something.
ConsumeBracket();
break;
case tok::r_brace:
- if (BraceCount && !isFirstTokenSkipped)
+ if (!HasFlagsSet(Flags, NoBracketsCount) && BraceCount && !isFirstTokenSkipped)
return false; // Matches something.
ConsumeBrace();
break;
@@ -2031,7 +2042,7 @@ bool BalancedDelimiterTracker::expectAndConsume(unsigned DiagID,
const char *Msg,
tok::TokenKind SkipToToc ) {
LOpen = P.Tok.getLocation();
- if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc))
+ if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc, NoCount))
return true;
if (getDepth() < MaxDepth)
@@ -2056,16 +2067,21 @@ bool BalancedDelimiterTracker::diagnoseMissingClose() {
// If we're not already at some kind of closing bracket, skip to our closing
// token.
+ Parser::SkipUntilFlags Flags = Parser::StopAtSemi | Parser::StopBeforeMatch;
+ if (NoCount)
+ Flags = Flags | Parser::NoBracketsCount;
if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) &&
P.Tok.isNot(tok::r_square) &&
- P.SkipUntil(Close, FinalToken,
- Parser::StopAtSemi | Parser::StopBeforeMatch) &&
+ P.SkipUntil(Close, FinalToken, Flags) &&
P.Tok.is(Close))
LClose = P.ConsumeAnyToken();
return true;
}
void BalancedDelimiterTracker::skipToEnd() {
- P.SkipUntil(Close, Parser::StopBeforeMatch);
+ Parser::SkipUntilFlags Flags = Parser::StopBeforeMatch;
+ if (NoCount)
+ Flags = Flags | Parser::NoBracketsCount;
+ P.SkipUntil(Close, Flags);
consumeClose();
}
diff --git a/clang/lib/Parse/RAIIObjectsForParser.h b/clang/lib/Parse/RAIIObjectsForParser.h
index f68a2e09fe9..4d7bfda39b0 100644
--- a/clang/lib/Parse/RAIIObjectsForParser.h
+++ b/clang/lib/Parse/RAIIObjectsForParser.h
@@ -361,6 +361,7 @@ namespace clang {
tok::TokenKind Kind, Close, FinalToken;
SourceLocation (Parser::*Consumer)();
SourceLocation LOpen, LClose;
+ bool NoCount;
unsigned short &getDepth() {
switch (Kind) {
@@ -378,9 +379,10 @@ namespace clang {
public:
BalancedDelimiterTracker(Parser& p, tok::TokenKind k,
- tok::TokenKind FinalToken = tok::semi)
+ tok::TokenKind FinalToken = tok::semi,
+ bool NoCount = false)
: GreaterThanIsOperatorScope(p.GreaterThanIsOperator, true),
- P(p), Kind(k), FinalToken(FinalToken)
+ P(p), Kind(k), FinalToken(FinalToken), NoCount(NoCount)
{
switch (Kind) {
default: llvm_unreachable("Unexpected balanced token");
OpenPOWER on IntegriCloud