Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions stl/inc/memory
Original file line number Diff line number Diff line change
Expand Up @@ -3079,15 +3079,21 @@ inline void* align(size_t _Bound, size_t _Size, void*& _Ptr, size_t& _Space) noe
return _Ptr;
}

#if _HAS_CXX20 && 0
#if _HAS_CXX20
template <size_t _Nx, class _Ty>
_NODISCARD constexpr _Ty* assume_aligned(_Ty* _Ptr) noexcept /* strengthened */ {
#ifndef __clang__ // TRANSITION, DevCom-1190972
if (_STD is_constant_evaluated()) {
return _Ptr;
}
#endif // ^^^ workaround ^^^

// this enforces the requirement that _Nx be a power of two
__builtin_assume_aligned(_Ptr, _Nx);
(void) __builtin_assume_aligned(_Ptr, _Nx);

return _Ptr;
}
#endif // _HAS_CXX20 && 0
#endif // _HAS_CXX20

// SPIN LOCKS
_EXTERN_C
Expand Down
2 changes: 2 additions & 0 deletions stl/inc/yvals_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@
// P0966R1 string::reserve() Should Not Shrink
// P1001R2 execution::unseq
// P1006R1 constexpr For pointer_traits<T*>::pointer_to()
// P1007R3 assume_aligned()
// P1023R0 constexpr For std::array Comparisons
// P1024R3 Enhancing span Usability
// P1032R1 Miscellaneous constexpr
Expand Down Expand Up @@ -1142,6 +1143,7 @@
#define __cpp_lib_atomic_value_initialization 201911L

#if _HAS_CXX20
#define __cpp_lib_assume_aligned 201811L
#define __cpp_lib_atomic_flag_test 201907L
#define __cpp_lib_atomic_float 201711L
#define __cpp_lib_atomic_lock_free_type_aliases 201907L
Expand Down
1 change: 1 addition & 0 deletions tests/std/test.lst
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ tests\P0898R3_identity
tests\P0912R5_coroutine
tests\P0919R3_heterogeneous_unordered_lookup
tests\P0966R1_string_reserve_should_not_shrink
tests\P1007R3_assume_aligned
tests\P1023R0_constexpr_for_array_comparisons
tests\P1032R1_miscellaneous_constexpr
tests\P1135R6_atomic_flag_test
Expand Down
4 changes: 4 additions & 0 deletions tests/std/tests/P1007R3_assume_aligned/env.lst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

RUNALL_INCLUDE ..\usual_latest_matrix.lst
44 changes: 44 additions & 0 deletions tests/std/tests/P1007R3_assume_aligned/test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <assert.h>
#include <memory>
#include <stddef.h>

void can_change_value_via_assume_aligned(int* p) {
int* p1 = std::assume_aligned<256>(p);
p1[0] = 10;
p1[1] = -15;
}

constexpr int can_read_constexpr_value_via_assume_aligned_and_sum_it(int const* p, size_t size) {
int const* p1 = std::assume_aligned<256>(p);
int result = 0;
for (size_t i = 0; i < size; ++i) {
result += p1[i];
}
return result;
}

void assume_aligned_can_change_value() {
alignas(256) int arr[2] = {0, 0};
can_change_value_via_assume_aligned(&arr[0]);
assert(arr[0] == 10);
assert(arr[1] == -15);
}

constexpr void constexpr_assume_aligned_can_read_value() {
alignas(256) constexpr int arr[3] = {10, 11, 9};
static_assert(can_read_constexpr_value_via_assume_aligned_and_sum_it(arr, 3) == 30);
}

void assume_aligned_can_read_value() {
alignas(256) constexpr int arr[3] = {10, 11, 9};
assert(can_read_constexpr_value_via_assume_aligned_and_sum_it(arr, 3) == 30);
}

int main() {
assume_aligned_can_change_value();
constexpr_assume_aligned_can_read_value();
assume_aligned_can_read_value();
}
14 changes: 14 additions & 0 deletions tests/std/tests/VSO_0157762_feature_test_macros/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,20 @@ STATIC_ASSERT(__cpp_lib_array_constexpr == 201803L);
STATIC_ASSERT(__cpp_lib_as_const == 201510L);
#endif

#if _HAS_CXX20
#ifndef __cpp_lib_assume_aligned
#error __cpp_lib_assume_aligned is not defined
#elif __cpp_lib_assume_aligned != 201811L
#error __cpp_lib_assume_aligned is not 201811L
#else
STATIC_ASSERT(__cpp_lib_assume_aligned == 201811L);
#endif
#else
#ifdef __cpp_lib_assume_aligned
#error __cpp_lib_assume_aligned is defined
#endif
#endif

#if _HAS_CXX20
#ifndef __cpp_lib_atomic_flag_test
#error __cpp_lib_atomic_flag_test is not defined
Expand Down