Don't report error for non-existent keys in not_needed

This matches the behavior of forward_variables_from which also doesn't
fail for non-existent keys.

Change-Id: I6ca4a33f1b85a91662ee9bf3fa7a1b3a217c0cfa
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6160
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Petr Hosek <phosek@google.com>
diff --git a/tools/gn/functions.cc b/tools/gn/functions.cc
index 937ffd2..47d987c 100644
--- a/tools/gn/functions.cc
+++ b/tools/gn/functions.cc
@@ -778,10 +778,10 @@
     for (const Value& cur : value->list_value()) {
       if (!cur.VerifyTypeIs(Value::STRING, err))
         return Value();
-      if (!source->GetValue(cur.string_value(), true)) {
-        *err = Err(cur, "Undefined identifier");
-        return Value();
-      }
+      // We don't need the return value, we invoke scope::GetValue only to mark
+      // the value as used. Note that we cannot use Scope::MarkUsed because we
+      // want to also search in the parent scope.
+      (void) source->GetValue(cur.string_value(), true);
     }
     return Value();
   }
diff --git a/tools/gn/functions_target_unittest.cc b/tools/gn/functions_target_unittest.cc
index 40c6fde..af8b0e0 100644
--- a/tools/gn/functions_target_unittest.cc
+++ b/tools/gn/functions_target_unittest.cc
@@ -66,6 +66,16 @@
   scoped_input.parsed()->Execute(setup.scope(), &err);
   ASSERT_FALSE(err.has_error()) << err.message();
 
+  TestParseInput nonexistent_arg_input(
+      "source_set(\"foo\") {\n"
+      "  a = {x = 1}\n"
+      "  not_needed(a, [ \"x\", \"y\" ])\n"
+      "}\n");
+  ASSERT_FALSE(nonexistent_arg_input.has_error());
+  err = Err();
+  nonexistent_arg_input.parsed()->Execute(setup.scope(), &err);
+  ASSERT_FALSE(err.has_error()) << err.message();
+
   TestParseInput exclusion_input(
       "source_set(\"foo\") {\n"
       "  x = 1\n"
@@ -193,4 +203,4 @@
   good_input.parsed()->Execute(setup.scope(), &err);
   ASSERT_TRUE(err.has_error());
   ASSERT_EQ(err.message(), "More than one language used in target sources.");
-}
\ No newline at end of file
+}