<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 - Failing compilation of dereferencing pointer-to-member function in constexpr function context"
   href="https://bugs.llvm.org/show_bug.cgi?id=43519">43519</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Failing compilation of dereferencing pointer-to-member function in constexpr function context
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>9.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

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

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>pierre.landrock@web.de
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, dgregor@apple.com, erik.pilkington@gmail.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>The following code was compiling fine in previous Clang versions (checked from
4.0.0 up to 8.0.0). It also compiles using GCC. However, using Clang 9.0.0, it
fails to compile with the message that a subexpression is not valid in a
constant expression.

--------

struct S
{
    constexpr int doubleValue(const int input) const
    {
        return 2 * input;
    }

    constexpr double doubleValue(const double input) const
    {
        return 2 * input;
    }
};

template <typename TReturn>
struct Overloader
{
    template <typename TClass, typename ...TArgs>
    constexpr auto operator()(TReturn (TClass::* const method)(TArgs...) const)
const
    {
         return method;
    }
};

constexpr int criticalFunction()
{
    S s;
    Overloader<int> overloader;

    auto method = overloader(&S::doubleValue);
    int value{(s.*method)(21)};

    return value;
}

int main()
{
    constexpr int result{criticalFunction()};
    static_assert(result == 42, "fail");
    return result;
}

-------

The error occurs inside 'criticalFuntion' in the line where 'method' is
dereferenced.

Moving the code from 'criticalFunction' to 'main', and adding a constexpr
specifier to both 'method' and 'value' will make the code compile. Hence, the
issue seems to be bound to constexpr function context.</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>