From e8fe7b81d75a015bb85f4c45f7a4119420d4beef Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Wed, 18 Dec 2013 18:47:12 +0000
Subject: [PATCH] Allow tessellation shaders to work on versions back to 150. 
 Also combined all the tessellation tests into a single run.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24569 e7fa87d3-cd2b-0410-9028-fcbf551c1848
---
 Test/140.frag                             |    2 +
 Test/150.frag                             |    2 +
 Test/150.tesc                             |   34 +
 Test/150.tese                             |   35 +
 Test/baseResults/140.frag.out             |    6 +
 Test/baseResults/150.frag.out             |    6 +
 Test/baseResults/150.tesc.out             | 1374 +++++++++++++++++++++
 Test/baseResults/400.tesc.out             |  134 --
 Test/baseResults/400.tese.out             |  141 ---
 Test/baseResults/410.tesc.out             |   21 -
 Test/baseResults/420.tesc.out             |   87 --
 Test/baseResults/420.tese.out             |  171 ---
 Test/runtests                             |   23 +-
 Test/testlist                             |    5 -
 glslang/Include/revision.h                |    4 +-
 glslang/MachineIndependent/Initialize.cpp |    8 +-
 glslang/MachineIndependent/Scan.cpp       |    5 +
 glslang/MachineIndependent/ShaderLang.cpp |    8 +-
 glslang/MachineIndependent/Versions.h     |    2 +-
 glslang/MachineIndependent/glslang.y      |    1 -
 20 files changed, 1487 insertions(+), 582 deletions(-)
 create mode 100644 Test/150.tesc
 create mode 100644 Test/150.tese
 create mode 100644 Test/baseResults/150.tesc.out
 delete mode 100644 Test/baseResults/400.tesc.out
 delete mode 100644 Test/baseResults/400.tese.out
 delete mode 100644 Test/baseResults/410.tesc.out
 delete mode 100644 Test/baseResults/420.tesc.out
 delete mode 100644 Test/baseResults/420.tese.out

diff --git a/Test/140.frag b/Test/140.frag
index 1ac44ce8e..1e29d4d4d 100644
--- a/Test/140.frag
+++ b/Test/140.frag
@@ -18,3 +18,5 @@ void main()
 #endif
 
 in struct S { float f; } s; // ERROR
+
+float patch = 3.1;
\ No newline at end of file
diff --git a/Test/150.frag b/Test/150.frag
index 49d5636a8..6225aa7a7 100644
--- a/Test/150.frag
+++ b/Test/150.frag
@@ -14,3 +14,5 @@ void main()
 layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;  // ERROR, declared after use
 
 in struct S { float f; } s;
+
+float patch = 3.1;
\ No newline at end of file
diff --git a/Test/150.tesc b/Test/150.tesc
new file mode 100644
index 000000000..b72f0def9
--- /dev/null
+++ b/Test/150.tesc
@@ -0,0 +1,34 @@
+#version 150
+
+#extension GL_ARB_tessellation_shader : enable
+
+layout(vertices = 4) out;
+int outa[gl_out.length()];
+
+patch out vec4 patchOut;
+
+void main()
+{
+    barrier();
+
+    int a = gl_MaxTessControlInputComponents +
+            gl_MaxTessControlOutputComponents +
+            gl_MaxTessControlTextureImageUnits +
+            gl_MaxTessControlUniformComponents +
+            gl_MaxTessControlTotalOutputComponents;
+
+    vec4 p = gl_in[1].gl_Position;
+    float ps = gl_in[1].gl_PointSize;
+    float cd = gl_in[1].gl_ClipDistance[2];
+
+    int pvi = gl_PatchVerticesIn;
+    int pid = gl_PrimitiveID;
+    int iid = gl_InvocationID;
+
+    gl_out[1].gl_Position = p;
+    gl_out[1].gl_PointSize = ps;
+    gl_out[1].gl_ClipDistance[1] = cd;
+
+    gl_TessLevelOuter[3] = 3.2;
+    gl_TessLevelInner[1] = 1.3;
+}
diff --git a/Test/150.tese b/Test/150.tese
new file mode 100644
index 000000000..aea65e810
--- /dev/null
+++ b/Test/150.tese
@@ -0,0 +1,35 @@
+#version 150
+
+#extension GL_ARB_tessellation_shader : enable
+
+layout(quads, cw) in;
+layout(fractional_odd_spacing) in;    
+layout(point_mode) in;
+patch in vec4 patchIn;
+
+void main()
+{
+    barrier(); // ERROR
+
+    int a = gl_MaxTessEvaluationInputComponents +
+            gl_MaxTessEvaluationOutputComponents +
+            gl_MaxTessEvaluationTextureImageUnits +
+            gl_MaxTessEvaluationUniformComponents +
+            gl_MaxTessPatchComponents +
+            gl_MaxPatchVertices +
+            gl_MaxTessGenLevel;
+
+    vec4 p = gl_in[1].gl_Position;
+    float ps = gl_in[1].gl_PointSize;
+    float cd = gl_in[1].gl_ClipDistance[2];
+
+    int pvi = gl_PatchVerticesIn;
+    int pid = gl_PrimitiveID;
+    vec3 tc = gl_TessCoord;
+    float tlo = gl_TessLevelOuter[3];
+    float tli = gl_TessLevelInner[1];
+
+    gl_Position = p;
+    gl_PointSize = ps;
+    gl_ClipDistance[2] = cd;
+}
diff --git a/Test/baseResults/140.frag.out b/Test/baseResults/140.frag.out
index 7ac82bb00..eb5ceb103 100644
--- a/Test/baseResults/140.frag.out
+++ b/Test/baseResults/140.frag.out
@@ -17,6 +17,11 @@ ERROR: node is still EOpNull!
 0:12            'gl_ClipDistance' (smooth in 5-element array of float)
 0:12            Constant:
 0:12              2 (const int)
+0:22  Sequence
+0:22    move second child to first child (float)
+0:22      'patch' (float)
+0:22      Constant:
+0:22        3.100000
 0:?   Linker Objects
 0:?     'v' (smooth in 4-component vector of float)
 0:?     'i' (smooth in 4-component vector of float)
@@ -24,6 +29,7 @@ ERROR: node is still EOpNull!
 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:?     'patch' (float)
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out
index d6efd180f..148f5ea54 100644
--- a/Test/baseResults/150.frag.out
+++ b/Test/baseResults/150.frag.out
@@ -17,11 +17,17 @@ ERROR: node is still EOpNull!
 0:11        move second child to first child (4-component vector of float)
 0:11          'c' (4-component vector of float)
 0:11          'gl_FragCoord' (gl_FragCoord 4-component vector of float)
