diff options
| author | ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> | 2024-04-23 12:53:32 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-23 09:53:32 -0700 |
| commit | 9f892c96c9cc093988a7d1527fdf1b0005031ded (patch) | |
| tree | 01310801ea42c5071dbe4cd42ffe310f09c9311c | |
| parent | 484c1e618dddf586360c03f90e6c27ece1065acd (diff) | |
use memberExpr instead of varExpr (#4008)
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 18 | ||||
| -rw-r--r-- | tests/language-feature/struct-field-initializers/struct-field-initializer-shadowed-member.slang | 23 |
2 files changed, 36 insertions, 5 deletions
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>(); + thisExpr->scope = ctor->ownedScope; + thisExpr->type = ctor->returnType.type; + auto seqStmt = _ensureCtorBodyIsSeqStmt(m_astBuilder, ctor); auto seqStmtChild = m_astBuilder->create<SeqStmt>(); seqStmtChild->stmts.reserve(structDecl->members.getCount()); @@ -7474,12 +7478,16 @@ namespace Slang || !varDeclBase->initExpr) continue; - VarExpr* memberVarExpr = m_astBuilder->create<VarExpr>(); - memberVarExpr->scope = ctor->ownedScope; - memberVarExpr->name = m->getName(); + MemberExpr* memberExpr = m_astBuilder->create<MemberExpr>(); + 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<AssignExpr>(); - 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<int> 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 |
