Skip to content

Commit 59f376c

Browse files
authored
bail out on unknown DUI::std value (#312)
1 parent 8d8926b commit 59f376c

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ int main(int argc, char **argv)
169169
case simplecpp::Output::FILE_NOT_FOUND:
170170
std::cerr << "file not found: ";
171171
break;
172+
case simplecpp::Output::DUI_ERROR:
173+
std::cerr << "dui error: ";
174+
break;
172175
}
173176
std::cerr << output.msg << std::endl;
174177
}

simplecpp.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3315,8 +3315,17 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
33153315
macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, dummy)));
33163316
} else {
33173317
std_def = simplecpp::getCppStdString(dui.std);
3318-
if (!std_def.empty())
3319-
macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy)));
3318+
if (std_def.empty()) {
3319+
if (outputList) {
3320+
simplecpp::Output err(files);
3321+
err.type = Output::DUI_ERROR;
3322+
err.msg = "unknown standard specified: '" + dui.std + "'";
3323+
outputList->push_back(err);
3324+
}
3325+
output.clear();
3326+
return;
3327+
}
3328+
macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy)));
33203329
}
33213330
}
33223331

simplecpp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ namespace simplecpp {
181181
PORTABILITY_BACKSLASH,
182182
UNHANDLED_CHAR_ERROR,
183183
EXPLICIT_INCLUDE_NOT_FOUND,
184-
FILE_NOT_FOUND
184+
FILE_NOT_FOUND,
185+
DUI_ERROR
185186
} type;
186187
explicit Output(const std::vector<std::string>& files, Type type, const std::string& msg) : type(type), location(files), msg(msg) {}
187188
Location location;

test.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ static std::string toString(const simplecpp::OutputList &outputList)
154154
case simplecpp::Output::Type::FILE_NOT_FOUND:
155155
ostr << "file_not_found,";
156156
break;
157+
case simplecpp::Output::Type::DUI_ERROR:
158+
ostr << "dui_error,";
159+
break;
157160
}
158161

159162
ostr << output.msg << '\n';
@@ -2656,6 +2659,48 @@ static void cpluscplusDefine()
26562659
ASSERT_EQUALS("\n201103L", preprocess(code, dui));
26572660
}
26582661

2662+
static void invalidStd()
2663+
{
2664+
const char code[] = "";
2665+
simplecpp::DUI dui;
2666+
simplecpp::OutputList outputList;
2667+
2668+
dui.std = "c88";
2669+
ASSERT_EQUALS("", preprocess(code, dui, &outputList));
2670+
ASSERT_EQUALS(1, outputList.size());
2671+
ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type);
2672+
ASSERT_EQUALS("unknown standard specified: 'c88'", outputList.cbegin()->msg);
2673+
outputList.clear();
2674+
2675+
dui.std = "gnu88";
2676+
ASSERT_EQUALS("", preprocess(code, dui, &outputList));
2677+
ASSERT_EQUALS(1, outputList.size());
2678+
ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type);
2679+
ASSERT_EQUALS("unknown standard specified: 'gnu88'", outputList.cbegin()->msg);
2680+
outputList.clear();
2681+
2682+
dui.std = "d99";
2683+
ASSERT_EQUALS("", preprocess(code, dui, &outputList));
2684+
ASSERT_EQUALS(1, outputList.size());
2685+
ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type);
2686+
ASSERT_EQUALS("unknown standard specified: 'd99'", outputList.cbegin()->msg);
2687+
outputList.clear();
2688+
2689+
dui.std = "c++77";
2690+
ASSERT_EQUALS("", preprocess(code, dui, &outputList));
2691+
ASSERT_EQUALS(1, outputList.size());
2692+
ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type);
2693+
ASSERT_EQUALS("unknown standard specified: 'c++77'", outputList.cbegin()->msg);
2694+
outputList.clear();
2695+
2696+
dui.std = "gnu++33";
2697+
ASSERT_EQUALS("", preprocess(code, dui, &outputList));
2698+
ASSERT_EQUALS(1, outputList.size());
2699+
ASSERT_EQUALS(simplecpp::Output::Type::DUI_ERROR, outputList.cbegin()->type);
2700+
ASSERT_EQUALS("unknown standard specified: 'gnu++33'", outputList.cbegin()->msg);
2701+
outputList.clear();
2702+
}
2703+
26592704
static void assertToken(const std::string& s, bool name, bool number, bool comment, char op, int line)
26602705
{
26612706
const std::vector<std::string> f;
@@ -2984,6 +3029,7 @@ int main(int argc, char **argv)
29843029

29853030
TEST_CASE(stdcVersionDefine);
29863031
TEST_CASE(cpluscplusDefine);
3032+
TEST_CASE(invalidStd);
29873033

29883034
TEST_CASE(token);
29893035

0 commit comments

Comments
 (0)