1*3c1aa20cSAlvin Wong // RUN: %clang_cl_asan %Od %s %Fe%t
2673dc3d4SNico Weber // RUN: %run %t
3673dc3d4SNico Weber
4673dc3d4SNico Weber #include <windows.h>
5673dc3d4SNico Weber
6*3c1aa20cSAlvin Wong #ifdef __MINGW32__
7*3c1aa20cSAlvin Wong // FIXME: remove after mingw-w64 adds this declaration.
8*3c1aa20cSAlvin Wong extern "C" size_t __cdecl _aligned_msize(void *_Memory, size_t _Alignment,
9*3c1aa20cSAlvin Wong size_t _Offset);
10*3c1aa20cSAlvin Wong #endif
11*3c1aa20cSAlvin Wong
12673dc3d4SNico Weber #define CHECK_ALIGNED(ptr,alignment) \
13673dc3d4SNico Weber do { \
14673dc3d4SNico Weber if (((uintptr_t)(ptr) % (alignment)) != 0) \
15673dc3d4SNico Weber return __LINE__; \
16673dc3d4SNico Weber } \
17673dc3d4SNico Weber while(0)
18673dc3d4SNico Weber
main(void)19673dc3d4SNico Weber int main(void) {
20673dc3d4SNico Weber int *p = (int*)_aligned_malloc(1024 * sizeof(int), 32);
21673dc3d4SNico Weber CHECK_ALIGNED(p, 32);
22673dc3d4SNico Weber p[512] = 0;
23673dc3d4SNico Weber _aligned_free(p);
24673dc3d4SNico Weber
25673dc3d4SNico Weber p = (int*)_aligned_malloc(128, 128);
26673dc3d4SNico Weber CHECK_ALIGNED(p, 128);
27673dc3d4SNico Weber p = (int*)_aligned_realloc(p, 2048 * sizeof(int), 128);
28673dc3d4SNico Weber CHECK_ALIGNED(p, 128);
29673dc3d4SNico Weber p[1024] = 0;
30673dc3d4SNico Weber if (_aligned_msize(p, 128, 0) != 2048 * sizeof(int))
31673dc3d4SNico Weber return __LINE__;
32673dc3d4SNico Weber _aligned_free(p);
33673dc3d4SNico Weber
34673dc3d4SNico Weber return 0;
35673dc3d4SNico Weber }
36