@@ -393,10 +393,12 @@ enum ClauseParensKind {
393393 Required
394394};
395395
396- ClauseParensKind getClauseParensKind (OpenACCClauseKind Kind) {
396+ ClauseParensKind getClauseParensKind (OpenACCDirectiveKind DirKind,
397+ OpenACCClauseKind Kind) {
397398 switch (Kind) {
398399 case OpenACCClauseKind::Self:
399- return ClauseParensKind::Optional;
400+ return DirKind == OpenACCDirectiveKind::Update ? ClauseParensKind::Required
401+ : ClauseParensKind::Optional;
400402
401403 case OpenACCClauseKind::Default:
402404 case OpenACCClauseKind::If:
@@ -433,12 +435,14 @@ ClauseParensKind getClauseParensKind(OpenACCClauseKind Kind) {
433435 llvm_unreachable (" Unhandled clause kind" );
434436}
435437
436- bool ClauseHasOptionalParens (OpenACCClauseKind Kind) {
437- return getClauseParensKind (Kind) == ClauseParensKind::Optional;
438+ bool ClauseHasOptionalParens (OpenACCDirectiveKind DirKind,
439+ OpenACCClauseKind Kind) {
440+ return getClauseParensKind (DirKind, Kind) == ClauseParensKind::Optional;
438441}
439442
440- bool ClauseHasRequiredParens (OpenACCClauseKind Kind) {
441- return getClauseParensKind (Kind) == ClauseParensKind::Required;
443+ bool ClauseHasRequiredParens (OpenACCDirectiveKind DirKind,
444+ OpenACCClauseKind Kind) {
445+ return getClauseParensKind (DirKind, Kind) == ClauseParensKind::Required;
442446}
443447
444448ExprResult ParseOpenACCConditionalExpr (Parser &P) {
@@ -465,7 +469,7 @@ void SkipUntilEndOfDirective(Parser &P) {
465469// a pqr-list is a comma-separated list of pdr items. The one exception is a
466470// clause-list, which is a list of one or more clauses optionally separated by
467471// commas.
468- void Parser::ParseOpenACCClauseList () {
472+ void Parser::ParseOpenACCClauseList (OpenACCDirectiveKind DirKind ) {
469473 bool FirstClause = true ;
470474 while (getCurToken ().isNot (tok::annot_pragma_openacc_end)) {
471475 // Comma is optional in a clause-list.
@@ -475,7 +479,7 @@ void Parser::ParseOpenACCClauseList() {
475479
476480 // Recovering from a bad clause is really difficult, so we just give up on
477481 // error.
478- if (ParseOpenACCClause ()) {
482+ if (ParseOpenACCClause (DirKind )) {
479483 SkipUntilEndOfDirective (*this );
480484 return ;
481485 }
@@ -508,7 +512,7 @@ bool Parser::ParseOpenACCClauseVarList(OpenACCClauseKind Kind) {
508512// really have its owner grammar and each individual one has its own definition.
509513// However, they all are named with a single-identifier (or auto/default!)
510514// token, followed in some cases by either braces or parens.
511- bool Parser::ParseOpenACCClause () {
515+ bool Parser::ParseOpenACCClause (OpenACCDirectiveKind DirKind ) {
512516 // A number of clause names are actually keywords, so accept a keyword that
513517 // can be converted to a name.
514518 if (expectIdentifierOrKeyword (*this ))
@@ -523,14 +527,15 @@ bool Parser::ParseOpenACCClause() {
523527 // Consume the clause name.
524528 ConsumeToken ();
525529
526- return ParseOpenACCClauseParams (Kind);
530+ return ParseOpenACCClauseParams (DirKind, Kind);
527531}
528532
529- bool Parser::ParseOpenACCClauseParams (OpenACCClauseKind Kind) {
533+ bool Parser::ParseOpenACCClauseParams (OpenACCDirectiveKind DirKind,
534+ OpenACCClauseKind Kind) {
530535 BalancedDelimiterTracker Parens (*this , tok::l_paren,
531536 tok::annot_pragma_openacc_end);
532537
533- if (ClauseHasRequiredParens (Kind)) {
538+ if (ClauseHasRequiredParens (DirKind, Kind)) {
534539 if (Parens.expectAndConsume ()) {
535540 // We are missing a paren, so assume that the person just forgot the
536541 // parameter. Return 'false' so we try to continue on and parse the next
@@ -576,6 +581,12 @@ bool Parser::ParseOpenACCClauseParams(OpenACCClauseKind Kind) {
576581 if (ParseOpenACCClauseVarList (Kind))
577582 return true ;
578583 break ;
584+ case OpenACCClauseKind::Self:
585+ // The 'self' clause is a var-list instead of a 'condition' in the case of
586+ // the 'update' clause, so we have to handle it here. U se an assert to
587+ // make sure we get the right differentiator.
588+ assert (DirKind == OpenACCDirectiveKind::Update);
589+ LLVM_FALLTHROUGH;
579590 case OpenACCClauseKind::Attach:
580591 case OpenACCClauseKind::Copy:
581592 case OpenACCClauseKind::Delete:
@@ -598,10 +609,11 @@ bool Parser::ParseOpenACCClauseParams(OpenACCClauseKind Kind) {
598609 }
599610
600611 return Parens.consumeClose ();
601- } else if (ClauseHasOptionalParens (Kind)) {
612+ } else if (ClauseHasOptionalParens (DirKind, Kind)) {
602613 if (!Parens.consumeOpen ()) {
603614 switch (Kind) {
604615 case OpenACCClauseKind::Self: {
616+ assert (DirKind != OpenACCDirectiveKind::Update);
605617 ExprResult CondExpr = ParseOpenACCConditionalExpr (*this );
606618 // An invalid expression can be just about anything, so just give up on
607619 // this clause list.
@@ -817,7 +829,7 @@ void Parser::ParseOpenACCDirective() {
817829 }
818830
819831 // Parses the list of clauses, if present.
820- ParseOpenACCClauseList ();
832+ ParseOpenACCClauseList (DirKind );
821833
822834 Diag (getCurToken (), diag::warn_pragma_acc_unimplemented);
823835 assert (Tok.is (tok::annot_pragma_openacc_end) &&
0 commit comments