J'ai la fonction suivante (exemple réduit) :
QByteArray DecompressBytes(const QByteArray& content){
/* function body (with other return expressions) */
do { return content; } while(content.size() != 0);
}
La dernière ligne a été ajoutée pour les tests, en remplacement d'une macro utilisée. Visual Studio ne voit pas de problème avec ce code, mais g++ génère
avertissement : la commande atteint la fin d'une fonction non vide [-Wreturn-type].
Changer la dernière ligne en return content;
supprime l'avertissement.
Ma question : pourquoi le compilateur se comporte-t-il ainsi et quelle devrait être la forme du code pour éviter tout avertissement ?
La dernière ligne était auparavant ASSERT_FAIL("must be unreachable", content)
con ASSERT_FAIL
en s'étendant sur do { ... } while(false)
avec une autre macro remplaçant while
pour interdire les expressions non-bool, donc l'expression résultante était comme do { qt_assert_x("", "", 42); return content; } while(::helper::bool_verify(false));
.
g++ version 5.3.0, utilisé avec MinGW (configuration Qt standard).
Mise à jour : après avoir essayé de commenter différentes parties du code (puisque l'exemple pur ci-dessus ne permet pas de reproduire le problème), quelque chose de vraiment étrange est apparu :
QByteArray DecompressBytes(const QByteArray& content){
QByteArray decompressed; //no 'unused variable' warning
do { return content; } while(content.size() != 0);
} //produces warning above
QByteArray DecompressBytes2(const QByteArray& content){
//QByteArray decompressed;
do { return content; } while(content.size() != 0);
} //doesn't produce warning
std::vector<char> DecompressBytes3(const std::vector<char>& content){
std::vector<char> decompressed; //no 'unused variable' warning
do { return content; } while(content.size() != 0);
} //does produce warning
std::vector<char> DecompressBytes4(const std::vector<char>& content){
int decompressed; //unused variable warning is given
do { return content; } while(content.size() != 0);
} //doesn't produce warning
Je ne suis pas sûr de ce que tout cela signifie.