Add -std=c++17 and allow semicolon in 'if ()'
This commit is contained in:
parent
cb06aebdab
commit
b04d1815ed
|
@ -606,6 +606,8 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
mSettings->standards.cpp = Standards::CPP11;
|
mSettings->standards.cpp = Standards::CPP11;
|
||||||
} else if (std::strcmp(argv[i], "--std=c++14") == 0) {
|
} else if (std::strcmp(argv[i], "--std=c++14") == 0) {
|
||||||
mSettings->standards.cpp = Standards::CPP14;
|
mSettings->standards.cpp = Standards::CPP14;
|
||||||
|
} else if (std::strcmp(argv[i], "--std=c++17") == 0) {
|
||||||
|
mSettings->standards.cpp = Standards::CPP17;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output formatter
|
// Output formatter
|
||||||
|
@ -1095,7 +1097,9 @@ void CmdLineParser::printHelp()
|
||||||
" * c++11\n"
|
" * c++11\n"
|
||||||
" C++ code is C++11 compatible\n"
|
" C++ code is C++11 compatible\n"
|
||||||
" * c++14\n"
|
" * c++14\n"
|
||||||
" C++ code is C++14 compatible (default)\n"
|
" C++ code is C++14 compatible\n"
|
||||||
|
" * c++17\n"
|
||||||
|
" C++ code is C++17 compatible (default)\n"
|
||||||
" --suppress=<spec> Suppress warnings that match <spec>. The format of\n"
|
" --suppress=<spec> Suppress warnings that match <spec>. The format of\n"
|
||||||
" <spec> is:\n"
|
" <spec> is:\n"
|
||||||
" [error id]:[filename]:[line]\n"
|
" [error id]:[filename]:[line]\n"
|
||||||
|
|
|
@ -36,10 +36,10 @@ struct Standards {
|
||||||
enum cstd_t { C89, C99, C11, CLatest=C11 } c;
|
enum cstd_t { C89, C99, C11, CLatest=C11 } c;
|
||||||
|
|
||||||
/** C++ code standard */
|
/** C++ code standard */
|
||||||
enum cppstd_t { CPP03, CPP11, CPP14, CPPLatest=CPP14 } cpp;
|
enum cppstd_t { CPP03, CPP11, CPP14, CPP17, CPPLatest=CPP17 } cpp;
|
||||||
|
|
||||||
/** This constructor clear all the variables **/
|
/** This constructor clear all the variables **/
|
||||||
Standards() : c(C11), cpp(CPP14) {}
|
Standards() : c(C11), cpp(CPP17) {}
|
||||||
|
|
||||||
bool setC(const std::string& str) {
|
bool setC(const std::string& str) {
|
||||||
if (str == "c89" || str == "C89") {
|
if (str == "c89" || str == "C89") {
|
||||||
|
@ -69,6 +69,10 @@ struct Standards {
|
||||||
cpp = CPP14;
|
cpp = CPP14;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (str == "c++17" || str == "C++17") {
|
||||||
|
cpp = CPP17;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9040,7 +9040,7 @@ void Tokenizer::findGarbageCode() const
|
||||||
if (!Token::Match(tok->next(), "( !!)"))
|
if (!Token::Match(tok->next(), "( !!)"))
|
||||||
syntaxError(tok);
|
syntaxError(tok);
|
||||||
if (tok->str() != "for") {
|
if (tok->str() != "for") {
|
||||||
if (isGarbageExpr(tok->next(), tok->linkAt(1)))
|
if (isGarbageExpr(tok->next(), tok->linkAt(1), mSettings->standards.cpp>=Standards::cppstd_t::CPP17))
|
||||||
syntaxError(tok);
|
syntaxError(tok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9197,12 +9197,12 @@ void Tokenizer::findGarbageCode() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Tokenizer::isGarbageExpr(const Token *start, const Token *end)
|
bool Tokenizer::isGarbageExpr(const Token *start, const Token *end, bool allowSemicolon)
|
||||||
{
|
{
|
||||||
for (const Token *tok = start; tok != end; tok = tok->next()) {
|
for (const Token *tok = start; tok != end; tok = tok->next()) {
|
||||||
if (tok->isControlFlowKeyword())
|
if (tok->isControlFlowKeyword())
|
||||||
return true;
|
return true;
|
||||||
if (tok->str() == ";")
|
if (!allowSemicolon && tok->str() == ";")
|
||||||
return true;
|
return true;
|
||||||
if (tok->str() == "{")
|
if (tok->str() == "{")
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
|
|
|
@ -632,7 +632,7 @@ private:
|
||||||
void findGarbageCode() const;
|
void findGarbageCode() const;
|
||||||
|
|
||||||
/** Detect garbage expression */
|
/** Detect garbage expression */
|
||||||
static bool isGarbageExpr(const Token *start, const Token *end);
|
static bool isGarbageExpr(const Token *start, const Token *end, bool allowSemicolon);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove __declspec()
|
* Remove __declspec()
|
||||||
|
|
Loading…
Reference in New Issue