bernhardmgruber added inline comments.

================
Comment at: clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp:274
+
+  if (F->getLocation().isInvalid())
+    return;
----------------
aaron.ballman wrote:
> bernhardmgruber wrote:
> > aaron.ballman wrote:
> > > bernhardmgruber wrote:
> > > > aaron.ballman wrote:
> > > > > Should this also bail out if the function is `main()`?
> > > > How strange does
> > > > 
> > > > ```
> > > > auto main(int argc, const char* argv[]) -> int {
> > > >     return 0;
> > > > }
> > > > ```
> > > > look to you?
> > > > 
> > > > I think the transformation is valid here. But I can understand that 
> > > > people feel uneasy after typing `int main ...` for decades. Should we 
> > > > also create an option here to turn it off for main? Or just not 
> > > > transform it? I do not mind. If I want `main` to start with `auto` I 
> > > > could also do this transformation manually.
> > > This comment was marked as done, but I don't see any changes or mention 
> > > of what should happen. I suppose the more general question is: should 
> > > there be a list of functions that should not have this transformation 
> > > applied, like program entrypoints? Or do you want to see this check 
> > > diagnose those functions as well?
> > I am sorry for marking it as done. I do not know how people work here 
> > exactly and how phabricator behaves. I thought the check boxes are handled 
> > for everyone individually. Also, if I add a new comment, it is checked by 
> > default.
> > 
> > How are you/most people going to use clang-tidy? Do you run it regularly 
> > and automatic? Do you expect it to find zero issues once you applied the 
> > check?
> > In other words, if you do not want to transform some functions, do you need 
> > an option to disable the check for these, so it runs clean on the full 
> > source code?
> > 
> > Personally, I do not need this behavior, as I run clang-tidy manually once 
> > in a while and revert transformations I do not want before checking in the 
> > changes.
> > I am sorry for marking it as done. I do not know how people work here 
> > exactly and how phabricator behaves. I thought the check boxes are handled 
> > for everyone individually. Also, if I add a new comment, it is checked by 
> > default.
> 
> No worries -- that new comments are automatically marked done by default is 
> certainly a surprise to me!
> 
> > How are you/most people going to use clang-tidy? Do you run it regularly 
> > and automatic? Do you expect it to find zero issues once you applied the 
> > check? In other words, if you do not want to transform some functions, do 
> > you need an option to disable the check for these, so it runs clean on the 
> > full source code?
> 
> I think it's hard to gauge how most people do anything, really. However, I 
> think there are people who enable certain clang-tidy checks and have them run 
> automatically as part of CI, etc. Those kind of folks may need the ability to 
> silence the diagnostics. We could do this in a few ways (options to control 
> methods not to diagnose, NOLINT comments, etc).
> 
> I kind of think we don't need an option for the user to list functions not to 
> transform. They can use NOLINT to cover those situations as a one-off. The 
> only situation where I wonder if everyone is going to want to write NOLINT is 
> for `main()`. It might make sense to have an option to not check program 
> entrypoints, but there is technically nothing stopping someone from using a 
> trailing return type with a program entrypoint so maybe this option isn't 
> needed at all.
> 
> How about we not add any options and if someone files a bug report, we can 
> address it then?
> How about we not add any options and if someone files a bug report, we can 
> address it then?

Sounds good to me!


================
Comment at: clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp:180-184
+      if (Info.hasMacroDefinition()) {
+        // The CV qualifiers of the return type are inside macros.
+        diag(F.getLocation(), Message);
+        return {};
+      }
----------------
aaron.ballman wrote:
> bernhardmgruber wrote:
> > aaron.ballman wrote:
> > > Perhaps I'm a bit dense on a Monday morning, but why should this be a 
> > > diagnostic? I am worried this will diagnose situations like (untested 
> > > guesses):
> > > ```
> > > #define const const
> > > const int f(void); // Why no fixit?
> > > 
> > > #define attr __attribute__((frobble))
> > > attr void g(void); // Why diagnosed as needing a trailing return type?
> > > ```
> > Because I would also like to rewrite functions which contain macros in the 
> > return type. However, I cannot provide a fixit in all cases. Clang can give 
> > me a `SourceRange` without CV qualifiers which seems to work in all my 
> > tests so far. But to include CV qualifiers I have to do some manual lexing 
> > left and right of the return type `SourceRange`. If I encounter macros 
> > along this way, I bail out because handling these cases becomes compilated 
> > very easily.
> > 
> > Your second case does not give a diagnostic, as it is not matched by the 
> > check, because it returns `void`.
> > Because I would also like to rewrite functions which contain macros in the 
> > return type. However, I cannot provide a fixit in all cases. Clang can give 
> > me a SourceRange without CV qualifiers which seems to work in all my tests 
> > so far. But to include CV qualifiers I have to do some manual lexing left 
> > and right of the return type SourceRange. If I encounter macros along this 
> > way, I bail out because handling these cases becomes compilated very easily.
> 
> That makes sense, but I am worried about this bailing out because of things 
> that are not CV qualifiers but are typically macros, like attributes. It 
> seems like there should not be a problem providing a fixit in that situation, 
> unless I'm misunderstanding still.
```
#define const const
const int f(void); // Why no fixit?
```
This can be handled now. As well as e.g.:

```
#define ATT __attribute__((deprecated))
ATT const int f();
```


================
Comment at: clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp:234
+  bool ExtendedLeft = false;
+  for (size_t I = 0; I < Tokens.size(); I++) {
+    // If we found the beginning of the return type, include const and volatile
----------------
aaron.ballman wrote:
> bernhardmgruber wrote:
> > aaron.ballman wrote:
> > > As a torture test for this, how well does it handle a declaration like:
> > > ```
> > > const long static int volatile unsigned inline long foo();
> > > ```
> > > Does it get the fixit to spit out:
> > > ```
> > > static inline auto foo() -> const unsigned long long int;
> > > ```
> > I honestly did not believe this compiled until I put it into godbolt. And 
> > no, it is not handled.
> > I added your test as well as a few other ones of this kind. You could also 
> > add `constexpr` or inside classes `friend` anywhere.
> > 
> > I will try to come up with a solution. I guess the best would be to delete 
> > the specifiers from the extracted range type string and readd them in the 
> > order of appearance before auto.
> > I will try to come up with a solution. I guess the best would be to delete 
> > the specifiers from the extracted range type string and readd them in the 
> > order of appearance before auto.
> 
> Alternatively, if it's easier, you can refuse to add fix-its for the 
> situation and just add a FIXME to handle this should users ever care.
Specifiers at arbitrary locations inside the return type should be supported 
now.


================
Comment at: clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp:268
+  const BuiltinType *BT = dyn_cast<BuiltinType>(RT.getTypePtr());
+  if (!BT || !BT->getName(PrintingPolicy(LangOpts)).contains(' '))
+    return true;
----------------
bernhardmgruber wrote:
> I am not sure if this covers all types where a specifier may occur "inside" a 
> type. Can someone come up with something other than a built-in type 
> consisting of at least two tokens?
`int static&();`
Running `keepSpecifiers()` on all return types now.


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

https://reviews.llvm.org/D56160



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to