[PATCH] D147875: [clang][Diagnostics] Show line numbers when printing code snippets

Eli Friedman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 5 14:22:53 PDT 2023


efriedma added inline comments.


================
Comment at: clang/lib/Frontend/TextDiagnostic.cpp:1121-1138
+static unsigned getNumDisplayWidth(unsigned N) {
+  if (N < 10)
+    return 1;
+  if (N < 100)
+    return 2;
+  if (N < 1'000)
+    return 3;
----------------
aaron.ballman wrote:
> jrtc27 wrote:
> > kwk wrote:
> > > This function screamed at me to be generalized so I gave it a try: https://gist.github.com/kwk/7e408065ea291e49fea4a83cf90a9cdf
> > I don't think I want floating point arithmetic in my compiler... Something like:
> > 
> > ```
> >     unsigned L, M;
> >     for (L = 1U, M = 10U; N >= M && M != ~0U; ++L)
> >         M = (M > ((~0U) / 10U)) ? (~0U) : (M * 10U);
> >     
> >     return (L);
> > ```
> > 
> > is the generalised form (without all the redundant parentheses I added during debugging).
> Cleaned up a bit:
> ```
> constexpr unsigned getNumDisplayWidth(unsigned N) {
>   unsigned L = 1U, M = 10U;
>   constexpr unsigned Upper = ~0U / 10U;
>   for (; N >= M && M != ~0U; ++L)
>     M = M > Upper ? ~0U : M * 10U;
>   return L;
> }
> ```
> https://godbolt.org/z/szTYsEM4v
Slightly less efficient, but easier to read:

```
unsigned getNumDisplayWidth(unsigned N) {
  unsigned Width = 1;
  for (; N >= 10; ++Width)
    N /= 10;
  return Width;
}
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147875/new/

https://reviews.llvm.org/D147875



More information about the cfe-commits mailing list