Fix ticket #145 (Line numbers are invalid if file is included inside #ifdef)

http://apps.sourceforge.net/trac/cppcheck/ticket/145
This commit is contained in:
Reijo Tomperi 2009-03-08 09:45:53 +02:00
parent 15fc47660c
commit 5be85d71a0
2 changed files with 37 additions and 4 deletions

View File

@ -447,10 +447,15 @@ std::string Preprocessor::getcode(const std::string &filedata, std::string cfg)
for (std::list<bool>::const_iterator it = matching_ifdef.begin(); it != matching_ifdef.end(); ++it)
match &= bool(*it);
}
if (! match)
line = "";
if (line.find("#if") == 0 ||
if (line.find("#file \"") == 0 ||
line.find("#endfile") == 0 )
{
// We must not remove #file tags or line numbers
// are corrupted. File tags are removed by the tokenizer.
}
else if (!match ||
line.find("#if") == 0 ||
line.find("#else") == 0 ||
line.find("#elif") == 0 ||
line.find("#endif") == 0)

View File

@ -24,7 +24,7 @@
#include "testsuite.h"
#include "../src/preprocessor.h"
#include "../src/tokenize.h"
#include <map>
#include <string>
@ -106,6 +106,7 @@ private:
TEST_CASE(multi_character_character);
TEST_CASE(stringify);
TEST_CASE(ifdefwithfile);
}
@ -324,6 +325,33 @@ private:
ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));
}
void ifdefwithfile()
{
// Handling include guards..
const char filedata[] = "#ifdef ABC\n"
"#file \"abc.h\"\n"
"class A{};/*\n\n\n\n\n\n\n*/\n"
"#endfile\n"
"#endif\n"
"int main() {}\n";
// Preprocess => actual result..
std::istringstream istr(filedata);
std::map<std::string, std::string> actual;
Preprocessor preprocessor;
preprocessor.preprocess(istr, actual, "file.c");
Tokenizer tok;
std::istringstream codeStream( actual[""] );
tok.tokenize( codeStream, "main.cpp" );
ASSERT_EQUALS( "\n\n##file 0\n1:\n2:\n3:\n4: int main ( ) { }\n", tok.tokens()->stringifyList() );
// Expected configurations: "" and "ABC"
ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));
ASSERT_EQUALS("\n#file \"abc.h\"\n\n\n\n\n\n\n\n\n#endfile\n\nint main() {}\n", actual[""]);
ASSERT_EQUALS("\n#file \"abc.h\"\nclass A{};\n\n\n\n\n\n\n\n#endfile\n\nint main() {}\n", actual["ABC"]);
}
void newlines()
{