[C++] Fix unmatched_paren.mk
diff --git a/testcase/unmatched_paren.mk b/testcase/unmatched_paren.mk
new file mode 100644
index 0000000..6f5d6c8
--- /dev/null
+++ b/testcase/unmatched_paren.mk
@@ -0,0 +1,10 @@
+# TODO(go): Fix.
+
+PAREN:=(
+$(PAREN):=PASS
+
+X:=O(
+Y:=$(X:(=K)
+test:
+ echo $Y
+ echo $(()
diff --git a/value.cc b/value.cc
index acff0b1..5337e4f 100644
--- a/value.cc
+++ b/value.cc
@@ -250,6 +250,10 @@
return s.size();
}
+bool ShouldHandleComments(ParseExprOpt opt) {
+ return opt != ParseExprOpt::DEFINE && opt != ParseExprOpt::COMMAND;
+}
+
Value* ParseFunc(const Loc& loc,
Func* f, StringPiece s, size_t i, char* terms,
size_t* index_out) {
@@ -274,7 +278,7 @@
const bool trim_right_space = (f->trim_space() ||
(nargs == 1 && f->trim_right_space_1st()));
size_t n;
- Value* v = ParseExprImpl(loc, s.substr(i), terms, ParseExprOpt::NORMAL,
+ Value* v = ParseExprImpl(loc, s.substr(i), terms, ParseExprOpt::FUNC,
&n, trim_right_space);
// TODO: concatLine???
f->AddArg(v);
@@ -398,7 +402,7 @@
}
// Handle a comment.
- if (!terms && c == '#' && opt == ParseExprOpt::NORMAL) {
+ if (!terms && c == '#' && ShouldHandleComments(opt)) {
if (i > b)
r->AddValue(new Literal(s.substr(b, i-b)));
bool was_backslash = false;
@@ -438,7 +442,7 @@
continue;
}
- if (c == '(' || c == '{') {
+ if ((c == '(' || c == '{') && opt == ParseExprOpt::FUNC) {
char cp = CloseParen(c);
if (terms && terms[0] == cp) {
paren_depth++;
@@ -464,7 +468,7 @@
i++;
continue;
}
- if (n == '#' && opt == ParseExprOpt::NORMAL) {
+ if (n == '#' && ShouldHandleComments(opt)) {
r->AddValue(new Literal(s.substr(b, i-b)));
i++;
b = i;
diff --git a/value.h b/value.h
index f46a017..8e18e14 100644
--- a/value.h
+++ b/value.h
@@ -53,6 +53,7 @@
NORMAL = 0,
DEFINE,
COMMAND,
+ FUNC,
};
Value* ParseExprImpl(const Loc& loc, StringPiece s, const char* terms,