HazardyKnusperkeks marked 15 inline comments as done.
HazardyKnusperkeks added inline comments.


================
Comment at: clang/include/clang/Format/Format.h:3130-3136
+  /// \brief The position of the ``requires`` clause for class templates.
+  /// \version 14
+  RequiresClausePositionStyle RequiresClausePositionForClasses;
+
+  /// \brief The position of the ``requires`` clause for function templates.
+  /// \version 14
+  RequiresClausePositionStyle RequiresClausePositionForFunctions;
----------------
Quuxplusone wrote:
> HazardyKnusperkeks wrote:
> > Quuxplusone wrote:
> > > What about for variable templates? What about for alias templates? What 
> > > about for deduction guides?
> > > It makes sense to me to have //one// option for this. It doesn't make 
> > > sense to have 2, 3, or 4. Having 5 feels insane. So, I think you should 
> > > just have one option that applies consistently to all `requires`-clauses 
> > > everywhere in the code.
> > That makes sense, in my defense I thought about it and came to the 
> > conclusion there would be no need for requires on variable templates, and 
> > the others I did not think of.
> > 
> > Why I have chosen to options is maybe someone wants
> > ```template <typename T>
> > requires ...
> > class ...```
> > 
> > But also
> > ```template <typename T>
> > void foo(T) requires ... {
> > ```
> > 
> > What's your opinion on that?
> Well, I see that there is a machine-readable distinction between "`requires` 
> after `template`" versus "`requires` after function parameter list," i.e. 
> between
> ```
> template<class T> requires X
> void f(T);
> 
> template<class T>
> void f(T) requires X;
> ```
> The latter position is not (currently) valid for non-functions (e.g. 
> `template<class T> int v requires X;` is a syntax error).
> However, as usual, I don't think that the user should //want// to format 
> these differently.
> If you're using clang-format to format your code, then you should definitely 
> want function-parameter-list-requires-clauses on their own line for sure, to 
> avoid confusing strings of tokens such as
> ```
> void f() const noexcept requires foobar<T>;  // bad
> 
> void f() const noexcept  // better
>   requires foobar<T>;
> ```
> If you do that, then (in my proposed world) you would also automatically get
> ```
> template<class T>
>   requires foobar<T>  // automatically
> void f();
> 
> template<class T> requires foobar<T>  // can't get this
> void f();
> 
> template<foobar T>  // could also get this, via manual intervention
> void f();
> ```
> And personally I see nothing wrong with that state of affairs.
I still can imagine someone maybe wants it different, but for now I go with 
your suggestion, only one option for all clauses.


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

https://reviews.llvm.org/D113319

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

Reply via email to