From: Stéphane Nicolet Date: Mon, 14 Nov 2016 14:07:32 +0000 (+0100) Subject: Do not use GCC extension for anonymous unions X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=7f4de0196b8169e3d0deef75bfcfff6d10166d99 Do not use GCC extension for anonymous unions Anonymous struct inside anonymous unions are a GCC extension. This patch uses named structs to stick to the C+11 standard. Avoids a string of warnings on the Clang compiler. Non functional change (same bench and same MD5 signature, so compiled code is exactly the same as in current master) --- diff --git a/src/syzygy/tbprobe.cpp b/src/syzygy/tbprobe.cpp index 22b3697c..b553ac9f 100644 --- a/src/syzygy/tbprobe.cpp +++ b/src/syzygy/tbprobe.cpp @@ -125,18 +125,39 @@ struct PairsData { int groupLen[TBPIECES+1]; // Number of pieces in a given group: KRKN -> (3, 1) }; -// Helper struct to avoid to manually define entry copy c'tor as we should -// because default one is not compatible with std::atomic_bool. +// Helper struct to avoid manually defining entry copy constructor as we +// should because the default one is not compatible with std::atomic_bool. struct Atomic { Atomic() = default; Atomic(const Atomic& e) { ready = e.ready.load(); } // MSVC 2013 wants assignment within body std::atomic_bool ready; }; -struct WDLEntry : public Atomic { - WDLEntry(const std::string& code); - ~WDLEntry(); +// We define types for the different parts of the WLDEntry and DTZEntry with +// corresponding specializations for pieces or pawns. + +struct WLDEntryPiece { + PairsData* precomp; +}; + +struct WDLEntryPawn { + uint8_t pawnCount[2]; // [Lead color / other color] + WLDEntryPiece file[2][4]; // [wtm / btm][FILE_A..FILE_D] +}; +struct DTZEntryPiece { + PairsData* precomp; + uint16_t map_idx[4]; // WDLWin, WDLLoss, WDLCursedWin, WDLCursedLoss + uint8_t* map; +}; + +struct DTZEntryPawn { + uint8_t pawnCount[2]; + DTZEntryPiece file[4]; + uint8_t* map; +}; + +struct TBEntry : public Atomic { void* baseAddress; uint64_t mapping; Key key; @@ -144,46 +165,24 @@ struct WDLEntry : public Atomic { int pieceCount; bool hasPawns; bool hasUniquePieces; +}; + +// Now the main types: WDLEntry and DTZEntry +struct WDLEntry : public TBEntry { + WDLEntry(const std::string& code); + ~WDLEntry(); union { - struct { - PairsData* precomp; - } pieceTable[2]; // [wtm / btm] - - struct { - uint8_t pawnCount[2]; // [Lead color / other color] - struct { - PairsData* precomp; - } file[2][4]; // [wtm / btm][FILE_A..FILE_D] - } pawnTable; + WLDEntryPiece pieceTable[2]; // [wtm / btm] + WDLEntryPawn pawnTable; }; }; -struct DTZEntry : public Atomic { +struct DTZEntry : public TBEntry { DTZEntry(const WDLEntry& wdl); ~DTZEntry(); - - void* baseAddress; - uint64_t mapping; - Key key; - Key key2; - int pieceCount; - bool hasPawns; - bool hasUniquePieces; union { - struct { - PairsData* precomp; - uint16_t map_idx[4]; // WDLWin, WDLLoss, WDLCursedWin, WDLCursedLoss - uint8_t* map; - } pieceTable; - - struct { - uint8_t pawnCount[2]; - struct { - PairsData* precomp; - uint16_t map_idx[4]; - } file[4]; - uint8_t* map; - } pawnTable; + DTZEntryPiece pieceTable; + DTZEntryPawn pawnTable; }; };