diff --git a/Test/baseResults/100.frag.out b/Test/baseResults/100.frag.out
index dafad7d475d4263fe6f69fe291a36ff2caf816fd..0bd5acda71e766f2d9343541d33c5b3ecc71d9a0 100644
--- a/Test/baseResults/100.frag.out
+++ b/Test/baseResults/100.frag.out
@@ -129,20 +129,20 @@ ERROR: node is still EOpNull!
 0:29        'b' (mediump int)
 0:29        Constant:
 0:29          3 (const int)
-0:36      move second child to first child (structure{f,a})
-0:36        's1' (structure{f,a})
-0:36        's2' (structure{f,a})
+0:36      move second child to first child (structure{mediump float f, 10-element array of mediump float a})
+0:36        's1' (structure{mediump float f, 10-element array of mediump float a})
+0:36        's2' (structure{mediump float f, 10-element array of mediump float a})
 0:37      Test condition and select (void)
 0:37        Condition
 0:37        Compare Equal (bool)
-0:37          's1' (structure{f,a})
-0:37          's2' (structure{f,a})
+0:37          's1' (structure{mediump float f, 10-element array of mediump float a})
+0:37          's2' (structure{mediump float f, 10-element array of mediump float a})
 0:37        true case is null
 0:38      Test condition and select (void)
 0:38        Condition
 0:38        Compare Not Equal (bool)
-0:38          's1' (structure{f,a})
-0:38          's2' (structure{f,a})
+0:38          's1' (structure{mediump float f, 10-element array of mediump float a})
+0:38          's2' (structure{mediump float f, 10-element array of mediump float a})
 0:38        true case is null
 0:40      'b' (mediump int)
 0:54  Function Definition: foo10( (void)
@@ -325,7 +325,7 @@ ERROR: node is still EOpNull!
 0:?     'uint' (mediump int)
 0:?     'v' (smooth in 3-element array of mediump 4-component vector of float)
 0:?     'f' (mediump float)
-0:?     '__anon__0' (layout(column_major shared ) uniform block{x})
+0:?     '__anon__0' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump int x})
 0:?     'fa' (unsized array of mediump float)
 0:?     'f13' (mediump float)
 0:?     'fi' (invariant mediump float)
@@ -343,7 +343,7 @@ ERROR: node is still EOpNull!
 0:?     'f123' (mediump float)
 0:?     'f124' (mediump float)
 0:?     'sCube' (uniform lowp samplerCube)
-0:?     's' (smooth in structure{f})
+0:?     's' (smooth in structure{mediump float f})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/100scope.vert.out b/Test/baseResults/100scope.vert.out
index a196adef94da76588e11232ae94796efa8387147..edf9cd34d807e53a055dfa598233bc754a8fdcfe 100644
--- a/Test/baseResults/100scope.vert.out
+++ b/Test/baseResults/100scope.vert.out
@@ -107,12 +107,12 @@ ERROR: node is still EOpNull!
 0:60            'x' (highp int)
 0:68      Sequence
 0:68        Sequence
-0:68          move second child to first child (structure{x})
-0:68            'S' (structure{x})
+0:68          move second child to first child (structure{highp int x})
+0:68            'S' (structure{highp int x})
 0:68            Constant:
 0:68              0 (const int)
 0:69        x: direct index for structure (highp int)
-0:69          'S' (structure{x})
+0:69          'S' (structure{highp int x})
 0:69          Constant:
 0:69            0 (const int)
 0:73      Constant:
@@ -120,7 +120,7 @@ ERROR: node is still EOpNull!
 0:?   Linker Objects
 0:?     'b' (bool)
 0:?     'tan' (highp float)
-0:?     's' (smooth out structure{f})
+0:?     's' (smooth out structure{highp float f})
 
 
 Linked vertex stage:
diff --git a/Test/baseResults/110scope.vert.out b/Test/baseResults/110scope.vert.out
index cabb6582fced74c0072a0d7e1082eb629debea88..26b2e4065d9f675a21d1ab75d816b05de930b96e 100644
--- a/Test/baseResults/110scope.vert.out
+++ b/Test/baseResults/110scope.vert.out
@@ -99,12 +99,12 @@ ERROR: node is still EOpNull!
 0:60            'x' (int)
 0:68      Sequence
 0:68        Sequence
-0:68          move second child to first child (structure{x})
-0:68            'S' (structure{x})
+0:68          move second child to first child (structure{int x})
+0:68            'S' (structure{int x})
 0:68            Constant:
 0:68              0 (const int)
 0:69        x: direct index for structure (int)
-0:69          'S' (structure{x})
+0:69          'S' (structure{int x})
 0:69          Constant:
 0:69            0 (const int)
 0:73      Constant:
diff --git a/Test/baseResults/120.frag.out b/Test/baseResults/120.frag.out
index bc461f2a34f40f3151372fabe01628ab8ec4a16e..77e44d0d05778614b06c8fa86e191a02f8a63b5e 100644
--- a/Test/baseResults/120.frag.out
+++ b/Test/baseResults/120.frag.out
@@ -47,9 +47,9 @@ ERROR: node is still EOpNull!
 0:23          Construct mat2x3 (2X3 matrix of float)
 0:23            'm' (uniform 4X2 matrix of float)
 0:27      Sequence
-0:27        move second child to first child (structure{f})
-0:27          'sv' (structure{f})
-0:27          Construct structure (structure{f})
+0:27        move second child to first child (structure{float f})
+0:27          'sv' (structure{float f})
+0:27          Construct structure (structure{float f})
 0:27            Convert int to float (float)
 0:27              'a' (int)
 0:28      Sequence
@@ -196,9 +196,9 @@ ERROR: node is still EOpNull!
 0:51            false case
 0:51            'a' (int)
 0:52      Sequence
-0:52        move second child to first child (structure{f})
-0:52          'news' (structure{f})
-0:52          'sv' (structure{f})
+0:52        move second child to first child (structure{float f})
+0:52          'news' (structure{float f})
+0:52          'sv' (structure{float f})
 0:54      vector swizzle (2-component vector of float)
 0:54        'i' (smooth in 4-component vector of float)
 0:54        Sequence
diff --git a/Test/baseResults/140.frag.out b/Test/baseResults/140.frag.out
index eb5ceb103c893116da6d98af6ca1ebab19078cee..6beb4c5b428ce5f32dfeafbe0e133d85ed3c0bf9 100644
--- a/Test/baseResults/140.frag.out
+++ b/Test/baseResults/140.frag.out
@@ -28,7 +28,7 @@ ERROR: node is still EOpNull!
 0:?     'o' (out 4-component vector of float)
 0:?     'gl_ClipDistance' (smooth in 5-element array of float)
 0:?     'gl_ClipDistance' (smooth in 5-element array of float)
-0:?     's' (smooth in structure{f})
+0:?     's' (smooth in structure{float f})
 0:?     'patch' (float)
 
 
diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out
index 148f5ea548c9d0ebe745261a55834987f9156cb0..49ef96830f5ee3e9b91aafd0f993243b4c71a68d 100644
--- a/Test/baseResults/150.frag.out
+++ b/Test/baseResults/150.frag.out
@@ -26,7 +26,7 @@ ERROR: node is still EOpNull!
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'foo' (smooth in 4-component vector of float)
-0:?     's' (smooth in structure{f})
+0:?     's' (smooth in structure{float f})
 0:?     'patch' (float)
 
 
diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out
index e1c1ae4fff7bd84acb2d9fbd9092bfdb6868dd4d..5ce6787fcb6a6380f9fbffedae3bd8aad3c84df8 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -48,12 +48,12 @@ ERROR: node is still EOpNull!
 0:30        0.000000
 0:32      move second child to first child (3-component vector of float)
 0:32        color: direct index for structure (layout(stream=0 ) 3-component vector of float)
-0:32          '__anon__0' (layout(stream=0 ) out block{color})
+0:32          '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) 3-component vector of float color})
 0:32          Constant:
 0:32            0 (const uint)
 0:32        color: direct index for structure (3-component vector of float)
-0:32          direct index (block{color})
-0:32            'fromV' (in 4-element array of block{color})
+0:32          direct index (block{3-component vector of float color})
+0:32            'fromV' (in 4-element array of block{3-component vector of float color})
 0:32            Constant:
 0:32              0 (const int)
 0:32          Constant:
@@ -61,15 +61,15 @@ ERROR: node is still EOpNull!
 0:33      move second child to first child (float)
 0:33        direct index (layout(stream=0 ) float)
 0:33          gl_ClipDistance: direct index for structure (layout(stream=0 ) unsized array of float)
