Fixed #2919 (Wrong file name reported with #error in header)
This commit is contained in:
parent
ee7b8d53c6
commit
e82df7292f
|
@ -1673,6 +1673,9 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string
|
|||
}
|
||||
}
|
||||
|
||||
std::stack<std::string> filenames;
|
||||
filenames.push(filename);
|
||||
std::stack<unsigned int> lineNumbers;
|
||||
std::istringstream istr(filedata);
|
||||
std::string line;
|
||||
while (getline(istr, line))
|
||||
|
@ -1811,7 +1814,7 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string
|
|||
{
|
||||
Settings settings2(*settings);
|
||||
Preprocessor preprocessor(&settings2, errorLogger);
|
||||
preprocessor.error(filename, lineno, line);
|
||||
preprocessor.error(filenames.top(), lineno, line);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
@ -1829,6 +1832,25 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string
|
|||
{
|
||||
// We must not remove #file tags or line numbers
|
||||
// are corrupted. File tags are removed by the tokenizer.
|
||||
|
||||
// Keep location info updated
|
||||
if (line.compare(0, 7, "#file \"") == 0)
|
||||
{
|
||||
filenames.push(line.substr(7, line.size() - 8));
|
||||
lineNumbers.push(lineno);
|
||||
lineno = 0;
|
||||
}
|
||||
else if (line.compare(0, 8, "#endfile") == 0)
|
||||
{
|
||||
if (filenames.size() > 1U)
|
||||
filenames.pop();
|
||||
|
||||
if (!lineNumbers.empty())
|
||||
{
|
||||
lineno = lineNumbers.top();
|
||||
lineNumbers.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!match || line.compare(0, 1, "#") == 0)
|
||||
{
|
||||
|
|
|
@ -91,6 +91,7 @@ private:
|
|||
TEST_CASE(error2);
|
||||
|
||||
TEST_CASE(error3);
|
||||
TEST_CASE(error4); // #2919 - wrong filename is reported
|
||||
|
||||
TEST_CASE(if0_exclude);
|
||||
TEST_CASE(if0_whitespace);
|
||||
|
@ -639,6 +640,8 @@ private:
|
|||
|
||||
void error2()
|
||||
{
|
||||
errout.str("");
|
||||
|
||||
const char filedata[] = "#error ê\n"
|
||||
"#warning ê\n"
|
||||
"123";
|
||||
|
@ -653,6 +656,7 @@ private:
|
|||
|
||||
void error3()
|
||||
{
|
||||
errout.str("");
|
||||
Settings settings;
|
||||
settings.userDefines = "__cplusplus";
|
||||
const std::string code("#error hello world!\n");
|
||||
|
@ -660,6 +664,30 @@ private:
|
|||
ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout.str());
|
||||
}
|
||||
|
||||
// Ticket #2919 - wrong filename reported for #error
|
||||
void error4()
|
||||
{
|
||||
// In included file
|
||||
{
|
||||
errout.str("");
|
||||
Settings settings;
|
||||
settings.userDefines = "TEST";
|
||||
const std::string code("#file \"ab.h\"\n#error hello world!\n#endfile");
|
||||
Preprocessor::getcode(code, "TEST", "test.c", &settings, this);
|
||||
ASSERT_EQUALS("[ab.h:1]: (error) #error hello world!\n", errout.str());
|
||||
}
|
||||
|
||||
// After including a file
|
||||
{
|
||||
errout.str("");
|
||||
Settings settings;
|
||||
settings.userDefines = "TEST";
|
||||
const std::string code("#file \"ab.h\"\n\n#endfile\n#error aaa");
|
||||
Preprocessor::getcode(code, "TEST", "test.c", &settings, this);
|
||||
ASSERT_EQUALS("[test.c:2]: (error) #error aaa\n", errout.str());
|
||||
}
|
||||
}
|
||||
|
||||
void if0_exclude()
|
||||
{
|
||||
Settings settings;
|
||||
|
|
Loading…
Reference in New Issue