llvm-project/clang/test/SemaHLSL/BuiltIns/resource_getpointer-errors.hlsl
Justin Bogner bd92e46204
[HLSL] Implement RWBuffer::operator[] via __builtin_hlsl_resource_getpointer (#117017)
This introduces `__builtin_hlsl_resource_getpointer`, which lowers to
`llvm.dx.resource.getpointer` and is used to implement indexing into
resources.

This will only work through the backend for typed buffers at this point,
but the changes to structured buffers should be correct as far as the
frontend is concerned.

Note: We probably want this to return a reference in the HLSL device
address space, but for now we're just using address space 0. Creating a
device address space and updating this code can be done later as
necessary.

Fixes #95956
2024-12-02 14:03:31 -08:00

28 lines
960 B
HLSL

// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify
// RWBuffer<int>
using handle_t = __hlsl_resource_t
[[hlsl::resource_class(UAV)]] [[hlsl::contained_type(int)]];
void test_args(unsigned int x) {
// expected-error@+1 {{too few arguments to function call, expected 2, have 1}}
__builtin_hlsl_resource_getpointer(x);
// expected-error@+1 {{too many arguments to function call, expected 2, have 3}}
__builtin_hlsl_resource_getpointer(x, x, x);
// expected-error@+1 {{used type 'unsigned int' where __hlsl_resource_t is required}}
__builtin_hlsl_resource_getpointer(x, x);
handle_t res;
// expected-error@+1 {{passing 'const char *' to parameter of incompatible type 'unsigned int'}}
__builtin_hlsl_resource_getpointer(res, "1");
// no error
__builtin_hlsl_resource_getpointer(res, 0u);
// no error
__builtin_hlsl_resource_getpointer(res, x);
}