From 934855a64236dcad8c56b563734ffbbffb22abba Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Tue, 19 Jul 2016 15:50:58 -0600
Subject: [PATCH] Fix issue #382: Detect implicitly-sized atomic_uint arrays.

---
 Test/420.frag                              |  2 ++
 Test/baseResults/420.frag.out              |  3 +++
 glslang/MachineIndependent/ParseHelper.cpp | 14 ++++++++++++--
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/Test/420.frag b/Test/420.frag
index 98ddf3d2e..1444758ea 100644
--- a/Test/420.frag
+++ b/Test/420.frag
@@ -10,3 +10,5 @@ void main()
 
 layout(depth_less) in float depth; // ERROR: depth_less only applies to gl_FragDepth
 layout(depth_any) out float gl_FragDepth;  // ERROR, done after use
+
+layout(binding=0) uniform atomic_uint a[];
diff --git a/Test/baseResults/420.frag.out b/Test/baseResults/420.frag.out
index 0697b52b7..784cdb4b5 100644
--- a/Test/baseResults/420.frag.out
+++ b/Test/baseResults/420.frag.out
@@ -3,6 +3,7 @@ Warning, version 420 is not yet complete; most version-specific features are pre
 ERROR: 0:4: 'redeclaration' : all redeclarations must use the same depth layout on gl_FragDepth
 ERROR: 0:11: 'layout qualifier' : can only apply depth layout to gl_FragDepth 
 ERROR: 0:12: 'gl_FragDepth' : cannot redeclare after use 
+WARNING: 0:14: 'atomic_uint' : implicitly sized atomic_uint array treated as having one element for tracking the default offset 
 ERROR: 3 compilation errors.  No code generated.
 
 
@@ -20,6 +21,7 @@ ERROR: node is still EOpNull!
 0:?     'gl_FragDepth' (gl_FragDepth float FragDepth)
 0:?     'gl_FragDepth' (gl_FragDepth float FragDepth)
 0:?     'depth' (smooth in float)
+0:?     'a' (layout(binding=0 offset=0 ) uniform implicitly-sized array of atomic_uint)
 
 
 Linked fragment stage:
@@ -39,4 +41,5 @@ ERROR: node is still EOpNull!
 0:?     'gl_FragDepth' (gl_FragDepth float FragDepth)
 0:?     'gl_FragDepth' (gl_FragDepth float FragDepth)
 0:?     'depth' (smooth in float)
+0:?     'a' (layout(binding=0 offset=0 ) uniform 1-element array of atomic_uint)
 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 56b326efd..0c20cf87e 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -4753,8 +4753,18 @@ void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol)
 
             // Check for overlap
             int numOffsets = 4;
-            if (symbol.getType().isArray())
-                numOffsets *= symbol.getType().getCumulativeArraySize();
+            if (symbol.getType().isArray()) {
+                if (symbol.getType().isExplicitlySizedArray())
+                    numOffsets *= symbol.getType().getCumulativeArraySize();
+                else {
+                    // TODO: functionality: implicitly-sized atomic_uint arrays.
+                    // We don't know the full size until later.  This might
+                    // be a specification problem, will report to Khronos.  For the
+                    // cases that is not true, the rest of the checking would need
+                    // to be done at link time instead of compile time.
+                    warn(loc, "implicitly sized atomic_uint array treated as having one element for tracking the default offset", "atomic_uint", "");
+                }
+            }
             int repeated = intermediate.addUsedOffsets(qualifier.layoutBinding, offset, numOffsets);
             if (repeated >= 0)
                 error(loc, "atomic counters sharing the same offset:", "offset", "%d", repeated);
-- 
GitLab