diff options
| author | Yong He <yonghe@outlook.com> | 2019-01-30 17:25:09 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-01-30 17:25:09 -0800 |
| commit | 4db0aba1edc5fd55b91457481bae119ef66dde89 (patch) | |
| tree | 9a3153d2749b733ad82563bebbc4aa2d2c0ca126 | |
| parent | dc018032ee82911030601fa1cd3ca39ca107ad44 (diff) | |
| parent | c6e5551f6cf38caa37f4ebb6415e97c86eece241 (diff) | |
Merge pull request #818 from csyonghe/fix-while-in-gen
Fixing IR-lowering not properly registering func decl
| -rw-r--r-- | source/slang/lower-to-ir.cpp | 9 | ||||
| -rw-r--r-- | tests/bugs/while-in-generic.slang | 23 | ||||
| -rw-r--r-- | tests/bugs/while-in-generic.slang.expected.txt | 4 |
3 files changed, 30 insertions, 6 deletions
diff --git a/source/slang/lower-to-ir.cpp b/source/slang/lower-to-ir.cpp index c1fa871ba..3f77de446 100644 --- a/source/slang/lower-to-ir.cpp +++ b/source/slang/lower-to-ir.cpp @@ -5790,24 +5790,22 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> // body appear before the function itself in the list // of global values. irFunc->moveToEnd(); - return LoweredValInfo::simple(finishOuterGenerics(subBuilder, irFunc)); } LoweredValInfo visitGenericDecl(GenericDecl * genDecl) { // TODO: Should this just always visit/lower the inner decl? - if (auto innerFuncDecl = genDecl->inner->As<FunctionDeclBase>()) - return lowerFuncDecl(innerFuncDecl); + return ensureDecl(context, innerFuncDecl); else if (auto innerStructDecl = genDecl->inner->As<StructDecl>()) { - visitAggTypeDecl(innerStructDecl); + ensureDecl(context, innerStructDecl); return LoweredValInfo(); } else if( auto extensionDecl = genDecl->inner->As<ExtensionDecl>() ) { - return visitExtensionDecl(extensionDecl); + return ensureDecl(context, extensionDecl); } SLANG_RELEASE_ASSERT(false); UNREACHABLE_RETURN(LoweredValInfo()); @@ -5892,7 +5890,6 @@ LoweredValInfo ensureDecl( env = env->outer; } - IRBuilder subIRBuilder; subIRBuilder.sharedBuilder = context->irBuilder->sharedBuilder; subIRBuilder.setInsertInto(subIRBuilder.sharedBuilder->module->getModuleInst()); diff --git a/tests/bugs/while-in-generic.slang b/tests/bugs/while-in-generic.slang new file mode 100644 index 000000000..ea34238f5 --- /dev/null +++ b/tests/bugs/while-in-generic.slang @@ -0,0 +1,23 @@ +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute +struct Context +{ + int genFunc<TGenType>(TGenType t) + { + int i = 0; + while (true) + { + i++; + if (i > 5) break; + } + return i; + } +}; +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):dxbinding(0),glbinding(0),out +RWStructuredBuffer<int> outputBuffer; + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + Context c; + outputBuffer[dispatchThreadID.x] = c.genFunc<int>(5); +}
\ No newline at end of file diff --git a/tests/bugs/while-in-generic.slang.expected.txt b/tests/bugs/while-in-generic.slang.expected.txt new file mode 100644 index 000000000..4c6d5911b --- /dev/null +++ b/tests/bugs/while-in-generic.slang.expected.txt @@ -0,0 +1,4 @@ +6 +6 +6 +6
\ No newline at end of file |
