Move some error reporting from cc_toolchain to rules

This is unfortunate, confusing for the user, and less accurate than what the
original behavior was, but because cc_toolchain cannot access (currently, with
platforms enabled) the target configuration, there is nothing we can do other
than showing the error for the target.

https://github.com/bazelbuild/bazel/issues/6516

RELNOTES: None
PiperOrigin-RevId: 240345500
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 7e93b77..dfc5d04 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -256,6 +256,7 @@
     ruleContext.checkSrcsSamePackage(true);
 
     CcCommon common = new CcCommon(ruleContext);
+    common.reportInvalidOptions(ruleContext);
     CcToolchainProvider ccToolchain = common.getToolchain();
 
     ImmutableMap.Builder<String, String> toolchainMakeVariables = ImmutableMap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 4427e70..4971c41 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -418,6 +418,35 @@
     return getHeaders(ruleContext);
   }
 
+  public void reportInvalidOptions(RuleContext ruleContext) {
+    reportInvalidOptions(ruleContext, cppConfiguration, ccToolchain);
+  }
+
+  public static void reportInvalidOptions(
+      RuleContext ruleContext, CppConfiguration cppConfiguration, CcToolchainProvider ccToolchain) {
+    if (cppConfiguration.fissionIsActiveForCurrentCompilationMode()
+        && !ccToolchain.supportsFission()) {
+      ruleContext.ruleWarning(
+          "Fission is not supported by this crosstool.  Please use a "
+              + "supporting crosstool to enable fission");
+    }
+    if (cppConfiguration.buildTestDwpIsActivated()
+        && !(ccToolchain.supportsFission()
+            && cppConfiguration.fissionIsActiveForCurrentCompilationMode())) {
+      ruleContext.ruleWarning(
+          "Test dwp file requested, but Fission is not enabled.  To generate a "
+              + "dwp for the test executable, use '--fission=yes' with a toolchain that supports "
+              + "Fission to build statically.");
+    }
+
+    if (cppConfiguration.getLibcTopLabel() != null && ccToolchain.getDefaultSysroot() == null) {
+      ruleContext.ruleError(
+          "The selected toolchain "
+              + ccToolchain.getToolchainIdentifier()
+              + " does not support setting --grte_top (it doesn't specify builtin_sysroot).");
+    }
+  }
+
   /**
    * Supply CC_FLAGS Make variable value computed from FeatureConfiguration. Appends them to
    * original CC_FLAGS, so FeatureConfiguration can override legacy values.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
index 8520a21..83d08bf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
@@ -152,6 +152,7 @@
     }
 
     final CcCommon common = new CcCommon(ruleContext);
+    common.reportInvalidOptions(ruleContext);
     CompilationInfo compilationInfo =
         new CcCompilationHelper(
                 ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index f4cbee7..cc08f65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -120,6 +120,7 @@
     }
 
     final CcCommon common = new CcCommon(ruleContext);
+    common.reportInvalidOptions(ruleContext);
 
     CcToolchainProvider ccToolchain = common.getToolchain();
     CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index 3fdd39f..23aa991 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -986,5 +986,9 @@
   public LicensesProvider getLicensesProvider() {
     return licensesProvider;
   }
+
+  public PathFragment getDefaultSysroot() {
+    return toolchainInfo.getDefaultSysroot();
+  }
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index 26c66e9..444aa7f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -446,7 +446,7 @@
       fdoInputFile =
           FdoInputFile.fromAbsolutePath(ccSkyframeSupportValue.getFdoZipPath().asFragment());
     }
-
+    
     CppToolchainInfo toolchainInfo =
         getCppToolchainInfo(
             ruleContext,
@@ -610,7 +610,6 @@
 
     Artifact prefetchHintsArtifact = getPrefetchHintsArtifact(prefetchHints, ruleContext);
 
-    reportInvalidOptions(ruleContext, toolchainInfo);
     return new CcToolchainProvider(
         getToolchainForSkylark(toolchainInfo),
         cppConfiguration,
@@ -757,31 +756,6 @@
     }
   }
 
-  private static void reportInvalidOptions(RuleContext ruleContext, CppToolchainInfo toolchain) {
-    CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
-    if (cppConfiguration.fissionIsActiveForCurrentCompilationMode()
-        && !toolchain.supportsFission()) {
-      ruleContext.ruleWarning(
-          "Fission is not supported by this crosstool.  Please use a "
-              + "supporting crosstool to enable fission");
-    }
-    if (cppConfiguration.buildTestDwpIsActivated()
-        && !(toolchain.supportsFission()
-            && cppConfiguration.fissionIsActiveForCurrentCompilationMode())) {
-      ruleContext.ruleWarning(
-          "Test dwp file requested, but Fission is not enabled.  To generate a "
-              + "dwp for the test executable, use '--fission=yes' with a toolchain that supports "
-              + "Fission to build statically.");
-    }
-
-    if (cppConfiguration.getLibcTopLabel() != null && toolchain.getDefaultSysroot() == null) {
-      ruleContext.ruleError(
-          "The selected toolchain "
-              + toolchain.getToolchainIdentifier()
-              + " does not support setting --grte_top (it doesn't specify builtin_sysroot).");
-    }
-  }
-
   @Nullable
   private static CToolchain getToolchainFromAttributes(
       RuleContext ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
index 474cd78..cd5c580 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
@@ -96,6 +96,8 @@
       }
     }
 
+    CcCommon.reportInvalidOptions(ruleContext, cppConfiguration, ccToolchainProvider);
+
     TemplateVariableInfo templateVariableInfo =
         CcToolchain.createMakeVariableProvider(
             ccToolchainProvider,