static constexpr std::size_t DefaultMinimumLength = 2;
/// The default value for ignored parameter names.
-static const std::string DefaultIgnoredParameterNames =
- optutils::serializeStringList({"\"\"", "iterator", "Iterator", "begin",
- "Begin", "end", "End", "first", "First",
- "last", "Last", "lhs", "LHS", "rhs", "RHS"});
+static constexpr llvm::StringLiteral DefaultIgnoredParameterNames = "\"\";"
+ "iterator;"
+ "Iterator;"
+ "begin;"
+ "Begin;"
+ "end;"
+ "End;"
+ "first;"
+ "First;"
+ "last;"
+ "Last;"
+ "lhs;"
+ "LHS;"
+ "rhs;"
+ "RHS";
/// The default value for ignored parameter type suffixes.
-static const std::string DefaultIgnoredParameterTypeSuffixes =
- optutils::serializeStringList({"bool",
- "Bool",
- "_Bool",
- "it",
- "It",
- "iterator",
- "Iterator",
- "inputit",
- "InputIt",
- "forwardit",
- "ForwardIt",
- "bidirit",
- "BidirIt",
- "constiterator",
- "const_iterator",
- "Const_Iterator",
- "Constiterator",
- "ConstIterator",
- "RandomIt",
- "randomit",
- "random_iterator",
- "ReverseIt",
- "reverse_iterator",
- "reverse_const_iterator",
- "ConstReverseIterator",
- "Const_Reverse_Iterator",
- "const_reverse_iterator",
- "Constreverseiterator",
- "constreverseiterator"});
+static constexpr llvm::StringLiteral DefaultIgnoredParameterTypeSuffixes =
+ "bool;"
+ "Bool;"
+ "_Bool;"
+ "it;"
+ "It;"
+ "iterator;"
+ "Iterator;"
+ "inputit;"
+ "InputIt;"
+ "forwardit;"
+ "ForwardIt;"
+ "bidirit;"
+ "BidirIt;"
+ "constiterator;"
+ "const_iterator;"
+ "Const_Iterator;"
+ "Constiterator;"
+ "ConstIterator;"
+ "RandomIt;"
+ "randomit;"
+ "random_iterator;"
+ "ReverseIt;"
+ "reverse_iterator;"
+ "reverse_const_iterator;"
+ "ConstReverseIterator;"
+ "Const_Reverse_Iterator;"
+ "const_reverse_iterator;"
+ "Constreverseiterator;"
+ "constreverseiterator";
/// The default value for the QualifiersMix check option.
static constexpr bool DefaultQualifiersMix = false;
#include "TypeMismatchCheck.h"
#include "clang/Lex/Lexer.h"
#include "clang/Tooling/FixIt.h"
+#include "llvm/ADT/StringSet.h"
#include <map>
-#include <unordered_set>
using namespace clang::ast_matchers;
///
/// \returns true if the pair matches
static bool
-isMPITypeMatching(const std::multimap<BuiltinType::Kind, std::string> &MultiMap,
- const BuiltinType::Kind Kind,
- const std::string &MPIDatatype) {
+isMPITypeMatching(const std::multimap<BuiltinType::Kind, StringRef> &MultiMap,
+ const BuiltinType::Kind Kind, StringRef MPIDatatype) {
auto ItPair = MultiMap.equal_range(Kind);
while (ItPair.first != ItPair.second) {
if (ItPair.first->second == MPIDatatype)
/// \param MPIDatatype name of the MPI datatype
///
/// \returns true if the type is a standard type
-static bool isStandardMPIDatatype(const std::string &MPIDatatype) {
- static std::unordered_set<std::string> AllTypes = {
- "MPI_C_BOOL",
- "MPI_CHAR",
- "MPI_SIGNED_CHAR",
- "MPI_UNSIGNED_CHAR",
- "MPI_WCHAR",
- "MPI_INT",
- "MPI_LONG",
- "MPI_SHORT",
- "MPI_LONG_LONG",
- "MPI_LONG_LONG_INT",
- "MPI_UNSIGNED",
- "MPI_UNSIGNED_SHORT",
- "MPI_UNSIGNED_LONG",
- "MPI_UNSIGNED_LONG_LONG",
- "MPI_FLOAT",
- "MPI_DOUBLE",
- "MPI_LONG_DOUBLE",
- "MPI_C_COMPLEX",
- "MPI_C_FLOAT_COMPLEX",
- "MPI_C_DOUBLE_COMPLEX",
- "MPI_C_LONG_DOUBLE_COMPLEX",
- "MPI_INT8_T",
- "MPI_INT16_T",
- "MPI_INT32_T",
- "MPI_INT64_T",
- "MPI_UINT8_T",
- "MPI_UINT16_T",
- "MPI_UINT32_T",
- "MPI_UINT64_T",
- "MPI_CXX_BOOL",
- "MPI_CXX_FLOAT_COMPLEX",
- "MPI_CXX_DOUBLE_COMPLEX",
- "MPI_CXX_LONG_DOUBLE_COMPLEX"};
+static bool isStandardMPIDatatype(StringRef MPIDatatype) {
+ static llvm::StringSet<> AllTypes = {"MPI_C_BOOL",
+ "MPI_CHAR",
+ "MPI_SIGNED_CHAR",
+ "MPI_UNSIGNED_CHAR",
+ "MPI_WCHAR",
+ "MPI_INT",
+ "MPI_LONG",
+ "MPI_SHORT",
+ "MPI_LONG_LONG",
+ "MPI_LONG_LONG_INT",
+ "MPI_UNSIGNED",
+ "MPI_UNSIGNED_SHORT",
+ "MPI_UNSIGNED_LONG",
+ "MPI_UNSIGNED_LONG_LONG",
+ "MPI_FLOAT",
+ "MPI_DOUBLE",
+ "MPI_LONG_DOUBLE",
+ "MPI_C_COMPLEX",
+ "MPI_C_FLOAT_COMPLEX",
+ "MPI_C_DOUBLE_COMPLEX",
+ "MPI_C_LONG_DOUBLE_COMPLEX",
+ "MPI_INT8_T",
+ "MPI_INT16_T",
+ "MPI_INT32_T",
+ "MPI_INT64_T",
+ "MPI_UINT8_T",
+ "MPI_UINT16_T",
+ "MPI_UINT32_T",
+ "MPI_UINT64_T",
+ "MPI_CXX_BOOL",
+ "MPI_CXX_FLOAT_COMPLEX",
+ "MPI_CXX_DOUBLE_COMPLEX",
+ "MPI_CXX_LONG_DOUBLE_COMPLEX"};
return AllTypes.find(MPIDatatype) != AllTypes.end();
}
/// \returns true if the type matches
static bool isBuiltinTypeMatching(const BuiltinType *Builtin,
std::string &BufferTypeName,
- const std::string &MPIDatatype,
+ StringRef MPIDatatype,
const LangOptions &LO) {
- static std::multimap<BuiltinType::Kind, std::string> BuiltinMatches = {
+ static std::multimap<BuiltinType::Kind, StringRef> BuiltinMatches = {
// On some systems like PPC or ARM, 'char' is unsigned by default which is
// why distinct signedness for the buffer and MPI type is tolerated.
{BuiltinType::SChar, "MPI_CHAR"},
/// \returns true if the type matches or the buffer type is unknown
static bool isCComplexTypeMatching(const ComplexType *const Complex,
std::string &BufferTypeName,
- const std::string &MPIDatatype,
+ StringRef MPIDatatype,
const LangOptions &LO) {
- static std::multimap<BuiltinType::Kind, std::string> ComplexCMatches = {
+ static std::multimap<BuiltinType::Kind, StringRef> ComplexCMatches = {
{BuiltinType::Float, "MPI_C_COMPLEX"},
{BuiltinType::Float, "MPI_C_FLOAT_COMPLEX"},
{BuiltinType::Double, "MPI_C_DOUBLE_COMPLEX"},
/// \returns true if the type matches or the buffer type is unknown
static bool
isCXXComplexTypeMatching(const TemplateSpecializationType *const Template,
- std::string &BufferTypeName,
- const std::string &MPIDatatype,
+ std::string &BufferTypeName, StringRef MPIDatatype,
const LangOptions &LO) {
- static std::multimap<BuiltinType::Kind, std::string> ComplexCXXMatches = {
+ static std::multimap<BuiltinType::Kind, StringRef> ComplexCXXMatches = {
{BuiltinType::Float, "MPI_CXX_FLOAT_COMPLEX"},
{BuiltinType::Double, "MPI_CXX_DOUBLE_COMPLEX"},
{BuiltinType::LongDouble, "MPI_CXX_LONG_DOUBLE_COMPLEX"}};
/// \returns true if the type matches or the buffer type is unknown
static bool isTypedefTypeMatching(const TypedefType *const Typedef,
std::string &BufferTypeName,
- const std::string &MPIDatatype) {
- static llvm::StringMap<std::string> FixedWidthMatches = {
+ StringRef MPIDatatype) {
+ static llvm::StringMap<StringRef> FixedWidthMatches = {
{"int8_t", "MPI_INT8_T"}, {"int16_t", "MPI_INT16_T"},
{"int32_t", "MPI_INT32_T"}, {"int64_t", "MPI_INT64_T"},
{"uint8_t", "MPI_UINT8_T"}, {"uint16_t", "MPI_UINT16_T"},
const Type *ArgType = argumentType(CE, BufferIdx);
// Skip unknown MPI datatypes and void pointers.
- if (!isStandardMPIDatatype(std::string(MPIDatatype)) ||
- ArgType->isVoidType())
+ if (!isStandardMPIDatatype(MPIDatatype) || ArgType->isVoidType())
return;
BufferTypes.push_back(ArgType);
bool Error = false;
if (const auto *Typedef = BT->getAs<TypedefType>()) {
- Error = !isTypedefTypeMatching(Typedef, BufferTypeName,
- std::string(MPIDatatypes[I]));
+ Error = !isTypedefTypeMatching(Typedef, BufferTypeName, MPIDatatypes[I]);
} else if (const auto *Complex = BT->getAs<ComplexType>()) {
- Error = !isCComplexTypeMatching(Complex, BufferTypeName,
- std::string(MPIDatatypes[I]), LO);
+ Error =
+ !isCComplexTypeMatching(Complex, BufferTypeName, MPIDatatypes[I], LO);
} else if (const auto *Template = BT->getAs<TemplateSpecializationType>()) {
Error = !isCXXComplexTypeMatching(Template, BufferTypeName,
- std::string(MPIDatatypes[I]), LO);
+ MPIDatatypes[I], LO);
} else if (const auto *Builtin = BT->getAs<BuiltinType>()) {
- Error = !isBuiltinTypeMatching(Builtin, BufferTypeName,
- std::string(MPIDatatypes[I]), LO);
+ Error =
+ !isBuiltinTypeMatching(Builtin, BufferTypeName, MPIDatatypes[I], LO);
}
if (Error) {