brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · d02ab72 Raw
54 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "UseDefaultNoneCheck.h"10#include "clang/AST/OpenMPClause.h"11#include "clang/AST/StmtOpenMP.h"12#include "clang/ASTMatchers/ASTMatchFinder.h"13#include "clang/ASTMatchers/ASTMatchers.h"14 15using namespace clang::ast_matchers;16 17namespace clang::tidy::openmp {18 19void UseDefaultNoneCheck::registerMatchers(MatchFinder *Finder) {20  Finder->addMatcher(21      ompExecutableDirective(22          isAllowedToContainClauseKind(llvm::omp::OMPC_default),23          anyOf(unless(hasAnyClause(ompDefaultClause())),24                hasAnyClause(25                    ompDefaultClause(unless(isNoneKind())).bind("clause"))))26          .bind("directive"),27      this);28}29 30void UseDefaultNoneCheck::check(const MatchFinder::MatchResult &Result) {31  const auto *Directive =32      Result.Nodes.getNodeAs<OMPExecutableDirective>("directive");33  assert(Directive != nullptr && "Expected to match some directive.");34 35  if (const auto *Clause = Result.Nodes.getNodeAs<OMPDefaultClause>("clause")) {36    diag(Directive->getBeginLoc(),37         "OpenMP directive '%0' specifies 'default(%1)' clause, consider using "38         "'default(none)' clause instead")39        << getOpenMPDirectiveName(Directive->getDirectiveKind())40        << getOpenMPSimpleClauseTypeName(Clause->getClauseKind(),41                                         unsigned(Clause->getDefaultKind()));42    diag(Clause->getBeginLoc(), "existing 'default' clause specified here",43         DiagnosticIDs::Note);44    return;45  }46 47  diag(Directive->getBeginLoc(),48       "OpenMP directive '%0' does not specify 'default' clause, consider "49       "specifying 'default(none)' clause")50      << getOpenMPDirectiveName(Directive->getDirectiveKind());51}52 53} // namespace clang::tidy::openmp54