These nonsense assignments are meant to squelch gcc warnings that the variables might be used uninitialized. However, gcc gets it mostly right, realizing that we will either extract tree entries from both sides, or we will hit a "continue" statement and go to the top of the loop. However, while getting this right for the "elem" and "path" variables, it does not do so for the "mode" variables. Let's drop the nonsense initialization where modern gcc does not need them, and just set the modes to "0", along with a comment. These values should never be used, but it makes both gcc, as well as any compiler which does not like the "x = x" initializations, happy. While we're in the area, let's also update the loop condition to use logical-OR rather than bitwise-OR. They should be equivalent in this case, and the use of the latter was probably a typo. Signed-off-by: Jeff King <peff@xxxxxxxx> --- 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. 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) -- 1.8.2.13.g0f18d3c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html