diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java index 3c18636b04d271..274adc7ccc549d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java +++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java @@ -67,6 +67,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import javax.annotation.Nullable; /** @@ -83,6 +84,20 @@ public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, ActionConflictException { AttributeMap attributes = NonconfigurableAttributeMapper.of(ruleContext.getRule()); + Optional likelyLabelInvalidSetting = + attributes.get(ConfigSettingRule.SETTINGS_ATTRIBUTE, Type.STRING_DICT).keySet().stream() + .filter(s -> s.startsWith("@") || s.startsWith("//") || s.startsWith(":")) + .findFirst(); + if (likelyLabelInvalidSetting.isPresent()) { + ruleContext.attributeError( + ConfigSettingRule.SETTINGS_ATTRIBUTE, + String.format( + "'%s' is not a valid setting name, but appears to be a label. Did you mean to place" + + " it in %s instead?", + likelyLabelInvalidSetting.get(), ConfigSettingRule.FLAG_SETTINGS_ATTRIBUTE)); + return null; + } + // Get the built-in Blaze flag settings that match this rule. ImmutableMultimap nativeFlagSettings = ImmutableMultimap.builder() diff --git a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java index aa425fb7200c54..3a182ff1dbb81e 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java @@ -2317,4 +2317,20 @@ public void singleValueThatLooksLikeMultiValueIsOkay() throws Exception { assertThat(getConfiguredTarget("//test:fg")).isNotNull(); assertNoEvents(); } + + @Test + public void labelInValuesError() throws Exception { + scratch.file( + "test/BUILD", + "config_setting(", + " name = 'match',", + " values = {'//foo:bar': 'value'},", + ")"); + reporter.removeHandler(failFastHandler); // expect errors + assertThat(getConfiguredTarget("//test:match")).isNull(); + assertContainsEvent( + "in values attribute of config_setting rule //test:match: '//foo:bar' is" + + " not a valid setting name, but appears to be a label. Did you mean to place it in" + + " flag_values instead?"); + } }