Re: [PATCH 8/4] match-trees: drop "x = x" initializations
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 22, 2013, 21:26 UTC
- Message-ID
- <7v1ub76s8c.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <20130322162155.GB25857@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 9 quoted lines
> Of the 8 patches, this is the one I find the least satisfying, if only > because I do not think gcc's failure is because of complicated control > flow, and rearranging the code would only hurt readability. And I'm > quite curious why it complains about "mode", but not about the other > variables, which are set in the exact same place (and why it would not > be able to handle such a simple control flow at all). > > It makes me wonder if I am missing something, or there is some subtle > bug. But I can't see it. Other eyes appreciated.
I obviously am not qualified as "other eyes" to catch bugs in this code as this is entirely mine, but I do not see any obvious reason that would make the compiler to think mode[12] less initialized than elem[12] or path[12] either.
These three are all updated by the same tree_entry_extract() call, and whenever we use mode[12] we use path[12], so if it decides path1 is used or assigned, it should be able to tell mode1 is, too.
Unsatisfactory, it surely is...
Show 28 quoted lines
> match-trees.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/match-trees.c b/match-trees.c
> index 26f7ed1..4360f10 100644
> --- a/match-trees.c
> +++ b/match-trees.c
> @@ -71,13 +71,13 @@ static int score_trees(const unsigned char *hash1, const unsigned char *hash2)
> if (type != OBJ_TREE)
> die("%s is not a tree", sha1_to_hex(hash2));
> init_tree_desc(&two, two_buf, size);
> - while (one.size | two.size) {
> - const unsigned char *elem1 = elem1;
> - const unsigned char *elem2 = elem2;
> - const char *path1 = path1;
> - const char *path2 = path2;
> - unsigned mode1 = mode1;
> - unsigned mode2 = mode2;
> + while (one.size || two.size) {
> + const unsigned char *elem1;
> + const unsigned char *elem2;
> + const char *path1;
> + const char *path2;
> + unsigned mode1 = 0; /* make gcc happy */
> + unsigned mode2 = 0; /* make gcc happy */
> int cmp;
>
> if (one.size)