diff options
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 3 | ||||
| -rw-r--r-- | tests/bugs/gh-6756.slang | 31 |
2 files changed, 34 insertions, 0 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index a530eb8f0..43987132e 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -674,6 +674,9 @@ Expr* SemanticsVisitor::maybeUseSynthesizedDeclForLookupResult( conformanceDecl->base.type = m_astBuilder->getDiffInterfaceType(); structDecl->addMember(conformanceDecl); structDecl->parentDecl = parent; + structDecl->ownedScope = m_astBuilder->create<Scope>(); + structDecl->ownedScope->containerDecl = structDecl; + structDecl->ownedScope->parent = getScope(parent); synthesizedDecl = structDecl; auto typeDef = m_astBuilder->create<TypeAliasDecl>(); diff --git a/tests/bugs/gh-6756.slang b/tests/bugs/gh-6756.slang new file mode 100644 index 000000000..ab1e5aa98 --- /dev/null +++ b/tests/bugs/gh-6756.slang @@ -0,0 +1,31 @@ +//TEST:SIMPLE(filecheck=CHECK):-target spirv -emit-spirv-via-glsl + +// This test is to test that PartlyDiffable.Differential is synthesized +// with correct scope. If not, the constructor for it will be wrong, and +// slang will generate wrong code, the downstream compiler will fail to +// compile. + +// CHECK: OpEntryPoint Fragment + +struct PartlyDiffable : IDifferentiable +{ + int i; + float q; +} + + +func breaker(x:PartlyDiffable.Differential) { + return; +} + + +[shader("fragment")] +float4 fragment(float4 in: SV_Position) + : SV_Target +{ + if (PartlyDiffable.Differential(0).q == 0) { + return float4(0); + } else { + return float4(1); + } +} |
