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(