Introduce --incompatible_disable_nocopts flag

This flag prohibits the use of 'nocopts' attribute in cc_* rules.

Issue #8706

RELNOTES: --incompatible_disable_nocopts flag has been added. See https://github.com/bazelbuild/bazel/issues/8706 for details.
PiperOrigin-RevId: 254781400
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 36ecb13..89413e3 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
@@ -525,6 +525,14 @@
     if (Strings.isNullOrEmpty(nocoptsValue)) {
       return null;
     }
+
+    if (ruleContext.getConfiguration().getFragment(CppConfiguration.class).disableNoCopts()) {
+      ruleContext.attributeError(
+          NO_COPTS_ATTRIBUTE,
+          "This attribute was removed. See https://github.com/bazelbuild/bazel/issues/8706 for"
+              + " details.");
+    }
+
     String nocoptsAttr = ruleContext.getExpander().expand(NO_COPTS_ATTRIBUTE, nocoptsValue);
     try {
       return Pattern.compile(nocoptsAttr);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 6d7798e..0fa5904 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -694,4 +694,8 @@
   public boolean useSpecificToolFiles() {
     return cppOptions.useSpecificToolFiles;
   }
+
+  public boolean disableNoCopts() {
+    return cppOptions.disableNoCopts;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index eb27d8a..a2b2851 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -903,6 +903,20 @@
               + "See https://github.com/bazelbuild/bazel/issues/8546.")
   public boolean disableStaticCcToolchains;
 
+  @Option(
+      name = "incompatible_disable_nocopts",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {OptionEffectTag.ACTION_COMMAND_LINES},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES,
+      },
+      help =
+          "When enabled, it removes nocopts attribute from C++ rules. See"
+              + " https://github.com/bazelbuild/bazel/issues/8706 for details.")
+  public boolean disableNoCopts;
+
   @Override
   public FragmentOptions getHost() {
     CppOptions host = (CppOptions) getDefault();
@@ -959,6 +973,7 @@
     host.useStandaloneLtoIndexingCommandLines = useStandaloneLtoIndexingCommandLines;
     host.useSpecificToolFiles = useSpecificToolFiles;
     host.disableStaticCcToolchains = disableStaticCcToolchains;
+    host.disableNoCopts = disableNoCopts;
 
     // Save host options for further use.
     host.hostCoptList = hostCoptList;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 0d4f1f8..675b84e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -1060,4 +1060,15 @@
   private String removeOutDirectory(String s) {
     return s.replace("blaze-out", "").replace("bazel-out", "");
   }
+
+  @Test
+  public void testNoCoptsDisabled() throws Exception {
+    reporter.removeHandler(failFastHandler);
+    scratch.file("x/BUILD", "cc_library(name = 'foo', srcs = ['a.cc'], nocopts = 'abc')");
+    useConfiguration("--incompatible_disable_nocopts");
+    getConfiguredTarget("//x:foo");
+    assertContainsEvent(
+        "This attribute was removed. See https://github.com/bazelbuild/bazel/issues/8706 for"
+            + " details.");
+  }
 }