Point S : what() donne le nom de la classe sans explication, un pointeur nul n'est pas une explication - #90
Merged
Conversation
…xplanation is none
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Point S de
TODO.md(l'ancien 14, suite de #32), selon les décisions du 3 et du 4 octobre. Les résultats des calculs ne changent pas.Un pointeur nul n'est pas une explication
Les constructeurs à
const char*deinput_format_error,unavailable_feature_erroretinvalid_action_errorpassaient leur explication àgaol_exception(f, l, const std::string&). Un pointeur nul y construisait donc unstd::string, ce qui est un comportement indéfini (libstdc++ lèvestd::logic_error). Aucun appel de GAOL ne le fait.gaol_exceptiona maintenant un constructeurgaol_exception(const char* f, unsigned l, const char* e), celui que le manuel documentait déjà et qui n'existait pas. Les constructeurs àconst char*des classes dérivées y passent sans changement, et un pointeur nul y laisse l'explication vide. Un littéral ou unstd::stringdonnent la même explication qu'avant.what()n'est jamais videSans explication,
what()rendaitgaol_exceptionpour toutes les classes. Il rend maintenant le nom de la classe de l'exception :gaol_exception,input_format_error,unavailable_feature_errorouinvalid_action_error. C'est aussi ce qu'il rend quand le texte C de l'explication est vide, c'est-à-dire quand unstd::stringcommence par un NUL : il rendait alors un texte vide.what()lit le nom dans une fonction virtuelle privée,class_name(), que chaque classe dérivée redéfinit en une ligne dans l'en-tête.gaol_exceptionchange. Elle a déjà changé dans GAOL v5 avecwhat(), et GAOL v5 n'a pas l'ABI de GAOL 4.class_name(), rend le nom de la classe de GAOL dont elle dérive.operator<<copie l'explication une foisoperator<<d'une exception appelaitexplanation()deux fois, ce qui copiait la chaîne deux fois. Elle est maintenant gardée dans une variable locale (décidé le 4 octobre). La sortie ne change pas.Tests et documentation
tests/expressions.cpp:says<>()vérifie, pour les quatre classes, quewhat()est le nom de la classe sans explication, avec un pointeur nul (dontexplanation()est vide) et avec une explication qui commence par un NUL, et qu'operator<<n'écrit pas d'explication pour un pointeur nul. Avec l'ancienwhat()remis en place, ces 10 contrôles échouent.std::string, que GAOL 4 avait déjà mais que le manuel ne donnait pas, sont ajoutés pour les quatre classes. Le pointeur nul est dit dans l'entrée degaol_exception(\newinvfive), et le nom de la classe dans celle dewhat().gaol/gaol_exceptions.hetdoc/tests.mddisent la même chose.todo-notes/synthese.md: les textes du point 14 pourChangeLogetdoc/differences.mdsont adaptés (ci-dessous), et la note sur l'appel double d'explanation()est retirée.examples/examples.md(n° 15 de la section 5 et de l'annexe B) est laissé à la pull request de synthèse, commeChangeLogetdoc/differences.md.Pour
doc/differences.mdetChangeLog(pull request de synthèse)Ces textes remplacent ceux du point 14 dans
todo-notes/synthese.md, où ils sont aussi.Vérifié en local
-Wall -Wextra, avec les tests et les exemples-Wall -Wextra -Werror, avec les testsintervalfetinterval2f, par construction. Aucun avertissement..github/scripts/headers.sh, sur l'installation CMake, avec g++ 9.4 et clang++-18 : les 22 en-têtes vérifiés compilent seuls avec-Wall -Wextra -Wold-style-cast -Werror, et toutes les macros sont préfixées.-Weverything, Clang 18 signale-Wweak-vtablessur les trois classes dérivées, comme avec l'en-tête deconfigure-clean: rien de nouveau.gaol_exceptions.cppcomme avant. La CI les couvre.Dépendances
Aucune. Les fichiers touchés ne sont pas ceux de
todo-27-per-instruction-rounding.todo-12-long-sums(point E) touche aussitests/expressions.cppetmanual/v5/gaol.tex, mais à d'autres endroits.Après la fusion
TODO.md: le point S est fait, et le n° 14 sort de la table des anciens numéros.