Skip to content

Commit ce7b670

Browse files
authored
[clang][OpenMP] Simplify check for repeated clauses (#93611)
The `FirstClauses` is a vector of pointer-bool pairs, and the pointer part of the pair is never used. Replace the vector with std::bitset, and rename it to `SeenClauses` to make the purpose of it a bit clearer.
1 parent 9faa623 commit ce7b670

File tree

1 file changed

+24
-36
lines changed

1 file changed

+24
-36
lines changed

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
#include "clang/Sema/SemaAMDGPU.h"
2525
#include "clang/Sema/SemaCodeCompletion.h"
2626
#include "clang/Sema/SemaOpenMP.h"
27-
#include "llvm/ADT/PointerIntPair.h"
2827
#include "llvm/ADT/StringSwitch.h"
2928
#include "llvm/Frontend/OpenMP/OMPAssume.h"
3029
#include "llvm/Frontend/OpenMP/OMPContext.h"
30+
#include <bitset>
3131
#include <optional>
3232

3333
using namespace clang;
@@ -1646,19 +1646,17 @@ bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc,
16461646
void Parser::ParseOpenMPClauses(OpenMPDirectiveKind DKind,
16471647
SmallVectorImpl<OMPClause *> &Clauses,
16481648
SourceLocation Loc) {
1649-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
1650-
llvm::omp::Clause_enumSize + 1>
1651-
FirstClauses(llvm::omp::Clause_enumSize + 1);
1649+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
16521650
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
16531651
OpenMPClauseKind CKind = Tok.isAnnotation()
16541652
? OMPC_unknown
16551653
: getOpenMPClauseKind(PP.getSpelling(Tok));
16561654
Actions.OpenMP().StartOpenMPClause(CKind);
1657-
OMPClause *Clause = ParseOpenMPClause(
1658-
DKind, CKind, !FirstClauses[unsigned(CKind)].getInt());
1655+
OMPClause *Clause =
1656+
ParseOpenMPClause(DKind, CKind, !SeenClauses[unsigned(CKind)]);
16591657
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
16601658
StopBeforeMatch);
1661-
FirstClauses[unsigned(CKind)].setInt(true);
1659+
SeenClauses[unsigned(CKind)] = true;
16621660
if (Clause != nullptr)
16631661
Clauses.push_back(Clause);
16641662
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2114,19 +2112,17 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21142112
/*AllowScopeSpecifier=*/true)) {
21152113
SmallVector<OMPClause *, 1> Clauses;
21162114
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
2117-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2118-
llvm::omp::Clause_enumSize + 1>
2119-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2115+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
21202116
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
21212117
OpenMPClauseKind CKind =
21222118
Tok.isAnnotation() ? OMPC_unknown
21232119
: getOpenMPClauseKind(PP.getSpelling(Tok));
21242120
Actions.OpenMP().StartOpenMPClause(CKind);
2125-
OMPClause *Clause = ParseOpenMPClause(
2126-
OMPD_allocate, CKind, !FirstClauses[unsigned(CKind)].getInt());
2121+
OMPClause *Clause = ParseOpenMPClause(OMPD_allocate, CKind,
2122+
!SeenClauses[unsigned(CKind)]);
21272123
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
21282124
StopBeforeMatch);
2129-
FirstClauses[unsigned(CKind)].setInt(true);
2125+
SeenClauses[unsigned(CKind)] = true;
21302126
if (Clause != nullptr)
21312127
Clauses.push_back(Clause);
21322128
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2150,9 +2146,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21502146
case OMPD_requires: {
21512147
SourceLocation StartLoc = ConsumeToken();
21522148
SmallVector<OMPClause *, 5> Clauses;
2153-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2154-
llvm::omp::Clause_enumSize + 1>
2155-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2149+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
21562150
if (Tok.is(tok::annot_pragma_openmp_end)) {
21572151
Diag(Tok, diag::err_omp_expected_clause)
21582152
<< getOpenMPDirectiveName(OMPD_requires);
@@ -2163,11 +2157,11 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
21632157
? OMPC_unknown
21642158
: getOpenMPClauseKind(PP.getSpelling(Tok));
21652159
Actions.OpenMP().StartOpenMPClause(CKind);
2166-
OMPClause *Clause = ParseOpenMPClause(
2167-
OMPD_requires, CKind, !FirstClauses[unsigned(CKind)].getInt());
2160+
OMPClause *Clause = ParseOpenMPClause(OMPD_requires, CKind,
2161+
!SeenClauses[unsigned(CKind)]);
21682162
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
21692163
StopBeforeMatch);
2170-
FirstClauses[unsigned(CKind)].setInt(true);
2164+
SeenClauses[unsigned(CKind)] = true;
21712165
if (Clause != nullptr)
21722166
Clauses.push_back(Clause);
21732167
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2510,9 +2504,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
25102504
ParsingOpenMPDirectiveRAII DirScope(*this);
25112505
ParenBraceBracketBalancer BalancerRAIIObj(*this);
25122506
SmallVector<OMPClause *, 5> Clauses;
2513-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2514-
llvm::omp::Clause_enumSize + 1>
2515-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2507+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
25162508
unsigned ScopeFlags = Scope::FnScope | Scope::DeclScope |
25172509
Scope::CompoundStmtScope | Scope::OpenMPDirectiveScope;
25182510
SourceLocation Loc = ReadDirectiveWithinMetadirective
@@ -2717,19 +2709,17 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
27172709
/*AllowScopeSpecifier=*/false)) {
27182710
SmallVector<OMPClause *, 1> Clauses;
27192711
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
2720-
SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>,
2721-
llvm::omp::Clause_enumSize + 1>
2722-
FirstClauses(llvm::omp::Clause_enumSize + 1);
2712+
std::bitset<llvm::omp::Clause_enumSize + 1> SeenClauses;
27232713
while (Tok.isNot(tok::annot_pragma_openmp_end)) {
27242714
OpenMPClauseKind CKind =
27252715
Tok.isAnnotation() ? OMPC_unknown
27262716
: getOpenMPClauseKind(PP.getSpelling(Tok));
27272717
Actions.OpenMP().StartOpenMPClause(CKind);
2728-
OMPClause *Clause = ParseOpenMPClause(
2729-
OMPD_allocate, CKind, !FirstClauses[unsigned(CKind)].getInt());
2718+
OMPClause *Clause = ParseOpenMPClause(OMPD_allocate, CKind,
2719+
!SeenClauses[unsigned(CKind)]);
27302720
SkipUntil(tok::comma, tok::identifier, tok::annot_pragma_openmp_end,
27312721
StopBeforeMatch);
2732-
FirstClauses[unsigned(CKind)].setInt(true);
2722+
SeenClauses[unsigned(CKind)] = true;
27332723
if (Clause != nullptr)
27342724
Clauses.push_back(Clause);
27352725
if (Tok.is(tok::annot_pragma_openmp_end)) {
@@ -2926,13 +2916,11 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29262916
ImplicitClauseAllowed = false;
29272917
Actions.OpenMP().StartOpenMPClause(CKind);
29282918
HasImplicitClause = false;
2929-
OMPClause *Clause = ParseOpenMPClause(
2930-
DKind, CKind, !FirstClauses[unsigned(CKind)].getInt());
2931-
FirstClauses[unsigned(CKind)].setInt(true);
2932-
if (Clause) {
2933-
FirstClauses[unsigned(CKind)].setPointer(Clause);
2919+
OMPClause *Clause =
2920+
ParseOpenMPClause(DKind, CKind, !SeenClauses[unsigned(CKind)]);
2921+
SeenClauses[unsigned(CKind)] = true;
2922+
if (Clause)
29342923
Clauses.push_back(Clause);
2935-
}
29362924

29372925
// Skip ',' if any.
29382926
if (Tok.is(tok::comma))
@@ -2948,7 +2936,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29482936
// If the depend or doacross clause is specified, the ordered construct
29492937
// is a stand-alone directive.
29502938
for (auto CK : {OMPC_depend, OMPC_doacross}) {
2951-
if (FirstClauses[unsigned(CK)].getInt()) {
2939+
if (SeenClauses[unsigned(CK)]) {
29522940
if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) ==
29532941
ParsedStmtContext()) {
29542942
Diag(Loc, diag::err_omp_immediate_directive)
@@ -2960,7 +2948,7 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
29602948
}
29612949
}
29622950

2963-
if (DKind == OMPD_tile && !FirstClauses[unsigned(OMPC_sizes)].getInt()) {
2951+
if (DKind == OMPD_tile && !SeenClauses[unsigned(OMPC_sizes)]) {
29642952
Diag(Loc, diag::err_omp_required_clause)
29652953
<< getOpenMPDirectiveName(OMPD_tile) << "sizes";
29662954
}

0 commit comments

Comments
 (0)