git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Use ^=1 to toggle between 0 and 1

From
Jeff King <peff@peff.net>
Date
Dec 14, 2023, 22:05 UTC
Message-ID
<20231214220503.GA3320432@coredump.intra.peff.net>
In-Reply-To
<4d0b2a5f-305b-4350-b164-44923cb250d8@web.de>
On Thu, Dec 14, 2023 at 02:08:31PM +0100, René Scharfe wrote:
Show 16 quoted lines
> > I don't even know that we'd need much of a weather-balloon patch. I
> > think it would be valid to do:
> >
> >   #ifndef bool
> >   #define bool int
> >
> > to handle pre-C99 compilers (if there even are any these days). Of
> > course we probably need some conditional magic to try to "#include
> > <stdbool.h>" for the actual C99. I guess we could assume C99 by default
> > and then add NO_STDBOOL as an escape hatch if anybody complains.
> 
> The semantics are slightly different in edge cases, so that fallback
> would not be fully watertight.  E.g. consider:
> 
>    bool b(bool cond) {return cond == true;}
>    bool b2(void) {return b(2);}

Yeah. b2() is wrong for passing "2" to a bool. I assumed that the compiler would warn of that (at least for people on modern C99 compilers, not the fallback code), but it doesn't seem to. It's been a long time since I've worked on a code base that made us of "bool", but I guess that idea is that silently coercing a non-zero int to a bool is reasonable in many cases (e.g., "bool found_foo = count_foos()").

I guess one could argue that b() is also sub-optimal, as it should just say "return cond" or "return !cond" rather than explicitly comparing to true/false. But I won't be surprised if it happens from time to time.

> A coding rule to not compare bools could mitigate that.  Or a rule to
> only use the values true and false in bool context and to only use
> logical operators on them.

That seems more complex than we want if our goal is just supporting legacy systems that may or may not even exist. Given your example, I'd be more inclined to just do a weather-balloon adding <stdbool.h> to git-compat-util.h, and using "bool" in a single spot in the code. If nobody screams after a few releases, we can consider it OK. If they do, it's a trivial patch to convert back.

-Peff
Previous: René ScharfeNext: Phillip Wood
Message 8 of 26 in “Use ^=1 to toggle between 0 and 1”
  1. Use ^=1 to toggle between 0 and 1AtariDreams via GitGitGadget, Dec 12, 2023
  2. Dragan SimicDec 12, 2023
  3. Jeff KingDec 12, 2023
  4. René ScharfeDec 12, 2023
  5. Jeff KingDec 13, 2023
  6. Junio C HamanoDec 13, 2023
  7. René ScharfeDec 14, 2023
  8. Jeff KingDec 14, 2023
  9. Phillip WoodDec 15, 2023
  10. Junio C HamanoDec 15, 2023
  11. René ScharfeDec 16, 2023
  12. Phillip WoodDec 18, 2023
  13. git-compat-util: convert skip_{prefix,suffix}{,_mem} to boolRené Scharfe, Dec 16, 2023
  14. Phillip WoodDec 18, 2023
  15. Junio C HamanoDec 18, 2023
  16. René ScharfeDec 19, 2023
  17. Jeff KingDec 21, 2023
  18. Jeff KingDec 21, 2023
  19. phillip.wood123@gmail.comDec 21, 2023
  20. Use ^=1 to toggle between 0 and 1AreaZR via GitGitGadget, Dec 18, 2024
  21. git: use ^=1 to toggle between 0 and 1AreaZR via GitGitGadget, Dec 18, 2024
  22. git: use ^=1 to toggle between 0 and 1AreaZR via GitGitGadget, Dec 18, 2024
  23. git: use ^=1 to toggle between 0 and 1AreaZR via GitGitGadget, Dec 18, 2024
  24. git: use logical-not operator to toggle between 0 and 1AreaZR via GitGitGadget, Dec 18, 2024
  25. Junio C HamanoDec 19, 2024
  26. Junio C HamanoDec 18, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.