|
@@ -1205,11 +1205,13 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
OpenMPClauseKind CKind, bool FirstClause) {
|
|
|
OMPClause *Clause = nullptr;
|
|
|
bool ErrorFound = false;
|
|
|
+ bool WrongDirective = false;
|
|
|
// Check if clause is allowed for the given directive.
|
|
|
if (CKind != OMPC_unknown && !isAllowedClauseForDirective(DKind, CKind)) {
|
|
|
Diag(Tok, diag::err_omp_unexpected_clause) << getOpenMPClauseName(CKind)
|
|
|
<< getOpenMPDirectiveName(DKind);
|
|
|
ErrorFound = true;
|
|
|
+ WrongDirective = true;
|
|
|
}
|
|
|
|
|
|
switch (CKind) {
|
|
@@ -1253,9 +1255,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
}
|
|
|
|
|
|
if (CKind == OMPC_ordered && PP.LookAhead(/*N=*/0).isNot(tok::l_paren))
|
|
|
- Clause = ParseOpenMPClause(CKind);
|
|
|
+ Clause = ParseOpenMPClause(CKind, WrongDirective);
|
|
|
else
|
|
|
- Clause = ParseOpenMPSingleExprClause(CKind);
|
|
|
+ Clause = ParseOpenMPSingleExprClause(CKind, WrongDirective);
|
|
|
break;
|
|
|
case OMPC_default:
|
|
|
case OMPC_proc_bind:
|
|
@@ -1270,7 +1272,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
ErrorFound = true;
|
|
|
}
|
|
|
|
|
|
- Clause = ParseOpenMPSimpleClause(CKind);
|
|
|
+ Clause = ParseOpenMPSimpleClause(CKind, WrongDirective);
|
|
|
break;
|
|
|
case OMPC_schedule:
|
|
|
case OMPC_dist_schedule:
|
|
@@ -1287,7 +1289,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
LLVM_FALLTHROUGH;
|
|
|
|
|
|
case OMPC_if:
|
|
|
- Clause = ParseOpenMPSingleExprWithArgClause(CKind);
|
|
|
+ Clause = ParseOpenMPSingleExprWithArgClause(CKind, WrongDirective);
|
|
|
break;
|
|
|
case OMPC_nowait:
|
|
|
case OMPC_untied:
|
|
@@ -1310,7 +1312,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
ErrorFound = true;
|
|
|
}
|
|
|
|
|
|
- Clause = ParseOpenMPClause(CKind);
|
|
|
+ Clause = ParseOpenMPClause(CKind, WrongDirective);
|
|
|
break;
|
|
|
case OMPC_private:
|
|
|
case OMPC_firstprivate:
|
|
@@ -1330,7 +1332,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
case OMPC_from:
|
|
|
case OMPC_use_device_ptr:
|
|
|
case OMPC_is_device_ptr:
|
|
|
- Clause = ParseOpenMPVarListClause(DKind, CKind);
|
|
|
+ Clause = ParseOpenMPVarListClause(DKind, CKind, WrongDirective);
|
|
|
break;
|
|
|
case OMPC_unknown:
|
|
|
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
|
|
@@ -1339,8 +1341,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
|
|
|
break;
|
|
|
case OMPC_threadprivate:
|
|
|
case OMPC_uniform:
|
|
|
- Diag(Tok, diag::err_omp_unexpected_clause) << getOpenMPClauseName(CKind)
|
|
|
- << getOpenMPDirectiveName(DKind);
|
|
|
+ if (!WrongDirective)
|
|
|
+ Diag(Tok, diag::err_omp_unexpected_clause)
|
|
|
+ << getOpenMPClauseName(CKind) << getOpenMPDirectiveName(DKind);
|
|
|
SkipUntil(tok::comma, tok::annot_pragma_openmp_end, StopBeforeMatch);
|
|
|
break;
|
|
|
}
|
|
@@ -1400,7 +1403,8 @@ ExprResult Parser::ParseOpenMPParensExpr(StringRef ClauseName,
|
|
|
/// hint-clause:
|
|
|
/// 'hint' '(' expression ')'
|
|
|
///
|
|
|
-OMPClause *Parser::ParseOpenMPSingleExprClause(OpenMPClauseKind Kind) {
|
|
|
+OMPClause *Parser::ParseOpenMPSingleExprClause(OpenMPClauseKind Kind,
|
|
|
+ bool ParseOnly) {
|
|
|
SourceLocation Loc = ConsumeToken();
|
|
|
SourceLocation LLoc = Tok.getLocation();
|
|
|
SourceLocation RLoc;
|
|
@@ -1410,6 +1414,8 @@ OMPClause *Parser::ParseOpenMPSingleExprClause(OpenMPClauseKind Kind) {
|
|
|
if (Val.isInvalid())
|
|
|
return nullptr;
|
|
|
|
|
|
+ if (ParseOnly)
|
|
|
+ return nullptr;
|
|
|
return Actions.ActOnOpenMPSingleExprClause(Kind, Val.get(), Loc, LLoc, RLoc);
|
|
|
}
|
|
|
|
|
@@ -1421,7 +1427,8 @@ OMPClause *Parser::ParseOpenMPSingleExprClause(OpenMPClauseKind Kind) {
|
|
|
/// proc_bind-clause:
|
|
|
/// 'proc_bind' '(' 'master' | 'close' | 'spread' ')
|
|
|
///
|
|
|
-OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind) {
|
|
|
+OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind,
|
|
|
+ bool ParseOnly) {
|
|
|
SourceLocation Loc = Tok.getLocation();
|
|
|
SourceLocation LOpen = ConsumeToken();
|
|
|
// Parse '('.
|
|
@@ -1440,6 +1447,8 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind) {
|
|
|
// Parse ')'.
|
|
|
T.consumeClose();
|
|
|
|
|
|
+ if (ParseOnly)
|
|
|
+ return nullptr;
|
|
|
return Actions.ActOnOpenMPSimpleClause(Kind, Type, TypeLoc, LOpen, Loc,
|
|
|
Tok.getLocation());
|
|
|
}
|
|
@@ -1470,10 +1479,12 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind) {
|
|
|
/// nogroup-clause:
|
|
|
/// 'nogroup'
|
|
|
///
|
|
|
-OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind) {
|
|
|
+OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind, bool ParseOnly) {
|
|
|
SourceLocation Loc = Tok.getLocation();
|
|
|
ConsumeAnyToken();
|
|
|
|
|
|
+ if (ParseOnly)
|
|
|
+ return nullptr;
|
|
|
return Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation());
|
|
|
}
|
|
|
|
|
@@ -1491,7 +1502,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind) {
|
|
|
/// defaultmap:
|
|
|
/// 'defaultmap' '(' modifier ':' kind ')'
|
|
|
///
|
|
|
-OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPClauseKind Kind) {
|
|
|
+OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPClauseKind Kind,
|
|
|
+ bool ParseOnly) {
|
|
|
SourceLocation Loc = ConsumeToken();
|
|
|
SourceLocation DelimLoc;
|
|
|
// Parse '('.
|
|
@@ -1613,6 +1625,8 @@ OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPClauseKind Kind) {
|
|
|
if (NeedAnExpression && Val.isInvalid())
|
|
|
return nullptr;
|
|
|
|
|
|
+ if (ParseOnly)
|
|
|
+ return nullptr;
|
|
|
return Actions.ActOnOpenMPSingleExprWithArgClause(
|
|
|
Kind, Arg, Val.get(), Loc, T.getOpenLocation(), KLoc, DelimLoc,
|
|
|
T.getCloseLocation());
|
|
@@ -1940,7 +1954,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
|
|
/// modifier(list)
|
|
|
/// where modifier is 'val' (C) or 'ref', 'val' or 'uval'(C++).
|
|
|
OMPClause *Parser::ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
|
|
|
- OpenMPClauseKind Kind) {
|
|
|
+ OpenMPClauseKind Kind,
|
|
|
+ bool ParseOnly) {
|
|
|
SourceLocation Loc = Tok.getLocation();
|
|
|
SourceLocation LOpen = ConsumeToken();
|
|
|
SmallVector<Expr *, 4> Vars;
|
|
@@ -1949,6 +1964,8 @@ OMPClause *Parser::ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
|
|
|
if (ParseOpenMPVarList(DKind, Kind, Vars, Data))
|
|
|
return nullptr;
|
|
|
|
|
|
+ if (ParseOnly)
|
|
|
+ return nullptr;
|
|
|
return Actions.ActOnOpenMPVarListClause(
|
|
|
Kind, Vars, Data.TailExpr, Loc, LOpen, Data.ColonLoc, Tok.getLocation(),
|
|
|
Data.ReductionIdScopeSpec, Data.ReductionId, Data.DepKind, Data.LinKind,
|