aaron.ballman added inline comments.
================
Comment at:
clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp:204
+ return true;
+}
+
----------------
LegalizeAdulthood wrote:
> LegalizeAdulthood wrote:
> > aaron.ballman wrote:
> > > LegalizeAdulthood wrote:
> > > > LegalizeAdulthood wrote:
> > > > > aaron.ballman wrote:
> > > > > > LegalizeAdulthood wrote:
> > > > > > > aaron.ballman wrote:
> > > > > > > > Comma operator?
> > > > > > > Remember that the use case here is identifying expressions that
> > > > > > > are initializers for an enum. If you were doing a code review
> > > > > > > and you saw this:
> > > > > > > ```
> > > > > > > enum {
> > > > > > > FOO = (2, 3)
> > > > > > > };
> > > > > > > ```
> > > > > > > Would you be OK with that? I wouldn't. Clang even warns about
> > > > > > > it: https://godbolt.org/z/Y641cb8Y9
> > > > > > >
> > > > > > > Therefore I deliberately left comma operator out of the grammar.
> > > > > > This is another case where I think you're predicting that users
> > > > > > won't be using the full expressivity of the language and we'll get
> > > > > > bug reports later. Again, in insolation, I tend to agree that I
> > > > > > wouldn't be happy seeing that code. However, users write some very
> > > > > > creative code and there's no technical reason why we can't or
> > > > > > shouldn't handle comma operators.
> > > > > "Don't let the perfect be the enemy of the good."
> > > > >
> > > > > My inclination is to simply explicitly state that comma operator is
> > > > > not recognized in the documentation. It's already implicit by it's
> > > > > absence from the list of recognized operators.
> > > > >
> > > > > Again, the worst that happens is that your macro isn't converted.
> > > > >
> > > > > I'm open to being convinced that it's important, but you haven't
> > > > > convinced me yet `:)`
> > > > It wasn't much extra work/code to add comma operator support so I've
> > > > done that.
> > > > "Don't let the perfect be the enemy of the good."
> > >
> > > This is a production compiler toolchain. Correctness is important and
> > > that sometimes means caring more about perfection than you otherwise
> > > would like to.
> > >
> > > > I'm open to being convinced that it's important, but you haven't
> > > > convinced me yet :)
> > >
> > > It's less about importance and more about maintainability coupled with
> > > correctness. With your approach, we get something that will have a long
> > > tail of bugs. If you used Clang's parser, you don't get the same issue --
> > > maintenance largely comes along for free, and the bugs are far less
> > > likely.
> > >
> > > About the only reason I like your current approach over using clang's
> > > parsing is that it quite likely performs much better than doing an actual
> > > token parsing of the expression. But as you pointed out, about the worst
> > > thing for a check can do is take correct code and make it incorrect --
> > > doing that right requires some amount of semantic evaluation of the
> > > expressions (which you're not doing). For example:
> > > ```
> > > #define FINE 1LL << 30LL;
> > > #define BAD 1LL << 31LL;
> > > #define ALSO_BAD 1LL << 32L;
> > > ```
> > > We'll convert this into an enumeration and break `-pedantic-errors`
> > > builds in C. If we had a `ConstantExpr` object, we could see what it's
> > > value is and note that it's greater than what fits into an `int` and
> > > decide to do something smarter.
> > >
> > > So I continue to see the current approach as being somewhat reasonable
> > > (especially for experimentation), but incorrect in the long run. Not
> > > sufficiently incorrect for me to block this patch on, but incorrect
> > > enough that the first time this check becomes a maintenance burden, I'll
> > > be asking more strongly to do this the correct way.
> > > > "Don't let the perfect be the enemy of the good."
> > >
> > > This is a production compiler toolchain. Correctness is important and
> > > that sometimes means caring more about perfection than you otherwise
> > > would like to.
> >
> > That's fair.
> >
> > > For example:
> > > ```
> > > #define FINE 1LL << 30LL;
> > > #define BAD 1LL << 31LL;
> > > #define ALSO_BAD 1LL << 32L;
> > > ```
> >
> > Oh this brings up the pesky "semicolons disappear from the AST" issue. I
> > wonder what happens when we're just processing tokens, though. I will add
> > a test to see. This could be a case where my approach results in more
> > correctness than `clangParse`!
> >
> > > Not sufficiently incorrect for me to block this patch on, but incorrect
> > > enough that the first time this check becomes a maintenance burden, I'll
> > > be asking more strongly to do this the correct way.
> >
> > I agree.
> So I was research the C standard for what it says are acceptable initializer
> values for an enum and it //disallows// the comma operator:
>
> https://en.cppreference.com/w/c/language/enum
>
> > integer constant expression whose value is representable as a value of type
> > int
>
> https://en.cppreference.com/w/c/language/constant_expression
>
> > An integer constant expression is an expression that consists only of
> > - operators other than assignment, increment, decrement, function-call, or
> > comma, except that cast operators can only cast arithmetic types to integer
> > types
>
> So I'll have to reject initializing expressions that use the comma operator
> when processing C files.
> So I'll have to reject initializing expressions that use the comma operator
> when processing C files.
Be careful when you do so: https://godbolt.org/z/dTMKv3a4v
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124500/new/
https://reviews.llvm.org/D124500
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits