Fix default condition removal in `selects.bzl` (#633)
_remove_default_condition compared the whole settings list against
"//conditions:default" instead of comparing each element, so the entry
was never filtered out. Multi-element config_setting_groups that
include it then leak "//conditions:default" into the generated alias
chain, where it is not a real target, and analysis fails:
selects.config_setting_group(
name = "1_or_default",
match_any = [":condition1", "//conditions:default"],
)
Compare each element instead. An ORing group containing
"//conditions:default" now reduces to an always-true condition, and an
ANDing group ignores the entry, as originally intended.diff --git a/lib/selects.bzl b/lib/selects.bzl
index bd4db71..e25e29c 100644
--- a/lib/selects.bzl
+++ b/lib/selects.bzl
@@ -138,7 +138,7 @@
"""Returns settings with "//conditions:default" entries filtered out."""
new_settings = []
for setting in settings:
- if settings != "//conditions:default":
+ if setting != "//conditions:default":
new_settings.append(setting)
return new_settings
diff --git a/tests/selects_tests.bzl b/tests/selects_tests.bzl
index aabf3c5..9e8eac2 100644
--- a/tests/selects_tests.bzl
+++ b/tests/selects_tests.bzl
@@ -97,6 +97,14 @@
name = "1_or_nothing_else",
match_any = [":condition1"],
)
+ selects.config_setting_group(
+ name = "1_or_default",
+ match_any = [":condition1", "//conditions:default"],
+ )
+ selects.config_setting_group(
+ name = "1_and_default",
+ match_all = [":condition1", "//conditions:default"],
+ )
###################################################
# Support code for config_setting_group tests
@@ -589,6 +597,78 @@
)
###################################################
+# or_config_setting_group_with_default_matches_test
+###################################################
+or_config_setting_group_with_default_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([False, False, False]),
+)
+
+def _or_config_setting_group_with_default_matches_test():
+ """Tests that an ORing config_setting_group containing '//conditions:default' always matches."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_with_default_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_default": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_with_default_matches_test(
+ name = "or_config_setting_group_with_default_matches_test",
+ target_under_test = ":or_config_setting_group_with_default_matches_rule",
+ )
+
+###################################################
+# and_config_setting_group_with_default_matches_test
+###################################################
+and_config_setting_group_with_default_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([True, False, False]),
+)
+
+def _and_config_setting_group_with_default_matches_test():
+ """Tests that '//conditions:default' in an ANDing config_setting_group is ignored (match case)."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_with_default_matches_rule",
+ myboolean = select(
+ {
+ ":1_and_default": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_with_default_matches_test(
+ name = "and_config_setting_group_with_default_matches_test",
+ target_under_test = ":and_config_setting_group_with_default_matches_rule",
+ )
+
+###################################################
+# and_config_setting_group_with_default_fails_test
+###################################################
+and_config_setting_group_with_default_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([False, True, True]),
+)
+
+def _and_config_setting_group_with_default_fails_test():
+ """Tests that '//conditions:default' in an ANDing config_setting_group is ignored (mismatch case)."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_with_default_fails_rule",
+ myboolean = select(
+ {
+ ":1_and_default": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_with_default_fails_test(
+ name = "and_config_setting_group_with_default_fails_test",
+ target_under_test = ":and_config_setting_group_with_default_fails_rule",
+ )
+
+###################################################
# empty_config_setting_group_not_allowed_test
###################################################
@@ -639,5 +719,9 @@
_always_true_match_all_test()
_always_true_match_any_test()
+ _or_config_setting_group_with_default_matches_test()
+ _and_config_setting_group_with_default_matches_test()
+ _and_config_setting_group_with_default_fails_test()
+
# _empty_config_setting_group_not_allowed_test()
# _and_and_or_not_allowed_together_test()