https://bugs.llvm.org/show_bug.cgi?id=50962

            Bug ID: 50962
           Summary: Clang 11.0 and 12.0 errorneous codegen on Windows x64
                    when using Visual Studio 2019 STL.
           Product: clang
           Version: 12.0
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: release blocker
          Priority: P
         Component: C++17
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected], [email protected],
                    [email protected], [email protected]

Rephrased title to better match the problem, originally from [Structured
Bindings Miscompilation(?) on Windows
x64](https://bugs.llvm.org/show_bug.cgi?id=50731). As the problem is not
limited to structured bindings but operator[] and std::get.

Microsoft also doesn't seem to find anything wrong with their STL, for more
info, see [Clang 11.0 and 12.0 generates erroneous code when using
STL](https://developercommunity.visualstudio.com/t/Clang-110-and-120-generates-erroneous/1464106).

The code in question,
```
#include <immintrin.h>

#include <array>

namespace my {

template <class T, size_t N>
struct array {
  T data_[N];
};

template <size_t I, class T, size_t N>
constexpr typename std::enable_if<(I < N), T&>::type get(
    my::array<T, N>& a) noexcept {
  return a.data_[I];
}

template <size_t I, class T, size_t N>
constexpr typename std::enable_if<(I < N), T const&>::type get(
    my::array<T, N> const& a) noexcept {
  return a.data_[I];
}

template <size_t I, class T, size_t N>
constexpr typename std::enable_if<(I < N), T&&>::type get(
    my::array<T, N>&& a) noexcept {
  return std::move(a.data_[I]);
}

}  // namespace my

namespace std {

template <class T, size_t N>
struct tuple_size<my::array<T, N>> {
  static constexpr auto value = N;
};

template <size_t I, class T, size_t N>
struct tuple_element<I, my::array<T, N>> {
  static_assert(I < N);

  using type = T;
};

}  // namespace std

#if 0
using std::array;  // Results in memory violation in x64 Debug.
#else
using my::array;  // Fine.
#endif

int main() {
  auto lambda = [](std::array<__m256i, 2> in) noexcept {
    auto [in0, in1] = in;

    return _mm256_add_epi8(in0, in1);
  };

  const __m256i a = _mm256_set1_epi8(1);
  const __m256i b = _mm256_set1_epi8(2);

  (void)lambda({a, b});
}
```

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to