fix the wrong generated code when a non-constant array is declared with its size derived from spec constant operations
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 81486ca..63c3d40 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -66,6 +66,25 @@
// or a different instruction sequence to do something gets used).
const int GeneratorVersion = 1;
+namespace {
+class SpecConstantOpModeGuard {
+public:
+ SpecConstantOpModeGuard(spv::Builder* builder)
+ : builder_(builder) {
+ previous_flag_ = builder->isInSpecConstCodeGenMode();
+ builder->setToSpecConstCodeGenMode();
+ }
+ ~SpecConstantOpModeGuard() {
+ previous_flag_ ? builder_->setToSpecConstCodeGenMode()
+ : builder_->setToNormalCodeGenMode();
+ }
+
+private:
+ spv::Builder* builder_;
+ bool previous_flag_;
+};
+}
+
//
// The main holder of information for translating glslang to SPIR-V.
//
@@ -1927,6 +1946,7 @@
glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim);
if (specNode != nullptr) {
builder.clearAccessChain();
+ SpecConstantOpModeGuard set_to_spec_const_mode(&builder);
specNode->traverse(this);
return accessChainLoad(specNode->getAsTyped()->getType());
}
@@ -3868,25 +3888,6 @@
return builder.makeCompositeConstant(typeId, spvConsts);
}
-namespace {
-class SpecConstantOpModeGuard {
-public:
- SpecConstantOpModeGuard(spv::Builder* builder)
- : builder_(builder) {
- previous_flag_ = builder->isInSpecConstCodeGenMode();
- builder->setToSpecConstCodeGenMode();
- }
- ~SpecConstantOpModeGuard() {
- previous_flag_ ? builder_->setToSpecConstCodeGenMode()
- : builder_->setToNormalCodeGenMode();
- }
-
-private:
- spv::Builder* builder_;
- bool previous_flag_;
-};
-}
-
// Create constant ID from const initializer sub tree.
spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstSubTree(
glslang::TIntermTyped* subTree)