2018-11-07 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr81112.C
blobe9ef2a84cbfe774ea2124f478e9837e4608dbe3e
1 // { dg-do compile }
2 // { dg-additional-options "-Wno-psabi" }
4 class AssertionResult {
5     bool success_;
6 };
8 AssertionResult AssertionSuccess();
10 template <typename T1>
11 AssertionResult EXPECT_EQ(const T1& expected, const T1& actual) {
12     if (expected == actual) {
13         return AssertionSuccess();
14     }
15     return AssertionSuccess();
18 struct uuid
20   unsigned char data[16];
23 bool operator== (uuid const& lhs, uuid const& rhs);
25 typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
26 typedef int __v4si __attribute__ ((__vector_size__ (16)));
27 typedef char __v16qi __attribute__ ((__vector_size__ (16)));
28 typedef long long __m128i_u __attribute__ ((__vector_size__ (16), __may_alias__, __aligned__ (1)));
30 int foo (__v16qi);
32 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
33      _mm_loadu_si128 (__m128i_u const *__P)
35     return *__P;
37 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
38      _mm_cmpeq_epi32 (__m128i __A, __m128i __B)
40     return (__m128i) ((__v4si)__A == (__v4si)__B);
42 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
43      _mm_movemask_epi8 (__m128i __A)
45     return foo ((__v16qi)__A);
49 __m128i load_unaligned_si128(const unsigned char* p)
51   return _mm_loadu_si128(reinterpret_cast< const __m128i* >(p));
54 inline bool operator== (uuid const& lhs, uuid const& rhs)
56   __m128i mm_left = load_unaligned_si128(lhs.data);
57   __m128i mm_right = load_unaligned_si128(rhs.data);
59   __m128i mm_cmp = _mm_cmpeq_epi32(mm_left, mm_right);
61   return _mm_movemask_epi8(mm_cmp) == 0xFFFF;
64 void crash_gcc7()
66   static const uuid u = uuid();
67   EXPECT_EQ(u, u);