cppcheck/lib/keywords.cpp

230 lines
7.1 KiB
C++

/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2023 Cppcheck team.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "keywords.h"
#include "utils.h"
#include <cassert>
// see https://en.cppreference.com/w/c/keyword
#define C90_KEYWORDS \
"auto", "break", "case", "char", "const", "continue", "default", \
"do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", \
"register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", \
"union", "unsigned", "void", "volatile", "while"
#define C99_KEYWORDS \
"inline", "restrict", "_Bool", "_Complex", "_Imaginary"
#define C11_KEYWORDS \
"_Alignas", "_Alignof", "_Atomic", "_Generic", "_Noreturn", "_Static_assert", "_Thread_local"
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-macros"
#endif
#define C23_KEYWORDS \
"alignas", "alignof", "bool", "constexpr", "false", "nullptr", "static_assert", "thread_local", "true", "typeof", "typeof_unqual", \
"_BitInt", "_Decimal128", "_Decimal32", "_Decimal64"
#ifdef __clang__
#pragma clang diagnostic pop
#endif
static const std::unordered_set<std::string> c89_keywords_all = {
C90_KEYWORDS
};
static const std::unordered_set<std::string> c89_keywords = c89_keywords_all;
static const std::unordered_set<std::string> c99_keywords_all = {
C90_KEYWORDS, C99_KEYWORDS
};
static const std::unordered_set<std::string> c99_keywords = {
C99_KEYWORDS
};
static const std::unordered_set<std::string> c11_keywords_all = {
C90_KEYWORDS, C99_KEYWORDS, C11_KEYWORDS
};
static const std::unordered_set<std::string> c11_keywords = {
C11_KEYWORDS
};
/*
static const std::unordered_set<std::string> c23_keywords_all = {
C90_KEYWORDS, C99_KEYWORDS, C11_KEYWORDS, C23_KEYWORDS
};
static const std::unordered_set<std::string> c23_keywords = {
C23_KEYWORDS
};
*/
// see https://en.cppreference.com/w/cpp/keyword
#define CPP03_KEYWORDS \
"and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", \
"class", "compl", "const", "const_cast", "continue", "default", \
"delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", \
"float", "for", "friend", "goto", "if", "inline", "int", "long", \
"mutable", "namespace", "new", "not", "not_eq", "operator", \
"or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", \
"return", "short", "signed", "sizeof", "static", \
"static_cast", "struct", "switch", "template", "this", "throw", \
"true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", \
"virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
#define CPP11_KEYWORDS \
"alignas", "alignof", "char16_t", "char32_t", "constexpr", "decltype", \
"noexcept", "nullptr", "static_assert", "thread_local"
#define CPP20_KEYWORDS \
"char8_t", "concept", "consteval", "constinit", "co_await", \
"co_return", "co_yield", "requires"
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-macros"
#endif
#define CPP_TMTS_KEYWORDS \
"atomic_cancel", "atomic_commit", "atomic_noexcept", "synchronized"
#define CPP_REFL_TS_KEYWORDS \
"reflexpr"
#ifdef __clang__
#pragma clang diagnostic pop
#endif
static const std::unordered_set<std::string> cpp03_keywords_all = {
CPP03_KEYWORDS
};
static const std::unordered_set<std::string> cpp03_keywords = cpp03_keywords_all;
static const std::unordered_set<std::string> cpp11_keywords_all = {
CPP03_KEYWORDS, CPP11_KEYWORDS
};
static const std::unordered_set<std::string> cpp11_keywords = {
CPP11_KEYWORDS
};
static const std::unordered_set<std::string> cpp14_keywords_all = cpp11_keywords_all;
static const std::unordered_set<std::string> cpp14_keywords;
static const std::unordered_set<std::string> cpp17_keywords_all = cpp11_keywords_all;
static const std::unordered_set<std::string> cpp17_keywords;
static const std::unordered_set<std::string> cpp20_keywords_all = {
CPP03_KEYWORDS, CPP11_KEYWORDS, CPP20_KEYWORDS
};
static const std::unordered_set<std::string> cpp20_keywords = {
CPP20_KEYWORDS
};
static const std::unordered_set<std::string> cpp23_keywords;
static const std::unordered_set<std::string> cpp23_keywords_all = cpp20_keywords_all;
// cppcheck-suppress unusedFunction
const std::unordered_set<std::string>& Keywords::getAll(Standards::cstd_t cStd)
{
// cppcheck-suppress missingReturn
switch (cStd) {
case Standards::cstd_t::C89:
return c89_keywords_all;
case Standards::cstd_t::C99:
return c99_keywords_all;
case Standards::cstd_t::C11:
return c11_keywords_all;
/*case Standards::cstd_t::C23:
return c23_keywords_all;*/
}
cppcheck::unreachable();
}
// cppcheck-suppress unusedFunction
const std::unordered_set<std::string>& Keywords::getAll(Standards::cppstd_t cppStd) {
// cppcheck-suppress missingReturn
switch (cppStd) {
case Standards::cppstd_t::CPP03:
return cpp03_keywords_all;
case Standards::cppstd_t::CPP11:
return cpp11_keywords_all;
case Standards::cppstd_t::CPP14:
return cpp14_keywords_all;
case Standards::cppstd_t::CPP17:
return cpp17_keywords_all;
case Standards::cppstd_t::CPP20:
return cpp20_keywords_all;
case Standards::cppstd_t::CPP23:
return cpp23_keywords_all;
}
cppcheck::unreachable();
}
// cppcheck-suppress unusedFunction
const std::unordered_set<std::string>& Keywords::getOnly(Standards::cstd_t cStd)
{
// cppcheck-suppress missingReturn
switch (cStd) {
case Standards::cstd_t::C89:
return c89_keywords;
case Standards::cstd_t::C99:
return c99_keywords;
case Standards::cstd_t::C11:
return c11_keywords;
/*case Standards::cstd_t::C23:
return c23_keywords_all;*/
}
cppcheck::unreachable();
}
// cppcheck-suppress unusedFunction
const std::unordered_set<std::string>& Keywords::getOnly(Standards::cppstd_t cppStd)
{
// cppcheck-suppress missingReturn
switch (cppStd) {
case Standards::cppstd_t::CPP03:
return cpp03_keywords;
case Standards::cppstd_t::CPP11:
return cpp11_keywords;
case Standards::cppstd_t::CPP14:
return cpp14_keywords;
case Standards::cppstd_t::CPP17:
return cpp17_keywords;
case Standards::cppstd_t::CPP20:
return cpp20_keywords;
case Standards::cppstd_t::CPP23:
return cpp23_keywords;
}
cppcheck::unreachable();
}