Raise an error when a select() expression yields None in a mandatory attribute.

Preferable to crashing.

RELNOTES: None.
PiperOrigin-RevId: 295669663
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
index b8c59f9..3a8c972 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
@@ -109,6 +109,14 @@
         // predicates ineligible for "None" values. But no user-facing attributes should
         // do that anyway, so that isn't a loss.
         Attribute attr = getAttributeDefinition(attributeName);
+        if (attr.isMandatory()) {
+          throw new EvalException(
+              rule.getLocation(),
+              String.format(
+                  "Mandatory attribute '%s' resolved to 'None' after evaluating 'select'"
+                      + " expression",
+                  attributeName));
+        }
         Verify.verify(attr.getCondition() == Predicates.<AttributeMap>alwaysTrue());
         resolvedList.add((T) attr.getDefaultValue(null)); // unchecked cast
       } else {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
index 88762cc..d9160b0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
@@ -275,6 +275,14 @@
   }
 
   @Test
+  public void testNoneValueOnMandatoryAttribute() throws Exception {
+    scratch.file("a/BUILD", "alias(name='a', actual=select({'//conditions:default': None}))");
+    reporter.removeHandler(failFastHandler);
+    getConfiguredTarget("//a:a");
+    assertContainsEvent("Mandatory attribute 'actual' resolved to 'None'");
+  }
+
+  @Test
   public void testAliasedConfigSetting() throws Exception {
     writeConfigRules();
     scratch.file(