<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [feature request] requires clause in functions (concepts TS)"
   href="https://bugs.llvm.org/show_bug.cgi?id=32166">32166</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[feature request] requires clause in functions (concepts TS)
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Formatter
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>gonzalobg88@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>djasper@google.com, klimek@google.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>This code

template <bool IsConst>
struct A {
  void prev() 
  requires BidirectionalIterator<iterator_t<IsConst>>() &&
           BidirectionalIterator<iterator_t<IsConst>>() &&
           BidirectionalIterator<iterator_t<IsConst>>() 
  { --it_; }
};

gets formatted into: 

template <bool IsConst>
struct A {
  void prev() requires BidirectionalIterator<iterator_t<IsConst>>() &&
      BidirectionalIterator<iterator_t<IsConst>>() &&
      BidirectionalIterator<iterator_t<IsConst>>() {
    --it_;
  }
};

I don't see a reason why the options specified in #32165 shouldn't apply here
as well. 

Also:
<a href="https://github.com/CaseyCarter/cmcstl2/blob/43b63f6846d80bcd1867f512519bc18841bd961e/include/stl2/detail/iterator/operations.hpp#L25">https://github.com/CaseyCarter/cmcstl2/blob/43b63f6846d80bcd1867f512519bc18841bd961e/include/stl2/detail/iterator/operations.hpp#L25</a>

this code: 

template <class I>
requires
        Iterator<I>()
        // Pre: 0 <= n && [i,i+n)
constexpr void impl(I& i, difference_type_t<I> n)
noexcept(noexcept(++std::declval<I&>()))
{
    STL2_EXPECT(0 <= n);
    while (n != 0) {
        --n;
        ++i;
    }
}

gets formatted into 

template <class I>
requires Iterator<I>()
    // Pre: 0 <= n && [i,i+n)
    constexpr void impl(I& i, difference_type_t<I> n) noexcept(
        noexcept(++std::declval<I&>())) {
  STL2_EXPECT(0 <= n);
  while (n != 0) {
    --n;
    ++i;
  }
}

(Note how the constexpr keywords is not aligned with the template keyword).</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>