mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 00:47:13 +00:00
sem::StructMember: Add Type()
Once the AST switches to pure ast::Type nodes, we need a way to fetch the semantic type for a structure member. Bug: tint:724 Change-Id: I4b55c1ec0220e29ca4ff3131cf2d41409821a538 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49347 Commit-Queue: Ben Clayton <bclayton@chromium.org> Reviewed-by: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
committed by
Commit Bot service account
parent
109b18f504
commit
2ac55febf5
@@ -2392,10 +2392,12 @@ Resolver::StructInfo* Resolver::Structure(const sem::StructType* str) {
|
||||
for (auto* member : str->impl()->members()) {
|
||||
Mark(member);
|
||||
|
||||
auto type = member->type();
|
||||
|
||||
// First check the member type is legal
|
||||
if (!IsStorable(member->type())) {
|
||||
if (!IsStorable(type)) {
|
||||
builder_->Diagnostics().add_error(
|
||||
std::string(member->type()->FriendlyName(builder_->Symbols())) +
|
||||
std::string(type->FriendlyName(builder_->Symbols())) +
|
||||
" cannot be used as the type of a structure member");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -2403,7 +2405,7 @@ Resolver::StructInfo* Resolver::Structure(const sem::StructType* str) {
|
||||
uint32_t offset = struct_size;
|
||||
uint32_t align = 0;
|
||||
uint32_t size = 0;
|
||||
if (!DefaultAlignAndSize(member->type(), align, size, member->source())) {
|
||||
if (!DefaultAlignAndSize(type, align, size, member->source())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -2455,7 +2457,7 @@ Resolver::StructInfo* Resolver::Structure(const sem::StructType* str) {
|
||||
offset = utils::RoundUp(align, offset);
|
||||
|
||||
auto* sem_member =
|
||||
builder_->create<sem::StructMember>(member, offset, align, size);
|
||||
builder_->create<sem::StructMember>(member, type, offset, align, size);
|
||||
builder_->Sem().Add(member, sem_member);
|
||||
sem_members.emplace_back(sem_member);
|
||||
|
||||
|
||||
@@ -892,13 +892,10 @@ TEST_F(ResolverTest, Expr_MemberAccessor_Struct) {
|
||||
|
||||
auto* ptr = TypeOf(mem)->As<sem::Pointer>();
|
||||
EXPECT_TRUE(ptr->type()->Is<sem::F32>());
|
||||
ASSERT_TRUE(Sem().Get(mem)->Is<sem::StructMemberAccess>());
|
||||
EXPECT_EQ(Sem()
|
||||
.Get(mem)
|
||||
->As<sem::StructMemberAccess>()
|
||||
->Member()
|
||||
->Declaration()
|
||||
->symbol(),
|
||||
auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
|
||||
ASSERT_NE(sma, nullptr);
|
||||
EXPECT_EQ(sma->Member()->Type(), ty.f32());
|
||||
EXPECT_EQ(sma->Member()->Declaration()->symbol(),
|
||||
Symbols().Get("second_member"));
|
||||
}
|
||||
|
||||
@@ -918,7 +915,9 @@ TEST_F(ResolverTest, Expr_MemberAccessor_Struct_Alias) {
|
||||
|
||||
auto* ptr = TypeOf(mem)->As<sem::Pointer>();
|
||||
EXPECT_TRUE(ptr->type()->Is<sem::F32>());
|
||||
ASSERT_TRUE(Sem().Get(mem)->Is<sem::StructMemberAccess>());
|
||||
auto* sma = Sem().Get(mem)->As<sem::StructMemberAccess>();
|
||||
ASSERT_NE(sma, nullptr);
|
||||
EXPECT_EQ(sma->Member()->Type(), ty.f32());
|
||||
}
|
||||
|
||||
TEST_F(ResolverTest, Expr_MemberAccessor_VectorSwizzle) {
|
||||
|
||||
Reference in New Issue
Block a user