mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-12-24 16:51:06 +00:00
Validate variable initializer type (#2668)
Fixes #249 * The pointed to type of Result Type must match the initializer type * Had to update some opt tests to be valid
This commit is contained in:
parent
9477c91dec
commit
59983a6010
@ -422,6 +422,11 @@ spv_result_t ValidateVariable(ValidationState_t& _, const Instruction* inst) {
|
||||
<< "OpVariable Initializer <id> '" << _.getIdName(initializer_id)
|
||||
<< "' is not a constant or module-scope variable.";
|
||||
}
|
||||
if (initializer->type_id() != result_type->GetOperandAs<uint32_t>(2u)) {
|
||||
return _.diag(SPV_ERROR_INVALID_ID, inst)
|
||||
<< "Initializer type must match the type pointed to by the Result "
|
||||
"Type";
|
||||
}
|
||||
}
|
||||
|
||||
const auto storage_class =
|
||||
|
@ -3811,7 +3811,7 @@ OpName %output "output"
|
||||
%6 = OpTypeFunction %void
|
||||
%float = OpTypeFloat 32
|
||||
%_ptr_Private_float = OpTypePointer Private %float
|
||||
%initializer = OpVariable %_ptr_Private_float Private
|
||||
%initializer = OpConstant %float 0
|
||||
%live = OpVariable %_ptr_Private_float Private %initializer
|
||||
%_ptr_Output_float = OpTypePointer Output %float
|
||||
%output = OpVariable %_ptr_Output_float Output
|
||||
|
@ -217,7 +217,7 @@ OpName %initializer "initializer"
|
||||
%6 = OpTypeFunction %void
|
||||
%float = OpTypeFloat 32
|
||||
%_ptr_Private_float = OpTypePointer Private %float
|
||||
%initializer = OpVariable %_ptr_Private_float Private
|
||||
%initializer = OpConstant %float 0
|
||||
%live = OpVariable %_ptr_Private_float Private %initializer
|
||||
%main = OpFunction %void None %6
|
||||
%9 = OpLabel
|
||||
|
@ -3543,6 +3543,29 @@ OpFunctionEnd
|
||||
INSTANTIATE_TEST_SUITE_P(PointerComparisons, ValidatePointerComparisons,
|
||||
Values("OpPtrEqual", "OpPtrNotEqual", "OpPtrDiff"));
|
||||
|
||||
TEST_F(ValidateMemory, VariableInitializerWrongType) {
|
||||
const std::string spirv = R"(
|
||||
OpCapability Shader
|
||||
OpCapability Linkage
|
||||
OpCapability VariablePointersStorageBuffer
|
||||
OpMemoryModel Logical GLSL450
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%float = OpTypeFloat 32
|
||||
%ptr_wg_int = OpTypePointer Workgroup %int
|
||||
%ptr_wg_float = OpTypePointer Workgroup %int
|
||||
%wg_var = OpVariable %ptr_wg_int Workgroup
|
||||
%ptr_private_wg_float = OpTypePointer Private %ptr_wg_float
|
||||
%priv_var = OpVariable %ptr_private_wg_float Private %wg_var
|
||||
)";
|
||||
|
||||
CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3);
|
||||
EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
|
||||
EXPECT_THAT(getDiagnosticString(),
|
||||
HasSubstr("Initializer type must match the type pointed to by "
|
||||
"the Result Type"));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
Loading…
Reference in New Issue
Block a user