aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Parse/ParseOpenACC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Parse/ParseOpenACC.cpp')
-rw-r--r--clang/lib/Parse/ParseOpenACC.cpp65
1 files changed, 21 insertions, 44 deletions
diff --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index c9224d3ae910..fc82324e235d 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -554,49 +554,17 @@ ExprResult Parser::ParseOpenACCIDExpression() {
return getActions().CorrectDelayedTyposInExpr(Res);
}
-/// OpenACC 3.3, section 2.10:
-/// A 'var' in a cache directive must be a single array element or a simple
-/// subarray. In C and C++, a simple subarray is an array name followed by an
-/// extended array range specification in brackets, with a start and length such
-/// as:
-///
-/// arr[lower:length]
-///
-bool Parser::ParseOpenACCCacheVar() {
- ExprResult ArrayName = ParseOpenACCIDExpression();
- if (ArrayName.isInvalid())
- return true;
-
- // If the expression is invalid, just continue parsing the brackets, there
- // is likely other useful diagnostics we can emit inside of those.
-
- BalancedDelimiterTracker SquareBrackets(*this, tok::l_square,
- tok::annot_pragma_openacc_end);
-
- // Square brackets are required, so error here, and try to recover by moving
- // until the next comma, or the close paren/end of pragma.
- if (SquareBrackets.expectAndConsume()) {
- SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openacc_end,
- Parser::StopBeforeMatch);
- return true;
- }
-
- ExprResult Lower = getActions().CorrectDelayedTyposInExpr(ParseExpression());
- if (Lower.isInvalid())
- return true;
-
- // The 'length' expression is optional, as this could be a single array
- // element. If there is no colon, we can treat it as that.
- if (getCurToken().is(tok::colon)) {
- ConsumeToken();
- ExprResult Length =
- getActions().CorrectDelayedTyposInExpr(ParseExpression());
- if (Length.isInvalid())
- return true;
- }
-
- // Diagnose the square bracket being in the wrong place and continue.
- return SquareBrackets.consumeClose();
+/// OpenACC 3.3, section 1.6:
+/// In this spec, a 'var' (in italics) is one of the following:
+/// - a variable name (a scalar, array, or compisite variable name)
+/// - a subarray specification with subscript ranges
+/// - an array element
+/// - a member of a composite variable
+/// - a common block name between slashes (fortran only)
+bool Parser::ParseOpenACCVar() {
+ OpenACCArraySectionRAII ArraySections(*this);
+ ExprResult Res = ParseAssignmentExpression();
+ return Res.isInvalid();
}
/// OpenACC 3.3, section 2.10:
@@ -627,7 +595,16 @@ void Parser::ParseOpenACCCacheVarList() {
if (!FirstArray)
ExpectAndConsume(tok::comma);
FirstArray = false;
- if (ParseOpenACCCacheVar())
+
+ // OpenACC 3.3, section 2.10:
+ // A 'var' in a cache directive must be a single array element or a simple
+ // subarray. In C and C++, a simple subarray is an array name followed by
+ // an extended array range specification in brackets, with a start and
+ // length such as:
+ //
+ // arr[lower:length]
+ //
+ if (ParseOpenACCVar())
SkipUntil(tok::r_paren, tok::annot_pragma_openacc_end, tok::comma,
StopBeforeMatch);
}