-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[clang][OpenMP] Pass OpenMP version to getOpenMPDirectiveName #139115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Some OpenMP directives have different spellings in different versions of the OpenMP spec. To use the proper spelling for a given spec version pass "version" as a parameter to getOpenMPDirectiveName. This parameter won't be used at the moment, and will have a default value to allow callers not to pass it, for gradual adoption in various components. RFC: https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507
The OpenMP version is stored in language options in Sema. For use in objects that do not have access to Sema, add OpenMP version field to PrintingPolicy, giving it 8 bits. RFC: https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507
@llvm/pr-subscribers-clang Author: Krzysztof Parzyszek (kparzysz) ChangesThe OpenMP version is stored in language options in Sema. For use in objects that do not have access to Sema, add OpenMP version field to PrintingPolicy, giving it 8 bits. RFC: https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507 Patch is 58.79 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/139115.diff 7 Files Affected:
diff --git a/clang/include/clang/AST/PrettyPrinter.h b/clang/include/clang/AST/PrettyPrinter.h
index 5a98ae1987b16..1f64466956b66 100644
--- a/clang/include/clang/AST/PrettyPrinter.h
+++ b/clang/include/clang/AST/PrettyPrinter.h
@@ -59,7 +59,7 @@ struct PrintingPolicy {
/// Create a default printing policy for the specified language.
PrintingPolicy(const LangOptions &LO)
- : Indentation(2), SuppressSpecifiers(false),
+ : Indentation(2), OpenMP(LO.OpenMP), SuppressSpecifiers(false),
SuppressTagKeyword(LO.CPlusPlus), IncludeTagDefinition(false),
SuppressScope(false), SuppressUnwrittenScope(false),
SuppressInlineNamespace(SuppressInlineNamespaceMode::Redundant),
@@ -94,6 +94,10 @@ struct PrintingPolicy {
/// The number of spaces to use to indent each line.
unsigned Indentation : 8;
+ /// Version of the effective OpenMP spec (used to select directive name
+ /// spelling).
+ unsigned OpenMP : 8;
+
/// Whether we should suppress printing of the actual specifiers for
/// the given type or declaration.
///
diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp
index 2226791a70b6e..5ed04d250f5a1 100644
--- a/clang/lib/AST/OpenMPClause.cpp
+++ b/clang/lib/AST/OpenMPClause.cpp
@@ -1821,7 +1821,8 @@ OMPThreadLimitClause *OMPThreadLimitClause::CreateEmpty(const ASTContext &C,
void OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) {
OS << "if(";
if (Node->getNameModifier() != OMPD_unknown)
- OS << getOpenMPDirectiveName(Node->getNameModifier()) << ": ";
+ OS << getOpenMPDirectiveName(Node->getNameModifier(), Policy.OpenMP)
+ << ": ";
Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
OS << ")";
}
@@ -2049,7 +2050,7 @@ void OMPClausePrinter::VisitOMPAbsentClause(OMPAbsentClause *Node) {
for (auto &D : Node->getDirectiveKinds()) {
if (!First)
OS << ", ";
- OS << getOpenMPDirectiveName(D);
+ OS << getOpenMPDirectiveName(D, Policy.OpenMP);
First = false;
}
OS << ")";
@@ -2067,7 +2068,7 @@ void OMPClausePrinter::VisitOMPContainsClause(OMPContainsClause *Node) {
for (auto &D : Node->getDirectiveKinds()) {
if (!First)
OS << ", ";
- OS << getOpenMPDirectiveName(D);
+ OS << getOpenMPDirectiveName(D, Policy.OpenMP);
First = false;
}
OS << ")";
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index c6c49c6c1ba4d..53f7bb2f64249 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -965,13 +965,13 @@ void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
void StmtPrinter::VisitOMPCancellationPointDirective(
OMPCancellationPointDirective *Node) {
Indent() << "#pragma omp cancellation point "
- << getOpenMPDirectiveName(Node->getCancelRegion());
+ << getOpenMPDirectiveName(Node->getCancelRegion(), Policy.OpenMP);
PrintOMPExecutableDirective(Node);
}
void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
Indent() << "#pragma omp cancel "
- << getOpenMPDirectiveName(Node->getCancelRegion());
+ << getOpenMPDirectiveName(Node->getCancelRegion(), Policy.OpenMP);
PrintOMPExecutableDirective(Node);
}
diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 7b90861c78de0..a451fc7c01841 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -850,7 +850,8 @@ void clang::getOpenMPCaptureRegions(
case OMPD_master:
return false;
default:
- llvm::errs() << getOpenMPDirectiveName(LKind) << '\n';
+ llvm::errs() << getOpenMPDirectiveName(LKind, llvm::omp::FallbackVersion)
+ << '\n';
llvm_unreachable("Unexpected directive");
}
return false;
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 8d8698e61216f..4f87d6c74b251 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -288,11 +288,12 @@ static DeclarationName parseOpenMPReductionId(Parser &P) {
///
Parser::DeclGroupPtrTy
Parser::ParseOpenMPDeclareReductionDirective(AccessSpecifier AS) {
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
// Parse '('.
BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
if (T.expectAndConsume(
diag::err_expected_lparen_after,
- getOpenMPDirectiveName(OMPD_declare_reduction).data())) {
+ getOpenMPDirectiveName(OMPD_declare_reduction, OMPVersion).data())) {
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
return DeclGroupPtrTy();
}
@@ -540,10 +541,12 @@ void Parser::ParseOpenMPReductionInitializerForDecl(VarDecl *OmpPrivParm) {
Parser::DeclGroupPtrTy
Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {
bool IsCorrect = true;
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
// Parse '('
BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
- if (T.expectAndConsume(diag::err_expected_lparen_after,
- getOpenMPDirectiveName(OMPD_declare_mapper).data())) {
+ if (T.expectAndConsume(
+ diag::err_expected_lparen_after,
+ getOpenMPDirectiveName(OMPD_declare_mapper, OMPVersion).data())) {
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
return DeclGroupPtrTy();
}
@@ -626,7 +629,7 @@ Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {
}
if (Clauses.empty()) {
Diag(Tok, diag::err_omp_expected_clause)
- << getOpenMPDirectiveName(OMPD_declare_mapper);
+ << getOpenMPDirectiveName(OMPD_declare_mapper, OMPVersion);
IsCorrect = false;
}
@@ -745,8 +748,10 @@ static bool parseDeclareSimdClauses(
P.ConsumeToken();
} else if (ClauseName == "simdlen") {
if (SimdLen.isUsable()) {
+ unsigned OMPVersion = P.getActions().getLangOpts().OpenMP;
P.Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(OMPD_declare_simd) << ClauseName << 0;
+ << getOpenMPDirectiveName(OMPD_declare_simd, OMPVersion)
+ << ClauseName << 0;
IsError = true;
}
P.ConsumeToken();
@@ -1404,6 +1409,7 @@ bool Parser::parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI) {
void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
CachedTokens &Toks,
SourceLocation Loc) {
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
PP.EnterToken(Tok, /*IsReinject*/ true);
PP.EnterTokenStream(Toks, /*DisableMacroExpansion=*/true,
/*IsReinject*/ true);
@@ -1423,7 +1429,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
EnterExpressionEvaluationContext Unevaluated(
Actions, Sema::ExpressionEvaluationContext::Unevaluated);
AssociatedFunction = ParseOpenMPParensExpr(
- getOpenMPDirectiveName(OMPD_declare_variant), RLoc,
+ getOpenMPDirectiveName(OMPD_declare_variant, OMPVersion), RLoc,
/*IsAddressOfOperand=*/true);
}
if (!AssociatedFunction.isUsable()) {
@@ -1483,7 +1489,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
case OMPC_append_args:
if (!AppendArgs.empty()) {
Diag(AppendArgsLoc, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(OMPD_declare_variant)
+ << getOpenMPDirectiveName(OMPD_declare_variant, OMPVersion)
<< getOpenMPClauseName(CKind) << 0;
IsError = true;
}
@@ -1740,8 +1746,9 @@ void Parser::ParseOpenMPAssumesDirective(OpenMPDirectiveKind DKind,
bool NextIsLPar = Tok.is(tok::l_paren);
// Handle unknown clauses by skipping them.
if (Idx == -1) {
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
Diag(StartLoc, diag::warn_omp_unknown_assumption_clause_missing_id)
- << llvm::omp::getOpenMPDirectiveName(DKind)
+ << llvm::omp::getOpenMPDirectiveName(DKind, OMPVersion)
<< llvm::omp::getAllAssumeClauseOptions() << NextIsLPar;
if (NextIsLPar)
SkipBraces(II ? II->getName() : "", /* IssueNote */ true);
@@ -1854,8 +1861,9 @@ void Parser::ParseOMPDeclareTargetClauses(
bool IsIndirectClause = getLangOpts().OpenMP >= 51 &&
getOpenMPClauseKind(ClauseName) == OMPC_indirect;
if (DTCI.Indirect && IsIndirectClause) {
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(OMPD_declare_target)
+ << getOpenMPDirectiveName(OMPD_declare_target, OMPVersion)
<< getOpenMPClauseName(OMPC_indirect) << 0;
break;
}
@@ -1988,8 +1996,9 @@ void Parser::skipUntilPragmaOpenMPEnd(OpenMPDirectiveKind DKind) {
if (Tok.is(tok::annot_pragma_openmp_end))
return;
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
- << getOpenMPDirectiveName(DKind);
+ << getOpenMPDirectiveName(DKind, OMPVersion);
while (Tok.isNot(tok::annot_pragma_openmp_end))
ConsumeAnyToken();
}
@@ -2008,10 +2017,12 @@ void Parser::parseOMPEndDirective(OpenMPDirectiveKind BeginKind,
return;
}
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
Diag(FoundLoc, diag::err_expected_end_declare_target_or_variant)
<< DiagSelection;
Diag(BeginLoc, diag::note_matching)
- << ("'#pragma omp " + getOpenMPDirectiveName(BeginKind) + "'").str();
+ << ("'#pragma omp " + getOpenMPDirectiveName(BeginKind, OMPVersion) + "'")
+ .str();
if (SkipUntilOpenMPEnd)
SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
}
@@ -2070,6 +2081,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
"Not an OpenMP directive!");
ParsingOpenMPDirectiveRAII DirScope(*this);
ParenBraceBracketBalancer BalancerRAIIObj(*this);
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
SourceLocation Loc;
OpenMPDirectiveKind DKind;
@@ -2163,7 +2175,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
llvm::SmallBitVector SeenClauses(llvm::omp::Clause_enumSize + 1);
if (Tok.is(tok::annot_pragma_openmp_end)) {
Diag(Tok, diag::err_omp_expected_clause)
- << getOpenMPDirectiveName(OMPD_requires);
+ << getOpenMPDirectiveName(OMPD_requires, OMPVersion);
break;
}
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
@@ -2190,7 +2202,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
// Consume final annot_pragma_openmp_end
if (Clauses.empty()) {
Diag(Tok, diag::err_omp_expected_clause)
- << getOpenMPDirectiveName(OMPD_requires);
+ << getOpenMPDirectiveName(OMPD_requires, OMPVersion);
ConsumeAnnotationToken();
return nullptr;
}
@@ -2378,7 +2390,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
case OMPD_end_declare_target: {
if (!Actions.OpenMP().isInOpenMPDeclareTargetContext()) {
Diag(Tok, diag::err_omp_unexpected_directive)
- << 1 << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind, OMPVersion);
break;
}
const SemaOpenMP::DeclareTargetContextInfo &DTCI =
@@ -2388,7 +2400,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
}
case OMPD_assume: {
Diag(Tok, diag::err_omp_unexpected_directive)
- << 1 << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind, OMPVersion);
break;
}
case OMPD_unknown:
@@ -2401,7 +2413,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
case Category::Subsidiary:
case Category::Utility:
Diag(Tok, diag::err_omp_unexpected_directive)
- << 1 << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind, OMPVersion);
break;
case Category::Declarative:
case Category::Informational:
@@ -2418,6 +2430,7 @@ StmtResult Parser::ParseOpenMPExecutableDirective(
ParsedStmtContext StmtCtx, OpenMPDirectiveKind DKind, SourceLocation Loc,
bool ReadDirectiveWithinMetadirective) {
assert(isOpenMPExecutableDirective(DKind) && "Unexpected directive category");
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
bool HasAssociatedStatement = true;
Association Assoc = getDirectiveAssociation(DKind);
@@ -2431,7 +2444,7 @@ StmtResult Parser::ParseOpenMPExecutableDirective(
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
ParsedStmtContext()) {
Diag(Tok, diag::err_omp_immediate_directive)
- << getOpenMPDirectiveName(DKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion) << 0;
if (DKind == OMPD_error) {
SkipUntil(tok::annot_pragma_openmp_end);
return StmtError();
@@ -2541,7 +2554,8 @@ StmtResult Parser::ParseOpenMPExecutableDirective(
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
ParsedStmtContext()) {
Diag(Loc, diag::err_omp_immediate_directive)
- << getOpenMPDirectiveName(DKind) << 1 << getOpenMPClauseName(CK);
+ << getOpenMPDirectiveName(DKind, OMPVersion) << 1
+ << getOpenMPClauseName(CK);
}
HasAssociatedStatement = false;
}
@@ -2551,7 +2565,7 @@ StmtResult Parser::ParseOpenMPExecutableDirective(
if ((DKind == OMPD_tile || DKind == OMPD_stripe) &&
!SeenClauses[unsigned(OMPC_sizes)]) {
Diag(Loc, diag::err_omp_required_clause)
- << getOpenMPDirectiveName(DKind) << "sizes";
+ << getOpenMPDirectiveName(DKind, OMPVersion) << "sizes";
}
StmtResult AssociatedStmt;
@@ -2707,6 +2721,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
SourceLocation Loc = ReadDirectiveWithinMetadirective
? Tok.getLocation()
: ConsumeAnnotationToken();
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
OpenMPDirectiveKind DKind = parseOpenMPDirectiveKind(*this);
if (ReadDirectiveWithinMetadirective && DKind == OMPD_unknown) {
Diag(Tok, diag::err_omp_unknown_directive);
@@ -2909,7 +2924,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
ParsedStmtContext()) {
Diag(Tok, diag::err_omp_immediate_directive)
- << getOpenMPDirectiveName(DKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion) << 0;
}
ConsumeToken();
DeclDirectiveListParserHelper Helper(this, DKind);
@@ -2928,7 +2943,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
ParsedStmtContext()) {
Diag(Tok, diag::err_omp_immediate_directive)
- << getOpenMPDirectiveName(DKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion) << 0;
}
ConsumeToken();
DeclDirectiveListParserHelper Helper(this, DKind);
@@ -3001,7 +3016,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
if (HasImplicitMappings) {
Diag(Tok, diag::err_omp_unexpected_directive)
- << 1 << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind, OMPVersion);
SkipUntil(tok::annot_pragma_openmp_end);
break;
}
@@ -3020,7 +3035,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
case OMPD_end_declare_variant:
case OMPD_declare_variant:
Diag(Tok, diag::err_omp_unexpected_directive)
- << 1 << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind, OMPVersion);
SkipUntil(tok::annot_pragma_openmp_end);
break;
case OMPD_assume: {
@@ -3049,10 +3064,11 @@ bool Parser::ParseOpenMPSimpleVarList(
const llvm::function_ref<void(CXXScopeSpec &, DeclarationNameInfo)>
&Callback,
bool AllowScopeSpecifier) {
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
// Parse '('.
BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
if (T.expectAndConsume(diag::err_expected_lparen_after,
- getOpenMPDirectiveName(Kind).data()))
+ getOpenMPDirectiveName(Kind, OMPVersion).data()))
return true;
bool IsCorrect = true;
bool NoIdentIsFound = true;
@@ -3205,11 +3221,14 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
OMPClause *Clause = nullptr;
bool ErrorFound = false;
bool WrongDirective = false;
+ unsigned OMPVersion = Actions.getLangOpts().OpenMP;
+
// Check if clause is allowed for the given directive.
if (CKind != OMPC_unknown &&
!isAllowedClauseForDirective(DKind, CKind, getLangOpts().OpenMP)) {
Diag(Tok, diag::err_omp_unexpected_clause)
- << getOpenMPClauseName(CKind) << getOpenMPDirectiveName(DKind);
+ << getOpenMPClauseName(CKind)
+ << getOpenMPDirectiveName(DKind, OMPVersion);
ErrorFound = true;
WrongDirective = true;
}
@@ -3264,7 +3283,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
// At most one message clause can appear on the directive
if (!FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
@@ -3298,7 +3318,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
// At most one bind clause can appear on a loop directive.
if (!FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
@@ -3320,7 +3341,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
if ((getLangOpts().OpenMP < 50 || CKind != OMPC_defaultmap) &&
(CKind != OMPC_order || getLangOpts().OpenMP >= 51) && !FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
[[fallthrough]];
@@ -3359,7 +3381,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
// Each of the requires clauses can appear at most once on the directive.
if (!FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
@@ -3369,12 +3392,13 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
// OpenMP [6.0, self_maps clause]
if (getLangOpts().OpenMP < 60) {
Diag(Tok, diag::err_omp_expected_clause)
- << getOpenMPDirectiveName(OMPD_requires);
+ << getOpenMPDirectiveName(OMPD_requires, OMPVersion);
ErrorFound = true;
}
if (!FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
Clause = ParseOpenMPClause(CKind, WrongDirective);
@@ -3382,7 +3406,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
case OMPC_update:
if (!FirstClause) {
Diag(Tok, diag::err_omp_more_one_clause)
- << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
@@ -3394,7 +3419,8 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
case OMPC_thread...
[truncated]
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems to be reasonable as far as I can tell.
I DO wonder if getOpenMPDirectiveName
should lose non-version overload though, so we make sure we get this right everywhere.
/// Version of the effective OpenMP spec (used to select directive name | ||
/// spelling). | ||
unsigned OpenMP : 8; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe instead store openmp version in OMPClausePrinter?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
clang/lib/AST/StmtPrinter.cpp
Outdated
@@ -965,13 +965,13 @@ void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) { | |||
void StmtPrinter::VisitOMPCancellationPointDirective( | |||
OMPCancellationPointDirective *Node) { | |||
Indent() << "#pragma omp cancellation point " | |||
<< getOpenMPDirectiveName(Node->getCancelRegion()); | |||
<< getOpenMPDirectiveName(Node->getCancelRegion(), Policy.OpenMP); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The version can be obtained via Context->getLangOpts().OpenMP, if Context is non-nullptr.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
clang/lib/AST/StmtPrinter.cpp
Outdated
@@ -73,13 +73,16 @@ namespace { | |||
PrintingPolicy Policy; | |||
std::string NL; | |||
const ASTContext *Context; | |||
unsigned Version; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think better not to add Version here, just get it from Context where required. This class is a generic Stmt/Expr printer, Version is confusing here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oops, you're right. Removed.
The OpenMP version is stored in language options in ASTContext. If the context is not available, use the fallback version.
RFC: https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507