Fixed #1024 (Preprocessor: doesn't expand macro in macro)
This commit is contained in:
parent
418d93eafb
commit
e2473314b5
|
@ -302,21 +302,26 @@ void Tokenizer::createTokens(std::istream &code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If token contains # characters, split it up
|
// If token contains # characters, split it up
|
||||||
std::string temp;
|
if (CurrentToken.find("##") == std::string::npos)
|
||||||
for (std::string::size_type i = 0; i < CurrentToken.length(); ++i)
|
addtoken(CurrentToken.c_str(), lineno, FileIndex);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (CurrentToken[i] == '#' && CurrentToken.length() + 1 > i && CurrentToken[i+1] == '#')
|
std::string temp;
|
||||||
|
for (std::string::size_type i = 0; i < CurrentToken.length(); ++i)
|
||||||
{
|
{
|
||||||
addtoken(temp.c_str(), lineno, FileIndex);
|
if (CurrentToken[i] == '#' && CurrentToken.length() + 1 > i && CurrentToken[i+1] == '#')
|
||||||
temp.clear();
|
{
|
||||||
addtoken("##", lineno, FileIndex);
|
addtoken(temp.c_str(), lineno, FileIndex);
|
||||||
++i;
|
temp.clear();
|
||||||
|
addtoken("##", lineno, FileIndex);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
temp += CurrentToken[i];
|
||||||
}
|
}
|
||||||
else
|
addtoken(temp.c_str(), lineno, FileIndex);
|
||||||
temp += CurrentToken[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addtoken(temp.c_str(), lineno, FileIndex);
|
|
||||||
CurrentToken.clear();
|
CurrentToken.clear();
|
||||||
|
|
||||||
if (ch == '\n')
|
if (ch == '\n')
|
||||||
|
@ -341,8 +346,25 @@ void Tokenizer::createTokens(std::istream &code)
|
||||||
|
|
||||||
CurrentToken += ch;
|
CurrentToken += ch;
|
||||||
}
|
}
|
||||||
addtoken(CurrentToken.c_str(), lineno, FileIndex);
|
if (CurrentToken.find("##") == std::string::npos)
|
||||||
|
addtoken(CurrentToken.c_str(), lineno, FileIndex);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string temp;
|
||||||
|
for (std::string::size_type i = 0; i < CurrentToken.length(); ++i)
|
||||||
|
{
|
||||||
|
if (CurrentToken[i] == '#' && CurrentToken.length() + 1 > i && CurrentToken[i+1] == '#')
|
||||||
|
{
|
||||||
|
addtoken(temp.c_str(), lineno, FileIndex);
|
||||||
|
temp.clear();
|
||||||
|
addtoken("##", lineno, FileIndex);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
temp += CurrentToken[i];
|
||||||
|
}
|
||||||
|
addtoken(temp.c_str(), lineno, FileIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyTypedef()
|
void Tokenizer::simplifyTypedef()
|
||||||
|
|
|
@ -1200,6 +1200,13 @@ private:
|
||||||
|
|
||||||
// Compare results..
|
// Compare results..
|
||||||
ASSERT_EQUALS("\nfoo_20=20;\n", OurPreprocessor::expandMacros(filedata2));
|
ASSERT_EQUALS("\nfoo_20=20;\n", OurPreprocessor::expandMacros(filedata2));
|
||||||
|
|
||||||
|
const char filedata3[] = "#define ABCD 123\n"
|
||||||
|
"#define A(B) A##B\n"
|
||||||
|
"A(BCD)\n";
|
||||||
|
|
||||||
|
// Compare results..
|
||||||
|
ASSERT_EQUALS("\n\n123\n", OurPreprocessor::expandMacros(filedata3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue