[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,