diff options
| -rw-r--r-- | source/slang/slang-emit-metal.cpp | 5 | ||||
| -rw-r--r-- | tests/metal/pointer-literals.slang | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp index d3b00d57d..7dd0c19ad 100644 --- a/source/slang/slang-emit-metal.cpp +++ b/source/slang/slang-emit-metal.cpp @@ -937,6 +937,11 @@ bool MetalSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inO } return true; } + case kIROp_PtrLit: + { + m_writer->emit("nullptr"); + return true; + } default: break; } diff --git a/tests/metal/pointer-literals.slang b/tests/metal/pointer-literals.slang new file mode 100644 index 000000000..327d488d2 --- /dev/null +++ b/tests/metal/pointer-literals.slang @@ -0,0 +1,30 @@ +//TEST:SIMPLE(filecheck=METAL): -target metal -stage compute -entry computeMain
+//TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage compute -entry computeMain
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<uint> outputBuffer;
+
+//METAL: {{\[\[}}kernel{{\]\]}} void computeMain
+//METALLIB: define void @computeMain
+
+// Test that pointer literals are handled correctly in Metal.
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ // Test pointer literals in some contexts that might generate kIROp_PtrLit.
+
+ // Test 1: Basic pointer literal assignment
+ void* ptr1 = nullptr;
+ outputBuffer[0] = (ptr1 == nullptr) ? 1 : 0;
+
+ // Test 2: Pointer literal in struct
+ struct TestStruct
+ {
+ void* ptr;
+ int value;
+ };
+
+ TestStruct test = { nullptr, 42 };
+ outputBuffer[1] = (test.ptr == nullptr) ? 1 : 0;
+}
\ No newline at end of file |
