spirv-val: Better atomic storage class message (#6425)
> AtomicIAdd: storage class forbidden by universal validation rules.
Is a terrible error message and requires me to read the source code to
know what is wrong/going on
Now it will say
> AtomicIAdd: Can not be used with storage class Output by universal
validation rules
diff --git a/source/val/validate_atomics.cpp b/source/val/validate_atomics.cpp
index 510960b..8cda07e 100644
--- a/source/val/validate_atomics.cpp
+++ b/source/val/validate_atomics.cpp
@@ -235,7 +235,9 @@
if (!IsStorageClassAllowedByUniversalRules(storage_class)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< spvOpcodeString(opcode)
- << ": storage class forbidden by universal validation rules.";
+ << ": Can not be used with storage class "
+ << spvtools::StorageClassToString(storage_class)
+ << " by universal validation rules";
}
// Then Shader rules
@@ -249,8 +251,10 @@
(storage_class != spv::StorageClass::PhysicalStorageBuffer) &&
(storage_class != spv::StorageClass::TaskPayloadWorkgroupEXT)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
- << _.VkErrorID(4686) << spvOpcodeString(opcode)
- << ": Vulkan spec only allows storage classes for atomic to "
+ << _.VkErrorID(4686) << spvOpcodeString(opcode) << ": "
+ << spvtools::StorageClassToString(storage_class)
+ << " is not allowed, the Vulkan spec only allows storage "
+ "classes for atomic to "
"be: Uniform, Workgroup, Image, StorageBuffer, "
"PhysicalStorageBuffer or TaskPayloadWorkgroupEXT.";
}
@@ -335,8 +339,9 @@
(storage_class != spv::StorageClass::CrossWorkgroup) &&
(storage_class != spv::StorageClass::Generic)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
- << spvOpcodeString(opcode)
- << ": storage class must be Function, Workgroup, "
+ << spvOpcodeString(opcode) << ": storage class is "
+ << spvtools::StorageClassToString(storage_class)
+ << ", but must be Function, Workgroup, "
"CrossWorkGroup or Generic in the OpenCL environment.";
}
diff --git a/test/val/val_atomics_test.cpp b/test/val/val_atomics_test.cpp
index 392586e..a243ff6 100644
--- a/test/val/val_atomics_test.cpp
+++ b/test/val/val_atomics_test.cpp
@@ -783,7 +783,8 @@
AnyVUID("VUID-StandaloneSpirv-None-04686"));
EXPECT_THAT(
getDiagnosticString(),
- HasSubstr("AtomicStore: Vulkan spec only allows storage classes for "
+ HasSubstr("AtomicStore: Function is not allowed, the Vulkan spec only "
+ "allows storage classes for "
"atomic to be: Uniform, Workgroup, Image, StorageBuffer, "
"PhysicalStorageBuffer or TaskPayloadWorkgroupEXT."));
}
@@ -1081,7 +1082,8 @@
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_OPENCL_1_2));
EXPECT_THAT(
getDiagnosticString(),
- HasSubstr("AtomicStore: storage class must be Function, Workgroup, "
+ HasSubstr("AtomicStore: storage class is Image, but must be Function, "
+ "Workgroup, "
"CrossWorkGroup or Generic in the OpenCL environment."));
}
@@ -1093,8 +1095,8 @@
CompileSuccessfully(GenerateKernelCode(body));
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
- HasSubstr("AtomicStore: storage class forbidden by universal "
- "validation rules."));
+ HasSubstr("AtomicStore: Can not be used with storage class "
+ "UniformConstant by universal validation rules"));
}
TEST_F(ValidateAtomics, AtomicStoreWrongScopeType) {