Files
TheRock/compiler/amd-llvm/clang/test/AST/ByteCode/builtin-constant-p.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

163 lines
4.1 KiB
C++

// RUN: %clang_cc1 -std=c++20 -verify=expected,both %s -fexperimental-new-constant-interpreter
// RUN: %clang_cc1 -std=c++20 -verify=ref,both %s
using intptr_t = __INTPTR_TYPE__;
static_assert(__builtin_constant_p(12), "");
static_assert(__builtin_constant_p(1.0), "");
constexpr int I = 100;
static_assert(__builtin_constant_p(I), "");
static_assert(__builtin_constant_p(I + 10), "");
static_assert(__builtin_constant_p(I + 10.0), "");
static_assert(__builtin_constant_p(nullptr), "");
static_assert(__builtin_constant_p(&I), ""); // both-error {{failed due to requirement}}
static_assert(__builtin_constant_p((void)I), ""); // both-error {{failed due to requirement}}
extern int z;
constexpr int foo(int &a) {
return __builtin_constant_p(a);
}
static_assert(!foo(z));
static_assert(__builtin_constant_p(__builtin_constant_p(1)));
constexpr bool nested(int& a) {
return __builtin_constant_p(__builtin_constant_p(a));
}
static_assert(nested(z));
constexpr bool Local() {
int z = 10;
return __builtin_constant_p(z);
}
static_assert(Local());
constexpr bool Local2() {
int z = 10;
return __builtin_constant_p(&z);
}
static_assert(!Local2());
constexpr bool Parameter(int a) {
return __builtin_constant_p(a);
}
static_assert(Parameter(10));
constexpr bool InvalidLocal() {
int *z;
{
int b = 10;
z = &b;
}
return __builtin_constant_p(z);
}
static_assert(!InvalidLocal());
template<typename T> constexpr bool bcp(T t) {
return __builtin_constant_p(t);
}
constexpr intptr_t ptr_to_int(const void *p) {
return __builtin_constant_p(1) ? (intptr_t)p : (intptr_t)p;
}
static_assert(bcp(ptr_to_int("foo")));
constexpr bool AndFold(const int &a, const int &b) {
return __builtin_constant_p(a && b);
}
static_assert(AndFold(10, 20));
static_assert(!AndFold(z, 10));
static_assert(!AndFold(10, z));
struct F {
int a;
};
constexpr F f{12};
static_assert(__builtin_constant_p(f.a));
constexpr bool Member() {
F f;
return __builtin_constant_p(f.a);
}
static_assert(!Member());
constexpr bool Discard() {
(void)__builtin_constant_p(10);
return true;
}
static_assert(Discard());
static_assert(__builtin_constant_p((int*)123));
constexpr void func() {}
static_assert(!__builtin_constant_p(func));
/// This is from SemaCXX/builtin-constant-p and GCC agrees with the bytecode interpreter.
constexpr int mutate1() {
int n = 1;
int m = __builtin_constant_p(++n);
return n * 10 + m;
}
static_assert(mutate1() == 21); // ref-error {{static assertion failed}} \
// ref-note {{evaluates to '10 == 21'}}
/// Similar for this. GCC agrees with the bytecode interpreter.
constexpr int mutate_param(bool mutate, int &param) {
mutate = mutate; // Mutation of internal state is OK
if (mutate)
++param;
return param;
}
constexpr int mutate6(bool mutate) {
int n = 1;
int m = __builtin_constant_p(mutate_param(mutate, n));
return n * 10 + m;
}
static_assert(mutate6(false) == 11);
static_assert(mutate6(true) == 21); // ref-error {{static assertion failed}} \
// ref-note {{evaluates to '10 == 21'}}
#define fold(x) (__builtin_constant_p(x) ? (x) : (x))
void g() {
/// f will be revisited when evaluating the static_assert, since it's
/// a local variable. But it should be visited in a non-constant context.
const float f = __builtin_is_constant_evaluated();
static_assert(fold(f == 0.0f));
}
void test17(void) {
#define ASSERT(...) { enum { folded = (__VA_ARGS__) }; int arr[folded ? 1 : -1]; }
#define T(...) ASSERT(__builtin_constant_p(__VA_ARGS__))
#define F(...) ASSERT(!__builtin_constant_p(__VA_ARGS__))
T(3i + 5);
T("string literal");
F("string literal" + 1); // both-warning {{adding}} \
// both-note {{use array indexing}}
}
/// FIXME
static void foo(int i) __attribute__((__diagnose_if__(!__builtin_constant_p(i), "not constant", "error"))) // expected-note {{from}}
{
}
static void bar(int i) {
foo(15); // expected-error {{not constant}}
}
namespace Inactive {
int foo() {
if ((__extension__(
0 ? __extension__({ (1 ? 0 : (__builtin_constant_p("plane"))); })
: 0)) == 0) {
}
return 0;
}
}