validation: pointer to handle is not allowed
Bug: tint:986 Change-Id: Icce391c4741a2b9a090676fc5994a704941e4a30 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58941 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
parent
3647df3fb7
commit
edecbb161f
|
@ -2576,9 +2576,7 @@ fn via_call([[location(0)]] fragUV: vec2<f32>,
|
||||||
[[stage(fragment)]]
|
[[stage(fragment)]]
|
||||||
fn via_ptr([[location(0)]] fragUV: vec2<f32>,
|
fn via_ptr([[location(0)]] fragUV: vec2<f32>,
|
||||||
[[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
|
[[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
|
||||||
let t = &myTexture;
|
return textureSample(myTexture, mySampler, fragUV) + fragPosition;
|
||||||
let s = &mySampler;
|
|
||||||
return textureSample(*t, *s, fragUV) + fragPosition;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[[stage(fragment)]]
|
[[stage(fragment)]]
|
||||||
|
|
|
@ -52,6 +52,34 @@ TEST_F(ResolverPtrRefValidationTest, AddressOfLet) {
|
||||||
EXPECT_EQ(r()->error(), "12:34 error: cannot take the address of expression");
|
EXPECT_EQ(r()->error(), "12:34 error: cannot take the address of expression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ResolverPtrRefValidationTest, AddressOfHandle) {
|
||||||
|
// [[group(0), binding(0)]] var t: texture_3d<f32>;
|
||||||
|
// &t
|
||||||
|
Global("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()),
|
||||||
|
GroupAndBinding(0u, 0u));
|
||||||
|
auto* expr = AddressOf(Expr(Source{{12, 34}}, "t"));
|
||||||
|
WrapInFunction(expr);
|
||||||
|
|
||||||
|
EXPECT_FALSE(r()->Resolve());
|
||||||
|
EXPECT_EQ(r()->error(),
|
||||||
|
"12:34 error: cannot take the address of expression in handle "
|
||||||
|
"storage class");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ResolverPtrRefValidationTest, IndirectOfAddressOfHandle) {
|
||||||
|
// [[group(0), binding(0)]] var t: texture_3d<f32>;
|
||||||
|
// *&t
|
||||||
|
Global("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()),
|
||||||
|
GroupAndBinding(0u, 0u));
|
||||||
|
auto* expr = Deref(AddressOf(Expr(Source{{12, 34}}, "t")));
|
||||||
|
WrapInFunction(expr);
|
||||||
|
|
||||||
|
EXPECT_FALSE(r()->Resolve());
|
||||||
|
EXPECT_EQ(r()->error(),
|
||||||
|
"12:34 error: cannot take the address of expression in handle "
|
||||||
|
"storage class");
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ResolverPtrRefValidationTest, DerefOfLiteral) {
|
TEST_F(ResolverPtrRefValidationTest, DerefOfLiteral) {
|
||||||
// *1
|
// *1
|
||||||
|
|
||||||
|
|
|
@ -3384,6 +3384,12 @@ bool Resolver::UnaryOp(ast::UnaryOpExpression* unary) {
|
||||||
|
|
||||||
case ast::UnaryOp::kAddressOf:
|
case ast::UnaryOp::kAddressOf:
|
||||||
if (auto* ref = expr_type->As<sem::Reference>()) {
|
if (auto* ref = expr_type->As<sem::Reference>()) {
|
||||||
|
if (ref->StoreType()->UnwrapRef()->is_handle()) {
|
||||||
|
AddError(
|
||||||
|
"cannot take the address of expression in handle storage class",
|
||||||
|
unary->expr()->source());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
type = builder_->create<sem::Pointer>(
|
type = builder_->create<sem::Pointer>(
|
||||||
ref->StoreType(), ref->StorageClass(), ref->Access());
|
ref->StoreType(), ref->StorageClass(), ref->Access());
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue