From 736c9f08b68b2735d85fe7eefdf2118de8b8c34e Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 1 Nov 2023 11:08:12 +0200 Subject: Fix incorrect fsdir_rule::perform_update_direct() calls Also make fsdir_rule::perform_{update,clean}_direct() harder to misuse. --- libbuild2/rule.cxx | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'libbuild2/rule.cxx') diff --git a/libbuild2/rule.cxx b/libbuild2/rule.cxx index a3e3268..79ccb86 100644 --- a/libbuild2/rule.cxx +++ b/libbuild2/rule.cxx @@ -352,16 +352,17 @@ namespace build2 } void fsdir_rule:: - perform_update_direct (action a, const target& t) + perform_update_direct (action a, const fsdir& t) { // First create the parent directory. If present, it is always first. // - const target* p (t.prerequisite_targets[a].empty () - ? nullptr - : t.prerequisite_targets[a][0]); - - if (p != nullptr && p->is_a ()) - perform_update_direct (a, *p); + if (const target* p = (t.prerequisite_targets[a].empty () + ? nullptr + : t.prerequisite_targets[a][0])) + { + if (const fsdir* fp = p->is_a ()) + perform_update_direct (a, *fp); + } // The same code as in perform_update() above. // @@ -394,7 +395,7 @@ namespace build2 } void fsdir_rule:: - perform_clean_direct (action a, const target& t) + perform_clean_direct (action a, const fsdir& t) { // The same code as in perform_clean() above. // @@ -402,12 +403,13 @@ namespace build2 // Then clean the parent directory. If present, it is always first. // - const target* p (t.prerequisite_targets[a].empty () - ? nullptr - : t.prerequisite_targets[a][0]); - - if (p != nullptr && p->is_a ()) - perform_clean_direct (a, *p); + if (const target* p = (t.prerequisite_targets[a].empty () + ? nullptr + : t.prerequisite_targets[a][0])) + { + if (const fsdir* fp = p->is_a ()) + perform_clean_direct (a, *fp); + } } const fsdir_rule fsdir_rule::instance; -- cgit v1.1