From 8286737741474a866c8c804070da11cb91710801 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 30 Jan 2019 14:35:07 -0800 Subject: Fixing IR-lowering not properly registering func decl --- source/slang/lower-to-ir.cpp | 9 +++------ tests/bugs/while-in-generic.slang | 23 +++++++++++++++++++++++ tests/bugs/while-in-generic.slang.expected.txt | 4 ++++ 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 tests/bugs/while-in-generic.slang create mode 100644 tests/bugs/while-in-generic.slang.expected.txt 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 // 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()) - return lowerFuncDecl(innerFuncDecl); + return ensureDecl(context, innerFuncDecl); else if (auto innerStructDecl = genDecl->inner->As()) { - visitAggTypeDecl(innerStructDecl); + ensureDecl(context, innerStructDecl); return LoweredValInfo(); } else if( auto extensionDecl = genDecl->inner->As() ) { - 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 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 outputBuffer; + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + Context c; + outputBuffer[dispatchThreadID.x] = c.genFunc(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 -- cgit v1.2.3