aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-09-13 16:07:41 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-09-13 16:07:41 +0200
commitce4b3b115957575c2055291c54fc6452817dab87 (patch)
treec2e993b609bdba211df5ac1ed4f95a8816703c23
parent0b18c9cc4531da4a3f20212152254a894d2cbff3 (diff)
Fix bug in handling of disabled recipes in ad hoc pattern rules
-rw-r--r--libbuild2/parser.cxx19
1 files changed, 16 insertions, 3 deletions
diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx
index 7e48ad8..03b912d 100644
--- a/libbuild2/parser.cxx
+++ b/libbuild2/parser.cxx
@@ -1253,8 +1253,13 @@ namespace build2
for (shared_ptr<adhoc_rule>& pr: recipes)
{
- pr->pattern = &rp; // Connect recipe to pattern.
- rp.rules.push_back (move (pr));
+ // Can be NULL if the recipe is disabled with a condition.
+ //
+ if (pr != nullptr)
+ {
+ pr->pattern = &rp; // Connect recipe to pattern.
+ rp.rules.push_back (move (pr));
+ }
}
// Register this adhoc rule for all its actions.
@@ -1766,7 +1771,15 @@ namespace build2
t = start; tt = t.type;
for (size_t i (0); tt == type::percent || tt == type::multi_lcbrace; ++i)
{
- recipes.push_back (nullptr); // For missing else/default (see below).
+ // For missing else/default (see below).
+ //
+ // Note that it may remain NULL if we have, say, an if-condition that
+ // evaluates to false and no else. While it may be tempting to get rid
+ // of such "holes", it's not easy due to the replay semantics (see the
+ // target_ != nullptr block below). So we expect the caller to be
+ // prepared to handle this.
+ //
+ recipes.push_back (nullptr);
attributes as;
buildspec bs;