Fixed #9452 (FP syntaxError - _Pragma before struct with two constructors)
This commit is contained in:
parent
6236beeb3f
commit
54a93c4374
|
@ -4352,6 +4352,8 @@ bool Tokenizer::simplifyTokenList1(const char FileName[])
|
||||||
|
|
||||||
createLinks();
|
createLinks();
|
||||||
|
|
||||||
|
removePragma();
|
||||||
|
|
||||||
reportUnknownMacros();
|
reportUnknownMacros();
|
||||||
|
|
||||||
simplifyHeaders();
|
simplifyHeaders();
|
||||||
|
@ -5214,6 +5216,22 @@ void Tokenizer::removeMacrosInGlobalScope()
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void Tokenizer::removePragma()
|
||||||
|
{
|
||||||
|
if (isC() && mSettings->standards.c == Standards::C89)
|
||||||
|
return;
|
||||||
|
if (isCPP() && mSettings->standards.cpp == Standards::CPP03)
|
||||||
|
return;
|
||||||
|
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
||||||
|
while (Token::simpleMatch(tok, "_Pragma (")) {
|
||||||
|
Token::eraseTokens(tok, tok->linkAt(1)->next());
|
||||||
|
tok->deleteThis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void Tokenizer::removeMacroInClassDef()
|
void Tokenizer::removeMacroInClassDef()
|
||||||
{
|
{
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
||||||
|
|
|
@ -252,6 +252,9 @@ public:
|
||||||
|
|
||||||
void addSemicolonAfterUnknownMacro();
|
void addSemicolonAfterUnknownMacro();
|
||||||
|
|
||||||
|
// Remove C99 and CPP11 _Pragma(str)
|
||||||
|
void removePragma();
|
||||||
|
|
||||||
/** Remove undefined macro in class definition:
|
/** Remove undefined macro in class definition:
|
||||||
* class DLLEXPORT Fred { };
|
* class DLLEXPORT Fred { };
|
||||||
* class Fred FINAL : Base { };
|
* class Fred FINAL : Base { };
|
||||||
|
|
|
@ -84,6 +84,8 @@ private:
|
||||||
|
|
||||||
TEST_CASE(syntax_case_default);
|
TEST_CASE(syntax_case_default);
|
||||||
|
|
||||||
|
TEST_CASE(removePragma);
|
||||||
|
|
||||||
TEST_CASE(foreach); // #3690
|
TEST_CASE(foreach); // #3690
|
||||||
TEST_CASE(ifconstexpr);
|
TEST_CASE(ifconstexpr);
|
||||||
|
|
||||||
|
@ -569,13 +571,13 @@ private:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tokenizeAndStringify(const char code[], const Settings &settings) {
|
std::string tokenizeAndStringify(const char code[], const Settings &settings, const char filename[] = "test.cpp") {
|
||||||
errout.str("");
|
errout.str("");
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer(&settings, this);
|
Tokenizer tokenizer(&settings, this);
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, filename);
|
||||||
if (!tokenizer.tokens())
|
if (!tokenizer.tokens())
|
||||||
return "";
|
return "";
|
||||||
return tokenizer.tokens()->stringifyList(false, true, false, true, false, nullptr, nullptr);
|
return tokenizer.tokens()->stringifyList(false, true, false, true, false, nullptr, nullptr);
|
||||||
|
@ -973,6 +975,21 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removePragma() {
|
||||||
|
const char code[] = "_Pragma(\"abc\") int x;";
|
||||||
|
Settings s;
|
||||||
|
|
||||||
|
s.standards.c = Standards::C89;
|
||||||
|
ASSERT_EQUALS("_Pragma ( \"abc\" ) int x ;", tokenizeAndStringify(code, s, "test.c"));
|
||||||
|
s.standards.c = Standards::CLatest;
|
||||||
|
ASSERT_EQUALS("int x ;", tokenizeAndStringify(code, s, "test.c"));
|
||||||
|
|
||||||
|
s.standards.cpp = Standards::CPP03;
|
||||||
|
ASSERT_EQUALS("_Pragma ( \"abc\" ) int x ;", tokenizeAndStringify(code, s, "test.cpp"));
|
||||||
|
s.standards.cpp = Standards::CPPLatest;
|
||||||
|
ASSERT_EQUALS("int x ;", tokenizeAndStringify(code, s, "test.cpp"));
|
||||||
|
}
|
||||||
|
|
||||||
void foreach () {
|
void foreach () {
|
||||||
// #3690,#5154
|
// #3690,#5154
|
||||||
const char code[] ="void f() { for each ( char c in MyString ) { Console::Write(c); } }";
|
const char code[] ="void f() { for each ( char c in MyString ) { Console::Write(c); } }";
|
||||||
|
|
Loading…
Reference in New Issue