diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index d634b114b7..ba6b48509b 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -3006,8 +3006,16 @@ return loweredExpr; } RefPtr loweredDecl = loweredDeclClass.createInstance(); + + // Note: we lower the declaration (including its initialization expression, if any) + // *before* we add the declaration to the current context (e.g., a statement being + // built), so that any operations inside the initialization expression that + // might need to inject statements/temporaries/whatever happen *before* + // the declaration of this variable. + auto result = lowerSimpleVarDeclCommon(loweredDecl, decl, loweredType); addDecl(loweredDecl); - return lowerSimpleVarDeclCommon(loweredDecl, decl, loweredType); + + return result; } RefPtr lowerVarDeclCommon( diff --git a/tests/rewriter/glslang-bug-988-workaround.frag b/tests/rewriter/glslang-bug-988-workaround.frag index 8c9692aed1..578b49236e 100644 --- a/tests/rewriter/glslang-bug-988-workaround.frag +++ b/tests/rewriter/glslang-bug-988-workaround.frag @@ -25,7 +25,8 @@ out vec4 result; void main() { - result = doIt(foo); + vec4 r = doIt(foo); + result = r; } #else @@ -52,7 +53,8 @@ out vec4 result; void main() { Foo SLANG_tmp_0 = foo; - result = doIt(SLANG_tmp_0); + vec4 r = doIt(SLANG_tmp_0); + result = r; } #endif