@@ -124,10 +124,12 @@ StmtResult Parser::ParseOmpSsDeclarativeOrExecutableDirective(
124124// / clause:
125125// / depend-clause | if-clause | final-clause
126126// / | default-clause | shared-clause | private-clause
127- // / | firstprivate-clause
127+ // / | firstprivate-clause | in-clause | out-clause
128+ // / | inout-clause | weakin-clause | weakout-clause
129+ // / | weakinout-clause
128130// /
129131OSSClause *Parser::ParseOmpSsClause (OmpSsDirectiveKind DKind,
130- OmpSsClauseKind CKind, bool FirstClause) {
132+ OmpSsClauseKind CKind, bool FirstClause) {
131133 OSSClause *Clause = nullptr ;
132134 bool ErrorFound = false ;
133135 bool WrongDirective = false ;
@@ -162,6 +164,12 @@ OSSClause *Parser::ParseOmpSsClause(OmpSsDirectiveKind DKind,
162164 case OSSC_private:
163165 case OSSC_firstprivate:
164166 case OSSC_depend:
167+ case OSSC_in:
168+ case OSSC_out:
169+ case OSSC_inout:
170+ case OSSC_weakin:
171+ case OSSC_weakout:
172+ case OSSC_weakinout:
165173 Clause = ParseOmpSsVarListClause (DKind, CKind, WrongDirective);
166174 break ;
167175 case OSSC_unknown:
@@ -175,9 +183,9 @@ OSSClause *Parser::ParseOmpSsClause(OmpSsDirectiveKind DKind,
175183
176184// / Parses clauses with list.
177185bool Parser::ParseOmpSsVarList (OmpSsDirectiveKind DKind,
178- OmpSsClauseKind Kind,
179- SmallVectorImpl<Expr *> &Vars,
180- OmpSsVarListDataTy &Data) {
186+ OmpSsClauseKind Kind,
187+ SmallVectorImpl<Expr *> &Vars,
188+ OmpSsVarListDataTy &Data) {
181189 // Parse '('.
182190 BalancedDelimiterTracker T (*this , tok::l_paren, tok::annot_pragma_ompss_end);
183191 if (T.expectAndConsume (diag::err_expected_lparen_after,
@@ -228,9 +236,14 @@ bool Parser::ParseOmpSsVarList(OmpSsDirectiveKind DKind,
228236 Data.DepKinds .end (),
229237 OSSC_DEPEND_unknown);
230238
239+ // IsComma init determine if we got a well-formed clause
231240 bool IsComma = (Kind != OSSC_depend)
232241 || (Kind == OSSC_depend && DepKindIt == Data.DepKinds .end ());
233-
242+ // We parse the locator-list when:
243+ // 1. If we found out something that seems a valid item regardless
244+ // of the clause validity
245+ // 2. We got a well-formed clause regardless what comes next.
246+ // while (IsComma || Tok.looks_like_valid_item)
234247 while (IsComma || (Tok.isNot (tok::r_paren) && Tok.isNot (tok::colon) &&
235248 Tok.isNot (tok::annot_pragma_ompss_end))) {
236249 // Parse variable
@@ -256,9 +269,10 @@ bool Parser::ParseOmpSsVarList(OmpSsDirectiveKind DKind,
256269 Data.RLoc = Tok.getLocation ();
257270 if (!T.consumeClose ())
258271 Data.RLoc = T.getCloseLocation ();
272+ // return Well-formed clause but empty list
259273 return (Kind == OSSC_depend
260- && DepKindIt == Data.DepKinds .end ()
261- && Vars.empty ());
274+ && DepKindIt == Data.DepKinds .end () && Vars. empty ())
275+ || (Kind != OSSC_depend && Vars.empty ());
262276}
263277
264278// / Parsing of OmpSs
@@ -272,6 +286,18 @@ bool Parser::ParseOmpSsVarList(OmpSsDirectiveKind DKind,
272286// / 'firstprivate' '(' list ')'
273287// / shared-clause:
274288// / 'shared' '(' list ')'
289+ // / in-clause:
290+ // / 'in' '(' list ')'
291+ // / out-clause:
292+ // / 'out' '(' list ')'
293+ // / inout-clause:
294+ // / 'inout' '(' list ')'
295+ // / weakin-clause:
296+ // / 'weakin' '(' list ')'
297+ // / weakout-clause:
298+ // / 'weakout' '(' list ')'
299+ // / weakinout-clause:
300+ // / 'weakinout' '(' list ')'
275301OSSClause *Parser::ParseOmpSsVarListClause (OmpSsDirectiveKind DKind,
276302 OmpSsClauseKind Kind,
277303 bool ParseOnly) {
@@ -280,7 +306,10 @@ OSSClause *Parser::ParseOmpSsVarListClause(OmpSsDirectiveKind DKind,
280306 SmallVector<Expr *, 4 > Vars;
281307 OmpSsVarListDataTy Data;
282308
283- Actions.AllowShapings = (Kind == OSSC_depend);
309+ Actions.AllowShapings =
310+ (Kind == OSSC_depend
311+ || Kind == OSSC_in || Kind == OSSC_out || Kind == OSSC_inout
312+ || Kind == OSSC_weakin || Kind == OSSC_weakout || Kind == OSSC_weakinout);
284313
285314 if (ParseOmpSsVarList (DKind, Kind, Vars, Data)) {
286315 Actions.AllowShapings = false ;
0 commit comments