]> git.sesse.net Git - stockfish/blobdiff - src/movegen.cpp
Fix generation of check blocking promotion
[stockfish] / src / movegen.cpp
index 3845cd978cab815b5d9e83eb27de9ba536d58437..ff8f6c6e16f6f2f186e27dad9972f43b8cf9bb1f 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <cassert>
 
+#include "bitcount.h"
 #include "movegen.h"
 
 // Simple macro to wrap a very common while loop, no facny, no flexibility,
@@ -131,7 +132,7 @@ namespace {
 
 
 /// generate_captures generates() all pseudo-legal captures and queen
-/// promotions.  The return value is the number of moves generated.
+/// promotions. The return value is the number of moves generated.
 
 int generate_captures(const Position& pos, MoveStack* mlist) {
 
@@ -505,7 +506,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) {
       // be a promotion.
       if (   (  (square_rank(to) == RANK_8 && us == WHITE)
               ||(square_rank(to) == RANK_1 && us != WHITE))
-           && !move_promotion(m))
+           && !move_is_promotion(m))
           return false;
 
       // Proceed according to the square delta between the source and
@@ -559,7 +560,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) {
   // Luckly we can handle all the other pieces in one go
   return (   pos.piece_attacks_square(pos.piece_on(from), from, to)
           && pos.pl_move_is_legal(m, pinned)
-          && !move_promotion(m));
+          && !move_is_promotion(m));
 }
 
 
@@ -790,9 +791,11 @@ namespace {
     // Direct checks. These are possible only for pawns on neighboring files
     // and in the two ranks that, after the push, are in front of the enemy king.
     b1 = pawns & neighboring_files_bb(ksq) & ~dc;
-    b2 = rank_bb(ksq + 2 * TDELTA_S) | rank_bb(ksq + 3 * TDELTA_S);
-    b1 &= b2;
-    if (!b1)
+
+    // We can get false positives if (ksq + x) is not in [0,63] range but
+    // is not a problem, they will be filtered out later.
+    b2 = b1 & (rank_bb(ksq + 2 * TDELTA_S) | rank_bb(ksq + 3 * TDELTA_S));
+    if (!b2)
         return mlist;
 
     // Direct checks, single pawn pushes
@@ -861,7 +864,7 @@ namespace {
                                              Bitboard blockSquares, MoveStack* mlist) {
 
     // Calculate our parametrized parameters at compile time
-    const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB);
+    const Rank TRANK_8 = (Us == WHITE ? RANK_8 : RANK_1);
     const Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
     const SquareDelta TDELTA_N = (Us == WHITE ? DELTA_N : DELTA_S);
 
@@ -879,7 +882,7 @@ namespace {
 
         assert(pos.piece_on(to) == EMPTY);
 
-        if (square_rank(to) == TRank8BB)
+        if (square_rank(to) == TRANK_8)
         {
             (*mlist++).move = make_promotion_move(to - TDELTA_N, to, QUEEN);
             (*mlist++).move = make_promotion_move(to - TDELTA_N, to, ROOK);