Fix crash in invalid scope subscript access

When accessing a missing scope member through the string subscript
syntax (scope["member"]) the error check didn't actually return
resulting in a NULL dereference. This fixes that and adds tests.

It also fixes some of the parse tree unit tests which weren't correctly
resetting their error values.

Bug: 209
Change-Id: Ida1415b63ce1bca1d479c732126d5336eec13fc9
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/10860
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 74bc2af..9ab28b5 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -393,6 +393,7 @@
     *err =
         Err(subscript_.get(), "No value named \"" + key_value.string_value() +
                                   "\" in scope \"" + base_.value() + "\"");
+    return Value();
   }
   return *result;
 }
diff --git a/src/gn/parse_tree_unittest.cc b/src/gn/parse_tree_unittest.cc
index e366b54..ed28b54 100644
--- a/src/gn/parse_tree_unittest.cc
+++ b/src/gn/parse_tree_unittest.cc
@@ -34,6 +34,7 @@
   Err err;
   Value result = accessor.Execute(setup.scope(), &err);
   EXPECT_TRUE(err.has_error());
+  err = Err();
   EXPECT_EQ(Value::NONE, result.type());
 
   // Define a as a Scope. It should still fail because b isn't defined.
@@ -94,11 +95,18 @@
 
   Value invalid1 = setup.ExecuteExpression("scope[second_element_idx]", &err);
   EXPECT_TRUE(err.has_error());
+  err = Err();
   EXPECT_EQ(invalid1.type(), Value::NONE);
 
   Value invalid2 = setup.ExecuteExpression("list[bar_key]", &err);
   EXPECT_TRUE(err.has_error());
+  err = Err();
   EXPECT_EQ(invalid2.type(), Value::NONE);
+
+  Value invalid3 = setup.ExecuteExpression("scope[\"baz\"]", &err);
+  EXPECT_TRUE(err.has_error());
+  err = Err();
+  EXPECT_EQ(invalid3.type(), Value::NONE);
 }
 
 TEST(ParseTree, BlockUnusedVars) {