From 9f892c96c9cc093988a7d1527fdf1b0005031ded Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:53:32 -0400 Subject: use memberExpr instead of varExpr (#4008) --- source/slang/slang-check-decl.cpp | 18 ++++++++++++----- .../struct-field-initializer-shadowed-member.slang | 23 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 tests/language-feature/struct-field-initializers/struct-field-initializer-shadowed-member.slang diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index e8cc01ef2..17551912d 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -7464,6 +7464,10 @@ namespace Slang for (auto ctor : structDeclInfo.ctorList) { + ThisExpr* thisExpr = m_astBuilder->create(); + thisExpr->scope = ctor->ownedScope; + thisExpr->type = ctor->returnType.type; + auto seqStmt = _ensureCtorBodyIsSeqStmt(m_astBuilder, ctor); auto seqStmtChild = m_astBuilder->create(); seqStmtChild->stmts.reserve(structDecl->members.getCount()); @@ -7474,12 +7478,16 @@ namespace Slang || !varDeclBase->initExpr) continue; - VarExpr* memberVarExpr = m_astBuilder->create(); - memberVarExpr->scope = ctor->ownedScope; - memberVarExpr->name = m->getName(); + MemberExpr* memberExpr = m_astBuilder->create(); + memberExpr->baseExpression = thisExpr; + memberExpr->declRef = m->getDefaultDeclRef(); + memberExpr->scope = ctor->ownedScope; + memberExpr->loc = m->loc; + memberExpr->name = m->getName(); + memberExpr->type = DeclRefType::create(getASTBuilder(), m->getDefaultDeclRef()); auto assign = m_astBuilder->create(); - assign->left = memberVarExpr; + assign->left = memberExpr; assign->right = varDeclBase->initExpr; assign->loc = m->loc; @@ -7492,7 +7500,7 @@ namespace Slang checkedMemberVarExpr = cachedDeclToCheckedVar[m]; else { - checkedMemberVarExpr = CheckTerm(memberVarExpr); + checkedMemberVarExpr = CheckTerm(memberExpr); cachedDeclToCheckedVar.add({ m, checkedMemberVarExpr }); } if (!checkedMemberVarExpr->type.isLeftValue) diff --git a/tests/language-feature/struct-field-initializers/struct-field-initializer-shadowed-member.slang b/tests/language-feature/struct-field-initializers/struct-field-initializer-shadowed-member.slang new file mode 100644 index 000000000..8b2f6d936 --- /dev/null +++ b/tests/language-feature/struct-field-initializers/struct-field-initializer-shadowed-member.slang @@ -0,0 +1,23 @@ +//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain +//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -emit-spirv-directly +//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-cpu -compute -entry computeMain +//TEST(smoke,compute):COMPARE_COMPUTE(filecheck-buffer=BUF):-dx12 -use-dxil -compute -entry computeMain + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +struct TextureHandle +{ + uint32_t packedData = 0; + __init(uint32_t packedData) { this.packedData = packedData; } +}; + +[numthreads(1, 1, 1)] +void computeMain(uint3 dispatchThreadID: SV_DispatchThreadID) +{ + TextureHandle texHandle = TextureHandle(1); + // BUF: 1 + outputBuffer[0] = true + && texHandle.packedData == 1 + ; +} \ No newline at end of file -- cgit v1.2.3