+0:18  Sequence
+0:18    move second child to first child (float)
+0:18      'patch' (float)
+0:18      Constant:
+0:18        3.100000
 0:?   Linker Objects
 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:?     'patch' (float)
 
 
 Linked fragment stage:
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
new file mode 100644
index 000000000..b7fbe2741
--- /dev/null
+++ b/Test/baseResults/150.tesc.out
@@ -0,0 +1,1374 @@
+150.tesc
+Warning, version 150 is not yet complete; some version-specific features are present, but many are missing.
+
+vertices = 4
+0:? Sequence
+0:10  Function Definition: main( (void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Barrier (void)
+0:14      Sequence
+0:14        move second child to first child (int)
+0:14          'a' (int)
+0:14          Constant:
+0:14            5392 (const int)
+0:20      Sequence
+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              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      Sequence
+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              Constant:
+0:21                1 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:22      Sequence
+0:22        move second child to first child (float)
+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                Constant:
+0:22                  1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:24      Sequence
+0:24        move second child to first child (int)
+0:24          'pvi' (int)
+0:24          'gl_PatchVerticesIn' (in int)
+0:25      Sequence
+0:25        move second child to first child (int)
+0:25          'pid' (int)
+0:25          'gl_PrimitiveID' (in int)
+0:26      Sequence
+0:26        move second child to first child (int)
+0:26          'iid' (int)
+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            Constant:
+0:28              1 (const int)
+0:28          Constant:
+0:28            0 (const int)
+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            Constant:
+0:29              1 (const int)
+0:29          Constant:
+0:29            1 (const int)
+0:29        'ps' (float)
+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              Constant:
+0:30                1 (const int)
+0:30            Constant:
+0:30              2 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        'cd' (float)
+0:32      move second child to first child (float)
+0:32        direct index (patch float)
+0:32          'gl_TessLevelOuter' (patch out 4-element array of float)
+0:32          Constant:
+0:32            3 (const int)
+0:32        Constant:
+0:32          3.200000
+0:33      move second child to first child (float)
+0:33        direct index (patch float)
+0:33          'gl_TessLevelInner' (patch out 2-element array of float)
+0:33          Constant:
+0:33            1 (const int)
+0:33        Constant:
+0:33          1.300000
+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})
+
+150.tese
+Warning, version 150 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:12: 'barrier' : no matching overloaded function found 
+ERROR: 1 compilation errors.  No code generated.
+
+
+input primitive = quads
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+using point mode
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( (void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Constant:
+0:12        0.000000
+0:14      Sequence
+0:14        move second child to first child (int)
+0:14          'a' (int)
+0:14          Constant:
+0:14            1512 (const int)
+0:22      Sequence
+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              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:23      Sequence
+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              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              1 (const int)
+0:24      Sequence
+0:24        move second child to first child (float)
+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                Constant:
+0:24                  1 (const int)
+0:24              Constant:
+0:24                2 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:26      Sequence
+0:26        move second child to first child (int)
+0:26          'pvi' (int)
+0:26          'gl_PatchVerticesIn' (in int)
+0:27      Sequence
+0:27        move second child to first child (int)
+0:27          'pid' (int)
+0:27          'gl_PrimitiveID' (in int)
+0:28      Sequence
+0:28        move second child to first child (3-component vector of float)
+0:28          'tc' (3-component vector of float)
+0:28          'gl_TessCoord' (in 3-component vector of float)
+0:29      Sequence
+0:29        move second child to first child (float)
+0:29          'tlo' (float)
+0:29          direct index (patch float)
+0:29            'gl_TessLevelOuter' (patch in 4-element array of float)
+0:29            Constant:
+0:29              3 (const int)
+0:30      Sequence
+0:30        move second child to first child (float)
+0:30          'tli' (float)
+0:30          direct index (patch float)
+0:30            'gl_TessLevelInner' (patch in 2-element array of float)
+0:30            Constant:
+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          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          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            Constant:
+0:34              2 (const uint)
+0:34          Constant:
+0:34            2 (const int)
+0:34        'cd' (float)
+0:?   Linker Objects
+0:?     'patchIn' (patch in 4-component vector of float)
+
+400.tesc
+Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
+ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
+ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
+ERROR: 0:10: 'patch' : can only use on output in tessellation-control shader 
+ERROR: 0:39: 'vertices' : can only apply to 'out' 
+ERROR: 0:40: 'vertices' : cannot change previously set layout value 
+ERROR: 0:44: '[' :  array index out of range '4'
+ERROR: 7 compilation errors.  No code generated.
+
+
+vertices = 4
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( (void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      Barrier (void)
+0:17      Sequence
+0:17        move second child to first child (int)
+0:17          'a' (int)
+0:17          Constant:
+0:17            5392 (const int)
+0:23      Sequence
+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              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:24      Sequence
+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              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:25      Sequence
+0:25        move second child to first child (float)
+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                Constant:
+0:25                  1 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:27      Sequence
+0:27        move second child to first child (int)
+0:27          'pvi' (int)
+0:27          'gl_PatchVerticesIn' (in int)
+0:28      Sequence
+0:28        move second child to first child (int)
+0:28          'pid' (int)
+0:28          'gl_PrimitiveID' (in int)
+0:29      Sequence
+0:29        move second child to first child (int)
+0:29          'iid' (int)
+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            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            0 (const int)
+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            Constant:
+0:32              1 (const int)
+0:32          Constant:
+0:32            1 (const int)
+0:32        'ps' (float)
+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              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              2 (const int)
+0:33          Constant:
+0:33            1 (const int)
+0:33        'cd' (float)
+0:35      move second child to first child (float)
+0:35        direct index (patch float)
+0:35          'gl_TessLevelOuter' (patch out 4-element array of float)
+0:35          Constant:
+0:35            3 (const int)
+0:35        Constant:
+0:35          3.200000
+0:36      move second child to first child (float)
+0:36        direct index (patch float)
+0:36          'gl_TessLevelInner' (patch out 2-element array of float)
+0:36          Constant:
+0:36            1 (const int)
+0:36        Constant:
+0:36          1.300000
+0:42  Function Definition: foo( (void)
+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          Constant:
+0:44            4 (const int)
+0:44        Constant:
+0:44          1 (const int)
+0:?   Linker Objects
+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})
+
+400.tese
+Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
+ERROR: 0:5: 'triangles' : cannot change previously set input primitive 
+ERROR: 0:6: 'isolines' : cannot change previously set input primitive 
+ERROR: 0:8: 'ccw' : cannot change previously set vertex order 
+ERROR: 0:12: 'equal_spacing' : cannot change previously set vertex spacing 
+ERROR: 0:13: 'fractional_even_spacing' : cannot change previously set vertex spacing 
+ERROR: 0:18: 'patch' : can only use on input in tessellation-evaluation shader 
+ERROR: 0:22: 'barrier' : no matching overloaded function found 
+ERROR: 0:47: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
+ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
+ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized 
+ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
+ERROR: 0:64: 'quads' : cannot apply to 'out' 
+ERROR: 0:64: 'cw' : can only apply to 'in' 
+ERROR: 0:65: 'triangles' : cannot apply to 'out' 
+ERROR: 0:66: 'isolines' : cannot apply to 'out' 
+ERROR: 0:67: 'cw' : can only apply to 'in' 
+ERROR: 0:68: 'fractional_odd_spacing' : can only apply to 'in' 
+ERROR: 0:69: 'equal_spacing' : can only apply to 'in' 
+ERROR: 0:70: 'fractional_even_spacing' : can only apply to 'in' 
+ERROR: 0:71: 'point_mode' : can only apply to 'in' 
+ERROR: 23 compilation errors.  No code generated.
+
+
+input primitive = quads
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+using point mode
+ERROR: node is still EOpNull!
+0:20  Function Definition: main( (void)
+0:20    Function Parameters: 
+0:22    Sequence
+0:22      Constant:
+0:22        0.000000
+0:24      Sequence
+0:24        move second child to first child (int)
+0:24          'a' (int)
+0:24          Constant:
+0:24            1512 (const int)
+0:32      Sequence
+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              Constant:
+0:32                1 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:33      Sequence
+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              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:34      Sequence
+0:34        move second child to first child (float)
+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                Constant:
+0:34                  1 (const int)
+0:34              Constant:
+0:34                2 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:36      Sequence
+0:36        move second child to first child (int)
+0:36          'pvi' (int)
+0:36          'gl_PatchVerticesIn' (in int)
+0:37      Sequence
+0:37        move second child to first child (int)
+0:37          'pid' (int)
+0:37          'gl_PrimitiveID' (in int)
+0:38      Sequence
+0:38        move second child to first child (3-component vector of float)
+0:38          'tc' (3-component vector of float)
+0:38          'gl_TessCoord' (in 3-component vector of float)
+0:39      Sequence
+0:39        move second child to first child (float)
+0:39          'tlo' (float)
+0:39          direct index (patch float)
+0:39            'gl_TessLevelOuter' (patch in 4-element array of float)
+0:39            Constant:
+0:39              3 (const int)
+0:40      Sequence
+0:40        move second child to first child (float)
+0:40          'tli' (float)
+0:40          direct index (patch float)
+0:40            'gl_TessLevelInner' (patch in 2-element array of float)
+0:40            Constant:
+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          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          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            Constant:
+0:44              2 (const uint)
+0:44          Constant:
+0:44            2 (const int)
+0:44        'cd' (float)
+0:?   Linker Objects
+0:?     'patchIn' (patch in 4-component vector of float)
+0:?     'patchOut' (patch out 4-component vector of float)
+0:?     'badp1' (smooth patch in 4-component vector of float)
+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})
+
+410.tesc
+Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:4: 'length' :  array must first be sized by a redeclaration or layout qualifier
+ERROR: 1 compilation errors.  No code generated.
+
+
+vertices = 0
+ERROR: node is still EOpNull!
+0:8  Function Definition: main( (void)
+0:8    Function Parameters: 
+0:?   Linker Objects
+0:?     'outa' (1-element array of int)
+0:?     'patchOut' (patch out 4-component vector of float)
+
+420.tesc
+Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
+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:29: 'out' : type must be an array: outf
+ERROR: 6 compilation errors.  No code generated.
+
+
+vertices = 4
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( (void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      Sequence
+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              Constant:
+0:17                1 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:18      Sequence
+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              Constant:
+0:18                1 (const int)
+0:18            Constant:
+0:18              1 (const int)
+0:19      Sequence
+0:19        move second child to first child (float)
+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                Constant:
+0:19                  1 (const int)
+0:19              Constant:
+0:19                2 (const int)
+0:19            Constant:
+0:19              2 (const int)
+0:21      Sequence
+0:21        move second child to first child (int)
+0:21          'pvi' (int)
+0:21          'gl_PatchVerticesIn' (in int)
+0:22      Sequence
+0:22        move second child to first child (int)
+0:22          'pid' (int)
+0:22          'gl_PrimitiveID' (in int)
+0:23      Sequence
+0:23        move second child to first child (int)
+0:23          'iid' (int)
+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            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        Constant:
+0:26          1 (const int)
+0:?   Linker Objects
+0:?     'gl_out' (out 3-element array of block{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)
+0:?     'outf' (out float)
+
+420.tese
+Warning, version 420 is not yet complete; some version-specific features are present, but many are missing.
+ERROR: 0:7: '=' :  cannot convert from '3-element array of float' to '2-element array of float'
+ERROR: 0:8: 'initializer list' : wrong vector size (or rows in a matrix column): 2-component vector of float
+ERROR: 0:9: 'initializer list' : wrong number of matrix columns: 3X3 matrix of float
+ERROR: 0:10: 'initializer list' : wrong number of matrix columns: 2X2 matrix of float
+ERROR: 0:25: 'initializer list' : wrong number of structure members 
+ERROR: 0:27: '=' :  cannot convert from 'const bool' to 'int'
+ERROR: 0:28: 'constructor' :  cannot convert parameter 2 from 'const float' to '4-component vector of float'
+ERROR: 0:29: 'constructor' :  cannot convert parameter 2 from 'const 2X2 matrix of float' to 'const 4-component vector of float'
+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:58: 'initializer list' : wrong number of structure members 
+ERROR: 13 compilation errors.  No code generated.
+
+
+input primitive = none
+vertex spacing = none
+triangle order = none
+ERROR: node is still EOpNull!
+0:4  Sequence
+0:4    move second child to first child (2X2 matrix of float)
+0:4      'b' (2X2 matrix of float)
+0:4      Constant:
+0:4        1.000000
+0:4        0.000000
+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      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      Constant:
+0:20        1.000000
+0:20        3 (const int)
+0:42  Sequence
+0:42    move second child to first child (5-element array of float)
+0:42      'b5' (5-element array of float)
+0:42      Constant:
+0:42        3.400000
+0:42        4.200000
+0:42        5.000000
+0:42        5.200000
+0:42        1.100000
+0:67  Sequence
+0:67    move second child to first child (3-component vector of float)
+0:67      'av3' (3-component vector of float)
+0:67      Construct vec3 (3-component vector of float)
+0:67        'vc1' (float)
+0:67        'vc2' (float)
+0:67        'vc3' (float)
+0:68  Sequence
+0:68    move second child to first child (3-component vector of float)
+0:68      'bv3' (3-component vector of float)
+0:68      Construct vec3 (3-component vector of float)
+0:68        'vc1' (float)
+0:68        'vc2' (float)
+0:68        'vc3' (float)
+0:70  Function Definition: main( (void)
+0:70    Function Parameters: 
+0:72    Sequence
+0:72      MemoryBarrier (void)
+0:74      Test condition and select (void)
+0:74        Condition
+0:74        Compare Equal (bool)
+0:74          Constant:
+0:74            1 (const uint)
+0:74            2 (const uint)
+0:74            3.000000
+0:74            4.000000
+0:74            0.000000
+0:74            0.000000
+0:74            0.000000
+0:74            4.000000
+0:74            0.000000
+0:74            5.000000
+0:74            6.000000
+0:74            0.000000
+0:74            0.000000
+0:74            0.000000
+0:74            6.000000
+0:74            0.000000
+0:74          'curlybad1' (structure{uv2,s})
+0:74        true case is null
+0:76      Test condition and select (void)
+0:76        Condition
+0:76        Constant:
+0:76          true (const bool)
+0:76        true case is null
+0:?   Linker Objects
+0:?     'a' (const 2X2 matrix of float)
+0:?       1.000000
+0:?       0.000000
+0:?       0.000000
+0:?       1.000000
+0:?     'b' (2X2 matrix of float)
+0:?     'c' (const 2X2 matrix of float)
+0:?       1.000000
+0:?       0.000000
+0:?       0.000000
+0:?       1.000000
+0:?     'a2' (2-element array of float)
+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:?     '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:?     'b5' (5-element array of float)
+0:?     'constructed' (const structure{uv2,s})
+0:?       1 (const uint)
+0:?       2 (const uint)
+0:?       3.000000
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?       0.000000
+0:?       5.000000
+0:?       6.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       6.000000
+0:?       0.000000
+0:?     'curlybad1' (structure{uv2,s})
+0:?     'curlyInit' (const structure{uv2,s})
+0:?       1 (const uint)
+0:?       2 (const uint)
+0:?       3.000000
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?       0.000000
+0:?       5.000000
+0:?       6.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       6.000000
+0:?       0.000000
+0:?     'vc1' (float)
+0:?     'vc2' (float)
+0:?     'vc3' (float)
+0:?     'av3' (3-component vector of float)
+0:?     'bv3' (3-component vector of float)
+
+
+Linked tessellation control stage:
+
+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: Contradictory layout vertices values
+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: Multiple function bodies in multiple compilation units for the same signature in the same stage:
+    main(
+ERROR: Linking tessellation control stage: Types must match:
+    outa: "4-element array of int" versus "1-element array of int"
+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: Multiple function bodies in multiple compilation units for the same signature in the same stage:
+    main(
+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}"
+
+Linked tessellation evaluation stage:
+
+ERROR: Linking tessellation evaluation stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
+    main(
+ERROR: Linking tessellation evaluation stage: Contradictory input layout primitives
+ERROR: Linking tessellation evaluation stage: Contradictory input vertex spacing
+ERROR: Linking tessellation evaluation stage: Contradictory triangle ordering
+ERROR: Linking tessellation evaluation stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
+    main(
+ERROR: Linking tessellation evaluation stage: Multiple function bodies in multiple compilation units for the same signature in the same stage:
+    main(
+
+vertices = 4
+0:? Sequence
+0:10  Function Definition: main( (void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Barrier (void)
+0:14      Sequence
+0:14        move second child to first child (int)
+0:14          'a' (int)
+0:14          Constant:
+0:14            5392 (const int)
+0:20      Sequence
+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              Constant:
+0:20                1 (const int)
+0:20            Constant:
+0:20              0 (const int)
+0:21      Sequence
+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              Constant:
+0:21                1 (const int)
+0:21            Constant:
+0:21              1 (const int)
+0:22      Sequence
+0:22        move second child to first child (float)
+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                Constant:
+0:22                  1 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              2 (const int)
+0:24      Sequence
+0:24        move second child to first child (int)
+0:24          'pvi' (int)
+0:24          'gl_PatchVerticesIn' (in int)
+0:25      Sequence
+0:25        move second child to first child (int)
+0:25          'pid' (int)
+0:25          'gl_PrimitiveID' (in int)
+0:26      Sequence
+0:26        move second child to first child (int)
+0:26          'iid' (int)
+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            Constant:
+0:28              1 (const int)
+0:28          Constant:
+0:28            0 (const int)
+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            Constant:
+0:29              1 (const int)
+0:29          Constant:
+0:29            1 (const int)
+0:29        'ps' (float)
+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              Constant:
+0:30                1 (const int)
+0:30            Constant:
+0:30              2 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        'cd' (float)
+0:32      move second child to first child (float)
+0:32        direct index (patch float)
+0:32          'gl_TessLevelOuter' (patch out 4-element array of float)
+0:32          Constant:
+0:32            3 (const int)
+0:32        Constant:
+0:32          3.200000
+0:33      move second child to first child (float)
+0:33        direct index (patch float)
+0:33          'gl_TessLevelInner' (patch out 2-element array of float)
+0:33          Constant:
+0:33            1 (const int)
+0:33        Constant:
+0:33          1.300000
+0:13  Function Definition: main( (void)
+0:13    Function Parameters: 
+0:15    Sequence
+0:15      Barrier (void)
+0:17      Sequence
+0:17        move second child to first child (int)
+0:17          'a' (int)
+0:17          Constant:
+0:17            5392 (const int)
+0:23      Sequence
+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              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:24      Sequence
+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              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:25      Sequence
+0:25        move second child to first child (float)
+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                Constant:
+0:25                  1 (const int)
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              2 (const int)
+0:27      Sequence
+0:27        move second child to first child (int)
+0:27          'pvi' (int)
+0:27          'gl_PatchVerticesIn' (in int)
+0:28      Sequence
+0:28        move second child to first child (int)
+0:28          'pid' (int)
+0:28          'gl_PrimitiveID' (in int)
+0:29      Sequence
+0:29        move second child to first child (int)
+0:29          'iid' (int)
+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            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            0 (const int)
+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            Constant:
+0:32              1 (const int)
+0:32          Constant:
+0:32            1 (const int)
+0:32        'ps' (float)
+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              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              2 (const int)
+0:33          Constant:
+0:33            1 (const int)
+0:33        'cd' (float)
+0:35      move second child to first child (float)
+0:35        direct index (patch float)
+0:35          'gl_TessLevelOuter' (patch out 4-element array of float)
+0:35          Constant:
+0:35            3 (const int)
+0:35        Constant:
+0:35          3.200000
+0:36      move second child to first child (float)
+0:36        direct index (patch float)
+0:36          'gl_TessLevelInner' (patch out 2-element array of float)
+0:36          Constant:
+0:36            1 (const int)
+0:36        Constant:
+0:36          1.300000
+0:42  Function Definition: foo( (void)
+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          Constant:
+0:44            4 (const int)
+0:44        Constant:
+0:44          1 (const int)
+0:8  Function Definition: main( (void)
+0:8    Function Parameters: 
+0:15  Function Definition: main( (void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      Sequence
+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              Constant:
+0:17                1 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:18      Sequence
+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              Constant:
+0:18                1 (const int)
+0:18            Constant:
+0:18              1 (const int)
+0:19      Sequence
+0:19        move second child to first child (float)
+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                Constant:
+0:19                  1 (const int)
+0:19              Constant:
+0:19                2 (const int)
+0:19            Constant:
+0:19              2 (const int)
+0:21      Sequence
+0:21        move second child to first child (int)
+0:21          'pvi' (int)
+0:21          'gl_PatchVerticesIn' (in int)
+0:22      Sequence
+0:22        move second child to first child (int)
+0:22          'pid' (int)
+0:22          'gl_PrimitiveID' (in int)
+0:23      Sequence
+0:23        move second child to first child (int)
+0:23          'iid' (int)
+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            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        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:?     'patchIn' (patch in 4-component vector of float)
+0:?     'a' (out 3-element array of int)
+0:?     'outb' (out 5-element array of int)
+0:?     'outc' (out 4-element array of int)
+0:?     'outf' (out float)
+input primitive = quads
+vertex spacing = fractional_odd_spacing
+triangle order = cw
+using point mode
+ERROR: node is still EOpNull!
+0:10  Function Definition: main( (void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      Constant:
+0:12        0.000000
+0:14      Sequence
+0:14        move second child to first child (int)
+0:14          'a' (int)
+0:14          Constant:
+0:14            1512 (const int)
+0:22      Sequence
+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              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:23      Sequence
+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              Constant:
+0:23                1 (const int)
+0:23            Constant:
+0:23              1 (const int)
+0:24      Sequence
+0:24        move second child to first child (float)
+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                Constant:
+0:24                  1 (const int)
+0:24              Constant:
+0:24                2 (const int)
+0:24            Constant:
+0:24              2 (const int)
+0:26      Sequence
+0:26        move second child to first child (int)
+0:26          'pvi' (int)
+0:26          'gl_PatchVerticesIn' (in int)
+0:27      Sequence
+0:27        move second child to first child (int)
+0:27          'pid' (int)
+0:27          'gl_PrimitiveID' (in int)
+0:28      Sequence
+0:28        move second child to first child (3-component vector of float)
+0:28          'tc' (3-component vector of float)
+0:28          'gl_TessCoord' (in 3-component vector of float)
+0:29      Sequence
+0:29        move second child to first child (float)
+0:29          'tlo' (float)
+0:29          direct index (patch float)
+0:29            'gl_TessLevelOuter' (patch in 4-element array of float)
+0:29            Constant:
+0:29              3 (const int)
+0:30      Sequence
+0:30        move second child to first child (float)
+0:30          'tli' (float)
+0:30          direct index (patch float)
+0:30            'gl_TessLevelInner' (patch in 2-element array of float)
+0:30            Constant:
+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          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          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            Constant:
+0:34              2 (const uint)
+0:34          Constant:
+0:34            2 (const int)
+0:34        'cd' (float)
+0:20  Function Definition: main( (void)
+0:20    Function Parameters: 
+0:22    Sequence
+0:22      Constant:
+0:22        0.000000
+0:24      Sequence
+0:24        move second child to first child (int)
+0:24          'a' (int)
+0:24          Constant:
+0:24            1512 (const int)
+0:32      Sequence
+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              Constant:
+0:32                1 (const int)
+0:32            Constant:
+0:32              0 (const int)
+0:33      Sequence
+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              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:34      Sequence
+0:34        move second child to first child (float)
+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                Constant:
+0:34                  1 (const int)
+0:34              Constant:
+0:34                2 (const int)
+0:34            Constant:
+0:34              2 (const int)
+0:36      Sequence
+0:36        move second child to first child (int)
+0:36          'pvi' (int)
+0:36          'gl_PatchVerticesIn' (in int)
+0:37      Sequence
+0:37        move second child to first child (int)
+0:37          'pid' (int)
+0:37          'gl_PrimitiveID' (in int)
+0:38      Sequence
+0:38        move second child to first child (3-component vector of float)
+0:38          'tc' (3-component vector of float)
+0:38          'gl_TessCoord' (in 3-component vector of float)
+0:39      Sequence
+0:39        move second child to first child (float)
+0:39          'tlo' (float)
+0:39          direct index (patch float)
+0:39            'gl_TessLevelOuter' (patch in 4-element array of float)
+0:39            Constant:
+0:39              3 (const int)
+0:40      Sequence
+0:40        move second child to first child (float)
+0:40          'tli' (float)
+0:40          direct index (patch float)
+0:40            'gl_TessLevelInner' (patch in 2-element array of float)
+0:40            Constant:
+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          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          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            Constant:
+0:44              2 (const uint)
+0:44          Constant:
+0:44            2 (const int)
+0:44        'cd' (float)
+0:4  Sequence
+0:4    move second child to first child (2X2 matrix of float)
+0:4      'b' (2X2 matrix of float)
+0:4      Constant:
+0:4        1.000000
+0:4        0.000000
+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      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      Constant:
+0:20        1.000000
+0:20        3 (const int)
+0:42  Sequence
+0:42    move second child to first child (5-element array of float)
+0:42      'b5' (5-element array of float)
+0:42      Constant:
+0:42        3.400000
+0:42        4.200000
+0:42        5.000000
+0:42        5.200000
+0:42        1.100000
+0:67  Sequence
+0:67    move second child to first child (3-component vector of float)
+0:67      'av3' (3-component vector of float)
+0:67      Construct vec3 (3-component vector of float)
+0:67        'vc1' (float)
+0:67        'vc2' (float)
+0:67        'vc3' (float)
+0:68  Sequence
+0:68    move second child to first child (3-component vector of float)
+0:68      'bv3' (3-component vector of float)
+0:68      Construct vec3 (3-component vector of float)
+0:68        'vc1' (float)
+0:68        'vc2' (float)
+0:68        'vc3' (float)
+0:70  Function Definition: main( (void)
+0:70    Function Parameters: 
+0:72    Sequence
+0:72      MemoryBarrier (void)
+0:74      Test condition and select (void)
+0:74        Condition
+0:74        Compare Equal (bool)
+0:74          Constant:
+0:74            1 (const uint)
+0:74            2 (const uint)
+0:74            3.000000
+0:74            4.000000
+0:74            0.000000
+0:74            0.000000
+0:74            0.000000
+0:74            4.000000
+0:74            0.000000
+0:74            5.000000
+0:74            6.000000
+0:74            0.000000
+0:74            0.000000
+0:74            0.000000
+0:74            6.000000
+0:74            0.000000
+0:74          'curlybad1' (structure{uv2,s})
+0:74        true case is null
+0:76      Test condition and select (void)
+0:76        Condition
+0:76        Constant:
+0:76          true (const bool)
+0:76        true case is null
+0:?   Linker Objects
+0:?     'patchIn' (patch in 4-component vector of float)
+0:?     'patchOut' (patch out 4-component vector of float)
+0:?     'badp1' (smooth patch in 4-component vector of float)
+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:?     'a' (const 2X2 matrix of float)
+0:?       1.000000
+0:?       0.000000
+0:?       0.000000
+0:?       1.000000
+0:?     'b' (2X2 matrix of float)
+0:?     'c' (const 2X2 matrix of float)
+0:?       1.000000
+0:?       0.000000
+0:?       0.000000
+0:?       1.000000
+0:?     'a2' (2-element array of float)
+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:?     '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:?     'b5' (5-element array of float)
+0:?     'constructed' (const structure{uv2,s})
+0:?       1 (const uint)
+0:?       2 (const uint)
+0:?       3.000000
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?       0.000000
+0:?       5.000000
+0:?       6.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       6.000000
+0:?       0.000000
+0:?     'curlybad1' (structure{uv2,s})
+0:?     'curlyInit' (const structure{uv2,s})
+0:?       1 (const uint)
+0:?       2 (const uint)
+0:?       3.000000
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?       0.000000
+0:?       5.000000
+0:?       6.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       6.000000
+0:?       0.000000
+0:?     'vc1' (float)
+0:?     'vc2' (float)
+0:?     'vc3' (float)
+0:?     'av3' (3-component vector of float)
+0:?     'bv3' (3-component vector of float)
+
diff --git a/Test/baseResults/400.tesc.out b/Test/baseResults/400.tesc.out
deleted file mode 100644
index 3e10c21f1..000000000
--- a/Test/baseResults/400.tesc.out
+++ /dev/null
@@ -1,134 +0,0 @@
-400.tesc
-Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
-ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
-ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
-ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) 
-ERROR: 0:10: 'patch' : can only use on output in tessellation-control shader 
-ERROR: 0:39: 'vertices' : can only apply to 'out' 
-ERROR: 0:40: 'vertices' : cannot change previously set layout value 
-ERROR: 0:44: '[' :  array index out of range '4'
-ERROR: 7 compilation errors.  No code generated.
-
-
-vertices = 4
-ERROR: node is still EOpNull!
-0:13  Function Definition: main( (void)
-0:13    Function Parameters: 
-0:15    Sequence
-0:15      Barrier (void)
-0:17      Sequence
-0:17        move second child to first child (int)
-0:17          'a' (int)
-0:17          Constant:
-0:17            5392 (const int)
-0:23      Sequence
-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              Constant:
-0:23                1 (const int)
-0:23            Constant:
-0:23              0 (const int)
-0:24      Sequence
-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              Constant:
-0:24                1 (const int)
-0:24            Constant:
-0:24              1 (const int)
-0:25      Sequence
-0:25        move second child to first child (float)
-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                Constant:
-0:25                  1 (const int)
-0:25              Constant:
-0:25                2 (const int)
-0:25            Constant:
-0:25              2 (const int)
-0:27      Sequence
-0:27        move second child to first child (int)
-0:27          'pvi' (int)
-0:27          'gl_PatchVerticesIn' (in int)
-0:28      Sequence
-0:28        move second child to first child (int)
-0:28          'pid' (int)
-0:28          'gl_PrimitiveID' (in int)
-0:29      Sequence
-0:29        move second child to first child (int)
-0:29          'iid' (int)
-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            Constant:
-0:31              1 (const int)
-0:31          Constant:
-0:31            0 (const int)
-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            Constant:
-0:32              1 (const int)
-0:32          Constant:
-0:32            1 (const int)
-0:32        'ps' (float)
-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              Constant:
-0:33                1 (const int)
-0:33            Constant:
-0:33              2 (const int)
-0:33          Constant:
-0:33            1 (const int)
-0:33        'cd' (float)
-0:35      move second child to first child (float)
-0:35        direct index (patch float)
-0:35          'gl_TessLevelOuter' (patch out 4-element array of float)
-0:35          Constant:
-0:35            3 (const int)
-0:35        Constant:
-0:35          3.200000
-0:36      move second child to first child (float)
-0:36        direct index (patch float)
-0:36          'gl_TessLevelInner' (patch out 2-element array of float)
-0:36          Constant:
-0:36            1 (const int)
-0:36        Constant:
-0:36          1.300000
-0:42  Function Definition: foo( (void)
-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          Constant:
-0:44            4 (const int)
-0:44        Constant:
-0:44          1 (const int)
-0:?   Linker Objects
-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})
-
-
-Linked tessellation control stage:
-
-
-vertices = 4
-
diff --git a/Test/baseResults/400.tese.out b/Test/baseResults/400.tese.out
deleted file mode 100644
index 121f32f95..000000000
--- a/Test/baseResults/400.tese.out
+++ /dev/null
@@ -1,141 +0,0 @@
-400.tese
-Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
-ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value 
-ERROR: 0:5: 'triangles' : cannot change previously set input primitive 
-ERROR: 0:6: 'isolines' : cannot change previously set input primitive 
-ERROR: 0:8: 'ccw' : cannot change previously set vertex order 
-ERROR: 0:12: 'equal_spacing' : cannot change previously set vertex spacing 
-ERROR: 0:13: 'fractional_even_spacing' : cannot change previously set vertex spacing 
-ERROR: 0:18: 'patch' : can only use on input in tessellation-evaluation shader 
-ERROR: 0:22: 'barrier' : no matching overloaded function found 
-ERROR: 0:47: 'patch' : cannot use interpolation qualifiers with patch 
-ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
-ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
-ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
-ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized 
-ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
-ERROR: 0:64: 'quads' : cannot apply to 'out' 
-ERROR: 0:64: 'cw' : can only apply to 'in' 
-ERROR: 0:65: 'triangles' : cannot apply to 'out' 
-ERROR: 0:66: 'isolines' : cannot apply to 'out' 
-ERROR: 0:67: 'cw' : can only apply to 'in' 
-ERROR: 0:68: 'fractional_odd_spacing' : can only apply to 'in' 
-ERROR: 0:69: 'equal_spacing' : can only apply to 'in' 
-ERROR: 0:70: 'fractional_even_spacing' : can only apply to 'in' 
-ERROR: 0:71: 'point_mode' : can only apply to 'in' 
-ERROR: 23 compilation errors.  No code generated.
-
-
-input primitive = quads
-vertex spacing = fractional_odd_spacing
-triangle order = cw
-using point mode
-ERROR: node is still EOpNull!
-0:20  Function Definition: main( (void)
-0:20    Function Parameters: 
-0:22    Sequence
-0:22      Constant:
-0:22        0.000000
-0:24      Sequence
-0:24        move second child to first child (int)
-0:24          'a' (int)
-0:24          Constant:
-0:24            1512 (const int)
-0:32      Sequence
-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              Constant:
-0:32                1 (const int)
-0:32            Constant:
-0:32              0 (const int)
-0:33      Sequence
-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              Constant:
-0:33                1 (const int)
-0:33            Constant:
-0:33              1 (const int)
-0:34      Sequence
-0:34        move second child to first child (float)
-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                Constant:
-0:34                  1 (const int)
-0:34              Constant:
-0:34                2 (const int)
-0:34            Constant:
-0:34              2 (const int)
-0:36      Sequence
-0:36        move second child to first child (int)
-0:36          'pvi' (int)
-0:36          'gl_PatchVerticesIn' (in int)
-0:37      Sequence
-0:37        move second child to first child (int)
-0:37          'pid' (int)
-0:37          'gl_PrimitiveID' (in int)
-0:38      Sequence
-0:38        move second child to first child (3-component vector of float)
-0:38          'tc' (3-component vector of float)
-0:38          'gl_TessCoord' (in 3-component vector of float)
-0:39      Sequence
-0:39        move second child to first child (float)
-0:39          'tlo' (float)
-0:39          direct index (patch float)
-0:39            'gl_TessLevelOuter' (patch in 4-element array of float)
-0:39            Constant:
-0:39              3 (const int)
-0:40      Sequence
-0:40        move second child to first child (float)
-0:40          'tli' (float)
-0:40          direct index (patch float)
-0:40            'gl_TessLevelInner' (patch in 2-element array of float)
-0:40            Constant:
-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          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          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            Constant:
-0:44              2 (const uint)
-0:44          Constant:
-0:44            2 (const int)
-0:44        'cd' (float)
-0:?   Linker Objects
-0:?     'patchIn' (patch in 4-component vector of float)
-0:?     'patchOut' (patch out 4-component vector of float)
-0:?     'badp1' (smooth patch in 4-component vector of float)
-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})
-
-
-Linked tessellation evaluation stage:
-
-
-input primitive = quads
-vertex spacing = fractional_odd_spacing
-triangle order = cw
-using point mode
-
diff --git a/Test/baseResults/410.tesc.out b/Test/baseResults/410.tesc.out
deleted file mode 100644
index 832ee90cf..000000000
--- a/Test/baseResults/410.tesc.out
+++ /dev/null
@@ -1,21 +0,0 @@
-410.tesc
-Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
-ERROR: 0:4: 'length' :  array must first be sized by a redeclaration or layout qualifier
-ERROR: 1 compilation errors.  No code generated.
-
-
-vertices = 0
-ERROR: node is still EOpNull!
-0:8  Function Definition: main( (void)
-0:8    Function Parameters: 
-0:?   Linker Objects
-0:?     'outa' (1-element array of int)
-0:?     'patchOut' (patch out 4-component vector of float)
-
-
-Linked tessellation control stage:
-
-ERROR: Linking tessellation control stage: At least one shader must specify an output layout(vertices=...)
-
-vertices = 0
-
diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out
deleted file mode 100644
index 12794d181..000000000
--- a/Test/baseResults/420.tesc.out
+++ /dev/null
@@ -1,87 +0,0 @@
-420.tesc
-Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.
-ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
-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:29: 'out' : type must be an array: outf
-ERROR: 6 compilation errors.  No code generated.
-
-
-vertices = 4
-ERROR: node is still EOpNull!
-0:15  Function Definition: main( (void)
-0:15    Function Parameters: 
-0:17    Sequence
-0:17      Sequence
-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              Constant:
-0:17                1 (const int)
-0:17            Constant:
-0:17              0 (const int)
-0:18      Sequence
-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              Constant:
-0:18                1 (const int)
-0:18            Constant:
-0:18              1 (const int)
-0:19      Sequence
-0:19        move second child to first child (float)
-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                Constant:
-0:19                  1 (const int)
-0:19              Constant:
-0:19                2 (const int)
-0:19            Constant:
-0:19              2 (const int)
-0:21      Sequence
-0:21        move second child to first child (int)
-0:21          'pvi' (int)
-0:21          'gl_PatchVerticesIn' (in int)
-0:22      Sequence
-0:22        move second child to first child (int)
-0:22          'pid' (int)
-0:22          'gl_PrimitiveID' (in int)
-0:23      Sequence
-0:23        move second child to first child (int)
-0:23          'iid' (int)
-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            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        Constant:
-0:26          1 (const int)
-0:?   Linker Objects
-0:?     'gl_out' (out 3-element array of block{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)
-0:?     'outf' (out float)
-
-
-Linked tessellation control stage:
-
-
-vertices = 4
-
diff --git a/Test/baseResults/420.tese.out b/Test/baseResults/420.tese.out
deleted file mode 100644
index 71ddd9374..000000000
--- a/Test/baseResults/420.tese.out
+++ /dev/null
@@ -1,171 +0,0 @@
-420.tese
-Warning, version 420 is not yet complete; some version-specific features are present, but many are missing.
-ERROR: 0:7: '=' :  cannot convert from '3-element array of float' to '2-element array of float'
-ERROR: 0:8: 'initializer list' : wrong vector size (or rows in a matrix column): 2-component vector of float
-ERROR: 0:9: 'initializer list' : wrong number of matrix columns: 3X3 matrix of float
-ERROR: 0:10: 'initializer list' : wrong number of matrix columns: 2X2 matrix of float
-ERROR: 0:25: 'initializer list' : wrong number of structure members 
-ERROR: 0:27: '=' :  cannot convert from 'const bool' to 'int'
-ERROR: 0:28: 'constructor' :  cannot convert parameter 2 from 'const float' to '4-component vector of float'
-ERROR: 0:29: 'constructor' :  cannot convert parameter 2 from 'const 2X2 matrix of float' to 'const 4-component vector of float'
-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:58: 'initializer list' : wrong number of structure members 
-ERROR: 13 compilation errors.  No code generated.
-
-
-input primitive = none
-vertex spacing = none
-triangle order = none
-ERROR: node is still EOpNull!
-0:4  Sequence
-0:4    move second child to first child (2X2 matrix of float)
-0:4      'b' (2X2 matrix of float)
-0:4      Constant:
-0:4        1.000000
-0:4        0.000000
-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      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      Constant:
-0:20        1.000000
-0:20        3 (const int)
-0:42  Sequence
-0:42    move second child to first child (5-element array of float)
-0:42      'b5' (5-element array of float)
-0:42      Constant:
-0:42        3.400000
-0:42        4.200000
-0:42        5.000000
-0:42        5.200000
-0:42        1.100000
-0:67  Sequence
-0:67    move second child to first child (3-component vector of float)
-0:67      'av3' (3-component vector of float)
-0:67      Construct vec3 (3-component vector of float)
-0:67        'vc1' (float)
-0:67        'vc2' (float)
-0:67        'vc3' (float)
-0:68  Sequence
-0:68    move second child to first child (3-component vector of float)
-0:68      'bv3' (3-component vector of float)
-0:68      Construct vec3 (3-component vector of float)
-0:68        'vc1' (float)
-0:68        'vc2' (float)
-0:68        'vc3' (float)
-0:70  Function Definition: main( (void)
-0:70    Function Parameters: 
-0:72    Sequence
-0:72      MemoryBarrier (void)
-0:74      Test condition and select (void)
-0:74        Condition
-0:74        Compare Equal (bool)
-0:74          Constant:
-0:74            1 (const uint)
-0:74            2 (const uint)
-0:74            3.000000
-0:74            4.000000
-0:74            0.000000
-0:74            0.000000
-0:74            0.000000
-0:74            4.000000
-0:74            0.000000
-0:74            5.000000
-0:74            6.000000
-0:74            0.000000
-0:74            0.000000
-0:74            0.000000
-0:74            6.000000
-0:74            0.000000
-0:74          'curlybad1' (structure{uv2,s})
-0:74        true case is null
-0:76      Test condition and select (void)
-0:76        Condition
-0:76        Constant:
-0:76          true (const bool)
-0:76        true case is null
-0:?   Linker Objects
-0:?     'a' (const 2X2 matrix of float)
-0:?       1.000000
-0:?       0.000000
-0:?       0.000000
-0:?       1.000000
-0:?     'b' (2X2 matrix of float)
-0:?     'c' (const 2X2 matrix of float)
-0:?       1.000000
-0:?       0.000000
-0:?       0.000000
-0:?       1.000000
-0:?     'a2' (2-element array of float)
-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:?     '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:?     'b5' (5-element array of float)
-0:?     'constructed' (const structure{uv2,s})
-0:?       1 (const uint)
-0:?       2 (const uint)
-0:?       3.000000
-0:?       4.000000
-0:?       0.000000
-0:?       0.000000
-0:?       0.000000
-0:?       4.000000
-0:?       0.000000
-0:?       5.000000
-0:?       6.000000
-0:?       0.000000
-0:?       0.000000
-0:?       0.000000
-0:?       6.000000
-0:?       0.000000
-0:?     'curlybad1' (structure{uv2,s})
-0:?     'curlyInit' (const structure{uv2,s})
-0:?       1 (const uint)
-0:?       2 (const uint)
-0:?       3.000000
-0:?       4.000000
-0:?       0.000000
-0:?       0.000000
-0:?       0.000000
-0:?       4.000000
-0:?       0.000000
-0:?       5.000000
-0:?       6.000000
-0:?       0.000000
-0:?       0.000000
-0:?       0.000000
-0:?       6.000000
-0:?       0.000000
-0:?     'vc1' (float)
-0:?     'vc2' (float)
-0:?     'vc3' (float)
-0:?     'av3' (3-component vector of float)
-0:?     'bv3' (3-component vector of float)
-
-
-Linked tessellation evaluation stage:
-
-ERROR: Linking tessellation evaluation stage: At least one shader must specify an input layout primitive
-
-input primitive = none
-vertex spacing = equal_spacing
-triangle order = ccw
-
diff --git a/Test/runtests b/Test/runtests
index 63cbd6ba6..5604bbb47 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -26,22 +26,23 @@ while read t; do
 done < testlist
 
 #
-# grouped shaders for link tests
+# grouped shaders for bulk (faster) tests
 #
-function runLinkTest {
+function runBulkTest {
     echo Running $*...
-    $EXE -i -l $* > $TARGETDIR/$1.out
+    $EXE -i -l -t $* > $TARGETDIR/$1.out
 	diff -b $BASEDIR/$1.out $TARGETDIR/$1.out
 }
 
-runLinkTest mains1.frag mains2.frag noMain1.geom noMain2.geom
-runLinkTest noMain.vert mains.frag
-runLinkTest link1.frag link2.frag link3.frag
-runLinkTest recurse1.vert recurse1.frag recurse2.frag
-runLinkTest 300link.frag
-runLinkTest 300link2.frag
-runLinkTest 300link3.frag
-runLinkTest empty.frag empty2.frag empty3.frag
+runBulkTest mains1.frag mains2.frag noMain1.geom noMain2.geom
+runBulkTest noMain.vert mains.frag
+runBulkTest link1.frag link2.frag link3.frag
+runBulkTest recurse1.vert recurse1.frag recurse2.frag
+runBulkTest 300link.frag
+runBulkTest 300link2.frag
+runBulkTest 300link3.frag
+runBulkTest empty.frag empty2.frag empty3.frag
+runBulkTest 150.tesc 150.tese 400.tesc 400.tese 410.tesc 420.tesc 420.tese
 
 #
 # reflection tests
diff --git a/Test/testlist b/Test/testlist
index ac63cbbf9..06f8b57fd 100644
--- a/Test/testlist
+++ b/Test/testlist
@@ -49,7 +49,6 @@ tokenLength.vert
 300scope.vert
 400.frag
 420.vert
-420.tesc
 420.geom
 420_size_gl_in.geom
 430scope.vert
@@ -57,11 +56,7 @@ lineContinuation100.vert
 lineContinuation.vert
 numeral.frag
 400.geom
-400.tesc
-400.tese
 410.geom
-410.tesc
-420.tese
 430.vert
 430.comp
 dce.frag
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index fd61d29eb..579257d7d 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 "24530"
-#define GLSLANG_DATE     "2013/12/16 16:58:15"
+#define GLSLANG_REVISION "24551"
+#define GLSLANG_DATE     "2013/12/17 20:06:24"
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index ac576f228..a421c0eb8 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -811,7 +811,7 @@ void TBuiltIns::initialize(int version, EProfile profile)
         //
         //============================================================================
 
-        if (version >= 400)
+        if (version >= 150)
             stageBuiltins[EShLangTessControl].append(
                 "void barrier();"
                 );
@@ -1255,7 +1255,7 @@ void TBuiltIns::initialize(int version, EProfile profile)
     //
     //============================================================================
 
-    if (version >= 400) {
+    if (version >= 150) {
         // Note:  "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
         // as it depends on the resource sizing of gl_MaxPatchVertices.
 
@@ -1293,7 +1293,7 @@ void TBuiltIns::initialize(int version, EProfile profile)
     //
     //============================================================================
 
-    if (version >= 400) {
+    if (version >= 150) {
         // Note:  "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
         // as it depends on the resource sizing of gl_MaxPatchVertices.
 
@@ -2001,7 +2001,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
         }
 
         // tessellation
-        if (version >= 400) {
+        if (version >= 150) {
             snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlInputComponents = %d;", resources.maxTessControlInputComponents);
             s.append(builtInConstant);
             snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlOutputComponents = %d;", resources.maxTessControlOutputComponents);
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index 9077ca696..9fb381b57 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -654,6 +654,11 @@ int TScanContext::tokenizeIdentifier()
         return keyword;
 
     case PATCH:
+        if (parseContext.symbolTable.atBuiltInLevel() || parseContext.extensionsTurnedOn(1, &GL_ARB_tessellation_shader))
+            return es30ReservedFromGLSL(150);
+        else
+            return es30ReservedFromGLSL(400);
+
     case SAMPLE:
     case SUBROUTINE:
         return es30ReservedFromGLSL(400);
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index 53f9451ed..d7810832e 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -191,7 +191,7 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TS
     // do the per-stage tables
     InitializeStageSymbolTable(builtIns, version, profile, EShLangVertex, infoSink, commonTable, symbolTables);
     InitializeStageSymbolTable(builtIns, version, profile, EShLangFragment, infoSink, commonTable, symbolTables);
-    if (profile != EEsProfile && version >= 400) {
+    if (profile != EEsProfile && version >= 150) {
         InitializeStageSymbolTable(builtIns, version, profile, EShLangTessControl, infoSink, commonTable, symbolTables);
         InitializeStageSymbolTable(builtIns, version, profile, EShLangTessEvaluation, infoSink, commonTable, symbolTables);
     }
@@ -353,10 +353,10 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
         break;
     case EShLangTessControl:
     case EShLangTessEvaluation:
-        if (version < 400 || (profile != ECoreProfile && profile != ECompatibilityProfile)) {
+        if (version < 150 || (profile != ECoreProfile && profile != ECompatibilityProfile)) {
             correct = false;
-            infoSink.info.message(EPrefixError, "#version: tessellation shaders require non-es profile and version 400 or above");
-            version = 400;
+            infoSink.info.message(EPrefixError, "#version: tessellation shaders require non-es profile and version 150 or above");
+            version = 150;
             profile = ECoreProfile;
         }
         break;
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 758f8d687..d0997b816 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -85,7 +85,7 @@ const char* const GL_ARB_shading_language_420pack = "GL_ARB_shading_language_420
 const char* const GL_ARB_texture_gather           = "GL_ARB_texture_gather";
 const char* const GL_ARB_gpu_shader5              = "GL_ARB_gpu_shader5";
 const char* const GL_ARB_separate_shader_objects  = "GL_ARB_separate_shader_objects";
-const char* const GL_ARB_tessellation_shader      = "GL_ARB_tessellation_shader";       // TODO: tessellation: make this extension work on version 150 and above shaders
+const char* const GL_ARB_tessellation_shader      = "GL_ARB_tessellation_shader";
 
 } // end namespace glslang
 
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index cd20b3efc..7e4f6e7bd 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1227,7 +1227,6 @@ storage_qualifier
     | PATCH {
         parseContext.globalCheck($1.loc, "patch");
         parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
-        parseContext.profileRequires($1.loc, ~EEsProfile, 400, 1, &GL_ARB_tessellation_shader, "patch");
         $$.init($1.loc);
         $$.qualifier.patch = true;
     }
-- 
GitLab