diff --git a/source/val/validate_image.cpp b/source/val/validate_image.cpp index 83c9db920..04100dd71 100644 --- a/source/val/validate_image.cpp +++ b/source/val/validate_image.cpp @@ -1134,15 +1134,15 @@ spv_result_t ValidateImageTexelPointer(ValidationState_t& _, const Instruction* inst) { const auto result_type = _.FindDef(inst->type_id()); if (result_type->opcode() != spv::Op::OpTypePointer && - result_type->opcode() == spv::Op::OpTypeUntypedPointerKHR) { + result_type->opcode() != spv::Op::OpTypeUntypedPointerKHR) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Expected Result Type to be OpTypePointer"; + << "Expected Result Type to be a pointer"; } const auto storage_class = result_type->GetOperandAs(1); if (storage_class != spv::StorageClass::Image) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Expected Result Type to be OpTypePointer whose Storage Class " + << "Expected Result Type to be a pointer whose Storage Class " "operand is Image"; } @@ -1157,7 +1157,7 @@ spv_result_t ValidateImageTexelPointer(ValidationState_t& _, _.HasCapability(spv::Capability::AtomicFloat16VectorNV) && _.IsFloat16Vector2Or4Type(ptr_type))) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Expected Result Type to be OpTypePointer whose Type operand " + << "Expected Result Type to be a pointer whose Type operand " "must be a scalar numerical type or OpTypeVoid"; } } diff --git a/test/val/val_image_test.cpp b/test/val/val_image_test.cpp index adba2c652..93fab0451 100644 --- a/test/val/val_image_test.cpp +++ b/test/val/val_image_test.cpp @@ -1380,7 +1380,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotPointer) { CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected Result Type to be OpTypePointer")); + HasSubstr("Expected Result Type to be a pointer")); } TEST_F(ValidateImage, ImageTexelPointerResultTypeNotImageClass) { @@ -1392,7 +1392,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotImageClass) { CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected Result Type to be OpTypePointer whose " + HasSubstr("Expected Result Type to be a pointer whose " "Storage Class operand is Image")); } @@ -1406,7 +1406,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotNumericNorVoid) { ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Expected Result Type to be OpTypePointer whose Type operand " + HasSubstr("Expected Result Type to be a pointer whose Type operand " "must be a scalar numerical type or OpTypeVoid")); } @@ -6310,7 +6310,7 @@ TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotPointer) { .c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected Result Type to be OpTypePointer")); + HasSubstr("Expected Result Type to be a pointer")); } TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotImageClass) { @@ -6326,7 +6326,7 @@ TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotImageClass) { .c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected Result Type to be OpTypePointer whose " + HasSubstr("Expected Result Type to be a pointer whose " "Storage Class operand is Image")); } @@ -10875,6 +10875,28 @@ OpFunctionEnd "Image operands must match result image operands except for depth")); } +TEST_F(ValidateImage, ImageTexelPointerNotAPointer) { + const std::string code = R"( + OpCapability ClipDistance + OpMemoryModel Logical Simple + %void = OpTypeVoid + %57 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%int_538976288 = OpConstant %int 538976288 +%int_538976288_0 = OpConstant %int 538976288 + %8224 = OpFunction %void None %57 + %65312 = OpLabel + %2097184 = OpImageTexelPointer %void %int_538976288 %int_538976288 %int_538976288_0 + OpUnreachable + OpFunctionEnd +)"; + + CompileSuccessfully(code); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Result Type to be a pointer")); +} + } // namespace } // namespace val } // namespace spvtools