<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </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 --- - declval() can be implemented without requiring a template instantiation."
   href="https://llvm.org/bugs/show_bug.cgi?id=27798">27798</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>declval() can be implemented without requiring a template instantiation.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libc++
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </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>All Bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>eniebler@boost.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org, mclow.lists@gmail.com
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>declval gets used *everywhere*. It doesn't need to instantiate a template.
Rather than:

  template <class _Tp>
  typename add_rvalue_reference<_Tp>::type
  declval() noexcept;

declval can be defined as:

  template<typename _Tp, typename _Up = _Tp&&>
  _Up
  __declval(int);

  template<typename _Tp>
  _Tp
  __declval(long);

  template<typename _Tp>
  auto declval() noexcept -> decltype(__declval<_Tp>(0));

In a large code base that makes heavy use of templates, this small change is a
measured  2% compile-time win.

I think the as-if rule gives implementers enough latitude to make this change.</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>