Update ToolchainResolver to properly deal with aliases as toolchain targets.

Closes #7543.

PiperOrigin-RevId: 235751297
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
index 801df3d..64c8af2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
@@ -33,6 +33,7 @@
 import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
@@ -521,17 +522,22 @@
       ImmutableList.Builder<TemplateVariableInfo> templateVariableProviders =
           new ImmutableList.Builder<>();
       for (ConfiguredTargetAndData target : toolchainTargets) {
-        Label discoveredLabel = target.getTarget().getLabel();
+        Label discoveredLabel;
+        // Aliases are in toolchainTypeToResolved by the original alias label, not via the final
+        // target's label.
+        if (target.getConfiguredTarget() instanceof AliasConfiguredTarget) {
+          discoveredLabel =
+              ((AliasConfiguredTarget) target.getConfiguredTarget()).getOriginalLabel();
+        } else {
+          discoveredLabel = target.getConfiguredTarget().getLabel();
+        }
         ToolchainTypeInfo toolchainType = toolchainTypeToResolved().inverse().get(discoveredLabel);
+        ToolchainInfo toolchainInfo = PlatformProviderUtils.toolchain(target.getConfiguredTarget());
 
         // If the toolchainType hadn't been resolved to an actual toolchain, resolution would have
         // failed with an error much earlier. This null check is just for safety.
-        if (toolchainType != null) {
-          ToolchainInfo toolchainInfo =
-              PlatformProviderUtils.toolchain(target.getConfiguredTarget());
-          if (toolchainInfo != null) {
-            toolchains.put(toolchainType, toolchainInfo);
-          }
+        if (toolchainType != null && toolchainInfo != null) {
+          toolchains.put(toolchainType, toolchainInfo);
         }
 
         // Find any template variables present for this toolchain.
diff --git a/src/test/shell/bazel/toolchain_test.sh b/src/test/shell/bazel/toolchain_test.sh
index f8c11cc..e713e10 100755
--- a/src/test/shell/bazel/toolchain_test.sh
+++ b/src/test/shell/bazel/toolchain_test.sh
@@ -187,6 +187,94 @@
   expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
 }
 
+function test_toolchain_alias_use_in_rule {
+  write_test_toolchain
+  write_test_rule
+
+  cat >> BUILD <<EOF
+load('//toolchain:toolchain_test_toolchain.bzl', 'test_toolchain')
+
+# Define the toolchain.
+filegroup(name = 'dep_rule_test_toolchain')
+test_toolchain(
+    name = 'test_toolchain_impl_1',
+    extra_label = ':dep_rule_test_toolchain',
+    extra_str = 'foo from test_toolchain',
+    visibility = ['//visibility:public'])
+alias(
+    name = 'test_toolchain_impl_1_alias',
+    actual = ':test_toolchain_impl_1',
+    visibility = ['//visibility:public'])
+
+# Declare the toolchain.
+toolchain(
+    name = 'test_toolchain_1',
+    toolchain_type = '//toolchain:test_toolchain',
+    exec_compatible_with = [],
+    target_compatible_with = [],
+    toolchain = ':test_toolchain_impl_1_alias',
+    visibility = ['//visibility:public'])
+EOF
+
+  mkdir -p demo
+  cat >> demo/BUILD <<EOF
+load('//toolchain:rule_use_toolchain.bzl', 'use_toolchain')
+# Use the toolchain.
+use_toolchain(
+    name = 'use',
+    message = 'this is the rule')
+EOF
+
+  bazel build --extra_toolchains=//:test_toolchain_1 //demo:use &> $TEST_log || fail "Build failed"
+  expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
+}
+
+function test_toolchain_alias_chain_use_in_rule {
+  write_test_toolchain
+  write_test_rule
+
+  cat >> BUILD <<EOF
+load('//toolchain:toolchain_test_toolchain.bzl', 'test_toolchain')
+
+# Define the toolchain.
+filegroup(name = 'dep_rule_test_toolchain')
+test_toolchain(
+    name = 'test_toolchain_impl_1',
+    extra_label = ':dep_rule_test_toolchain',
+    extra_str = 'foo from test_toolchain',
+    visibility = ['//visibility:public'])
+alias(
+    name = 'test_toolchain_impl_1_alias_alpha',
+    actual = ':test_toolchain_impl_1',
+    visibility = ['//visibility:public'])
+alias(
+    name = 'test_toolchain_impl_1_alias_beta',
+    actual = ':test_toolchain_impl_1_alias_alpha',
+    visibility = ['//visibility:public'])
+
+# Declare the toolchain.
+toolchain(
+    name = 'test_toolchain_1',
+    toolchain_type = '//toolchain:test_toolchain',
+    exec_compatible_with = [],
+    target_compatible_with = [],
+    toolchain = ':test_toolchain_impl_1_alias_beta',
+    visibility = ['//visibility:public'])
+EOF
+
+  mkdir -p demo
+  cat >> demo/BUILD <<EOF
+load('//toolchain:rule_use_toolchain.bzl', 'use_toolchain')
+# Use the toolchain.
+use_toolchain(
+    name = 'use',
+    message = 'this is the rule')
+EOF
+
+  bazel build --extra_toolchains=//:test_toolchain_1 //demo:use &> $TEST_log || fail "Build failed"
+  expect_log 'Using toolchain: rule message: "this is the rule", toolchain extra_str: "foo from test_toolchain"'
+}
+
 function test_toolchain_use_in_rule_missing {
   write_test_toolchain
   write_test_rule