-0:33            '__anon__1' (layout(stream=0 ) out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            '__anon__1' (layout(stream=0 ) out block{layout(stream=0 ) gl_Position 4-component vector of float gl_Position, layout(stream=0 ) gl_PointSize float gl_PointSize, layout(stream=0 ) unsized array of float gl_ClipDistance})
 0:33            Constant:
 0:33              2 (const uint)
 0:33          Constant:
 0:33            3 (const int)
 0:33        direct index (float)
 0:33          gl_ClipDistance: direct index for structure (unsized array of float)
-0:33            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:33              'gl_in' (in 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:33              'gl_in' (in 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -78,24 +78,24 @@ ERROR: node is still EOpNull!
 0:33            2 (const int)
 0:34      move second child to first child (4-component vector of float)
 0:34        gl_Position: direct index for structure (layout(stream=0 ) gl_Position 4-component vector of float)
-0:34          '__anon__1' (layout(stream=0 ) out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34          '__anon__1' (layout(stream=0 ) out block{layout(stream=0 ) gl_Position 4-component vector of float gl_Position, layout(stream=0 ) gl_PointSize float gl_PointSize, layout(stream=0 ) unsized array of float gl_ClipDistance})
 0:34          Constant:
 0:34            0 (const uint)
 0:34        gl_Position: direct index for structure (4-component vector of float)
-0:34          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:34            'gl_in' (in 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:34            'gl_in' (in 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:34            Constant:
 0:34              0 (const int)
 0:34          Constant:
 0:34            0 (const int)
 0:35      move second child to first child (float)
 0:35        gl_PointSize: direct index for structure (layout(stream=0 ) gl_PointSize float)
-0:35          '__anon__1' (layout(stream=0 ) out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:35          '__anon__1' (layout(stream=0 ) out block{layout(stream=0 ) gl_Position 4-component vector of float gl_Position, layout(stream=0 ) gl_PointSize float gl_PointSize, layout(stream=0 ) unsized array of float gl_ClipDistance})
 0:35          Constant:
 0:35            1 (const uint)
 0:35        gl_PointSize: direct index for structure (float)
-0:35          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:35            'gl_in' (in 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:35          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:35            'gl_in' (in 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:35            Constant:
 0:35              3 (const int)
 0:35          Constant:
@@ -113,7 +113,7 @@ ERROR: node is still EOpNull!
 0:67    Sequence
 0:67      move second child to first child (4-component vector of float)
 0:67        a: direct index for structure (layout(stream=6 ) 4-component vector of float)
-0:67          'ouuaa6' (layout(stream=6 ) out block{a})
+0:67          'ouuaa6' (layout(stream=6 ) out block{layout(stream=6 ) 4-component vector of float a})
 0:67          Constant:
 0:67            0 (const int)
 0:67        Constant:
@@ -122,28 +122,28 @@ ERROR: node is still EOpNull!
 0:67          1.000000
 0:67          1.000000
 0:?   Linker Objects
-0:?     'fromV' (in 4-element array of block{color})
-0:?     'toF' (layout(stream=0 ) out block{color})
-0:?     '__anon__0' (layout(stream=0 ) out block{color})
-0:?     'gl_in' (in 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'fromV' (in 4-element array of block{3-component vector of float color})
+0:?     'toF' (layout(stream=0 ) out block{layout(stream=0 ) 3-component vector of float color})
+0:?     '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) 3-component vector of float color})
+0:?     'gl_in' (in 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:?     'ov0' (layout(stream=0 ) out 4-component vector of float)
 0:?     'ov4' (layout(stream=4 ) out 4-component vector of float)
 0:?     'o1v0' (layout(stream=0 ) out 4-component vector of float)
 0:?     'ua' (layout(stream=3 ) uniform int)
-0:?     'ibb' (layout(stream=3 column_major shared ) uniform block{ua})
+0:?     'ibb' (layout(stream=3 column_major shared ) uniform block{layout(stream=3 column_major shared ) int ua})
 0:?     'ov3' (layout(stream=3 ) out 4-component vector of float)
-0:?     'ouuaa6' (layout(stream=6 ) out block{a})
-0:?     'ouua6' (layout(stream=6 ) out block{a})
-0:?     'ouua7' (layout(stream=7 ) out block{a})
+0:?     'ouuaa6' (layout(stream=6 ) out block{layout(stream=6 ) 4-component vector of float a})
+0:?     'ouua6' (layout(stream=6 ) out block{layout(stream=6 ) 4-component vector of float a})
+0:?     'ouua7' (layout(stream=7 ) out block{layout(stream=6 ) 4-component vector of float a})
 0:?     'ov2s3' (layout(stream=3 ) out 4-component vector of float)
 0:?     'badv4' (layout(stream=3 ) out 4-component vector of float)
 0:?     'bad2v4' (in 4-element array of 4-component vector of float)
-0:?     '__anon__1' (layout(stream=3 ) out block{a})
-0:?     'outbi' (layout(stream=3 ) out block{a,b,c})
-0:?     'inbi' (in 4-element array of block{a})
-0:?     'insn' (in 4-element array of block{a15})
-0:?     '__anon__2' (layout(stream=3 ) out block{f15})
-0:?     '__anon__3' (layout(column_major shared ) uniform block{b15})
+0:?     '__anon__1' (layout(stream=3 ) out block{layout(stream=3 ) int a})
+0:?     'outbi' (layout(stream=3 ) out block{layout(stream=3 ) int a, layout(stream=3 ) int b, layout(stream=3 ) int c})
+0:?     'inbi' (in 4-element array of block{layout(stream=2 ) int a})
+0:?     'insn' (in 4-element array of block{int a15})
+0:?     '__anon__2' (layout(stream=3 ) out block{layout(stream=3 ) float f15})
+0:?     '__anon__3' (layout(column_major shared ) uniform block{layout(column_major shared ) bool b15})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 1f4c891302a1f6b95ec529f6aff007d6bcdab7ee..28c2a92ec72bd32356a7213abde2a793d57b696f 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -16,8 +16,8 @@ vertices = 4
 0:20        move second child to first child (4-component vector of float)
 0:20          'p' (4-component vector of float)
 0:20          gl_Position: direct index for structure (4-component vector of float)
-0:20            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:20              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:20            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:20              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:20              Constant:
 0:20                1 (const int)
 0:20            Constant:
@@ -26,8 +26,8 @@ vertices = 4
 0:21        move second child to first child (float)
 0:21          'ps' (float)
 0:21          gl_PointSize: direct index for structure (float)
-0:21            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:21              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:21            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:21              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:21              Constant:
 0:21                1 (const int)
 0:21            Constant:
@@ -37,8 +37,8 @@ vertices = 4
 0:22          'cd' (float)
 0:22          direct index (float)
 0:22            gl_ClipDistance: direct index for structure (unsized array of float)
-0:22              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:22                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:22              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:22                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:22                Constant:
 0:22                  1 (const int)
 0:22              Constant:
@@ -59,8 +59,8 @@ vertices = 4
 0:26          'gl_InvocationID' (in int)
 0:28      move second child to first child (4-component vector of float)
 0:28        gl_Position: direct index for structure (4-component vector of float)
-0:28          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:28            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:28          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:28            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:28            Constant:
 0:28              1 (const int)
 0:28          Constant:
@@ -68,8 +68,8 @@ vertices = 4
 0:28        'p' (4-component vector of float)
 0:29      move second child to first child (float)
 0:29        gl_PointSize: direct index for structure (float)
-0:29          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:29            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:29          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:29            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:29            Constant:
 0:29              1 (const int)
 0:29          Constant:
@@ -78,8 +78,8 @@ vertices = 4
 0:30      move second child to first child (float)
 0:30        direct index (float)
 0:30          gl_ClipDistance: direct index for structure (unsized array of float)
-0:30            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:30              'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:30            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:30              'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:30              Constant:
 0:30                1 (const int)
 0:30            Constant:
@@ -104,7 +104,7 @@ vertices = 4
 0:?   Linker Objects
 0:?     'outa' (4-element array of int)
 0:?     'patchOut' (patch out 4-component vector of float)
-0:?     'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 
 150.tese
 Warning, version 150 is not yet complete; some version-specific features are present, but many are missing.
@@ -131,8 +131,8 @@ ERROR: node is still EOpNull!
 0:22        move second child to first child (4-component vector of float)
 0:22          'p' (4-component vector of float)
 0:22          gl_Position: direct index for structure (4-component vector of float)
-0:22            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:22              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:22            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:22              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:22              Constant:
 0:22                1 (const int)
 0:22            Constant:
@@ -141,8 +141,8 @@ ERROR: node is still EOpNull!
 0:23        move second child to first child (float)
 0:23          'ps' (float)
 0:23          gl_PointSize: direct index for structure (float)
-0:23            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:23              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:23            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:23              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -152,8 +152,8 @@ ERROR: node is still EOpNull!
 0:24          'cd' (float)
 0:24          direct index (float)
 0:24            gl_ClipDistance: direct index for structure (unsized array of float)
-0:24              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:24                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:24              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:24                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:24                Constant:
 0:24                  1 (const int)
 0:24              Constant:
@@ -188,20 +188,20 @@ ERROR: node is still EOpNull!
 0:30              1 (const int)
 0:32      move second child to first child (4-component vector of float)
 0:32        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:32          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32          Constant:
 0:32            0 (const uint)
 0:32        'p' (4-component vector of float)
 0:33      move second child to first child (float)
 0:33        gl_PointSize: direct index for structure (gl_PointSize float)
-0:33          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33          Constant:
 0:33            1 (const uint)
 0:33        'ps' (float)
 0:34      move second child to first child (float)
 0:34        direct index (float)
 0:34          gl_ClipDistance: direct index for structure (unsized array of float)
-0:34            '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34            '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:34            Constant:
 0:34              2 (const uint)
 0:34          Constant:
@@ -241,8 +241,8 @@ ERROR: node is still EOpNull!
 0:23        move second child to first child (4-component vector of float)
 0:23          'p' (4-component vector of float)
 0:23          gl_Position: direct index for structure (4-component vector of float)
-0:23            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:23              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:23            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:23              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -251,8 +251,8 @@ ERROR: node is still EOpNull!
 0:24        move second child to first child (float)
 0:24          'ps' (float)
 0:24          gl_PointSize: direct index for structure (float)
-0:24            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:24              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:24            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:24              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:24              Constant:
 0:24                1 (const int)
 0:24            Constant:
@@ -262,8 +262,8 @@ ERROR: node is still EOpNull!
 0:25          'cd' (float)
 0:25          direct index (float)
 0:25            gl_ClipDistance: direct index for structure (unsized array of float)
-0:25              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:25                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:25              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:25                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:25                Constant:
 0:25                  1 (const int)
 0:25              Constant:
@@ -284,8 +284,8 @@ ERROR: node is still EOpNull!
 0:29          'gl_InvocationID' (in int)
 0:31      move second child to first child (4-component vector of float)
 0:31        gl_Position: direct index for structure (4-component vector of float)
-0:31          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:31            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:31          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:31            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:31            Constant:
 0:31              1 (const int)
 0:31          Constant:
@@ -293,8 +293,8 @@ ERROR: node is still EOpNull!
 0:31        'p' (4-component vector of float)
 0:32      move second child to first child (float)
 0:32        gl_PointSize: direct index for structure (float)
-0:32          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:32            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:32            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32            Constant:
 0:32              1 (const int)
 0:32          Constant:
@@ -303,8 +303,8 @@ ERROR: node is still EOpNull!
 0:33      move second child to first child (float)
 0:33        direct index (float)
 0:33          gl_ClipDistance: direct index for structure (unsized array of float)
-0:33            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:33              'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:33              'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -330,8 +330,8 @@ ERROR: node is still EOpNull!
 0:42    Function Parameters: 
 0:44    Sequence
 0:44      gl_PointSize: direct index for structure (float)
-0:44        direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:44          'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:44        direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:44          'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:44          Constant:
 0:44            4 (const int)
 0:44        Constant:
@@ -340,7 +340,7 @@ ERROR: node is still EOpNull!
 0:?     'outa' (4-element array of int)
 0:?     'patchIn' (patch in 4-component vector of float)
 0:?     'patchOut' (patch out 4-component vector of float)
-0:?     'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:?     'ina' (in 2-component vector of float)
 0:?     'inb' (in 32-element array of 2-component vector of float)
 0:?     'inc' (in 32-element array of 2-component vector of float)
@@ -405,8 +405,8 @@ ERROR: node is still EOpNull!
 0:32        move second child to first child (4-component vector of float)
 0:32          'p' (4-component vector of float)
 0:32          gl_Position: direct index for structure (4-component vector of float)
-0:32            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:32              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:32              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32              Constant:
 0:32                1 (const int)
 0:32            Constant:
@@ -415,8 +415,8 @@ ERROR: node is still EOpNull!
 0:33        move second child to first child (float)
 0:33          'ps' (float)
 0:33          gl_PointSize: direct index for structure (float)
-0:33            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:33              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:33              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -426,8 +426,8 @@ ERROR: node is still EOpNull!
 0:34          'cd' (float)
 0:34          direct index (float)
 0:34            gl_ClipDistance: direct index for structure (unsized array of float)
-0:34              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:34                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:34                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:34                Constant:
 0:34                  1 (const int)
 0:34              Constant:
@@ -462,20 +462,20 @@ ERROR: node is still EOpNull!
 0:40              1 (const int)
 0:42      move second child to first child (4-component vector of float)
 0:42        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:42          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:42          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        'p' (4-component vector of float)
 0:43      move second child to first child (float)
 0:43        gl_PointSize: direct index for structure (gl_PointSize float)
-0:43          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:43          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:43          Constant:
 0:43            1 (const uint)
 0:43        'ps' (float)
 0:44      move second child to first child (float)
 0:44        direct index (float)
 0:44          gl_ClipDistance: direct index for structure (unsized array of float)
-0:44            '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:44            '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:44            Constant:
 0:44              2 (const uint)
 0:44          Constant:
@@ -488,15 +488,15 @@ ERROR: node is still EOpNull!
 0:?     'badp2' (flat patch in 4-component vector of float)
 0:?     'badp3' (noperspective patch in 4-component vector of float)
 0:?     'badp4' (patch sample in 3-component vector of float)
-0:?     'gl_in' (in 32-element array of block{gl_ClipDistance})
+0:?     'gl_in' (in 32-element array of block{unsized array of float gl_ClipDistance})
 0:?     'ina' (in 2-component vector of float)
 0:?     'inb' (in 32-element array of 2-component vector of float)
 0:?     'inc' (in 32-element array of 2-component vector of float)
 0:?     'ind' (in 32-element array of 2-component vector of float)
-0:?     'bla' (in block{f})
-0:?     'blb' (in 32-element array of block{f})
-0:?     'blc' (in 32-element array of block{f})
-0:?     'bld' (in 32-element array of block{f})
+0:?     'bla' (in block{int f})
+0:?     'blb' (in 32-element array of block{int f})
+0:?     'blc' (in 32-element array of block{int f})
+0:?     'bld' (in 32-element array of block{int f})
 0:?     'ivla' (layout(location=23 ) in 32-element array of 4-component vector of float)
 0:?     'ivlb' (layout(location=24 ) in 32-element array of 4-component vector of float)
 0:?     'ivlc' (layout(location=24 ) in 32-element array of 4-component vector of float)
@@ -523,7 +523,7 @@ ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size o
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
 ERROR: 0:26: 'gl_PointSize' :  no such field in structure 
-ERROR: 0:26: 'assign' :  cannot convert from 'float' to 'block{gl_Position}'
+ERROR: 0:26: 'assign' :  cannot convert from 'float' to 'block{4-component vector of float gl_Position}'
 ERROR: 0:29: 'out' : type must be an array: outf
 ERROR: 6 compilation errors.  No code generated.
 
@@ -537,8 +537,8 @@ ERROR: node is still EOpNull!
 0:17        move second child to first child (4-component vector of float)
 0:17          'p' (4-component vector of float)
 0:17          gl_Position: direct index for structure (4-component vector of float)
-0:17            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:17              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:17            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:17              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:17              Constant:
 0:17                1 (const int)
 0:17            Constant:
@@ -547,8 +547,8 @@ ERROR: node is still EOpNull!
 0:18        move second child to first child (float)
 0:18          'ps' (float)
 0:18          gl_PointSize: direct index for structure (float)
-0:18            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:18              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:18            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:18              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:18              Constant:
 0:18                1 (const int)
 0:18            Constant:
@@ -558,8 +558,8 @@ ERROR: node is still EOpNull!
 0:19          'cd' (float)
 0:19          direct index (float)
 0:19            gl_ClipDistance: direct index for structure (unsized array of float)
-0:19              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:19                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:19              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:19                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:19                Constant:
 0:19                  1 (const int)
 0:19              Constant:
@@ -580,19 +580,19 @@ ERROR: node is still EOpNull!
 0:23          'gl_InvocationID' (in int)
 0:25      move second child to first child (4-component vector of float)
 0:25        gl_Position: direct index for structure (4-component vector of float)
-0:25          direct index (block{gl_Position})
-0:25            'gl_out' (out 3-element array of block{gl_Position})
+0:25          direct index (block{4-component vector of float gl_Position})
+0:25            'gl_out' (out 3-element array of block{4-component vector of float gl_Position})
 0:25            Constant:
 0:25              1 (const int)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (4-component vector of float)
-0:26      direct index (block{gl_Position})
-0:26        'gl_out' (out 3-element array of block{gl_Position})
+0:26      direct index (block{4-component vector of float gl_Position})
+0:26        'gl_out' (out 3-element array of block{4-component vector of float gl_Position})
 0:26        Constant:
 0:26          1 (const int)
 0:?   Linker Objects
-0:?     'gl_out' (out 3-element array of block{gl_Position})
+0:?     'gl_out' (out 3-element array of block{4-component vector of float gl_Position})
 0:?     'a' (out 3-element array of int)
 0:?     'outb' (out 5-element array of int)
 0:?     'outc' (out 4-element array of int)
@@ -611,7 +611,7 @@ ERROR: 0:29: 'constructor' :  cannot convert parameter 2 from 'const 2X2 matrix
 ERROR: 0:29: 'const 2-element array of 4-component vector of float' : cannot construct with these arguments 
 ERROR: 0:29: '=' :  cannot convert from 'const float' to '2-element array of 4-component vector of float'
 ERROR: 0:30: 'initializer list' : wrong number of matrix columns: 4X2 matrix of float
-ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from 'float' to 'structure{s,t}'
+ERROR: 0:40: 'constructor' :  cannot convert parameter 1 from 'float' to 'structure{float s, float t}'
 ERROR: 0:58: 'initializer list' : wrong number of structure members 
 ERROR: 13 compilation errors.  No code generated.
 
@@ -629,14 +629,14 @@ ERROR: node is still EOpNull!
 0:4        0.000000
 0:4        1.000000
 0:15  Sequence
-0:15    move second child to first child (structure{a,b})
-0:15      'e' (structure{a,b})
+0:15    move second child to first child (structure{float a, int b})
+0:15      'e' (structure{float a, int b})
 0:15      Constant:
 0:15        1.200000
 0:15        2 (const int)
 0:20  Sequence
-0:20    move second child to first child (structure{a,b})
-0:20      'e2' (structure{a,b})
+0:20    move second child to first child (structure{float a, int b})
+0:20      'e2' (structure{float a, int b})
 0:20      Constant:
 0:20        1.000000
 0:20        3 (const int)
@@ -687,7 +687,7 @@ ERROR: node is still EOpNull!
 0:74            0.000000
 0:74            6.000000
 0:74            0.000000
-0:74          'curlybad1' (structure{uv2,s})
+0:74          'curlybad1' (structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:74        true case is null
 0:76      Test condition and select (void)
 0:76        Condition
@@ -710,16 +710,16 @@ ERROR: node is still EOpNull!
 0:?     'b2' (2-component vector of float)
 0:?     'c2' (3X3 matrix of float)
 0:?     'd' (2X2 matrix of float)
-0:?     'e' (structure{a,b})
-0:?     'e2' (structure{a,b})
-0:?     'e3' (structure{a,b})
+0:?     'e' (structure{float a, int b})
+0:?     'e2' (structure{float a, int b})
+0:?     'e3' (structure{float a, int b})
 0:?     'a3' (int)
 0:?     'b3' (2-element array of 4-component vector of float)
 0:?     'b4' (2-element array of 4-component vector of float)
 0:?     'c3' (4X2 matrix of float)
-0:?     'd2' (unsized array of structure{s,t})
+0:?     'd2' (unsized array of structure{float s, float t})
 0:?     'b5' (5-element array of float)
-0:?     'constructed' (const structure{uv2,s})
+0:?     'constructed' (const structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:?       1 (const uint)
 0:?       2 (const uint)
 0:?       3.000000
@@ -736,8 +736,8 @@ ERROR: node is still EOpNull!
 0:?       0.000000
 0:?       6.000000
 0:?       0.000000
-0:?     'curlybad1' (structure{uv2,s})
-0:?     'curlyInit' (const structure{uv2,s})
+0:?     'curlybad1' (structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
+0:?     'curlyInit' (const structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:?       1 (const uint)
 0:?       2 (const uint)
 0:?       3.000000
@@ -779,7 +779,7 @@ ERROR: Linking tessellation control stage: Multiple function bodies in multiple
 ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
     main(
 ERROR: Linking tessellation control stage: Types must match:
-    gl_out: "out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance}" versus "out 3-element array of block{gl_Position}"
+    gl_out: "out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance}" versus "out 3-element array of block{4-component vector of float gl_Position}"
 
 Linked tessellation evaluation stage:
 
@@ -808,8 +808,8 @@ vertices = 4
 0:20        move second child to first child (4-component vector of float)
 0:20          'p' (4-component vector of float)
 0:20          gl_Position: direct index for structure (4-component vector of float)
-0:20            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:20              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:20            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:20              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:20              Constant:
 0:20                1 (const int)
 0:20            Constant:
@@ -818,8 +818,8 @@ vertices = 4
 0:21        move second child to first child (float)
 0:21          'ps' (float)
 0:21          gl_PointSize: direct index for structure (float)
-0:21            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:21              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:21            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:21              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:21              Constant:
 0:21                1 (const int)
 0:21            Constant:
@@ -829,8 +829,8 @@ vertices = 4
 0:22          'cd' (float)
 0:22          direct index (float)
 0:22            gl_ClipDistance: direct index for structure (unsized array of float)
-0:22              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:22                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:22              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:22                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:22                Constant:
 0:22                  1 (const int)
 0:22              Constant:
@@ -851,8 +851,8 @@ vertices = 4
 0:26          'gl_InvocationID' (in int)
 0:28      move second child to first child (4-component vector of float)
 0:28        gl_Position: direct index for structure (4-component vector of float)
-0:28          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:28            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:28          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:28            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:28            Constant:
 0:28              1 (const int)
 0:28          Constant:
@@ -860,8 +860,8 @@ vertices = 4
 0:28        'p' (4-component vector of float)
 0:29      move second child to first child (float)
 0:29        gl_PointSize: direct index for structure (float)
-0:29          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:29            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:29          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:29            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:29            Constant:
 0:29              1 (const int)
 0:29          Constant:
@@ -870,8 +870,8 @@ vertices = 4
 0:30      move second child to first child (float)
 0:30        direct index (float)
 0:30          gl_ClipDistance: direct index for structure (unsized array of float)
-0:30            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:30              'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:30            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:30              'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:30              Constant:
 0:30                1 (const int)
 0:30            Constant:
@@ -906,8 +906,8 @@ vertices = 4
 0:23        move second child to first child (4-component vector of float)
 0:23          'p' (4-component vector of float)
 0:23          gl_Position: direct index for structure (4-component vector of float)
-0:23            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:23              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:23            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:23              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -916,8 +916,8 @@ vertices = 4
 0:24        move second child to first child (float)
 0:24          'ps' (float)
 0:24          gl_PointSize: direct index for structure (float)
-0:24            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:24              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:24            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:24              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:24              Constant:
 0:24                1 (const int)
 0:24            Constant:
@@ -927,8 +927,8 @@ vertices = 4
 0:25          'cd' (float)
 0:25          direct index (float)
 0:25            gl_ClipDistance: direct index for structure (unsized array of float)
-0:25              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:25                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:25              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:25                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:25                Constant:
 0:25                  1 (const int)
 0:25              Constant:
@@ -949,8 +949,8 @@ vertices = 4
 0:29          'gl_InvocationID' (in int)
 0:31      move second child to first child (4-component vector of float)
 0:31        gl_Position: direct index for structure (4-component vector of float)
-0:31          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:31            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:31          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:31            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:31            Constant:
 0:31              1 (const int)
 0:31          Constant:
@@ -958,8 +958,8 @@ vertices = 4
 0:31        'p' (4-component vector of float)
 0:32      move second child to first child (float)
 0:32        gl_PointSize: direct index for structure (float)
-0:32          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:32            'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32          direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:32            'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32            Constant:
 0:32              1 (const int)
 0:32          Constant:
@@ -968,8 +968,8 @@ vertices = 4
 0:33      move second child to first child (float)
 0:33        direct index (float)
 0:33          gl_ClipDistance: direct index for structure (unsized array of float)
-0:33            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:33              'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:33              'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -995,8 +995,8 @@ vertices = 4
 0:42    Function Parameters: 
 0:44    Sequence
 0:44      gl_PointSize: direct index for structure (float)
-0:44        direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:44          'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:44        direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:44          'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:44          Constant:
 0:44            4 (const int)
 0:44        Constant:
@@ -1010,8 +1010,8 @@ vertices = 4
 0:17        move second child to first child (4-component vector of float)
 0:17          'p' (4-component vector of float)
 0:17          gl_Position: direct index for structure (4-component vector of float)
-0:17            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:17              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:17            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:17              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:17              Constant:
 0:17                1 (const int)
 0:17            Constant:
@@ -1020,8 +1020,8 @@ vertices = 4
 0:18        move second child to first child (float)
 0:18          'ps' (float)
 0:18          gl_PointSize: direct index for structure (float)
-0:18            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:18              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:18            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:18              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:18              Constant:
 0:18                1 (const int)
 0:18            Constant:
@@ -1031,8 +1031,8 @@ vertices = 4
 0:19          'cd' (float)
 0:19          direct index (float)
 0:19            gl_ClipDistance: direct index for structure (unsized array of float)
-0:19              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:19                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:19              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:19                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:19                Constant:
 0:19                  1 (const int)
 0:19              Constant:
@@ -1053,21 +1053,21 @@ vertices = 4
 0:23          'gl_InvocationID' (in int)
 0:25      move second child to first child (4-component vector of float)
 0:25        gl_Position: direct index for structure (4-component vector of float)
-0:25          direct index (block{gl_Position})
-0:25            'gl_out' (out 3-element array of block{gl_Position})
+0:25          direct index (block{4-component vector of float gl_Position})
+0:25            'gl_out' (out 3-element array of block{4-component vector of float gl_Position})
 0:25            Constant:
 0:25              1 (const int)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (4-component vector of float)
-0:26      direct index (block{gl_Position})
-0:26        'gl_out' (out 3-element array of block{gl_Position})
+0:26      direct index (block{4-component vector of float gl_Position})
+0:26        'gl_out' (out 3-element array of block{4-component vector of float gl_Position})
 0:26        Constant:
 0:26          1 (const int)
 0:?   Linker Objects
 0:?     'outa' (4-element array of int)
 0:?     'patchOut' (patch out 4-component vector of float)
-0:?     'gl_out' (out 4-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'gl_out' (out 4-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:?     'patchIn' (patch in 4-component vector of float)
 0:?     'ina' (in 2-component vector of float)
 0:?     'inb' (in 32-element array of 2-component vector of float)
@@ -1102,8 +1102,8 @@ ERROR: node is still EOpNull!
 0:22        move second child to first child (4-component vector of float)
 0:22          'p' (4-component vector of float)
 0:22          gl_Position: direct index for structure (4-component vector of float)
-0:22            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:22              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:22            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:22              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:22              Constant:
 0:22                1 (const int)
 0:22            Constant:
@@ -1112,8 +1112,8 @@ ERROR: node is still EOpNull!
 0:23        move second child to first child (float)
 0:23          'ps' (float)
 0:23          gl_PointSize: direct index for structure (float)
-0:23            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:23              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:23            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:23              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:23              Constant:
 0:23                1 (const int)
 0:23            Constant:
@@ -1123,8 +1123,8 @@ ERROR: node is still EOpNull!
 0:24          'cd' (float)
 0:24          direct index (float)
 0:24            gl_ClipDistance: direct index for structure (unsized array of float)
-0:24              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:24                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:24              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:24                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:24                Constant:
 0:24                  1 (const int)
 0:24              Constant:
@@ -1159,20 +1159,20 @@ ERROR: node is still EOpNull!
 0:30              1 (const int)
 0:32      move second child to first child (4-component vector of float)
 0:32        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:32          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32          Constant:
 0:32            0 (const uint)
 0:32        'p' (4-component vector of float)
 0:33      move second child to first child (float)
 0:33        gl_PointSize: direct index for structure (gl_PointSize float)
-0:33          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33          Constant:
 0:33            1 (const uint)
 0:33        'ps' (float)
 0:34      move second child to first child (float)
 0:34        direct index (float)
 0:34          gl_ClipDistance: direct index for structure (unsized array of float)
-0:34            '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34            '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:34            Constant:
 0:34              2 (const uint)
 0:34          Constant:
@@ -1192,8 +1192,8 @@ ERROR: node is still EOpNull!
 0:32        move second child to first child (4-component vector of float)
 0:32          'p' (4-component vector of float)
 0:32          gl_Position: direct index for structure (4-component vector of float)
-0:32            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:32              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:32            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:32              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:32              Constant:
 0:32                1 (const int)
 0:32            Constant:
@@ -1202,8 +1202,8 @@ ERROR: node is still EOpNull!
 0:33        move second child to first child (float)
 0:33          'ps' (float)
 0:33          gl_PointSize: direct index for structure (float)
-0:33            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:33              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:33            direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:33              'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:33              Constant:
 0:33                1 (const int)
 0:33            Constant:
@@ -1213,8 +1213,8 @@ ERROR: node is still EOpNull!
 0:34          'cd' (float)
 0:34          direct index (float)
 0:34            gl_ClipDistance: direct index for structure (unsized array of float)
-0:34              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:34                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:34              direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:34                'gl_in' (in 32-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:34                Constant:
 0:34                  1 (const int)
 0:34              Constant:
@@ -1249,20 +1249,20 @@ ERROR: node is still EOpNull!
 0:40              1 (const int)
 0:42      move second child to first child (4-component vector of float)
 0:42        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:42          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:42          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        'p' (4-component vector of float)
 0:43      move second child to first child (float)
 0:43        gl_PointSize: direct index for structure (gl_PointSize float)
-0:43          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:43          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:43          Constant:
 0:43            1 (const uint)
 0:43        'ps' (float)
 0:44      move second child to first child (float)
 0:44        direct index (float)
 0:44          gl_ClipDistance: direct index for structure (unsized array of float)
-0:44            '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:44            '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance})
 0:44            Constant:
 0:44              2 (const uint)
 0:44          Constant:
@@ -1277,14 +1277,14 @@ ERROR: node is still EOpNull!
 0:4        0.000000
 0:4        1.000000
 0:15  Sequence
-0:15    move second child to first child (structure{a,b})
-0:15      'e' (structure{a,b})
+0:15    move second child to first child (structure{float a, int b})
+0:15      'e' (structure{float a, int b})
 0:15      Constant:
 0:15        1.200000
 0:15        2 (const int)
 0:20  Sequence
-0:20    move second child to first child (structure{a,b})
-0:20      'e2' (structure{a,b})
+0:20    move second child to first child (structure{float a, int b})
+0:20      'e2' (structure{float a, int b})
 0:20      Constant:
 0:20        1.000000
 0:20        3 (const int)
@@ -1335,7 +1335,7 @@ ERROR: node is still EOpNull!
 0:74            0.000000
 0:74            6.000000
 0:74            0.000000
-0:74          'curlybad1' (structure{uv2,s})
+0:74          'curlybad1' (structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:74        true case is null
 0:76      Test condition and select (void)
 0:76        Condition
@@ -1349,15 +1349,15 @@ ERROR: node is still EOpNull!
 0:?     'badp2' (flat patch in 4-component vector of float)
 0:?     'badp3' (noperspective patch in 4-component vector of float)
 0:?     'badp4' (patch sample in 3-component vector of float)
-0:?     'gl_in' (in 32-element array of block{gl_ClipDistance})
+0:?     'gl_in' (in 32-element array of block{unsized array of float gl_ClipDistance})
 0:?     'ina' (in 2-component vector of float)
 0:?     'inb' (in 32-element array of 2-component vector of float)
 0:?     'inc' (in 32-element array of 2-component vector of float)
 0:?     'ind' (in 32-element array of 2-component vector of float)
-0:?     'bla' (in block{f})
-0:?     'blb' (in 32-element array of block{f})
-0:?     'blc' (in 32-element array of block{f})
-0:?     'bld' (in 32-element array of block{f})
+0:?     'bla' (in block{int f})
+0:?     'blb' (in 32-element array of block{int f})
+0:?     'blc' (in 32-element array of block{int f})
+0:?     'bld' (in 32-element array of block{int f})
 0:?     'ivla' (layout(location=23 ) in 32-element array of 4-component vector of float)
 0:?     'ivlb' (layout(location=24 ) in 32-element array of 4-component vector of float)
 0:?     'ivlc' (layout(location=24 ) in 32-element array of 4-component vector of float)
@@ -1378,16 +1378,16 @@ ERROR: node is still EOpNull!
 0:?     'b2' (2-component vector of float)
 0:?     'c2' (3X3 matrix of float)
 0:?     'd' (2X2 matrix of float)
-0:?     'e' (structure{a,b})
-0:?     'e2' (structure{a,b})
-0:?     'e3' (structure{a,b})
+0:?     'e' (structure{float a, int b})
+0:?     'e2' (structure{float a, int b})
+0:?     'e3' (structure{float a, int b})
 0:?     'a3' (int)
 0:?     'b3' (2-element array of 4-component vector of float)
 0:?     'b4' (2-element array of 4-component vector of float)
 0:?     'c3' (4X2 matrix of float)
-0:?     'd2' (unsized array of structure{s,t})
+0:?     'd2' (unsized array of structure{float s, float t})
 0:?     'b5' (5-element array of float)
-0:?     'constructed' (const structure{uv2,s})
+0:?     'constructed' (const structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:?       1 (const uint)
 0:?       2 (const uint)
 0:?       3.000000
@@ -1404,8 +1404,8 @@ ERROR: node is still EOpNull!
 0:?       0.000000
 0:?       6.000000
 0:?       0.000000
-0:?     'curlybad1' (structure{uv2,s})
-0:?     'curlyInit' (const structure{uv2,s})
+0:?     'curlybad1' (structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
+0:?     'curlyInit' (const structure{2-component vector of uint uv2, 2-element array of structure{float f, 2X3 matrix of float m23} s})
 0:?       1 (const uint)
 0:?       2 (const uint)
 0:?       3.000000
diff --git a/Test/baseResults/150.vert.out b/Test/baseResults/150.vert.out
index 306c8a33d66b51194711adf9c5aadd993dcefe31..eb716292dab64da4c2f2ea2f17046a4ca0a68376 100644
--- a/Test/baseResults/150.vert.out
+++ b/Test/baseResults/150.vert.out
@@ -10,20 +10,20 @@ ERROR: node is still EOpNull!
 0:11    Sequence
 0:11      move second child to first child (4-component vector of float)
 0:11        gl_Position: direct index for structure (invariant gl_Position 4-component vector of float)
-0:11          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:11          '__anon__0' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, 4-element array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:11          Constant:
 0:11            0 (const uint)
 0:11        'iv4' (in 4-component vector of float)
 0:12      move second child to first child (float)
 0:12        gl_PointSize: direct index for structure (gl_PointSize float)
-0:12          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:12          '__anon__0' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, 4-element array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:12          Constant:
 0:12            1 (const uint)
 0:12        'ps' (uniform float)
 0:13      move second child to first child (float)
 0:13        direct index (float)
 0:13          gl_ClipDistance: direct index for structure (4-element array of float)
-0:13            '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:13            '__anon__0' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, 4-element array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:13            Constant:
 0:13              2 (const uint)
 0:13          Constant:
@@ -34,14 +34,14 @@ ERROR: node is still EOpNull!
 0:13            0 (const int)
 0:14      move second child to first child (4-component vector of float)
 0:14        gl_ClipVertex: direct index for structure (gl_ClipVertex 4-component vector of float)
-0:14          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:14          '__anon__0' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, 4-element array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:14          Constant:
 0:14            3 (const uint)
 0:14        'iv4' (in 4-component vector of float)
 0:?   Linker Objects
 0:?     'iv4' (in 4-component vector of float)
 0:?     'ps' (uniform float)
-0:?     '__anon__1' (layout(column_major shared ) uniform block{a})
+0:?     '__anon__1' (layout(column_major shared ) uniform block{layout(column_major shared ) unsized array of int a})
 0:?     'gl_VertexID' (gl_VertexId int)
 0:?     'gl_InstanceID' (gl_InstanceId int)
 
diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out
index 29d911ea0016d545946460a1f10b4ecf693ddbc6..10b2fd96efd6cd0db8e0379fec9f5020e62a72f8 100644
--- a/Test/baseResults/300.frag.out
+++ b/Test/baseResults/300.frag.out
@@ -201,13 +201,13 @@ ERROR: node is still EOpNull!
 0:91      move second child to first child (lowp 3-component vector of float)
 0:91        'sc' (out lowp 3-component vector of float)
 0:91        c: direct index for structure (lowp 3-component vector of float)
-0:91          's2' (smooth in structure{c,f})
+0:91          's2' (smooth in structure{lowp 3-component vector of float c, lowp float f})
 0:91          Constant:
 0:91            0 (const int)
 0:92      move second child to first child (lowp float)
 0:92        'sf' (out lowp float)
 0:92        f: direct index for structure (lowp float)
-0:92          's2' (smooth in structure{c,f})
+0:92          's2' (smooth in structure{lowp 3-component vector of float c, lowp float f})
 0:92          Constant:
 0:92            1 (const int)
 0:94      add (lowp 2-component vector of float)
@@ -241,28 +241,28 @@ ERROR: node is still EOpNull!
 0:111        'c4D' (smooth lowp 4-component vector of float)
 0:117  Function Definition: foo13(struct-s-i1-s211; (void)
 0:117    Function Parameters: 
-0:117      'inSt2' (in structure{i,s})
+0:117      'inSt2' (in structure{mediump int i, lowp sampler2D s})
 0:119    Sequence
 0:119      Test condition and select (void)
 0:119        Condition
 0:119        Compare Equal (bool)
-0:119          'st1' (uniform structure{i,s})
-0:119          'st2' (uniform structure{i,s})
+0:119          'st1' (uniform structure{mediump int i, lowp sampler2D s})
+0:119          'st2' (uniform structure{mediump int i, lowp sampler2D s})
 0:119        true case is null
 0:120      Test condition and select (void)
 0:120        Condition
 0:120        Compare Not Equal (bool)
-0:120          'st1' (uniform structure{i,s})
-0:120          'st2' (uniform structure{i,s})
+0:120          'st1' (uniform structure{mediump int i, lowp sampler2D s})
+0:120          'st2' (uniform structure{mediump int i, lowp sampler2D s})
 0:120        true case is null
 0:121      Constant:
 0:121        false (const bool)
-0:122      move second child to first child (structure{i,s})
-0:122        'inSt2' (in structure{i,s})
-0:122        'st1' (uniform structure{i,s})
+0:122      move second child to first child (structure{mediump int i, lowp sampler2D s})
+0:122        'inSt2' (in structure{mediump int i, lowp sampler2D s})
+0:122        'st1' (uniform structure{mediump int i, lowp sampler2D s})
 0:123      Compare Equal (bool)
-0:123        'inSt2' (in structure{i,s})
-0:123        'st1' (uniform structure{i,s})
+0:123        'inSt2' (in structure{mediump int i, lowp sampler2D s})
+0:123        'st1' (uniform structure{mediump int i, lowp sampler2D s})
 0:126  Function Definition: foo23( (void)
 0:126    Function Parameters: 
 0:128    Sequence
@@ -376,15 +376,15 @@ ERROR: node is still EOpNull!
 0:?     'ic4D' (flat in mediump 4-component vector of int)
 0:?     'badv' (noperspective in lowp 4-component vector of float)
 0:?     'bads' (smooth in lowp sampler2D)
-0:?     'badout' (smooth in structure{i,s})
-0:?     's2' (smooth in structure{c,f})
+0:?     'badout' (smooth in structure{mediump int i, lowp sampler2D s})
+0:?     's2' (smooth in structure{lowp 3-component vector of float c, lowp float f})
 0:?     'sc' (out lowp 3-component vector of float)
 0:?     'sf' (out lowp float)
 0:?     'arrayedSampler' (uniform 5-element array of lowp sampler2D)
-0:?     'multiInst' (layout(column_major shared ) uniform 2-element array of block{a,b,c})
+0:?     'multiInst' (layout(column_major shared ) uniform 2-element array of block{layout(column_major shared ) 2-element array of mediump int a, layout(column_major shared ) 2-element array of mediump int b, layout(column_major shared ) 2-element array of mediump int c})
 0:?     'colors' (out 4-element array of lowp 4-component vector of float)
-0:?     'st1' (uniform structure{i,s})
-0:?     'st2' (uniform structure{i,s})
+0:?     'st1' (uniform structure{mediump int i, lowp sampler2D s})
+0:?     'st2' (uniform structure{mediump int i, lowp sampler2D s})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 58103871afeebe01f3ec890c9fca5c34c19bbe5e..8f04c2181eb2aa4b7f671a40154681339cc571c2 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -138,13 +138,13 @@ ERROR: node is still EOpNull!
 0:50            1 (const int)
 0:52      move second child to first child (highp 3-component vector of float)
 0:52        c: direct index for structure (highp 3-component vector of float)
-0:52          's' (smooth out structure{c,f})
+0:52          's' (smooth out structure{highp 3-component vector of float c, highp float f})
 0:52          Constant:
 0:52            0 (const int)
 0:52        'v3' (in highp 3-component vector of float)
 0:53      move second child to first child (highp float)
 0:53        f: direct index for structure (highp float)
-0:53          's' (smooth out structure{c,f})
+0:53          's' (smooth out structure{highp 3-component vector of float c, highp float f})
 0:53          Constant:
 0:53            1 (const int)
 0:53        'dm' (highp float)
@@ -269,23 +269,23 @@ ERROR: node is still EOpNull!
 0:?     'rep' (smooth flat out highp 4-component vector of float)
 0:?     'rep2' (centroid smooth sample out highp 4-component vector of float)
 0:?     'rep3' (in highp 4-component vector of float)
-0:?     's' (smooth out structure{c,f})
+0:?     's' (smooth out structure{highp 3-component vector of float c, highp float f})
 0:?     'badsize' (unsized array of highp float)
 0:?     'badsize2' (unsized array of highp float)
-0:?     'ubInst' (layout(column_major shared ) uniform unsized array of block{a})
+0:?     'ubInst' (layout(column_major shared ) uniform unsized array of block{layout(column_major shared ) unsized array of highp int a})
 0:?     'okayA' (2-element array of highp float)
 0:?     'newV' (smooth out highp 3-component vector of float)
 0:?     'invIn' (in highp 4-component vector of float)
-0:?     's2' (smooth out structure{c,f})
-0:?     's3' (invariant smooth out structure{c,f})
-0:?     'a' (layout(column_major shared ) uniform block{f})
-0:?     '__anon__0' (layout(column_major shared ) uniform block{b23})
+0:?     's2' (smooth out structure{highp 3-component vector of float c, highp float f})
+0:?     's3' (invariant smooth out structure{highp 3-component vector of float c, highp float f})
+0:?     'a' (layout(column_major shared ) uniform block{layout(column_major shared ) highp float f})
+0:?     '__anon__0' (layout(column_major shared ) uniform block{layout(column_major shared ) bool b23})
 0:?     's2D' (uniform lowp sampler2D)
 0:?     's3D' (uniform lowp sampler3D)
 0:?     's2DS' (uniform lowp sampler2DShadow)
 0:?     's2DAS' (uniform lowp sampler2DArrayShadow)
 0:?     'c2D' (in highp 2-component vector of float)
-0:?     'ssss' (smooth out structure{f})
+0:?     'ssss' (smooth out structure{highp float f})
 0:?     'gl_VertexID' (gl_VertexId highp int)
 0:?     'gl_InstanceID' (gl_InstanceId highp int)
 
diff --git a/Test/baseResults/300block.frag.out b/Test/baseResults/300block.frag.out
index 7edaf560d3b3c54825cf2af3bcf12ffa30abf035..80b35a7962713a60e39d38efae26d5afd1b36295 100644
--- a/Test/baseResults/300block.frag.out
+++ b/Test/baseResults/300block.frag.out
@@ -12,19 +12,19 @@ ERROR: node is still EOpNull!
 0:44    Sequence
 0:44      Function Call: texture(is31;vf3; (mediump 4-component vector of int)
 0:44        sampler: direct index for structure (lowp isampler3D)
-0:44          's' (uniform structure{u,v,sampler,w,t})
+0:44          's' (uniform structure{mediump 4-component vector of float u, mediump 4-component vector of uint v, lowp isampler3D sampler, mediump 3-component vector of float w, structure{mediump int a} t})
 0:44          Constant:
 0:44            2 (const int)
 0:44        Construct vec3 (3-component vector of float)
 0:44          Convert int to float (float)
 0:44            ni: direct index for structure (layout(column_major shared ) mediump int)
-0:44              'inst' (layout(column_major shared ) uniform block{nbv,ni})
+0:44              'inst' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
 0:44              Constant:
 0:44                1 (const int)
 0:44          Convert uint to float (float)
 0:44            direct index (mediump uint)
 0:44              bv: direct index for structure (layout(column_major shared ) mediump 4-component vector of uint)
-0:44                '__anon__0' (layout(column_major shared ) uniform block{bv,bm2,sampler,t,fbs})
+0:44                '__anon__0' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump 4-component vector of uint bv, layout(column_major shared ) mediump 2X2 matrix of float bm2, layout(column_major shared ) lowp isampler2D sampler, layout(column_major shared ) structure{mediump int a} t, layout(column_major shared ) structure{mediump 4-component vector of float u, mediump 4-component vector of uint v, lowp isampler3D sampler, mediump 3-component vector of float w, structure{mediump int a} t} fbs})
 0:44                Constant:
 0:44                  0 (const uint)
 0:44              Constant:
@@ -32,29 +32,29 @@ ERROR: node is still EOpNull!
 0:44          Convert uint to float (float)
 0:44            direct index (mediump uint)
 0:44              nbv: direct index for structure (layout(column_major shared ) mediump 4-component vector of uint)
-0:44                direct index (layout(column_major shared ) block{nbv,ni})
-0:44                  'insts' (layout(column_major shared ) uniform 4-element array of block{nbv,ni})
+0:44                direct index (layout(column_major shared ) block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
+0:44                  'insts' (layout(column_major shared ) uniform 4-element array of block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
 0:44                  Constant:
 0:44                    2 (const int)
 0:44                Constant:
 0:44                  0 (const int)
 0:44              Constant:
 0:44                2 (const int)
-0:45      indirect index (layout(column_major shared ) block{nbv,ni})
-0:45        'insts' (layout(column_major shared ) uniform 4-element array of block{nbv,ni})
+0:45      indirect index (layout(column_major shared ) block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
+0:45        'insts' (layout(column_major shared ) uniform 4-element array of block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
 0:45        direct index (mediump uint)
 0:45          v: direct index for structure (mediump 4-component vector of uint)
-0:45            's' (uniform structure{u,v,sampler,w,t})
+0:45            's' (uniform structure{mediump 4-component vector of float u, mediump 4-component vector of uint v, lowp isampler3D sampler, mediump 3-component vector of float w, structure{mediump int a} t})
 0:45            Constant:
 0:45              1 (const int)
 0:45          Constant:
 0:45            0 (const int)
 0:?   Linker Objects
-0:?     's' (uniform structure{u,v,sampler,w,t})
-0:?     '__anon__0' (layout(column_major shared ) uniform block{bv,bm2,sampler,t,fbs})
-0:?     'inst' (layout(column_major shared ) uniform block{nbv,ni})
-0:?     'insts' (layout(column_major shared ) uniform 4-element array of block{nbv,ni})
-0:?     '__anon__1' (layout(column_major shared ) uniform block{f,u})
+0:?     's' (uniform structure{mediump 4-component vector of float u, mediump 4-component vector of uint v, lowp isampler3D sampler, mediump 3-component vector of float w, structure{mediump int a} t})
+0:?     '__anon__0' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump 4-component vector of uint bv, layout(column_major shared ) mediump 2X2 matrix of float bm2, layout(column_major shared ) lowp isampler2D sampler, layout(column_major shared ) structure{mediump int a} t, layout(column_major shared ) structure{mediump 4-component vector of float u, mediump 4-component vector of uint v, lowp isampler3D sampler, mediump 3-component vector of float w, structure{mediump int a} t} fbs})
+0:?     'inst' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
+0:?     'insts' (layout(column_major shared ) uniform 4-element array of block{layout(column_major shared ) mediump 4-component vector of uint nbv, layout(column_major shared ) mediump int ni})
+0:?     '__anon__1' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f, layout(column_major shared ) mediump uint u})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/300layout.vert.out b/Test/baseResults/300layout.vert.out
index ae183bfc38b5c6354c4cb074fd79e9c603c334a5..144f30f0b6f52993769453ac093cb7f3b7dcfe42 100644
--- a/Test/baseResults/300layout.vert.out
+++ b/Test/baseResults/300layout.vert.out
@@ -33,23 +33,23 @@ ERROR: node is still EOpNull!
 0:46              add (highp 4X4 matrix of float)
 0:46                add (highp 4X4 matrix of float)
 0:46                  M1: direct index for structure (layout(row_major std140 ) highp 4X4 matrix of float)
-0:46                    'tblock' (layout(row_major std140 ) uniform block{M1,M2,N1,badf,badg,bad1,bad2,bad3})
+0:46                    'tblock' (layout(row_major std140 ) uniform block{layout(row_major std140 ) highp 4X4 matrix of float M1, layout(column_major std140 ) highp 4X4 matrix of float M2, layout(row_major std140 ) highp 3X3 matrix of float N1, layout(row_major std140 ) centroid highp float badf, layout(row_major std140 ) in highp float badg, layout(row_major std140 ) highp float bad1, layout(row_major shared ) highp float bad2, layout(row_major packed ) highp float bad3})
 0:46                    Constant:
 0:46                      0 (const int)
 0:46                  M2: direct index for structure (layout(column_major std140 ) highp 4X4 matrix of float)
-0:46                    'tblock' (layout(row_major std140 ) uniform block{M1,M2,N1,badf,badg,bad1,bad2,bad3})
+0:46                    'tblock' (layout(row_major std140 ) uniform block{layout(row_major std140 ) highp 4X4 matrix of float M1, layout(column_major std140 ) highp 4X4 matrix of float M2, layout(row_major std140 ) highp 3X3 matrix of float N1, layout(row_major std140 ) centroid highp float badf, layout(row_major std140 ) in highp float badg, layout(row_major std140 ) highp float bad1, layout(row_major shared ) highp float bad2, layout(row_major packed ) highp float bad3})
 0:46                    Constant:
 0:46                      1 (const int)
 0:46                M4: direct index for structure (layout(row_major shared ) highp 4X4 matrix of float)
-0:46                  '__anon__1' (layout(column_major shared ) uniform block{M3,M4,N2,b})
+0:46                  '__anon__1' (layout(column_major shared ) uniform block{layout(column_major shared ) highp 4X4 matrix of float M3, layout(row_major shared ) highp 4X4 matrix of float M4, layout(column_major shared ) highp 3X3 matrix of float N2, layout(column_major shared ) highp int b})
 0:46                  Constant:
 0:46                    1 (const uint)
 0:46              M3: direct index for structure (layout(column_major shared ) highp 4X4 matrix of float)
-0:46                '__anon__1' (layout(column_major shared ) uniform block{M3,M4,N2,b})
+0:46                '__anon__1' (layout(column_major shared ) uniform block{layout(column_major shared ) highp 4X4 matrix of float M3, layout(row_major shared ) highp 4X4 matrix of float M4, layout(column_major shared ) highp 3X3 matrix of float N2, layout(column_major shared ) highp int b})
 0:46                Constant:
 0:46                  0 (const uint)
 0:46            t2m: direct index for structure (layout(row_major shared ) highp 4X4 matrix of float)
-0:46              '__anon__0' (layout(row_major shared ) uniform block{b,t2m})
+0:46              '__anon__0' (layout(row_major shared ) uniform block{layout(row_major shared ) bool b, layout(row_major shared ) highp 4X4 matrix of float t2m})
 0:46              Constant:
 0:46                1 (const uint)
 0:47      move second child to first child (highp 3-component vector of float)
@@ -57,20 +57,20 @@ ERROR: node is still EOpNull!
 0:47        vector-times-matrix (highp 3-component vector of float)
 0:47          'c' (layout(location=7 ) in highp 3-component vector of float)
 0:47          N1: direct index for structure (layout(row_major std140 ) highp 3X3 matrix of float)
-0:47            'tblock' (layout(row_major std140 ) uniform block{M1,M2,N1,badf,badg,bad1,bad2,bad3})
+0:47            'tblock' (layout(row_major std140 ) uniform block{layout(row_major std140 ) highp 4X4 matrix of float M1, layout(column_major std140 ) highp 4X4 matrix of float M2, layout(row_major std140 ) highp 3X3 matrix of float N1, layout(row_major std140 ) centroid highp float badf, layout(row_major std140 ) in highp float badg, layout(row_major std140 ) highp float bad1, layout(row_major shared ) highp float bad2, layout(row_major packed ) highp float bad3})
 0:47            Constant:
 0:47              2 (const int)
 0:?   Linker Objects
 0:?     'c' (layout(location=7 ) in highp 3-component vector of float)
 0:?     'p' (layout(location=3 ) in highp 4-component vector of float)
 0:?     'q' (layout(location=9 ) in 4-element array of highp 4-component vector of float)
-0:?     'r' (layout(location=10 ) in 4-element array of structure{v})
+0:?     'r' (layout(location=10 ) in 4-element array of structure{highp 4-component vector of float v})
 0:?     'pos' (smooth out highp 4-component vector of float)
 0:?     'color' (smooth out highp 3-component vector of float)
 0:?     'badm4' (layout(column_major shared ) uniform highp 4X4 matrix of float)
-0:?     'tblock' (layout(row_major std140 ) uniform block{M1,M2,N1,badf,badg,bad1,bad2,bad3})
-0:?     '__anon__0' (layout(row_major shared ) uniform block{b,t2m})
-0:?     '__anon__2' (out block{f})
+0:?     'tblock' (layout(row_major std140 ) uniform block{layout(row_major std140 ) highp 4X4 matrix of float M1, layout(column_major std140 ) highp 4X4 matrix of float M2, layout(row_major std140 ) highp 3X3 matrix of float N1, layout(row_major std140 ) centroid highp float badf, layout(row_major std140 ) in highp float badg, layout(row_major std140 ) highp float bad1, layout(row_major shared ) highp float bad2, layout(row_major packed ) highp float bad3})
+0:?     '__anon__0' (layout(row_major shared ) uniform block{layout(row_major shared ) bool b, layout(row_major shared ) highp 4X4 matrix of float t2m})
+0:?     '__anon__2' (out block{highp float f})
 0:?     'badoutA' (layout(location=10 ) smooth out highp 4-component vector of float)
 0:?     'compute_only' (shared highp 4-component vector of float)
 0:?     'aoeuntaoeu' (layout(packed ) highp float)
diff --git a/Test/baseResults/300operations.frag.out b/Test/baseResults/300operations.frag.out
index 0657e3d5517fcbbcd707b27d18ec07939e115c13..c5a3dd595319ac5a735ab9c58c6afad914b7a538 100644
--- a/Test/baseResults/300operations.frag.out
+++ b/Test/baseResults/300operations.frag.out
@@ -1,7 +1,7 @@
 300operations.frag
 ERROR: 0:11: 'float' : type requires declaration of default precision qualifier 
-ERROR: 0:30: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout(column_major shared ) uniform block{f}' and a right operand of type 'layout(column_major shared ) uniform block{f}' (or there is no acceptable conversion)
-ERROR: 0:31: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'structure{i}' and a right operand of type 'structure{i}' (or there is no acceptable conversion)
+ERROR: 0:30: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f}' and a right operand of type 'layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f}' (or there is no acceptable conversion)
+ERROR: 0:31: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'structure{mediump int i}' and a right operand of type 'structure{mediump int i}' (or there is no acceptable conversion)
 ERROR: 0:32: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'mediump float' (or there is no acceptable conversion)
 ERROR: 0:33: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'mediump uint' and a right operand of type 'mediump float' (or there is no acceptable conversion)
 ERROR: 0:34: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'mediump uint' and a right operand of type 'mediump int' (or there is no acceptable conversion)
@@ -15,8 +15,8 @@ ERROR: 0:42: '%' :  wrong operand types: no operation '%' exists that takes a le
 ERROR: 0:43: '%' :  wrong operand types: no operation '%' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'mediump float' (or there is no acceptable conversion)
 ERROR: 0:44: '%' :  wrong operand types: no operation '%' exists that takes a left-hand operand of type 'mediump float' and a right operand of type 'mediump uint' (or there is no acceptable conversion)
 ERROR: 0:45: '++' :  l-value required "instanceName" (can't modify a uniform)
-ERROR: 0:45: '++' :  wrong operand type no operation '++' exists that takes an operand of type layout(column_major shared ) uniform block{f} (or there is no acceptable conversion)
-ERROR: 0:46: '++' :  wrong operand type no operation '++' exists that takes an operand of type structure{i} (or there is no acceptable conversion)
+ERROR: 0:45: '++' :  wrong operand type no operation '++' exists that takes an operand of type layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f} (or there is no acceptable conversion)
+ERROR: 0:46: '++' :  wrong operand type no operation '++' exists that takes an operand of type structure{mediump int i} (or there is no acceptable conversion)
 ERROR: 0:47: '--' :  wrong operand type no operation '--' exists that takes an operand of type 5-element array of mediump float (or there is no acceptable conversion)
 ERROR: 0:48: '++' :  wrong operand type no operation '++' exists that takes an operand of type 3-component vector of bool (or there is no acceptable conversion)
 ERROR: 0:50: '<' :  wrong operand types: no operation '<' exists that takes a left-hand operand of type 'mediump 3-component vector of int' and a right operand of type 'mediump 3-component vector of uint' (or there is no acceptable conversion)
@@ -40,7 +40,7 @@ ERROR: 0:70: '~' :  wrong operand type no operation '~' exists that takes an ope
 ERROR: 0:71: '~' :  wrong operand type no operation '~' exists that takes an operand of type mediump 4X4 matrix of float (or there is no acceptable conversion)
 ERROR: 0:72: '~' :  wrong operand type no operation '~' exists that takes an operand of type mediump 3-component vector of float (or there is no acceptable conversion)
 ERROR: 0:73: '~' :  wrong operand type no operation '~' exists that takes an operand of type 5-element array of mediump float (or there is no acceptable conversion)
-ERROR: 0:74: '~' :  wrong operand type no operation '~' exists that takes an operand of type layout(column_major shared ) uniform block{f} (or there is no acceptable conversion)
+ERROR: 0:74: '~' :  wrong operand type no operation '~' exists that takes an operand of type layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f} (or there is no acceptable conversion)
 ERROR: 0:76: '<<' :  wrong operand types: no operation '<<' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'mediump 3-component vector of int' (or there is no acceptable conversion)
 ERROR: 0:77: '<<' :  wrong operand types: no operation '<<' exists that takes a left-hand operand of type 'mediump uint' and a right operand of type 'mediump 3-component vector of uint' (or there is no acceptable conversion)
 ERROR: 0:78: '>>' :  wrong operand types: no operation '>>' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'mediump float' (or there is no acceptable conversion)
@@ -53,7 +53,7 @@ ERROR: 0:85: 'assign' :  cannot convert from 'mediump 3-component vector of uint
 ERROR: 0:86: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type 'mediump int' and a right operand of type 'mediump 3-component vector of uint' (or there is no acceptable conversion)
 ERROR: 0:87: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type 'mediump uint' and a right operand of type 'mediump float' (or there is no acceptable conversion)
 ERROR: 0:88: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type 'mediump 2X2 matrix of float' and a right operand of type 'mediump 2X2 matrix of float' (or there is no acceptable conversion)
-ERROR: 0:89: '^' :  wrong operand types: no operation '^' exists that takes a left-hand operand of type 'structure{i}' and a right operand of type 'structure{i}' (or there is no acceptable conversion)
+ERROR: 0:89: '^' :  wrong operand types: no operation '^' exists that takes a left-hand operand of type 'structure{mediump int i}' and a right operand of type 'structure{mediump int i}' (or there is no acceptable conversion)
 ERROR: 0:90: 'assign' :  l-value required 
 ERROR: 56 compilation errors.  No code generated.
 
@@ -62,8 +62,8 @@ ERROR: node is still EOpNull!
 0:13  Function Definition: main( (void)
 0:13    Function Parameters: 
 0:?     Sequence
-0:30      'instanceName' (layout(column_major shared ) uniform block{f})
-0:31      's' (structure{i})
+0:30      'instanceName' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f})
+0:31      's' (structure{mediump int i})
 0:32      'i' (mediump int)
 0:33      'u' (mediump uint)
 0:34      'u' (mediump uint)
@@ -76,8 +76,8 @@ ERROR: node is still EOpNull!
 0:42      'f' (mediump float)
 0:43      'i' (mediump int)
 0:44      'f' (mediump float)
-0:45      'instanceName' (layout(column_major shared ) uniform block{f})
-0:46      's' (structure{i})
+0:45      'instanceName' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f})
+0:46      's' (structure{mediump int i})
 0:47      'a' (5-element array of mediump float)
 0:48      'b3' (3-component vector of bool)
 0:50      Constant:
@@ -113,7 +113,7 @@ ERROR: node is still EOpNull!
 0:71      'm4' (mediump 4X4 matrix of float)
 0:72      'v3' (mediump 3-component vector of float)
 0:73      'a' (5-element array of mediump float)
-0:74      'instanceName' (layout(column_major shared ) uniform block{f})
+0:74      'instanceName' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f})
 0:76      'i' (mediump int)
 0:77      'u' (mediump uint)
 0:78      'i' (mediump int)
@@ -126,7 +126,7 @@ ERROR: node is still EOpNull!
 0:86      'i' (mediump int)
 0:87      'u' (mediump uint)
 0:88      'm2' (mediump 2X2 matrix of float)
-0:89      's' (structure{i})
+0:89      's' (structure{mediump int i})
 0:90      move second child to first child (mediump float)
 0:90        move second child to first child (mediump float)
 0:90          'f' (mediump float)
@@ -169,8 +169,8 @@ ERROR: node is still EOpNull!
 0:106        'a' (5-element array of mediump float)
 0:106        'a' (5-element array of mediump float)
 0:107      Compare Not Equal (bool)
-0:107        's' (structure{i})
-0:107        's' (structure{i})
+0:107        's' (structure{mediump int i})
+0:107        's' (structure{mediump int i})
 0:109      logical-and (bool)
 0:109        'b' (bool)
 0:109        'b' (bool)
@@ -231,8 +231,8 @@ ERROR: node is still EOpNull!
 0:134        Constant:
 0:134          2 (const int)
 0:?   Linker Objects
-0:?     'instanceName' (layout(column_major shared ) uniform block{f})
-0:?     's' (structure{i})
+0:?     'instanceName' (layout(column_major shared ) uniform block{layout(column_major shared ) mediump float f})
+0:?     's' (structure{mediump int i})
 0:?     'a' (5-element array of mediump float)
 
 
diff --git a/Test/baseResults/300scope.vert.out b/Test/baseResults/300scope.vert.out
index c9aefe44f6d166e4e91b1c981cd8010c6cfed4e2..cde7d2323f75a01ca2cafef629ef3cd9f6882758 100644
--- a/Test/baseResults/300scope.vert.out
+++ b/Test/baseResults/300scope.vert.out
@@ -114,12 +114,12 @@ ERROR: node is still EOpNull!
 0:60            'x' (highp int)
 0:68      Sequence
 0:68        Sequence
-0:68          move second child to first child (structure{x})
-0:68            'S' (structure{x})
+0:68          move second child to first child (structure{highp int x})
+0:68            'S' (structure{highp int x})
 0:68            Constant:
 0:68              0 (const int)
 0:69        x: direct index for structure (highp int)
-0:69          'S' (structure{x})
+0:69          'S' (structure{highp int x})
 0:69          Constant:
 0:69            0 (const int)
 0:73      Constant:
diff --git a/Test/baseResults/330.frag.out b/Test/baseResults/330.frag.out
index 66dd5a375b9c46b0ec5bc49354b1647def98e9f5..97a7e17257f736cb32e36b2b1c07679e967b88f4 100644
--- a/Test/baseResults/330.frag.out
+++ b/Test/baseResults/330.frag.out
@@ -33,7 +33,7 @@ ERROR: node is still EOpNull!
 0:23        move second child to first child (4-component vector of float)
 0:23          'c' (4-component vector of float)
 0:23          gl_Color: direct index for structure (in 4-component vector of float)
-0:23            '__anon__0' (in block{gl_Color,})
+0:23            '__anon__0' (in block{in 4-component vector of float gl_Color, })
 0:23            Constant:
 0:23              2 (const uint)
 0:24      move second child to first child (4-component vector of float)
@@ -43,8 +43,8 @@ ERROR: node is still EOpNull!
 0:?     'inVar' (smooth in 4-component vector of float)
 0:?     'outVar' (out 4-component vector of float)
 0:?     'varyingVar' (smooth in 4-component vector of float)
-0:?     '__anon__0' (in block{gl_Color,})
-0:?     'gl_name' (in block{gl_i})
+0:?     '__anon__0' (in block{in 4-component vector of float gl_Color, })
+0:?     'gl_name' (in block{int gl_i})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/400.frag.out b/Test/baseResults/400.frag.out
index 9c3cbd3ec92ee6311070079c55b4b1a0fdb0069d..889a0242521eac29123671612d8a44676f24451d 100644
--- a/Test/baseResults/400.frag.out
+++ b/Test/baseResults/400.frag.out
@@ -201,8 +201,8 @@ ERROR: node is still EOpNull!
 0:?     'vl' (layout(location=4 ) smooth in 4-component vector of float)
 0:?     'vl2' (layout(location=6 ) smooth in 4-component vector of float)
 0:?     'uv3' (layout(location=3 ) uniform 3-component vector of float)
-0:?     '__anon__0' (in block{gl_FogFragCoord,gl_TexCoord,gl_Color,gl_SecondaryColor})
-0:?     '__anon__0' (in block{gl_FogFragCoord,gl_TexCoord,gl_Color,gl_SecondaryColor})
+0:?     '__anon__0' (in block{in float gl_FogFragCoord, in unsized array of 4-component vector of float gl_TexCoord, smooth in 4-component vector of float gl_Color, in 4-component vector of float gl_SecondaryColor})
+0:?     '__anon__0' (in block{in float gl_FogFragCoord, in unsized array of 4-component vector of float gl_TexCoord, smooth in 4-component vector of float gl_Color, in 4-component vector of float gl_SecondaryColor})
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'u2drs' (uniform sampler2DRectShadow)
diff --git a/Test/baseResults/400.geom.out b/Test/baseResults/400.geom.out
index 58a17b79d23d8247a4c0f1c12f6a7dbdb375295a..4b23ce03cb0bfbe2235e626dbbaf54b98812d172 100644
--- a/Test/baseResults/400.geom.out
+++ b/Test/baseResults/400.geom.out
@@ -47,8 +47,8 @@ ERROR: node is still EOpNull!
 0:25      Constant:
 0:25        1 (const int)
 0:26      gl_Position: direct index for structure (4-component vector of float)
-0:26        direct index (block{gl_Position,gl_PointSize})
-0:26          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize})
+0:26        direct index (block{4-component vector of float gl_Position, float gl_PointSize})
+0:26          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize})
 0:26          Constant:
 0:26            1 (const int)
 0:26        Constant:
@@ -72,8 +72,8 @@ ERROR: node is still EOpNull!
 0:51      Constant:
 0:51        3 (const int)
 0:?   Linker Objects
-0:?     'bn' (in 3-element array of block{a})
-0:?     'gl_in' (in 3-element array of block{gl_Position,gl_PointSize})
+0:?     'bn' (in 3-element array of block{int a})
+0:?     'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize})
 0:?     'color' (in 3-element array of 4-component vector of float)
 0:?     'color2' (in 3-element array of 4-component vector of float)
 0:?     'colorS' (in 3-element array of 4-component vector of float)
@@ -85,8 +85,8 @@ ERROR: node is still EOpNull!
 0:?     'patchIn' (patch in 3-element array of 4-component vector of float)
 0:?     'patchOut' (layout(stream=0 ) patch out 4-component vector of float)
 0:?     'scalar' (in float)
-0:?     'inbls' (in block{a})
-0:?     'inbla' (in 17-element array of block{a})
+0:?     'inbls' (in block{int a})
+0:?     'inbla' (in 17-element array of block{int a})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out
index 1eaeec69058ee8a455ff7cd5e9ac40edcb339f32..c6cc54e74179664acd74b916ff5ac1e1957d5c1b 100644
--- a/Test/baseResults/410.geom.out
+++ b/Test/baseResults/410.geom.out
@@ -4,7 +4,7 @@ ERROR: 0:8: 'myIn' : cannot redeclare a built-in block with a user name
 ERROR: 0:12: 'gl_myIn' : no declaration found for redeclaration 
 ERROR: 0:20: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:32: 'gl_Position' :  no such field in structure 
-ERROR: 0:32: '=' :  cannot convert from 'block{gl_PointSize}' to '4-component vector of float'
+ERROR: 0:32: '=' :  cannot convert from 'block{float gl_PointSize}' to '4-component vector of float'
 ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared 
 ERROR: 0:33: 'assign' :  cannot convert from 'const 4-component vector of float' to 'layout(stream=0 ) gl_Position void'
 ERROR: 7 compilation errors.  No code generated.
@@ -29,25 +29,25 @@ ERROR: node is still EOpNull!
 0:30        move second child to first child (float)
 0:30          'p' (float)
 0:30          gl_PointSize: direct index for structure (float)
-0:30            direct index (block{gl_PointSize})
-0:30              'gl_in' (in unsized array of block{gl_PointSize})
+0:30            direct index (block{float gl_PointSize})
+0:30              'gl_in' (in unsized array of block{float gl_PointSize})
 0:30              Constant:
 0:30                1 (const int)
 0:30            Constant:
 0:30              0 (const int)
 0:31      move second child to first child (float)
 0:31        gl_PointSize: direct index for structure (layout(stream=0 ) gl_PointSize float)
-0:31          '__anon__0' (layout(stream=0 ) out block{gl_PointSize,})
+0:31          '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) gl_PointSize float gl_PointSize, })
 0:31          Constant:
 0:31            1 (const uint)
 0:31        'p' (float)
 0:33      gl_Position: direct index for structure (layout(stream=0 ) gl_Position void)
-0:33        '__anon__0' (layout(stream=0 ) out block{gl_PointSize,})
+0:33        '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) gl_PointSize float gl_PointSize, })
 0:33        Constant:
 0:33          0 (const uint)
 0:?   Linker Objects
-0:?     'gl_in' (in unsized array of block{gl_PointSize})
-0:?     '__anon__0' (layout(stream=0 ) out block{gl_PointSize,})
+0:?     'gl_in' (in unsized array of block{float gl_PointSize})
+0:?     '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) gl_PointSize float gl_PointSize, })
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/420.geom.out b/Test/baseResults/420.geom.out
index 6865fa90230650e7c547493c23e435ff374c1754..1f781e1338aa296021536b3bab2766ef7a04e04f 100644
--- a/Test/baseResults/420.geom.out
+++ b/Test/baseResults/420.geom.out
@@ -20,15 +20,15 @@ ERROR: node is still EOpNull!
 0:9      Constant:
 0:9        1 (const int)
 0:10      gl_Position: direct index for structure (4-component vector of float)
-0:10        direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:10          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:10        direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:10          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:10          Constant:
 0:10            1 (const int)
 0:10        Constant:
 0:10          0 (const int)
 0:11      gl_Position: direct index for structure (4-component vector of float)
-0:11        indirect index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:11          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:11        indirect index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:11          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:11          'i' (int)
 0:11        Constant:
 0:11          0 (const int)
@@ -38,8 +38,8 @@ ERROR: node is still EOpNull!
 0:20      Constant:
 0:20        3 (const int)
 0:21      gl_Position: direct index for structure (4-component vector of float)
-0:21        indirect index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:21          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:21        indirect index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:21          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:21          'i' (int)
 0:21        Constant:
 0:21          0 (const int)
@@ -115,12 +115,12 @@ ERROR: node is still EOpNull!
 0:44            1 (const int)
 0:?   Linker Objects
 0:?     'i' (int)
-0:?     'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:?     'color3' (in 3-element array of 4-component vector of float)
 0:?     's2D' (uniform sampler2D)
 0:?     'coord' (in 3-element array of 2-component vector of float)
 0:?     'v4' (uniform 4-component vector of float)
-0:?     '__anon__0' (layout(stream=0 ) out block{gl_PointSize,gl_ClipDistance})
+0:?     '__anon__0' (layout(stream=0 ) out block{layout(stream=0 ) gl_PointSize float gl_PointSize, layout(stream=0 ) unsized array of float gl_ClipDistance})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index 1ef919fab665b63058809d1df1ecaac175a7e516..fceb116d44ca4c896aa28f87318e3a54ff4c8720 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -124,16 +124,16 @@ ERROR: node is still EOpNull!
 0:?       4.200000
 0:?     'dx' (const float)
 0:?       4.200000
-0:?     'boundInst' (layout(binding=3 column_major shared ) uniform block{aoeu})
-0:?     '__anon__0' (layout(binding=7 column_major shared ) uniform block{aoeu})
-0:?     '__anon__1' (layout(binding=1 ) in block{aoeua})
-0:?     '__anon__2' (layout(column_major shared ) uniform block{aooeu})
+0:?     'boundInst' (layout(binding=3 column_major shared ) uniform block{layout(binding=3 column_major shared ) int aoeu})
+0:?     '__anon__0' (layout(binding=7 column_major shared ) uniform block{layout(binding=7 column_major shared ) int aoeu})
+0:?     '__anon__1' (layout(binding=1 ) in block{layout(binding=1 ) int aoeua})
+0:?     '__anon__2' (layout(column_major shared ) uniform block{layout(column_major shared ) int aooeu})
 0:?     'sampb1' (layout(binding=4 ) uniform sampler2D)
 0:?     'sampb2' (layout(binding=5 ) uniform 10-element array of sampler2D)
 0:?     'sampb3' (layout(binding=80 ) uniform sampler2D)
 0:?     'sampb4' (layout(binding=31 ) uniform sampler2D)
 0:?     'sampb5' (layout(binding=79 ) uniform 2-element array of sampler2D)
-0:?     '__anon__3' (out block{gl_ClipDistance,})
+0:?     '__anon__3' (out block{unsized array of float gl_ClipDistance, })
 0:?     'patchIn' (patch in 4-component vector of float)
 0:?     'patchOut' (smooth patch out 4-component vector of float)
 0:?     'gl_VertexID' (gl_VertexId int)
diff --git a/Test/baseResults/420_size_gl_in.geom.out b/Test/baseResults/420_size_gl_in.geom.out
index 0915868635d4c1fcf6b80759cb567d1227cf21ac..569d5cd4b07be301b7dc0eccf30650af0c496d28 100644
--- a/Test/baseResults/420_size_gl_in.geom.out
+++ b/Test/baseResults/420_size_gl_in.geom.out
@@ -15,8 +15,8 @@ ERROR: node is still EOpNull!
 0:13      Constant:
 0:13        3 (const int)
 0:14      gl_Position: direct index for structure (4-component vector of float)
-0:14        direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:14          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:14        direct index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:14          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:14          Constant:
 0:14            1 (const int)
 0:14        Constant:
@@ -24,8 +24,8 @@ ERROR: node is still EOpNull!
 0:15      Constant:
 0:15        3 (const int)
 0:16      gl_Position: direct index for structure (4-component vector of float)
-0:16        indirect index (block{gl_Position,gl_PointSize,gl_ClipDistance})
-0:16          'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:16        indirect index (block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
+0:16          'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 0:16          'i' (int)
 0:16        Constant:
 0:16          0 (const int)
@@ -33,7 +33,7 @@ ERROR: node is still EOpNull!
 0:?     'i' (int)
 0:?     'colorun' (in 3-element array of 4-component vector of float)
 0:?     'color3' (in 3-element array of 4-component vector of float)
-0:?     'gl_in' (in 3-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})
+0:?     'gl_in' (in 3-element array of block{4-component vector of float gl_Position, float gl_PointSize, unsized array of float gl_ClipDistance})
 
 
 Linked geometry stage:
diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out
index 3b347df53e6ae3ea17f0fea330ee369cf610977d..18a7b3a77a6f0a2de1e59664626979cb8cd34b9e 100644
--- a/Test/baseResults/430.vert.out
+++ b/Test/baseResults/430.vert.out
@@ -1,8 +1,8 @@
 430.vert
 Warning, version 430 is not yet complete; some version-specific features are present, but many are missing.
 ERROR: 0:3: 'v4' : location qualifiers only appy to uniform, buffer, in, or out storage qualifiers 
-ERROR: 0:7: 'location qualifier on input block' : not supported for this version or the enabled extensions 
-ERROR: 0:8: 'location qualifier on output block' : not supported for this version or the enabled extensions 
+ERROR: 0:7: 'location qualifier on in/out block' : not supported for this version or the enabled extensions 
+ERROR: 0:8: 'location qualifier on in/out block' : not supported for this version or the enabled extensions 
 ERROR: 0:21: 'g' : cannot use storage or interpolation qualifiers on structure members 
 ERROR: 0:22: 'h' : cannot use storage or interpolation qualifiers on structure members 
 ERROR: 0:23: 'i' : cannot use invariant qualifier on structure members 
@@ -23,7 +23,7 @@ ERROR: node is still EOpNull!
 0:16      move second child to first child (float)
 0:16        direct index (float)
 0:16          gl_ClipDistance: direct index for structure (17-element array of float)
-0:16            '__anon__0' (out block{gl_ClipDistance,})
+0:16            '__anon__0' (out block{17-element array of float gl_ClipDistance, })
 0:16            Constant:
 0:16              2 (const uint)
 0:16          Constant:
@@ -39,10 +39,10 @@ ERROR: node is still EOpNull!
 0:?   Linker Objects
 0:?     'v4' (layout(location=3 ) 4-component vector of float)
 0:?     'uv4' (layout(location=4 ) uniform 4-component vector of float)
-0:?     'b1' (layout(location=2 ) in block{v})
-0:?     'b2' (layout(location=2 ) out block{v})
-0:?     '__anon__0' (out block{gl_ClipDistance,})
-0:?     'cs' (layout(location=10 ) smooth out 2-element array of structure{m,f})
+0:?     'b1' (layout(location=2 ) in block{layout(location=2 ) 4-component vector of float v})
+0:?     'b2' (layout(location=2 ) out block{layout(location=2 ) 4-component vector of float v})
+0:?     '__anon__0' (out block{17-element array of float gl_ClipDistance, })
+0:?     'cs' (layout(location=10 ) smooth out 2-element array of structure{7-element array of 3X2 matrix of float m, float f})
 0:?     'cf' (layout(location=54 ) smooth out float)
 0:?     'cg' (layout(location=53 ) smooth out float)
 0:?     'alias1' (layout(location=10 ) in 4-component vector of float)
diff --git a/Test/baseResults/430scope.vert.out b/Test/baseResults/430scope.vert.out
index 8c56d416df369973d08416d91a8fd7df95a049a3..65ab45507493731c356b26283f8e73e30226aae1 100644
--- a/Test/baseResults/430scope.vert.out
+++ b/Test/baseResults/430scope.vert.out
@@ -63,7 +63,7 @@ ERROR: node is still EOpNull!
 0:47          3.000000
 0:49      move second child to first child (4-component vector of float)
 0:49        gl_Position: direct index for structure (invariant gl_Position 4-component vector of float)
-0:49          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:49          '__anon__0' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:49          Constant:
 0:49            0 (const uint)
 0:49        Construct vec4 (4-component vector of float)
@@ -107,12 +107,12 @@ ERROR: node is still EOpNull!
 0:60            'x' (int)
 0:68      Sequence
 0:68        Sequence
-0:68          move second child to first child (structure{x})
-0:68            'S' (structure{x})
+0:68          move second child to first child (structure{int x})
+0:68            'S' (structure{int x})
 0:68            Constant:
 0:68              0 (const int)
 0:69        x: direct index for structure (int)
-0:69          'S' (structure{x})
+0:69          'S' (structure{int x})
 0:69          Constant:
 0:69            0 (const int)
 0:73      Constant:
diff --git a/Test/baseResults/aggOps.frag.out b/Test/baseResults/aggOps.frag.out
index 711982cbe15d59ff9d0eb4ff8ba4ac8613f18e8b..57b402f3ae0cff0ad7db87097b8761168a68eacf 100644
--- a/Test/baseResults/aggOps.frag.out
+++ b/Test/baseResults/aggOps.frag.out
@@ -7,10 +7,10 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:23  Function Definition: main( (void)
 0:23    Function Parameters: 
 0:?     Sequence
-0:27      move second child to first child (3-element array of structure{i,f})
-0:27        'a' (3-element array of structure{i,f})
-0:27        Construct structure (3-element array of structure{i,f})
-0:27          Construct structure (structure{i,f})
+0:27      move second child to first child (3-element array of structure{int i, float f})
+0:27        'a' (3-element array of structure{int i, float f})
+0:27        Construct structure (3-element array of structure{int i, float f})
+0:27          Construct structure (structure{int i, float f})
 0:27            Convert float to int (int)
 0:27              direct index (float)
 0:27                'u' (smooth in 4-component vector of float)
@@ -20,7 +20,7 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:27              'u' (smooth in 4-component vector of float)
 0:27              Constant:
 0:27                1 (const int)
-0:27          Construct structure (structure{i,f})
+0:27          Construct structure (structure{int i, float f})
 0:27            Convert float to int (int)
 0:27              direct index (float)
 0:27                'u' (smooth in 4-component vector of float)
@@ -33,13 +33,13 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:27          Constant:
 0:27            14 (const int)
 0:27            14.000000
-0:28      move second child to first child (3-element array of structure{i,f})
-0:28        'b' (3-element array of structure{i,f})
-0:28        Construct structure (3-element array of structure{i,f})
+0:28      move second child to first child (3-element array of structure{int i, float f})
+0:28        'b' (3-element array of structure{int i, float f})
+0:28        Construct structure (3-element array of structure{int i, float f})
 0:28          Constant:
 0:28            17 (const int)
 0:28            17.000000
-0:28          Construct structure (structure{i,f})
+0:28          Construct structure (structure{int i, float f})
 0:28            Convert float to int (int)
 0:28              direct index (float)
 0:28                'w' (smooth in 4-component vector of float)
@@ -49,7 +49,7 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:28              'w' (smooth in 4-component vector of float)
 0:28              Constant:
 0:28                1 (const int)
-0:28          Construct structure (structure{i,f})
+0:28          Construct structure (structure{int i, float f})
 0:28            Convert float to int (int)
 0:28              direct index (float)
 0:28                'w' (smooth in 4-component vector of float)
@@ -62,8 +62,8 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:30      Test condition and select (void)
 0:30        Condition
 0:30        Compare Equal (bool)
-0:30          'foo2a' (uniform structure{i,f,s1_1})
-0:30          'foo2b' (uniform structure{i,f,s1_1})
+0:30          'foo2a' (uniform structure{int i, float f, structure{int i, float f} s1_1})
+0:30          'foo2b' (uniform structure{int i, float f, structure{int i, float f} s1_1})
 0:30        true case
 0:31        move second child to first child (4-component vector of float)
 0:31          'v' (4-component vector of float)
@@ -118,8 +118,8 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:44      Test condition and select (void)
 0:44        Condition
 0:44        Compare Equal (bool)
-0:44          'a' (3-element array of structure{i,f})
-0:44          'b' (3-element array of structure{i,f})
+0:44          'a' (3-element array of structure{int i, float f})
+0:44          'b' (3-element array of structure{int i, float f})
 0:44        true case
 0:45        vector scale second child into first child (4-component vector of float)
 0:45          'v' (4-component vector of float)
@@ -128,8 +128,8 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:47      Test condition and select (void)
 0:47        Condition
 0:47        Compare Not Equal (bool)
-0:47          'a' (3-element array of structure{i,f})
-0:47          'b' (3-element array of structure{i,f})
+0:47          'a' (3-element array of structure{int i, float f})
+0:47          'b' (3-element array of structure{int i, float f})
 0:47        true case
 0:48        vector scale second child into first child (4-component vector of float)
 0:48          'v' (4-component vector of float)
@@ -143,9 +143,9 @@ WARNING: 0:6: varying deprecated in version 130; may be removed in future releas
 0:?     'coord' (smooth in 2-component vector of float)
 0:?     'u' (smooth in 4-component vector of float)
 0:?     'w' (smooth in 4-component vector of float)
-0:?     'foo1' (uniform structure{i,f})
-0:?     'foo2a' (uniform structure{i,f,s1_1})
-0:?     'foo2b' (uniform structure{i,f,s1_1})
+0:?     'foo1' (uniform structure{int i, float f})
+0:?     'foo2a' (uniform structure{int i, float f, structure{int i, float f} s1_1})
+0:?     'foo2b' (uniform structure{int i, float f, structure{int i, float f} s1_1})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/array100.frag.out b/Test/baseResults/array100.frag.out
index 5e12a74f819559f8303742b62a42d4da593d3568..835332a484889a2a3e1ec952042fbc36f3b179e7 100644
--- a/Test/baseResults/array100.frag.out
+++ b/Test/baseResults/array100.frag.out
@@ -127,29 +127,29 @@ ERROR: node is still EOpNull!
 0:40          1.000000
 0:40          1.000000
 0:40          1.000000
-0:53  Function Definition: bar9( (structure{v4,sa})
+0:53  Function Definition: bar9( (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:53    Function Parameters: 
 0:?     Sequence
 0:56      Branch: Return with expression
-0:56        's' (structure{v4,sa})
+0:56        's' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:59  Function Definition: bar10(struct-SB-vf4-struct-SA-vf3-vf2[4]11; (void)
 0:59    Function Parameters: 
-0:59      's' (in structure{v4,sa})
+0:59      's' (in structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:63  Function Definition: bar11( (void)
 0:63    Function Parameters: 
 0:?     Sequence
-0:66      move second child to first child (structure{v4,sa})
-0:66        's1' (structure{v4,sa})
-0:66        's2' (structure{v4,sa})
+0:66      move second child to first child (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:66        's1' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:66        's2' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:67      Function Call: bar10(struct-SB-vf4-struct-SA-vf3-vf2[4]11; (void)
-0:67        's1' (structure{v4,sa})
-0:68      move second child to first child (structure{v4,sa})
-0:68        's2' (structure{v4,sa})
-0:68        Function Call: bar9( (structure{v4,sa})
+0:67        's1' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:68      move second child to first child (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:68        's2' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:68        Function Call: bar9( (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:69      Sequence
-0:69        move second child to first child (structure{v4,sa})
-0:69          'initSb' (structure{v4,sa})
-0:69          's1' (structure{v4,sa})
+0:69        move second child to first child (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:69          'initSb' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
+0:69          's1' (structure{mediump 4-component vector of float v4, structure{mediump 3-component vector of float v3, 4-element array of mediump 2-component vector of float v2} sa})
 0:?   Linker Objects
 0:?     'gu' (unsized array of mediump float)
 0:?     'g4' (4-element array of mediump float)
diff --git a/Test/baseResults/constErrors.frag.out b/Test/baseResults/constErrors.frag.out
index 21e394a06bf688e83f35de9e7ed7aae30d377864..d62d4aad84f802fefe3183309b89baff8efa636d 100644
--- a/Test/baseResults/constErrors.frag.out
+++ b/Test/baseResults/constErrors.frag.out
@@ -7,8 +7,8 @@ ERROR: 0:18: '' : constant expression required
 ERROR: 0:18: '' : array size must be a constant integer expression 
 ERROR: 0:19: '' : constant expression required 
 ERROR: 0:19: '' : array size must be a constant integer expression 
-ERROR: 0:27: '=' : global const initializers must be constant 'const structure{v3,iv2}'
-ERROR: 0:33: '=' : global const initializers must be constant 'const structure{v3,iv2,m}'
+ERROR: 0:27: '=' : global const initializers must be constant 'const structure{3-component vector of float v3, 2-component vector of int iv2}'
+ERROR: 0:33: '=' : global const initializers must be constant 'const structure{3-component vector of float v3, 2-component vector of int iv2, 2X4 matrix of float m}'
 ERROR: 9 compilation errors.  No code generated.
 
 
@@ -26,8 +26,8 @@ ERROR: node is still EOpNull!
 0:?     'constInt' (const int)
 0:?       3 (const int)
 0:?     'uniformInt' (uniform int)
-0:?     's' (structure{v3,iv2})
-0:?     's2' (structure{v3,iv2,m})
+0:?     's' (structure{3-component vector of float v3, 2-component vector of int iv2})
+0:?     's2' (structure{3-component vector of float v3, 2-component vector of int iv2, 2X4 matrix of float m})
 0:?     'f' (const float)
 0:?       3.000000
 
diff --git a/Test/baseResults/constFold.frag.out b/Test/baseResults/constFold.frag.out
index c2fb5803e343b260adcfcad1a1d5c4adc1d67aea..28306e0b870f177b4911a675a7c9efe13b4741b9 100644
--- a/Test/baseResults/constFold.frag.out
+++ b/Test/baseResults/constFold.frag.out
@@ -262,7 +262,7 @@ ERROR: node is still EOpNull!
 0:?     'out11' (out 4-component vector of float)
 0:?     'out12' (out 2-component vector of int)
 0:?     'out13' (out 3-component vector of uint)
-0:?     's' (const structure{v3,iv2,m})
+0:?     's' (const structure{3-component vector of float v3, 2-component vector of int iv2, 2X4 matrix of float m})
 0:?       3.000000
 0:?       3.000000
 0:?       3.000000
diff --git a/Test/baseResults/cppSimple.vert.out b/Test/baseResults/cppSimple.vert.out
index bcd1e77814f8ec61fb1c92397bb22ce7d65380cb..34495c0a771f19f379313be27aafd00247acf9e9 100644
--- a/Test/baseResults/cppSimple.vert.out
+++ b/Test/baseResults/cppSimple.vert.out
@@ -125,7 +125,7 @@ ERROR: node is still EOpNull!
 0:65          0.050000
 0:69      move second child to first child (4-component vector of float)
 0:69        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:69          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:69          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:69          Constant:
 0:69            0 (const uint)
 0:69        Construct vec4 (4-component vector of float)
@@ -165,7 +165,7 @@ ERROR: node is still EOpNull!
 12:20034    Sequence
 12:20034      move second child to first child (4-component vector of float)
 12:20034        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-12:20034          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+12:20034          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 12:20034          Constant:
 12:20034            0 (const uint)
 12:20034        Constant:
diff --git a/Test/baseResults/deepRvalue.frag.out b/Test/baseResults/deepRvalue.frag.out
index b9f1f909d2f198b70fdcbfc3397fccf5f9d47b59..0bbb5b27a459e7b0c6be5086b827a7c7f7523b5b 100644
--- a/Test/baseResults/deepRvalue.frag.out
+++ b/Test/baseResults/deepRvalue.frag.out
@@ -108,8 +108,8 @@
 0:33        direct index (float)
 0:33          direct index (2-component vector of float)
 0:33            b: direct index for structure (3-element array of 2-component vector of float)
-0:33              move second child to first child (structure{a,b,c})
-0:33                't' (structure{a,b,c})
+0:33              move second child to first child (structure{int a, 3-element array of 2-component vector of float b, bool c})
+0:33                't' (structure{int a, 3-element array of 2-component vector of float b, bool c})
 0:33                Constant:
 0:33                  1 (const int)
 0:33                  2.000000
diff --git a/Test/baseResults/functionSemantics.frag.out b/Test/baseResults/functionSemantics.frag.out
index 45678706de80177bec20d16e01c00a83ab704f63..f164916b9d0195130e1381e161c2a3402027ad51 100644
--- a/Test/baseResults/functionSemantics.frag.out
+++ b/Test/baseResults/functionSemantics.frag.out
@@ -70,7 +70,7 @@
 0:28      move second child to first child (mediump int)
 0:28        direct index (mediump int)
 0:28          t: direct index for structure (mediump 4-component vector of int)
-0:28            'f' (structure{t})
+0:28            'f' (structure{mediump 4-component vector of int t})
 0:28            Constant:
 0:28              0 (const int)
 0:28          Constant:
@@ -93,7 +93,7 @@
 0:30            'e' (mediump int)
 0:30            direct index (mediump int)
 0:30              t: direct index for structure (mediump 4-component vector of int)
-0:30                'f' (structure{t})
+0:30                'f' (structure{mediump 4-component vector of int t})
 0:30                Constant:
 0:30                  0 (const int)
 0:30              Constant:
@@ -107,7 +107,7 @@
 0:32            'e' (mediump int)
 0:32            direct index (mediump int)
 0:32              t: direct index for structure (mediump 4-component vector of int)
-0:32                'f' (structure{t})
+0:32                'f' (structure{mediump 4-component vector of int t})
 0:32                Constant:
 0:32                  0 (const int)
 0:32              Constant:
diff --git a/Test/baseResults/link1.frag.out b/Test/baseResults/link1.frag.out
index 65c7fc6c1b8fb7a65a8859c6093984a89f8ab5c5..693be98762f9ca7777007787b8af665c82ee9109 100644
--- a/Test/baseResults/link1.frag.out
+++ b/Test/baseResults/link1.frag.out
@@ -71,11 +71,11 @@ Warning, version 130 is not yet complete; most features are present, but a few a
 0:?       0.000000
 0:?       0.000000
 0:?       4.000000
-0:?     's' (uniform structure{a,b})
+0:?     's' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
-0:?     'sn' (uniform structure{a,b})
-0:?     'se' (uniform structure{a,b})
+0:?     'sn' (uniform structure{int a, float b})
+0:?     'se' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
 
@@ -139,13 +139,13 @@ Warning, version 130 is not yet complete; most features are present, but a few a
 0:?       0.000000
 0:?       0.000000
 0:?       3.000000
-0:?     's' (uniform structure{a,b})
+0:?     's' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
-0:?     'sn' (uniform structure{a,b})
+0:?     'sn' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
-0:?     'se' (uniform structure{a,b})
+0:?     'se' (uniform structure{int a, float b})
 0:?       81 (const int)
 0:?       3.900000
 
@@ -271,13 +271,13 @@ ERROR: Linking fragment stage: Precision qualifiers must match:
 0:?       0.000000
 0:?       0.000000
 0:?       4.000000
-0:?     's' (uniform structure{a,b})
+0:?     's' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
-0:?     'sn' (uniform structure{a,b})
+0:?     'sn' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
-0:?     'se' (uniform structure{a,b})
+0:?     'se' (uniform structure{int a, float b})
 0:?       82 (const int)
 0:?       3.900000
 0:?     'd' (4-component vector of float)
diff --git a/Test/baseResults/localAggregates.frag.out b/Test/baseResults/localAggregates.frag.out
index 95e46f6593fa1cb413895ac12118d1f38d0884e0..95f72bb0320375471d7e30ad94fe0b2c2f0a3459 100644
--- a/Test/baseResults/localAggregates.frag.out
+++ b/Test/baseResults/localAggregates.frag.out
@@ -7,18 +7,18 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:34  Function Definition: main( (void)
 0:34    Function Parameters: 
 0:?     Sequence
-0:41      move second child to first child (structure{i,f,s1_1,bleh})
-0:41        'locals2' (structure{i,f,s1_1,bleh})
-0:41        s2_1: direct index for structure (structure{i,f,s1_1,bleh})
-0:41          'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:41      move second child to first child (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:41        'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:41        s2_1: direct index for structure (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:41          'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:41          Constant:
 0:41            0 (const int)
 0:43      Test condition and select (void)
 0:43        Condition
 0:43        Compare Greater Than (bool)
 0:43          i: direct index for structure (int)
-0:43            s2_1: direct index for structure (structure{i,f,s1_1,bleh})
-0:43              'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:43            s2_1: direct index for structure (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:43              'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:43              Constant:
 0:43                0 (const int)
 0:43            Constant:
@@ -29,8 +29,8 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:44        Sequence
 0:44          move second child to first child (float)
 0:44            f: direct index for structure (float)
-0:44              s1_1: direct index for structure (structure{i,f})
-0:44                'locals2' (structure{i,f,s1_1,bleh})
+0:44              s1_1: direct index for structure (structure{int i, float f})
+0:44                'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:44                Constant:
 0:44                  2 (const int)
 0:44              Constant:
@@ -52,8 +52,8 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:46              Constant:
 0:46                2 (const int)
 0:46            i: direct index for structure (int)
-0:46              s2_1: direct index for structure (structure{i,f,s1_1,bleh})
-0:46                'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:46              s2_1: direct index for structure (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:46                'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:46                Constant:
 0:46                  0 (const int)
 0:46              Constant:
@@ -62,8 +62,8 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:48        Sequence
 0:48          move second child to first child (float)
 0:48            f: direct index for structure (float)
-0:48              s1_1: direct index for structure (structure{i,f})
-0:48                'locals2' (structure{i,f,s1_1,bleh})
+0:48              s1_1: direct index for structure (structure{int i, float f})
+0:48                'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:48                Constant:
 0:48                  2 (const int)
 0:48              Constant:
@@ -148,14 +148,14 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:66          'localArray' (16-element array of float)
 0:68      move second child to first child (4-component vector of float)
 0:68        bleh: direct index for structure (4-component vector of float)
-0:68          'locals2' (structure{i,f,s1_1,bleh})
+0:68          'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:68          Constant:
 0:68            3 (const int)
 0:68        'color' (smooth in 4-component vector of float)
 0:69      move second child to first child (float)
 0:69        direct index (float)
 0:69          bleh: direct index for structure (4-component vector of float)
-0:69            'locals2' (structure{i,f,s1_1,bleh})
+0:69            'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:69            Constant:
 0:69              3 (const int)
 0:69          Constant:
@@ -169,7 +169,7 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:71        component-wise multiply (4-component vector of float)
 0:71          vector-scale (4-component vector of float)
 0:71            bleh: direct index for structure (4-component vector of float)
-0:71              'locals2' (structure{i,f,s1_1,bleh})
+0:71              'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:71              Constant:
 0:71                3 (const int)
 0:71            add (float)
@@ -180,8 +180,8 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:71                    Constant:
 0:71                      4 (const int)
 0:71                  f: direct index for structure (float)
-0:71                    s1_1: direct index for structure (structure{i,f})
-0:71                      'locals2' (structure{i,f,s1_1,bleh})
+0:71                    s1_1: direct index for structure (structure{int i, float f})
+0:71                      'locals2' (structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
 0:71                      Constant:
 0:71                        2 (const int)
 0:71                    Constant:
@@ -199,9 +199,9 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future releas
 0:?     'sampler' (uniform sampler2D)
 0:?     'coord' (smooth in 2-component vector of float)
 0:?     'color' (smooth in 4-component vector of float)
-0:?     'foo' (uniform structure{i,f})
-0:?     'foo2' (uniform structure{i,f,s1_1,bleh})
-0:?     'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:?     'foo' (uniform structure{int i, float f})
+0:?     'foo2' (uniform structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh})
+0:?     'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1, 4-component vector of float bleh} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:?     'uFloatArray' (uniform 16-element array of float)
 0:?     'condition' (uniform int)
 
diff --git a/Test/baseResults/prepost.frag.out b/Test/baseResults/prepost.frag.out
index 78fc83b7b1ea7bfc8bdd8e2dcf257bb2943a67de..daaacfb4b63bcb971e6bf486ee1d690eb0942835 100644
--- a/Test/baseResults/prepost.frag.out
+++ b/Test/baseResults/prepost.frag.out
@@ -13,7 +13,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:12      move second child to first child (float)
 0:12        direct index (float)
 0:12          y: direct index for structure (5-element array of float)
-0:12            'str' (structure{y})
+0:12            'str' (structure{5-element array of float y})
 0:12            Constant:
 0:12              0 (const int)
 0:12          Constant:
@@ -25,7 +25,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:13        Pre-Increment (float)
 0:13          indirect index (float)
 0:13            y: direct index for structure (5-element array of float)
-0:13              'str' (structure{y})
+0:13              'str' (structure{5-element array of float y})
 0:13              Constant:
 0:13                0 (const int)
 0:13            Pre-Decrement (int)
@@ -33,7 +33,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:14      add second child into first child (float)
 0:14        direct index (float)
 0:14          y: direct index for structure (5-element array of float)
-0:14            'str' (structure{y})
+0:14            'str' (structure{5-element array of float y})
 0:14            Constant:
 0:14              0 (const int)
 0:14          Constant:
@@ -44,7 +44,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:15        Post-Decrement (float)
 0:15          direct index (float)
 0:15            y: direct index for structure (5-element array of float)
-0:15              'str' (structure{y})
+0:15              'str' (structure{5-element array of float y})
 0:15              Constant:
 0:15                0 (const int)
 0:15            Constant:
@@ -52,7 +52,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:16      add second child into first child (float)
 0:16        indirect index (float)
 0:16          y: direct index for structure (5-element array of float)
-0:16            'str' (structure{y})
+0:16            'str' (structure{5-element array of float y})
 0:16            Constant:
 0:16              0 (const int)
 0:16          Post-Increment (int)
@@ -61,7 +61,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:17      Pre-Decrement (float)
 0:17        indirect index (float)
 0:17          y: direct index for structure (5-element array of float)
-0:17            'str' (structure{y})
+0:17            'str' (structure{5-element array of float y})
 0:17            Constant:
 0:17              0 (const int)
 0:17          Pre-Decrement (int)
@@ -71,7 +71,7 @@ Warning, version 140 is not yet complete; most features are present, but a few a
 0:19          'x' (float)
 0:19          direct index (float)
 0:19            y: direct index for structure (5-element array of float)
-0:19              'str' (structure{y})
+0:19              'str' (structure{5-element array of float y})
 0:19              Constant:
 0:19                0 (const int)
 0:19            Constant:
diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out
index 95be7c9581d37a9f6b16a5dc3d2e965c88abf5c2..b1a03e2d88538b4d8d70c261b4342cf82c0a06db 100644
--- a/Test/baseResults/specExamples.frag.out
+++ b/Test/baseResults/specExamples.frag.out
@@ -200,8 +200,8 @@ ERROR: node is still EOpNull!
 0:178      Constant:
 0:178        0.000000
 0:193      Sequence
-0:193        move second child to first child (structure{a,b})
-0:193          'e' (structure{a,b})
+0:193        move second child to first child (structure{float a, int b})
+0:193          'e' (structure{float a, int b})
 0:193          Constant:
 0:193            1.200000
 0:193            2 (const int)
@@ -270,10 +270,10 @@ ERROR: node is still EOpNull!
 0:?     'm' (3X2 matrix of float)
 0:?     'highPrecisionMVP' (4X4 matrix of double)
 0:?     'dm' (2X4 matrix of double)
-0:?     'lightVar' (structure{intensity,position})
+0:?     'lightVar' (structure{float intensity, 3-component vector of float position})
 0:?     'frequencies' (3-element array of float)
 0:?     'lightPosition' (uniform 4-element array of 4-component vector of float)
-0:?     'lights' (2-element array of structure{intensity,position})
+0:?     'lights' (2-element array of structure{float intensity, 3-component vector of float position})
 0:?     'numLights' (const int)
 0:?       2 (const int)
 0:?     'normal' (smooth in 3-component vector of float)
@@ -286,17 +286,17 @@ ERROR: node is still EOpNull!
 0:?       0.700000
 0:?       0.700000
 0:?       0.200000
-0:?     '__anon__0' (in block{Color1,Color2,TexCoordA,Atten})
-0:?     '__anon__1' (in block{LightPos,LightColor})
-0:?     'Materiala' (in block{Color,TexCoord})
+0:?     '__anon__0' (in block{smooth in 4-component vector of float Color1, smooth 4-component vector of float Color2, 2-component vector of float TexCoordA, uniform float Atten})
+0:?     '__anon__1' (in block{4-component vector of float LightPos, 3-component vector of float LightColor})
+0:?     'Materiala' (in block{4-component vector of float Color, 2-component vector of float TexCoord})
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)
 0:?     'factor' (layout(location=3 ) out 4-component vector of float)
 0:?     'colors' (layout(location=2 ) out 3-element array of 4-component vector of float)
 0:?     'gl_FragDepth' (gl_FragDepth float)
 0:?     'gl_FragDepth' (gl_FragDepth float)
-0:?     '__anon__2' (in block{gl_FogFragCoord,gl_TexCoord,gl_Color,gl_SecondaryColor})
-0:?     '__anon__2' (in block{gl_FogFragCoord,gl_TexCoord,gl_Color,gl_SecondaryColor})
+0:?     '__anon__2' (in block{in float gl_FogFragCoord, in unsized array of 4-component vector of float gl_TexCoord, flat in 4-component vector of float gl_Color, in 4-component vector of float gl_SecondaryColor})
+0:?     '__anon__2' (in block{in float gl_FogFragCoord, in unsized array of 4-component vector of float gl_TexCoord, flat in 4-component vector of float gl_Color, in 4-component vector of float gl_SecondaryColor})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/specExamples.vert.out b/Test/baseResults/specExamples.vert.out
index f7aa45cc08b9717cec043f4858e959918fecf124..2a4fefbb3d527b96917fd38cabb663c5cec03342 100644
--- a/Test/baseResults/specExamples.vert.out
+++ b/Test/baseResults/specExamples.vert.out
@@ -227,8 +227,8 @@ ERROR: node is still EOpNull!
 0:170        'img2' (coherent uniform image2D)
 0:?       Sequence
 0:178        Sequence
-0:178          move second child to first child (structure{intensity,position})
-0:178            'lightVar' (structure{intensity,position})
+0:178          move second child to first child (structure{float intensity, 3-component vector of float position})
+0:178            'lightVar' (structure{float intensity, 3-component vector of float position})
 0:178            Constant:
 0:178              3.000000
 0:178              1.000000
@@ -278,27 +278,27 @@ ERROR: node is still EOpNull!
 0:194        Constant:
 0:194          0.000000
 0:?   Linker Objects
-0:?     'Coords' (out block{Position,Texture})
-0:?     '__anon__0' (out block{Color})
-0:?     'transforms' (layout(column_major shared ) uniform 4-element array of block{ModelViewMatrix,ModelViewProjectionMatrix,a,Deformation})
+0:?     'Coords' (out block{4-component vector of float Position, 2-component vector of float Texture})
+0:?     '__anon__0' (out block{4-component vector of float Color})
+0:?     'transforms' (layout(column_major shared ) uniform 4-element array of block{layout(column_major shared ) 4X4 matrix of float ModelViewMatrix, layout(column_major shared ) 4X4 matrix of float ModelViewProjectionMatrix, layout(column_major shared ) unsized array of 4-component vector of float a, layout(column_major shared ) float Deformation})
 0:?     'normal' (layout(location=3 ) in 4-component vector of float)
 0:?     'colors' (layout(location=6 ) in 3-element array of 4-component vector of float)
-0:?     's' (layout(location=3 ) structure{a1,b,c})
+0:?     's' (layout(location=3 ) structure{3-component vector of float a1, 2X2 matrix of float b, 2-element array of 4-component vector of float c})
 0:?     'var1' (smooth out 4-component vector of float)
-0:?     '__anon__1' (out block{var2,var3,var4})
+0:?     '__anon__1' (out block{4-component vector of float var2, 2-component vector of float var3, 3-component vector of float var4})
 0:?     'var5' (smooth out 4-component vector of float)
-0:?     '__anon__2' (out block{var6})
+0:?     '__anon__2' (out block{4-component vector of float var6})
 0:?     'var7' (smooth out 4-component vector of float)
-0:?     '__anon__3' (layout(row_major std140 ) uniform block{M1,M2,N1})
-0:?     '__anon__4' (layout(column_major shared ) uniform block{M13,m14,N12})
+0:?     '__anon__3' (layout(row_major std140 ) uniform block{layout(row_major std140 ) 4X4 matrix of float M1, layout(column_major std140 ) 4X4 matrix of float M2, layout(row_major std140 ) 3X3 matrix of float N1})
+0:?     '__anon__4' (layout(column_major shared ) uniform block{layout(column_major shared ) 4X4 matrix of float M13, layout(row_major shared ) 4X4 matrix of float m14, layout(column_major shared ) 3X3 matrix of float N12})
 0:?     's17' (layout(binding=3 ) uniform sampler2D)
 0:?     'a2' (layout(binding=2 ) uniform int)
 0:?     'bar' (layout(binding=2 ) uniform int)
 0:?     'b2' (layout(binding=2 ) uniform int)
 0:?     'c2' (layout(binding=3 ) uniform int)
 0:?     'd2' (layout(binding=2 ) uniform int)
-0:?     '__anon__5' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
-0:?     '__anon__5' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:?     '__anon__5' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, flat 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
+0:?     '__anon__5' (out block{invariant gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, flat 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:?     'ColorInv' (smooth out 3-component vector of float)
 0:?     'Color4' (invariant centroid smooth out 3-component vector of float)
 0:?     'position' (smooth out 4-component vector of float)
@@ -308,8 +308,8 @@ ERROR: node is still EOpNull!
 0:?     'c' (in 4-component vector of float)
 0:?     'd' (in 4-component vector of float)
 0:?     'v' (smooth out 4-component vector of float)
-0:?     '__anon__6' (layout(row_major shared ) coherent uniform block{member1,member2})
-0:?     '__anon__7' (layout(row_major shared ) uniform block{member1A,member2A})
+0:?     '__anon__6' (layout(row_major shared ) coherent uniform block{layout(row_major shared ) readonly 4-component vector of float member1, layout(row_major shared ) 4-component vector of float member2})
+0:?     '__anon__7' (layout(row_major shared ) uniform block{layout(row_major shared ) coherent readonly 4-component vector of float member1A, layout(row_major shared ) coherent 4-component vector of float member2A})
 0:?     'shv' (shared 4-component vector of float)
 0:?     'img1' (uniform image2D)
 0:?     'img2' (coherent uniform image2D)
diff --git a/Test/baseResults/structAssignment.frag.out b/Test/baseResults/structAssignment.frag.out
index 39d110b4f21dc88b4d3c932252b965c0873f8f42..4cf5d3e20ffb72fdcf4dbc17decfddc3531b6494 100644
--- a/Test/baseResults/structAssignment.frag.out
+++ b/Test/baseResults/structAssignment.frag.out
@@ -10,8 +10,8 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:33        Condition
 0:33        Compare Greater Than (bool)
 0:33          i: direct index for structure (int)
-0:33            s2_1: direct index for structure (structure{i,f,s1_1})
-0:33              'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:33            s2_1: direct index for structure (structure{int i, float f, structure{int i, float f} s1_1})
+0:33              'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:33              Constant:
 0:33                0 (const int)
 0:33            Constant:
@@ -19,22 +19,22 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:33          Constant:
 0:33            0 (const int)
 0:33        true case
-0:34        move second child to first child (structure{i,f,s1_1})
-0:34          'locals2' (structure{i,f,s1_1})
-0:34          s2_1: direct index for structure (structure{i,f,s1_1})
-0:34            'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:34        move second child to first child (structure{int i, float f, structure{int i, float f} s1_1})
+0:34          'locals2' (structure{int i, float f, structure{int i, float f} s1_1})
+0:34          s2_1: direct index for structure (structure{int i, float f, structure{int i, float f} s1_1})
+0:34            'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:34            Constant:
 0:34              0 (const int)
 0:33        false case
-0:36        move second child to first child (structure{i,f,s1_1})
-0:36          'locals2' (structure{i,f,s1_1})
-0:36          'foo2' (uniform structure{i,f,s1_1})
+0:36        move second child to first child (structure{int i, float f, structure{int i, float f} s1_1})
+0:36          'locals2' (structure{int i, float f, structure{int i, float f} s1_1})
+0:36          'foo2' (uniform structure{int i, float f, structure{int i, float f} s1_1})
 0:38      move second child to first child (4-component vector of float)
 0:38        'gl_FragColor' (fragColor 4-component vector of float)
 0:38        vector-scale (4-component vector of float)
 0:38          f: direct index for structure (float)
-0:38            s1_1: direct index for structure (structure{i,f})
-0:38              'locals2' (structure{i,f,s1_1})
+0:38            s1_1: direct index for structure (structure{int i, float f})
+0:38              'locals2' (structure{int i, float f, structure{int i, float f} s1_1})
 0:38              Constant:
 0:38                2 (const int)
 0:38            Constant:
@@ -45,9 +45,9 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:?   Linker Objects
 0:?     'sampler' (uniform sampler2D)
 0:?     'coord' (smooth in 2-component vector of float)
-0:?     'foo' (uniform structure{i,f})
-0:?     'foo2' (uniform structure{i,f,s1_1})
-0:?     'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:?     'foo' (uniform structure{int i, float f})
+0:?     'foo2' (uniform structure{int i, float f, structure{int i, float f} s1_1})
+0:?     'foo3' (uniform structure{structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/structDeref.frag.out b/Test/baseResults/structDeref.frag.out
index 46b0e41455a9059fbaeddc9856a91db914d83640..c646d58b6f5d99d3dbb66e3c0f8bb5b280de0d10 100644
--- a/Test/baseResults/structDeref.frag.out
+++ b/Test/baseResults/structDeref.frag.out
@@ -10,9 +10,9 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:51        Condition
 0:51        Compare Greater Than (bool)
 0:51          i: direct index for structure (int)
-0:51            direct index (structure{i,f,s1_1})
-0:51              s2_1: direct index for structure (12-element array of structure{i,f,s1_1})
-0:51                'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:51            direct index (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
+0:51              s2_1: direct index for structure (12-element array of structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
+0:51                'foo3' (uniform structure{12-element array of structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1} s2_1, int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:51                Constant:
 0:51                  0 (const int)
 0:51              Constant:
@@ -25,14 +25,14 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:52        Sequence
 0:52          move second child to first child (float)
 0:52            f: direct index for structure (float)
-0:52              'locals2' (structure{i,f,s1_1})
+0:52              'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:52              Constant:
 0:52                1 (const int)
 0:52            Constant:
 0:52              1.000000
-0:53          move second child to first child (structure{i,f,s0_1})
-0:53            s1_1: direct index for structure (structure{i,f,s0_1})
-0:53              'locals2' (structure{i,f,s1_1})
+0:53          move second child to first child (structure{int i, float f, structure{int i} s0_1})
+0:53            s1_1: direct index for structure (structure{int i, float f, structure{int i} s0_1})
+0:53              'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:53              Constant:
 0:53                2 (const int)
 0:53            Constant:
@@ -48,44 +48,44 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:54              0.000000
 0:54              0.000000
 0:54              0.000000
-0:55          move second child to first child (structure{i,f,s0_1})
-0:55            direct index (structure{i,f,s0_1})
-0:55              'locals1Array' (10-element array of structure{i,f,s0_1})
+0:55          move second child to first child (structure{int i, float f, structure{int i} s0_1})
+0:55            direct index (structure{int i, float f, structure{int i} s0_1})
+0:55              'locals1Array' (10-element array of structure{int i, float f, structure{int i} s0_1})
 0:55              Constant:
 0:55                6 (const int)
-0:55            'foo1' (uniform structure{i,f,s0_1})
-0:56          move second child to first child (structure{i})
-0:56            'locals0' (structure{i})
+0:55            'foo1' (uniform structure{int i, float f, structure{int i} s0_1})
+0:56          move second child to first child (structure{int i})
+0:56            'locals0' (structure{int i})
 0:56            Constant:
 0:56              0 (const int)
-0:57          move second child to first child (structure{s0_0})
-0:57            'locals00' (structure{s0_0})
+0:57          move second child to first child (structure{structure{int i} s0_0})
+0:57            'locals00' (structure{structure{int i} s0_0})
 0:57            Constant:
 0:57              0 (const int)
 0:51        false case
 0:59        Sequence
 0:59          move second child to first child (float)
 0:59            f: direct index for structure (float)
-0:59              'locals2' (structure{i,f,s1_1})
+0:59              'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:59              Constant:
 0:59                1 (const int)
 0:59            direct index (float)
 0:59              'coord' (smooth in 2-component vector of float)
 0:59              Constant:
 0:59                0 (const int)
-0:60          move second child to first child (structure{i,f,s0_1})
-0:60            s1_1: direct index for structure (structure{i,f,s0_1})
-0:60              'locals2' (structure{i,f,s1_1})
+0:60          move second child to first child (structure{int i, float f, structure{int i} s0_1})
+0:60            s1_1: direct index for structure (structure{int i, float f, structure{int i} s0_1})
+0:60              'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:60              Constant:
 0:60                2 (const int)
-0:60            Construct structure (structure{i,f,s0_1})
+0:60            Construct structure (structure{int i, float f, structure{int i} s0_1})
 0:60              Constant:
 0:60                1 (const int)
 0:60              direct index (float)
 0:60                'coord' (smooth in 2-component vector of float)
 0:60                Constant:
 0:60                  1 (const int)
-0:60              'foo0' (uniform structure{i})
+0:60              'foo0' (uniform structure{int i})
 0:61          move second child to first child (6-element array of float)
 0:61            'fArray' (6-element array of float)
 0:61            Constant:
@@ -95,38 +95,38 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:61              3.000000
 0:61              4.000000
 0:61              5.000000
-0:62          move second child to first child (structure{i,f,s0_1})
-0:62            direct index (structure{i,f,s0_1})
-0:62              'locals1Array' (10-element array of structure{i,f,s0_1})
+0:62          move second child to first child (structure{int i, float f, structure{int i} s0_1})
+0:62            direct index (structure{int i, float f, structure{int i} s0_1})
+0:62              'locals1Array' (10-element array of structure{int i, float f, structure{int i} s0_1})
 0:62              Constant:
 0:62                6 (const int)
-0:62            s1_1: direct index for structure (structure{i,f,s0_1})
-0:62              'locals2' (structure{i,f,s1_1})
+0:62            s1_1: direct index for structure (structure{int i, float f, structure{int i} s0_1})
+0:62              'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:62              Constant:
 0:62                2 (const int)
-0:63          move second child to first child (structure{i})
-0:63            'locals0' (structure{i})
-0:63            s0_1: direct index for structure (structure{i})
-0:63              'foo1' (uniform structure{i,f,s0_1})
+0:63          move second child to first child (structure{int i})
+0:63            'locals0' (structure{int i})
+0:63            s0_1: direct index for structure (structure{int i})
+0:63              'foo1' (uniform structure{int i, float f, structure{int i} s0_1})
 0:63              Constant:
 0:63                2 (const int)
-0:64          move second child to first child (structure{s0_0})
-0:64            'locals00' (structure{s0_0})
-0:64            'foo00' (uniform structure{s0_0})
+0:64          move second child to first child (structure{structure{int i} s0_0})
+0:64            'locals00' (structure{structure{int i} s0_0})
+0:64            'foo00' (uniform structure{structure{int i} s0_0})
 0:67      Test condition and select (void)
 0:67        Condition
 0:67        Compare Greater Than (bool)
 0:67          i: direct index for structure (int)
-0:67            'locals0' (structure{i})
+0:67            'locals0' (structure{int i})
 0:67            Constant:
 0:67              0 (const int)
 0:67          Constant:
 0:67            5 (const int)
 0:67        true case
-0:68        move second child to first child (structure{i})
-0:68          'locals0' (structure{i})
-0:68          s0_0: direct index for structure (structure{i})
-0:68            'locals00' (structure{s0_0})
+0:68        move second child to first child (structure{int i})
+0:68          'locals0' (structure{int i})
+0:68          s0_0: direct index for structure (structure{int i})
+0:68            'locals00' (structure{structure{int i} s0_0})
 0:68            Constant:
 0:68              0 (const int)
 0:70      move second child to first child (4-component vector of float)
@@ -137,12 +137,12 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:70              add (float)
 0:70                Convert int to float (float)
 0:70                  i: direct index for structure (int)
-0:70                    'locals0' (structure{i})
+0:70                    'locals0' (structure{int i})
 0:70                    Constant:
 0:70                      0 (const int)
 0:70                f: direct index for structure (float)
-0:70                  direct index (structure{i,f,s0_1})
-0:70                    'locals1Array' (10-element array of structure{i,f,s0_1})
+0:70                  direct index (structure{int i, float f, structure{int i} s0_1})
+0:70                    'locals1Array' (10-element array of structure{int i, float f, structure{int i} s0_1})
 0:70                    Constant:
 0:70                      6 (const int)
 0:70                  Constant:
@@ -152,8 +152,8 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:70                Constant:
 0:70                  3 (const int)
 0:70            f: direct index for structure (float)
-0:70              s1_1: direct index for structure (structure{i,f,s0_1})
-0:70                'locals2' (structure{i,f,s1_1})
+0:70              s1_1: direct index for structure (structure{int i, float f, structure{int i} s0_1})
+0:70                'locals2' (structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
 0:70                Constant:
 0:70                  2 (const int)
 0:70              Constant:
@@ -164,11 +164,11 @@ WARNING: 0:4: varying deprecated in version 130; may be removed in future releas
 0:?   Linker Objects
 0:?     'sampler' (uniform sampler2D)
 0:?     'coord' (smooth in 2-component vector of float)
-0:?     'foo0' (uniform structure{i})
-0:?     'foo1' (uniform structure{i,f,s0_1})
-0:?     'foo2' (uniform structure{i,f,s1_1})
-0:?     'foo3' (uniform structure{s2_1,i,f,s1_1})
-0:?     'foo00' (uniform structure{s0_0})
+0:?     'foo0' (uniform structure{int i})
+0:?     'foo1' (uniform structure{int i, float f, structure{int i} s0_1})
+0:?     'foo2' (uniform structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
+0:?     'foo3' (uniform structure{12-element array of structure{int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1} s2_1, int i, float f, structure{int i, float f, structure{int i} s0_1} s1_1})
+0:?     'foo00' (uniform structure{structure{int i} s0_0})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/structure.frag.out b/Test/baseResults/structure.frag.out
index 5e1936f7f83d6c96ab48eca6fdc4cca7da564545..735e0e0bbb21c97fe8651b850572f51e637b4004 100644
--- a/Test/baseResults/structure.frag.out
+++ b/Test/baseResults/structure.frag.out
@@ -16,8 +16,8 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:24        Compare Greater Than (bool)
 0:24          direct index (int)
 0:24            i: direct index for structure (5-element array of int)
-0:24              direct index (structure{i,f,s1_1})
-0:24                'foo2' (uniform 5-element array of structure{i,f,s1_1})
+0:24              direct index (structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
+0:24                'foo2' (uniform 5-element array of structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
 0:24                Constant:
 0:24                  3 (const int)
 0:24              Constant:
@@ -32,10 +32,10 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:25          direct index (float)
 0:25            direct index (4-component vector of float)
 0:25              color: direct index for structure (5-element array of 4-component vector of float)
-0:25                direct index (structure{i,f,color})
-0:25                  s1_1: direct index for structure (7-element array of structure{i,f,color})
-0:25                    direct index (structure{i,f,s1_1})
-0:25                      'foo2' (uniform 5-element array of structure{i,f,s1_1})
+0:25                direct index (structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color})
+0:25                  s1_1: direct index for structure (7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color})
+0:25                    direct index (structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
+0:25                      'foo2' (uniform 5-element array of structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
 0:25                      Constant:
 0:25                        3 (const int)
 0:25                    Constant:
@@ -53,10 +53,10 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:27          'scale' (float)
 0:27          direct index (float)
 0:27            f: direct index for structure (4-element array of float)
-0:27              direct index (structure{i,f,color})
-0:27                s1_1: direct index for structure (7-element array of structure{i,f,color})
-0:27                  direct index (structure{i,f,s1_1})
-0:27                    'foo2' (uniform 5-element array of structure{i,f,s1_1})
+0:27              direct index (structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color})
+0:27                s1_1: direct index for structure (7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color})
+0:27                  direct index (structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
+0:27                    'foo2' (uniform 5-element array of structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
 0:27                    Constant:
 0:27                      3 (const int)
 0:27                  Constant:
@@ -77,8 +77,8 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:?   Linker Objects
 0:?     'sampler' (uniform sampler2D)
 0:?     'coord' (smooth in 2-component vector of float)
-0:?     'foo' (uniform structure{i,f,color})
-0:?     'foo2' (uniform 5-element array of structure{i,f,s1_1})
+0:?     'foo' (uniform structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color})
+0:?     'foo2' (uniform 5-element array of structure{5-element array of int i, float f, 7-element array of structure{int i, 4-element array of float f, 5-element array of 4-component vector of float color} s1_1})
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/variableArrayIndex.frag.out b/Test/baseResults/variableArrayIndex.frag.out
index cbe8d05f8416b604f5d09b20d2a865c7a3ea6d9f..565373edb3b02190f6a89ea33bc6332a99469747 100644
--- a/Test/baseResults/variableArrayIndex.frag.out
+++ b/Test/baseResults/variableArrayIndex.frag.out
@@ -14,9 +14,9 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:34        Condition
 0:34        Compare Greater Than (bool)
 0:34          i: direct index for structure (int)
-0:34            direct index (structure{i,f,s1_1})
-0:34              s2_1: direct index for structure (3-element array of structure{i,f,s1_1})
-0:34                'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:34            direct index (structure{int i, float f, structure{int i, float f} s1_1})
+0:34              s2_1: direct index for structure (3-element array of structure{int i, float f, structure{int i, float f} s1_1})
+0:34                'foo3' (uniform structure{3-element array of structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:34                Constant:
 0:34                  0 (const int)
 0:34              Constant:
@@ -29,19 +29,19 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:35        move second child to first child (float)
 0:35          'scale' (float)
 0:35          f: direct index for structure (float)
-0:35            s1_1: direct index for structure (structure{i,f})
-0:35              indirect index (structure{i,f,s1_1})
-0:35                'foo2' (uniform 5-element array of structure{i,f,s1_1})
+0:35            s1_1: direct index for structure (structure{int i, float f})
+0:35              indirect index (structure{int i, float f, structure{int i, float f} s1_1})
+0:35                'foo2' (uniform 5-element array of structure{int i, float f, structure{int i, float f} s1_1})
 0:35                add (int)
 0:35                  add (int)
 0:35                    i: direct index for structure (int)
-0:35                      indirect index (structure{i,f,s1_1})
-0:35                        s2_1: direct index for structure (3-element array of structure{i,f,s1_1})
-0:35                          'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:35                      indirect index (structure{int i, float f, structure{int i, float f} s1_1})
+0:35                        s2_1: direct index for structure (3-element array of structure{int i, float f, structure{int i, float f} s1_1})
+0:35                          'foo3' (uniform structure{3-element array of structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:35                          Constant:
 0:35                            0 (const int)
 0:35                        i: direct index for structure (int)
-0:35                          'foo' (uniform structure{i,f})
+0:35                          'foo' (uniform structure{int i, float f})
 0:35                          Constant:
 0:35                            0 (const int)
 0:35                      Constant:
@@ -58,10 +58,10 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:37        move second child to first child (float)
 0:37          'scale' (float)
 0:37          f: direct index for structure (float)
-0:37            s1_1: direct index for structure (structure{i,f})
-0:37              direct index (structure{i,f,s1_1})
-0:37                s2_1: direct index for structure (3-element array of structure{i,f,s1_1})
-0:37                  'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:37            s1_1: direct index for structure (structure{int i, float f})
+0:37              direct index (structure{int i, float f, structure{int i, float f} s1_1})
+0:37                s2_1: direct index for structure (3-element array of structure{int i, float f, structure{int i, float f} s1_1})
+0:37                  'foo3' (uniform structure{3-element array of structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:37                  Constant:
 0:37                    0 (const int)
 0:37                Constant:
@@ -93,21 +93,21 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future releas
 0:46          indirect index (2-component vector of float)
 0:46            'constructed' (3-element array of 2-component vector of float)
 0:46            i: direct index for structure (int)
-0:46              'foo' (uniform structure{i,f})
+0:46              'foo' (uniform structure{int i, float f})
 0:46              Constant:
 0:46                0 (const int)
 0:46          indirect index (2-component vector of float)
 0:46            'constructed' (3-element array of 2-component vector of float)
 0:46            i: direct index for structure (int)
-0:46              'foo' (uniform structure{i,f})
+0:46              'foo' (uniform structure{int i, float f})
 0:46              Constant:
 0:46                0 (const int)
 0:?   Linker Objects
 0:?     'sampler' (uniform sampler2D)
 0:?     'coord' (smooth in 2-component vector of float)
-0:?     'foo' (uniform structure{i,f})
-0:?     'foo2' (uniform 5-element array of structure{i,f,s1_1})
-0:?     'foo3' (uniform structure{s2_1,i,f,s1_1})
+0:?     'foo' (uniform structure{int i, float f})
+0:?     'foo2' (uniform 5-element array of structure{int i, float f, structure{int i, float f} s1_1})
+0:?     'foo3' (uniform structure{3-element array of structure{int i, float f, structure{int i, float f} s1_1} s2_1, int i, float f, structure{int i, float f} s1_1})
 0:?     'Count' (uniform int)
 
 
diff --git a/Test/baseResults/versionsClean.vert.out b/Test/baseResults/versionsClean.vert.out
index b996b2d6e27fbce2bec9e5dfc4bb1e327c4d74c2..bd1e8a0ff5d434f7c6a66b22cf7042ac633d0c5e 100644
--- a/Test/baseResults/versionsClean.vert.out
+++ b/Test/baseResults/versionsClean.vert.out
@@ -7,7 +7,7 @@ Warning, version 420 is not yet complete; some version-specific features are pre
 0:42    Sequence
 0:42      move second child to first child (4-component vector of float)
 0:42        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:42          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:42          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:42          Constant:
 0:42            0 (const uint)
 0:42        Construct vec4 (4-component vector of float)
diff --git a/Test/baseResults/versionsErrors.vert.out b/Test/baseResults/versionsErrors.vert.out
index f3f51f5d184f632a0607a042529f3edd632f8607..d57570118447d6fbb3284c85ad6eeb4d98f1bcf3 100644
--- a/Test/baseResults/versionsErrors.vert.out
+++ b/Test/baseResults/versionsErrors.vert.out
@@ -12,7 +12,7 @@ ERROR: node is still EOpNull!
 0:44    Sequence
 0:44      move second child to first child (4-component vector of float)
 0:44        gl_Position: direct index for structure (gl_Position 4-component vector of float)
-0:44          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:44          '__anon__1' (out block{gl_Position 4-component vector of float gl_Position, gl_PointSize float gl_PointSize, unsized array of float gl_ClipDistance, gl_ClipVertex 4-component vector of float gl_ClipVertex, 4-component vector of float gl_FrontColor, 4-component vector of float gl_BackColor, 4-component vector of float gl_FrontSecondaryColor, 4-component vector of float gl_BackSecondaryColor, unsized array of 4-component vector of float gl_TexCoord, float gl_FogFragCoord})
 0:44          Constant:
 0:44            0 (const uint)
 0:44        Construct vec4 (4-component vector of float)
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 83e5105b8526f9503ca26c8f95b69eaf3a68eb05..67ebfd58d145eb5bb71335ea59e9f167ece94ae3 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -353,7 +353,7 @@ public:
     {
         layoutMatrix = ElmNone;
         layoutPacking = ElpNone;
-        layoutSlotLocation = layoutLocationEnd;
+        layoutLocation = layoutLocationEnd;
         layoutBinding = layoutBindingEnd;
         layoutStream = layoutStreamEnd;
     }
@@ -367,7 +367,7 @@ public:
     }
     TLayoutMatrix  layoutMatrix       : 3;
     TLayoutPacking layoutPacking      : 4;
-    unsigned int   layoutSlotLocation : 7;  // ins/outs should have small numbers, buffer offsets could be large
+    unsigned int   layoutLocation : 7;  // ins/outs should have small numbers, buffer offsets could be large
     static const unsigned int layoutLocationEnd = 0x3F;
     unsigned int layoutBinding        : 8;
     static const unsigned int layoutBindingEnd = 0xFF;
@@ -375,7 +375,7 @@ public:
     static const unsigned int layoutStreamEnd = 0xFF;
     bool hasLocation() const
     {
-        return layoutSlotLocation != layoutLocationEnd;
+        return layoutLocation != layoutLocationEnd;
     }
     bool hasBinding() const
     {
@@ -825,7 +825,7 @@ public:
         if (qualifier.hasLayout()) {
             p += snprintf(p, end - p, "layout(");
             if (qualifier.hasLocation())
-                p += snprintf(p, end - p, "location=%d ", qualifier.layoutSlotLocation);
+                p += snprintf(p, end - p, "location=%d ", qualifier.layoutLocation);
             if (qualifier.hasBinding())
                 p += snprintf(p, end - p, "binding=%d ", qualifier.layoutBinding);
             if (qualifier.hasStream())
@@ -887,9 +887,11 @@ public:
             s.append("{");
             for (size_t i = 0; i < structure->size(); ++i) {
                 if ((*structure)[i].type->getBasicType() != EbtVoid) {
+                    s.append((*structure)[i].type->getCompleteString());
+                    s.append(" ");
                     s.append((*structure)[i].type->getFieldName());
                     if (i < structure->size() - 1)
-                        s.append(",");
+                        s.append(", ");
                 }
             }
             s.append("}");
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 6b8a7cda75add1ea1ee8d8003a60188b65892e5b..6b0570a29400522ea21f86009161813ecb5ff87e 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -343,17 +343,29 @@ public:
     virtual glslang::TSourceLoc getLoc() const { return loc; }
     virtual void setLoc(glslang::TSourceLoc l) { loc = l; }
     virtual void traverse(glslang::TIntermTraverser*) = 0;
-    virtual glslang::TIntermTyped*         getAsTyped()         { return 0; }
-    virtual glslang::TIntermOperator*      getAsOperator()      { return 0; }
-    virtual glslang::TIntermConstantUnion* getAsConstantUnion() { return 0; }
-    virtual glslang::TIntermAggregate*     getAsAggregate()     { return 0; }
-    virtual glslang::TIntermUnary*         getAsUnaryNode()     { return 0; }
-    virtual glslang::TIntermBinary*        getAsBinaryNode()    { return 0; }
-    virtual glslang::TIntermSelection*     getAsSelectionNode() { return 0; }
-    virtual glslang::TIntermSwitch*        getAsSwitchNode()    { return 0; }
-    virtual glslang::TIntermMethod*        getAsMethodNode()    { return 0; }
-    virtual glslang::TIntermSymbol*        getAsSymbolNode()    { return 0; }
-    virtual glslang::TIntermBranch*        getAsBranchNode()    { return 0; }
+    virtual       glslang::TIntermTyped*         getAsTyped()               { return 0; }
+    virtual       glslang::TIntermOperator*      getAsOperator()            { return 0; }
+    virtual       glslang::TIntermConstantUnion* getAsConstantUnion()       { return 0; }
+    virtual       glslang::TIntermAggregate*     getAsAggregate()           { return 0; }
+    virtual       glslang::TIntermUnary*         getAsUnaryNode()           { return 0; }
+    virtual       glslang::TIntermBinary*        getAsBinaryNode()          { return 0; }
+    virtual       glslang::TIntermSelection*     getAsSelectionNode()       { return 0; }
+    virtual       glslang::TIntermSwitch*        getAsSwitchNode()          { return 0; }
+    virtual       glslang::TIntermMethod*        getAsMethodNode()          { return 0; }
+    virtual       glslang::TIntermSymbol*        getAsSymbolNode()          { return 0; }
+    virtual       glslang::TIntermBranch*        getAsBranchNode()          { return 0; }
+
+    virtual const glslang::TIntermTyped*         getAsTyped()         const { return 0; }
+    virtual const glslang::TIntermOperator*      getAsOperator()      const { return 0; }
+    virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return 0; }
+    virtual const glslang::TIntermAggregate*     getAsAggregate()     const { return 0; }
+    virtual const glslang::TIntermUnary*         getAsUnaryNode()     const { return 0; }
+    virtual const glslang::TIntermBinary*        getAsBinaryNode()    const { return 0; }
+    virtual const glslang::TIntermSelection*     getAsSelectionNode() const { return 0; }
+    virtual const glslang::TIntermSwitch*        getAsSwitchNode()    const { return 0; }
+    virtual const glslang::TIntermMethod*        getAsMethodNode()    const { return 0; }
+    virtual const glslang::TIntermSymbol*        getAsSymbolNode()    const { return 0; }
+    virtual const glslang::TIntermBranch*        getAsBranchNode()    const { return 0; }
     virtual ~TIntermNode() { }
 protected:
     glslang::TSourceLoc loc;
@@ -375,7 +387,8 @@ struct TIntermNodePair {
 class TIntermTyped : public TIntermNode {
 public:
 	TIntermTyped(const TType& t) { type.shallowCopy(t); }
-    virtual TIntermTyped* getAsTyped()         { return this; }
+    virtual       TIntermTyped* getAsTyped()       { return this; }
+    virtual const TIntermTyped* getAsTyped() const { return this; }
     virtual void setType(const TType& t) { type.shallowCopy(t); }
     virtual const TType& getType() const { return type; }
     virtual TType& getWritableType() { return type; }
@@ -428,7 +441,8 @@ public:
     TIntermBranch(TOperator op, TIntermTyped* e) :
         flowOp(op),
         expression(e) { }
-    virtual TIntermBranch* getAsBranchNode() { return this; }
+    virtual       TIntermBranch* getAsBranchNode()       { return this; }
+    virtual const TIntermBranch* getAsBranchNode() const { return this; }
     virtual void traverse(TIntermTraverser*);
     TOperator getFlowOp() { return flowOp; }
     TIntermTyped* getExpression() { return expression; }
@@ -445,7 +459,8 @@ protected:
 class TIntermMethod : public TIntermTyped {
 public:
     TIntermMethod(TIntermTyped* o, const TType& t, const TString& m) : TIntermTyped(t), object(o), method(m) { }
-    virtual TIntermMethod* getAsMethodNode() { return this; }
+    virtual       TIntermMethod* getAsMethodNode()       { return this; }
+    virtual const TIntermMethod* getAsMethodNode() const { return this; }
     virtual const TString& getMethodName() const { return method; }
     virtual TIntermTyped* getObject() const { return object; }
     virtual void traverse(TIntermTraverser*);
@@ -467,7 +482,8 @@ public:
     virtual int getId() const { return id; }
     virtual const TString& getName() const { return name; }
     virtual void traverse(TIntermTraverser*);
-    virtual TIntermSymbol* getAsSymbolNode() { return this; }
+    virtual       TIntermSymbol* getAsSymbolNode()       { return this; }
+    virtual const TIntermSymbol* getAsSymbolNode() const { return this; }
     void setConstArray(const TConstUnionArray& c) { unionArray = c; }
     const TConstUnionArray& getConstArray() const { return unionArray; }
 protected:
@@ -480,10 +496,11 @@ class TIntermConstantUnion : public TIntermTyped {
 public:
     TIntermConstantUnion(const TConstUnionArray& ua, const TType& t) : TIntermTyped(t), unionArray(ua) { }
     const TConstUnionArray& getConstArray() const { return unionArray; }
-    virtual TIntermConstantUnion* getAsConstantUnion()  { return this; }
+    virtual       TIntermConstantUnion* getAsConstantUnion()       { return this; }
+    virtual const TIntermConstantUnion* getAsConstantUnion() const { return this; }
     virtual void traverse(TIntermTraverser*);
-    virtual TIntermTyped* fold(TOperator, TIntermTyped*);
-    virtual TIntermTyped* fold(TOperator, const TType&);
+    virtual TIntermTyped* fold(TOperator, const TIntermTyped*) const;
+    virtual TIntermTyped* fold(TOperator, const TType&) const;
 protected:
     const TConstUnionArray unionArray;
 };
@@ -493,7 +510,8 @@ protected:
 //
 class TIntermOperator : public TIntermTyped {
 public:
-    TIntermOperator* getAsOperator() { return this; }
+    virtual       TIntermOperator* getAsOperator()       { return this; }
+    virtual const TIntermOperator* getAsOperator() const { return this; }
     TOperator getOp() { return op; }
     bool modifiesState() const;
     bool isConstructor() const;
@@ -515,7 +533,8 @@ public:
     virtual void setRight(TIntermTyped* n) { right = n; }
     virtual TIntermTyped* getLeft() const { return left; }
     virtual TIntermTyped* getRight() const { return right; }
-    virtual TIntermBinary* getAsBinaryNode() { return this; }
+    virtual       TIntermBinary* getAsBinaryNode()       { return this; }
+    virtual const TIntermBinary* getAsBinaryNode() const { return this; }
     virtual bool promote();
     virtual void updatePrecision();
 protected:
@@ -533,7 +552,8 @@ public:
     virtual void traverse(TIntermTraverser*);
     virtual void setOperand(TIntermTyped* o) { operand = o; }
     virtual TIntermTyped* getOperand() { return operand; }
-    virtual TIntermUnary* getAsUnaryNode() { return this; }
+    virtual       TIntermUnary* getAsUnaryNode()       { return this; }
+    virtual const TIntermUnary* getAsUnaryNode() const { return this; }
     virtual bool promote();
     virtual void updatePrecision();
 protected:
@@ -550,7 +570,8 @@ public:
     TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
     TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
 	~TIntermAggregate() { delete pragmaTable; }
-    virtual TIntermAggregate* getAsAggregate() { return this; }
+    virtual       TIntermAggregate* getAsAggregate()       { return this; }
+    virtual const TIntermAggregate* getAsAggregate() const { return this; }
     virtual void setOperator(TOperator o) { op = o; }
     virtual TIntermSequence& getSequence() { return sequence; }
     virtual const TIntermSequence& getSequence() const { return sequence; }
@@ -592,7 +613,8 @@ public:
     virtual TIntermTyped* getCondition() const { return condition; }
     virtual TIntermNode* getTrueBlock() const { return trueBlock; }
     virtual TIntermNode* getFalseBlock() const { return falseBlock; }
-    virtual TIntermSelection* getAsSelectionNode() { return this; }
+    virtual       TIntermSelection* getAsSelectionNode()       { return this; }
+    virtual const TIntermSelection* getAsSelectionNode() const { return this; }
 protected:
     TIntermTyped* condition;
     TIntermNode* trueBlock;
@@ -611,7 +633,8 @@ public:
     virtual void traverse(TIntermTraverser*);
     virtual TIntermNode* getCondition() const { return condition; }
     virtual TIntermAggregate* getBody() const { return body; }
-    virtual TIntermSwitch* getAsSwitchNode() { return this; }
+    virtual       TIntermSwitch* getAsSwitchNode()       { return this; }
+    virtual const TIntermSwitch* getAsSwitchNode() const { return this; }
 protected:
     TIntermTyped* condition;
     TIntermAggregate* body;
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 15a63d39943898aa88a8b8b9b1794803d1e440b5..98e45edf825b9748cfeb4b5bd9b0531634a8d7b9 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -9,5 +9,5 @@
 // source have to figure out how to create revision.h just to get a build
 // going.  However, if it is not updated, it can be a version behind.
 
-#define GLSLANG_REVISION "24628"
-#define GLSLANG_DATE     "2013/12/30 13:44:49"
+#define GLSLANG_REVISION "24635"
+#define GLSLANG_DATE     "2013/12/31 16:02:24"
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index 4d0b685902c209defd6c3277eeebacd80711acbc..7e045b6b1770c874cd1675e54cd841ae257da115 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -83,7 +83,9 @@ namespace glslang {
 //
 // Do folding between a pair of nodes
 //
-TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNode)
+// Returns a new node representing the result.
+//
+TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* constantNode) const 
 {
     // For most cases, the return type matches the argument type, so set that
     // up and just code to exceptions below.
@@ -94,7 +96,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
     // A pair of nodes is to be folded together
     //
 
-    TIntermConstantUnion *node = constantNode->getAsConstantUnion();
+    const TIntermConstantUnion *node = constantNode->getAsConstantUnion();
     TConstUnionArray unionArray = getConstArray();
     TConstUnionArray rightUnionArray = node->getConstArray();
 
@@ -297,7 +299,9 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
 //
 // Do single unary node folding
 //
-TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
+// Returns a new node representing the result.
+//
+TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) const
 {
     // First, size the result, which is mostly the same as the argument's size,
     // but not always, and classify what is componentwise.
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 52d898c09941674e0f416af48d46a4c68909a6e9..560f898ab23aafe7f7c5c03f15a730a088a9d1e6 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1455,7 +1455,7 @@ void TParseContext::constantValueCheck(TIntermTyped* node, const char* token)
 // Both test, and if necessary spit out an error, to see if the node is really
 // an integer.
 //
-void TParseContext::integerCheck(TIntermTyped* node, const char* token)
+void TParseContext::integerCheck(const TIntermTyped* node, const char* token)
 {
     if ((node->getBasicType() == EbtInt || node->getBasicType() == EbtUint) && node->isScalar())
         return;
@@ -2820,7 +2820,7 @@ void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType,
         if ((unsigned int)value >= TQualifier::layoutLocationEnd)
             error(loc, "location is too large", id.c_str(), "");
         else
-            publicType.qualifier.layoutSlotLocation = value;
+            publicType.qualifier.layoutLocation = value;
         return;
     }
     if (id == "binding") {
@@ -2882,12 +2882,11 @@ void TParseContext::mergeObjectLayoutQualifiers(TSourceLoc loc, TQualifier& dst,
 {
     if (src.layoutMatrix != ElmNone)
         dst.layoutMatrix = src.layoutMatrix;
-
     if (src.layoutPacking != ElpNone)
         dst.layoutPacking = src.layoutPacking;
 
     if (src.hasLocation())
-        dst.layoutSlotLocation = src.layoutSlotLocation;
+        dst.layoutLocation = src.layoutLocation;
 
     if (src.hasBinding())
         dst.layoutBinding = src.layoutBinding;
@@ -2910,17 +2909,10 @@ void TParseContext::layoutTypeCheck(TSourceLoc loc, const TSymbol& symbol)
     if (qualifier.hasLocation()) {
         switch (qualifier.storage) {
         case EvqVaryingIn:
-        {
-            if (type.getBasicType() == EbtBlock)
-                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, 0 /* TODO ARB_enhanced_layouts*/, "location qualifier on input block");
-            break;
-        }
         case EvqVaryingOut:
-        {
             if (type.getBasicType() == EbtBlock)
-                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, 0 /* TODO ARB_enhanced_layouts*/, "location qualifier on output block");
+                profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, 0 /* TODO ARB_enhanced_layouts*/, "location qualifier on in/out block");
             break;
-        }
         case EvqUniform:
         case EvqBuffer:
         {
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 5978251efab9c7f0a0ebed25b861bf542f741406..371ef8552586d8e666347e713cc28163516a9f30 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -108,7 +108,7 @@ public:
     void variableCheck(TIntermTyped*& nodePtr);
     bool lValueErrorCheck(TSourceLoc, const char* op, TIntermTyped*);
     void constantValueCheck(TIntermTyped* node, const char* token);
-    void integerCheck(TIntermTyped* node, const char* token);
+    void integerCheck(const TIntermTyped* node, const char* token);
     void globalCheck(TSourceLoc, const char* token);
     bool constructorError(TSourceLoc, TIntermNode*, TFunction&, TOperator, TType&);
     void arraySizeCheck(TSourceLoc, TIntermTyped* expr, int& size);
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index f42c595c86670a7756087497949fa0d846ba2147..6fc97f744de0b66372282a0e2e2e04f1f86ddb94 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -183,7 +183,7 @@ const char* TParseContext::getPreamble()
             "#define GL_ARB_shading_language_420pack 1\n"
             "#define GL_ARB_texture_gather 1\n"
             "#define GL_ARB_gpu_shader5 1\n"
-            "#define GL_ARB_separate_shader_objects 1\n";
+            "#define GL_ARB_separate_shader_objects 1\n"
             "#define GL_ARB_tessellation_shader 1\n";
     }
 }
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index a7b4298abc9483131f47814eb7287121db434e91..e62f84f33c35ab05466b7acc3b0c6caed55b96b5 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -253,10 +253,10 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
     }
 
     // Layouts...
-    if (symbol.getQualifier().layoutMatrix       != unitSymbol.getQualifier().layoutMatrix ||
-        symbol.getQualifier().layoutPacking      != unitSymbol.getQualifier().layoutPacking ||
-        symbol.getQualifier().layoutSlotLocation != unitSymbol.getQualifier().layoutSlotLocation ||
-        symbol.getQualifier().layoutBinding      != unitSymbol.getQualifier().layoutBinding) {
+    if (symbol.getQualifier().layoutMatrix   != unitSymbol.getQualifier().layoutMatrix ||
+        symbol.getQualifier().layoutPacking  != unitSymbol.getQualifier().layoutPacking ||
+        symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation ||
+        symbol.getQualifier().layoutBinding  != unitSymbol.getQualifier().layoutBinding) {
         error(infoSink, "Layout qualification must match:");
         writeTypeComparison = true;
     }
@@ -510,7 +510,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
             size = computeTypeLocationSize(type);
     }
 
-    TRange range = { qualifier.layoutSlotLocation, qualifier.layoutSlotLocation + size - 1 };
+    TRange range = { qualifier.layoutLocation, qualifier.layoutLocation + size - 1 };
 
     // check for collisions, except for vertex inputs on desktop
     if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput())) {