blob: b206fe31ea196601a21396712e446578ddae5f48 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14, c++17
// #include <memory>
// template<size_t N, class T>
// [[nodiscard]] constexpr T* assume_aligned(T* ptr);
// This test checks that we static_assert inside std::assume_aligned<N>(p)
// when N is not a power of two. However, Clang will already emit an error
// in its own __builtin_assume_aligned, so we ignore that additional error
// for the purpose of this test. We also ignore the additional warning about
// remainder by 0 being undefined.
// ADDITIONAL_COMPILE_FLAGS: -Xclang -verify-ignore-unexpected=error -Xclang -verify-ignore-unexpected=warning
#include <memory>
void f() {
int *p = nullptr;
(void)std::assume_aligned<0>(p); // expected-error@*:* {{std::assume_aligned<N>(p) requires N to be a power of two}}
(void)std::assume_aligned<3>(p); // expected-error@*:* {{std::assume_aligned<N>(p) requires N to be a power of two}}
(void)std::assume_aligned<5>(p); // expected-error@*:* {{std::assume_aligned<N>(p) requires N to be a power of two}}
(void)std::assume_aligned<33>(p); // expected-error@*:* {{std::assume_aligned<N>(p) requires N to be a power of two}}
}