From 901fed5f1970bbb370a08bc1edee9b4c0179bc87 Mon Sep 17 00:00:00 2001 From: Dmitry-Me Date: Fri, 25 Sep 2015 10:29:51 +0300 Subject: [PATCH] Get rid of -Wtype-limits warning --- tinyxml2.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 4a1573f..ea8088c 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -1914,6 +1914,26 @@ XMLError XMLDocument::LoadFile( const char* filename ) return _errorID; } +// This is likely overengineered template art to have a check that unsigned long value incremented +// by one still fits into size_t. If size_t type is larger than unsigned long type +// (x86_64-w64-mingw32 target) then the check is redundant and gcc and clang emit +// -Wtype-limits warning. This piece makes the compiler select code with a check when a check +// is useful and code with no check when a check is redundant depending on how size_t and unsigned long +// types sizes relate to each other. +template += sizeof(size_t))> +struct LongFitsIntoSizeTMinusOne { + static bool Fits( unsigned long value ) + { + return value < (size_t)-1; + } +}; + +template <> +bool LongFitsIntoSizeTMinusOne::Fits( unsigned long /*value*/ ) +{ + return true; +} XMLError XMLDocument::LoadFile( FILE* fp ) { @@ -1933,7 +1953,7 @@ XMLError XMLDocument::LoadFile( FILE* fp ) return _errorID; } - if ( (unsigned long)filelength >= (size_t)-1 ) { + if ( !LongFitsIntoSizeTMinusOne<>::Fits( filelength ) ) { // Cannot handle files which won't fit in buffer together with null terminator SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID;