15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // #include <memory>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
125a83710eSEric Fiselier 
135a83710eSEric Fiselier #include <memory>
145a83710eSEric Fiselier #include <cassert>
155a83710eSEric Fiselier 
16*7fc6a556SMarshall Clow #include "test_macros.h"
17*7fc6a556SMarshall Clow 
main(int,char **)182df59c50SJF Bastien int main(int, char**)
195a83710eSEric Fiselier {
205a83710eSEric Fiselier     const unsigned N = 20;
215a83710eSEric Fiselier     char buf[N];
225a83710eSEric Fiselier     void* r;
235a83710eSEric Fiselier     void* p = &buf[0];
245a83710eSEric Fiselier     std::size_t s = N;
255a83710eSEric Fiselier     r = std::align(4, 10, p, s);
265a83710eSEric Fiselier     assert(p == &buf[0]);
275a83710eSEric Fiselier     assert(r == p);
285a83710eSEric Fiselier     assert(s == N);
295a83710eSEric Fiselier 
305a83710eSEric Fiselier     p = &buf[1];
315a83710eSEric Fiselier     s = N;
325a83710eSEric Fiselier     r = std::align(4, 10, p, s);
335a83710eSEric Fiselier     assert(p == &buf[4]);
345a83710eSEric Fiselier     assert(r == p);
355a83710eSEric Fiselier     assert(s == N-3);
365a83710eSEric Fiselier 
375a83710eSEric Fiselier     p = &buf[2];
385a83710eSEric Fiselier     s = N;
395a83710eSEric Fiselier     r = std::align(4, 10, p, s);
405a83710eSEric Fiselier     assert(p == &buf[4]);
415a83710eSEric Fiselier     assert(r == p);
425a83710eSEric Fiselier     assert(s == N-2);
435a83710eSEric Fiselier 
445a83710eSEric Fiselier     p = &buf[3];
455a83710eSEric Fiselier     s = N;
465a83710eSEric Fiselier     r = std::align(4, 10, p, s);
475a83710eSEric Fiselier     assert(p == &buf[4]);
485a83710eSEric Fiselier     assert(r == p);
495a83710eSEric Fiselier     assert(s == N-1);
505a83710eSEric Fiselier 
515a83710eSEric Fiselier     p = &buf[4];
525a83710eSEric Fiselier     s = N;
535a83710eSEric Fiselier     r = std::align(4, 10, p, s);
545a83710eSEric Fiselier     assert(p == &buf[4]);
555a83710eSEric Fiselier     assert(r == p);
565a83710eSEric Fiselier     assert(s == N);
575a83710eSEric Fiselier 
585a83710eSEric Fiselier     p = &buf[0];
595a83710eSEric Fiselier     s = N;
605a83710eSEric Fiselier     r = std::align(4, N, p, s);
615a83710eSEric Fiselier     assert(p == &buf[0]);
625a83710eSEric Fiselier     assert(r == p);
635a83710eSEric Fiselier     assert(s == N);
645a83710eSEric Fiselier 
655a83710eSEric Fiselier     p = &buf[1];
665a83710eSEric Fiselier     s = N-1;
675a83710eSEric Fiselier     r = std::align(4, N-4, p, s);
685a83710eSEric Fiselier     assert(p == &buf[4]);
695a83710eSEric Fiselier     assert(r == p);
705a83710eSEric Fiselier     assert(s == N-4);
715a83710eSEric Fiselier 
725a83710eSEric Fiselier     p = &buf[1];
735a83710eSEric Fiselier     s = N-1;
745a83710eSEric Fiselier     r = std::align(4, N-3, p, s);
755a83710eSEric Fiselier     assert(p == &buf[1]);
765a83710eSEric Fiselier     assert(r == nullptr);
775a83710eSEric Fiselier     assert(s == N-1);
785a83710eSEric Fiselier 
795a83710eSEric Fiselier     p = &buf[0];
805a83710eSEric Fiselier     s = N;
815a83710eSEric Fiselier     r = std::align(1, N+1, p, s);
825a83710eSEric Fiselier     assert(p == &buf[0]);
835a83710eSEric Fiselier     assert(r == nullptr);
845a83710eSEric Fiselier     assert(s == N);
852df59c50SJF Bastien 
862df59c50SJF Bastien   return 0;
875a83710eSEric Fiselier }
88