summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-emit-metal.cpp5
-rw-r--r--tests/metal/pointer-literals.slang30
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