<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 - [maybe regression]: undefined behavior due to misaligned access to aligned lambda"
   href="https://bugs.llvm.org/show_bug.cgi?id=34266">34266</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[maybe regression]: undefined behavior due to misaligned access to aligned lambda
          </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>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>gonzalobg88@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>When compiling the following code with: clang++ -fsanitize=undefined -std=c++14

I get the following error:

mwe.cpp:30:14: runtime error: load of misaligned address 0x00000042ff61 for
type 'const (lambda at mwe.cpp:30:14) *', which requires 8 byte alignment
0x00000042ff61: note: pointer points here
 00 00 00  00 00 4b 46 69 76 45 00  50 bc 63 00 00 00 00 00  62 ff 42 00 00 00
00 00  2f 61 69 61 2f
              ^ 

initial debugging suggest that the lambda, which is properly aligned in
E::operator() is accessed via a misaligned pointer in D::operator(),
introducing undefined behavior. How this happens escapes me.

The reproducer is:

template<typename T>
struct static_const { static constexpr T value {}; };

template<typename T>
constexpr T static_const<T>::value;

struct B {
  static constexpr int bar(int) noexcept { return 0; }
  constexpr int baz(int) noexcept { return 0; }
};

struct C {
  auto operator()() const noexcept -> int { return 0; }
};

namespace {
  constexpr auto const& c_fn = static_const<C>::value;
}

struct D {
  template <typename F>
  auto operator()(F&& f) const noexcept -> int { return f(0); }
};

namespace { constexpr auto const& d_fn = static_const<D>::value; }

struct E {
  template <typename T = B>
  auto operator()(T t = B()) const noexcept -> T {
    auto l = [&](int i) { return t.baz(T::bar(i)); };
    d_fn(l);
    return t;
  }
};

namespace { constexpr auto const& e_fn = static_const<E>::value; }

int main() {
   auto a = c_fn();
   auto b = e_fn();
   return 0;
}</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>