Skip to content

Commit 4db0aba

Browse files
authored
Merge pull request shader-slang#818 from csyonghe/fix-while-in-gen
Fixing IR-lowering not properly registering func decl
2 parents dc01803 + c6e5551 commit 4db0aba

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

source/slang/lower-to-ir.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -5790,24 +5790,22 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo>
57905790
// body appear before the function itself in the list
57915791
// of global values.
57925792
irFunc->moveToEnd();
5793-
57945793
return LoweredValInfo::simple(finishOuterGenerics(subBuilder, irFunc));
57955794
}
57965795

57975796
LoweredValInfo visitGenericDecl(GenericDecl * genDecl)
57985797
{
57995798
// TODO: Should this just always visit/lower the inner decl?
5800-
58015799
if (auto innerFuncDecl = genDecl->inner->As<FunctionDeclBase>())
5802-
return lowerFuncDecl(innerFuncDecl);
5800+
return ensureDecl(context, innerFuncDecl);
58035801
else if (auto innerStructDecl = genDecl->inner->As<StructDecl>())
58045802
{
5805-
visitAggTypeDecl(innerStructDecl);
5803+
ensureDecl(context, innerStructDecl);
58065804
return LoweredValInfo();
58075805
}
58085806
else if( auto extensionDecl = genDecl->inner->As<ExtensionDecl>() )
58095807
{
5810-
return visitExtensionDecl(extensionDecl);
5808+
return ensureDecl(context, extensionDecl);
58115809
}
58125810
SLANG_RELEASE_ASSERT(false);
58135811
UNREACHABLE_RETURN(LoweredValInfo());
@@ -5892,7 +5890,6 @@ LoweredValInfo ensureDecl(
58925890
env = env->outer;
58935891
}
58945892

5895-
58965893
IRBuilder subIRBuilder;
58975894
subIRBuilder.sharedBuilder = context->irBuilder->sharedBuilder;
58985895
subIRBuilder.setInsertInto(subIRBuilder.sharedBuilder->module->getModuleInst());

tests/bugs/while-in-generic.slang

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
2+
struct Context
3+
{
4+
int genFunc<TGenType>(TGenType t)
5+
{
6+
int i = 0;
7+
while (true)
8+
{
9+
i++;
10+
if (i > 5) break;
11+
}
12+
return i;
13+
}
14+
};
15+
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):dxbinding(0),glbinding(0),out
16+
RWStructuredBuffer<int> outputBuffer;
17+
18+
[numthreads(4, 1, 1)]
19+
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
20+
{
21+
Context c;
22+
outputBuffer[dispatchThreadID.x] = c.genFunc<int>(5);
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
6
2+
6
3+
6
4+
6

0 commit comments

Comments
 (0)