================
@@ -0,0 +1,92 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -triple
x86_64-unknown-unknown %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -triple
x86_64-unknown-unknown %s -fexperimental-new-constant-interpreter
+
+constexpr bool test_constexpr_valid() {
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(arr, 40);
+ return true;
+}
+static_assert(test_constexpr_valid(), "");
+
+constexpr bool test_constexpr_partial() {
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(&arr[5], 20);
+ return true;
+}
+static_assert(test_constexpr_partial(), "");
+
+constexpr bool test_constexpr_nullptr() { // expected-error {{constexpr
function never produces a constant expression}}
+ __builtin_assume_dereferenceable(nullptr, 4); // expected-note 2{{read of
dereferenced null pointer is not allowed in a constant expression}}
+ return true;
+}
+static_assert(test_constexpr_nullptr(), ""); // expected-error {{not an
integral constant expression}} expected-note {{in call to}}
+
+constexpr bool test_constexpr_too_large() { // expected-error {{constexpr
function never produces a constant expression}}
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(arr, 100); // expected-note 2{{read of
dereferenced one-past-the-end pointer is not allowed in a constant expression}}
+ return true;
+}
+static_assert(test_constexpr_too_large(), ""); // expected-error {{not an
integral constant expression}} expected-note {{in call to}}
+
+constexpr bool test_single_var() {
+ constexpr int single_var = 42;
+ __builtin_assume_dereferenceable(&single_var, 4);
+ return true;
+}
+static_assert(test_single_var(), "");
+
+constexpr bool test_exact_boundary() {
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(&arr[9], 4);
+ return true;
+}
+static_assert(test_exact_boundary(), "");
+
+constexpr bool test_one_over() { // expected-error {{constexpr function never
produces a constant expression}}
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(&arr[9], 5); // expected-note 2{{read of
dereferenced one-past-the-end pointer is not allowed in a constant expression}}
+ return true;
+}
+static_assert(test_one_over(), ""); // expected-error {{not an integral
constant expression}} expected-note {{in call to}}
+
+constexpr bool test_zero_size() {
+ constexpr int arr[10] = {};
+ __builtin_assume_dereferenceable(arr, 0);
+ return true;
+}
+static_assert(test_zero_size(), "");
+
+constexpr bool test_struct_member() {
+ struct S {
+ int x;
+ int y;
+ };
+ constexpr S s = {1, 2};
+ __builtin_assume_dereferenceable(&s.x, 4);
----------------
philnik777 wrote:
Is `__builtin_assume_dereferenceable(&s.x, 8)` accepted? If yes, what about a
pointer to base that assumes dereferenceable into a derived?
https://github.com/llvm/llvm-project/pull/169869
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits