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

Reply via email to