Skip to content

Commit 162eb96

Browse files
authored
Fix #669: Manually included files are not reported missing by preprocess (#670)
1 parent fc7dca0 commit 162eb96

2 files changed

Lines changed: 72 additions & 1 deletion

File tree

simplecpp.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3517,8 +3517,19 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
35173517
includetokenstack.push(rawtokens.cfront());
35183518
for (auto it = dui.includes.cbegin(); it != dui.includes.cend(); ++it) {
35193519
const FileData *const filedata = cache.get("", *it, dui, false, files, outputList).first;
3520-
if (filedata != nullptr && filedata->tokens.cfront() != nullptr)
3520+
if (filedata == nullptr) {
3521+
if (outputList) {
3522+
simplecpp::Output err{
3523+
simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND,
3524+
{},
3525+
"Can not open include file '" + *it + "' that is explicitly included."
3526+
};
3527+
outputList->emplace_back(std::move(err));
3528+
}
3529+
}
3530+
else if (filedata->tokens.cfront() != nullptr) {
35213531
includetokenstack.push(filedata->tokens.cfront());
3532+
}
35223533
}
35233534

35243535
std::map<std::string, std::list<Location>> maybeUsedMacros;

test.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2926,6 +2926,64 @@ static void include9()
29262926
ASSERT_EQUALS("\n#line 2 \"1.h\"\nx = 1 ;", out.stringify());
29272927
}
29282928

2929+
static void include10() // #669 - -include with load()
2930+
{
2931+
const char code_c[] = "X\n";
2932+
const char code_h[] = "#define X 123\n";
2933+
2934+
std::vector<std::string> files;
2935+
2936+
const simplecpp::TokenList rawtokens_c = makeTokenList(code_c, files, "src.c");
2937+
const simplecpp::TokenList rawtokens_h = makeTokenList(code_h, files, "inc.h");
2938+
2939+
ASSERT_EQUALS(2U, files.size());
2940+
ASSERT_EQUALS("src.c", files[0]);
2941+
ASSERT_EQUALS("inc.h", files[1]);
2942+
2943+
simplecpp::FileDataCache cache;
2944+
cache.insert({"src.c", rawtokens_c});
2945+
cache.insert({"inc.h", rawtokens_h});
2946+
2947+
simplecpp::OutputList outputList;
2948+
simplecpp::DUI dui;
2949+
dui.includes.emplace_back("inc.h");
2950+
dui.includes.emplace_back("missing.h");
2951+
cache = simplecpp::load(rawtokens_c, files, dui, &outputList, std::move(cache));
2952+
2953+
ASSERT_EQUALS(1, outputList.size());
2954+
ASSERT_EQUALS("Can not open include file 'missing.h' that is explicitly included.", outputList.begin()->msg);
2955+
}
2956+
2957+
static void include11() // #669 - -include with preprocess()
2958+
{
2959+
const char code_c[] = "X\n";
2960+
const char code_h[] = "#define X 123\n";
2961+
2962+
std::vector<std::string> files;
2963+
2964+
const simplecpp::TokenList rawtokens_c = makeTokenList(code_c, files, "src.c");
2965+
const simplecpp::TokenList rawtokens_h = makeTokenList(code_h, files, "inc.h");
2966+
2967+
ASSERT_EQUALS(2U, files.size());
2968+
ASSERT_EQUALS("src.c", files[0]);
2969+
ASSERT_EQUALS("inc.h", files[1]);
2970+
2971+
simplecpp::FileDataCache cache;
2972+
cache.insert({"src.c", rawtokens_c});
2973+
cache.insert({"inc.h", rawtokens_h});
2974+
2975+
simplecpp::OutputList outputList;
2976+
simplecpp::TokenList out(files);
2977+
simplecpp::DUI dui;
2978+
dui.includes.emplace_back("inc.h");
2979+
dui.includes.emplace_back("missing.h");
2980+
simplecpp::preprocess(out, rawtokens_c, files, cache, dui, &outputList);
2981+
2982+
ASSERT_EQUALS("123", out.stringify());
2983+
ASSERT_EQUALS(1, outputList.size());
2984+
ASSERT_EQUALS("Can not open include file 'missing.h' that is explicitly included.", outputList.begin()->msg);
2985+
}
2986+
29292987
static void readfile_nullbyte()
29302988
{
29312989
const char code[] = "ab\0cd";
@@ -4118,6 +4176,8 @@ static void runTests(int argc, char **argv, Input input)
41184176
TEST_CASE(include7); // #include MACRO
41194177
TEST_CASE(include8); // #include MACRO(X)
41204178
TEST_CASE(include9); // #include MACRO
4179+
TEST_CASE(include10); // -include with load()
4180+
TEST_CASE(include11); // -include with preprocess()
41214181

41224182
TEST_CASE(multiline1);
41234183
TEST_CASE(multiline2);

0 commit comments

Comments
 (0)