build: Propagate module dependencies through group targets

This change ensures that C++ module dependencies are correctly
propagated through `group` targets when using `public_deps`. Previously,
`group` targets were not considered in
`ComputeModuleDepsInformationFor`, leading to incomplete dependency
resolution.

A new unit test has been added to verify this functionality.

This is to remove `alias` template in
https://source.chromium.org/chromium/chromium/src/+/main:buildtools/third_party/libc++/modules.gni;l=79;drc=3296f9068c5d6ac4ac42124ee2338dc36443df8b

Bug: 40440396
Change-Id: Ibb2e62af1a43df1223275176c8b204b0c359f299
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/19680
Reviewed-by: David Turner <digit@google.com>
Reviewed-by: Matt Stark <msta@google.com>
Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/resolved_target_data.cc b/src/gn/resolved_target_data.cc
index 30433b0..201f655 100644
--- a/src/gn/resolved_target_data.cc
+++ b/src/gn/resolved_target_data.cc
@@ -191,7 +191,8 @@
   for (const Target* dep : deps) {
     if (dep->output_type() != Target::STATIC_LIBRARY &&
         dep->output_type() != Target::SHARED_LIBRARY &&
-        dep->output_type() != Target::SOURCE_SET) {
+        dep->output_type() != Target::SOURCE_SET &&
+        dep->output_type() != Target::GROUP) {
       continue;
     }
 
diff --git a/src/gn/resolved_target_data_unittest.cc b/src/gn/resolved_target_data_unittest.cc
index d4f60b4..92b965d 100644
--- a/src/gn/resolved_target_data_unittest.cc
+++ b/src/gn/resolved_target_data_unittest.cc
@@ -408,3 +408,35 @@
   EXPECT_EQ(&inter, exe_inherited[0].target());
   EXPECT_EQ(&pub, exe_inherited[1].target());
 }
+
+TEST(ResolvedTargetDataTest, ModuleDepsInheritance) {
+  TestWithScope setup;
+  Err err;
+
+  // Create a dependency chain:
+  //   A (executable) -> G (group) -> B (static_library) -> C (source_set)
+  TestTarget a(setup, "//foo:a", Target::EXECUTABLE);
+  TestTarget g(setup, "//foo:g", Target::GROUP);
+  TestTarget b(setup, "//foo:b", Target::STATIC_LIBRARY);
+  TestTarget c(setup, "//foo:c", Target::SOURCE_SET);
+
+  c.sources().push_back(SourceFile("//foo/c.modulemap"));
+  c.source_types_used().Set(SourceFile::SOURCE_MODULEMAP);
+
+  a.public_deps().push_back(LabelTargetPair(&g));
+  g.public_deps().push_back(LabelTargetPair(&b));
+  b.public_deps().push_back(LabelTargetPair(&c));
+
+  ASSERT_TRUE(c.OnResolved(&err));
+  ASSERT_TRUE(b.OnResolved(&err));
+  ASSERT_TRUE(g.OnResolved(&err));
+  ASSERT_TRUE(a.OnResolved(&err));
+
+  ResolvedTargetData resolved;
+
+  const auto& a_module_deps = resolved.GetModuleDepsInformation(&a);
+  ASSERT_EQ(3u, a_module_deps.size());
+  EXPECT_EQ(&g, a_module_deps[0].target());
+  EXPECT_EQ(&b, a_module_deps[1].target());
+  EXPECT_EQ(&c, a_module_deps[2].target());
+}