Add AST tests for ray tracing shaders

with subgroup touch tests (error and non-error cases)
Currently the subgroup built-ins are NOT giving the correct output.
This is fixed in the next commit.
diff --git a/Test/glsl.460.subgroup.rahit b/Test/glsl.460.subgroup.rahit
new file mode 100644
index 0000000..3ee7378
--- /dev/null
+++ b/Test/glsl.460.subgroup.rahit
@@ -0,0 +1,255 @@
+#version 460
+#extension GL_NV_ray_tracing : enable
+
+vec4 undeclared_errors(vec4 f4)
+{
+  vec4 result;
+  gl_SubgroupSize;               // ERROR, extension not enabled (basic)
+  gl_SubgroupInvocationID;       // ERROR, extension not enabled (basic)
+  subgroupBarrier();             // ERROR, extension not enabled (basic)
+  subgroupMemoryBarrier();       // ERROR, extension not enabled (basic)
+  subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic)
+  subgroupMemoryBarrierImage();  // ERROR, extension not enabled (basic)
+  subgroupElect();               // ERROR, extension not enabled (basic)
+  gl_NumSubgroups;               // ERROR, only defined in compute
+  gl_SubgroupID;                 // ERROR, only defined in compute
+  subgroupMemoryBarrierShared(); // ERROR, only defined in compute
+
+  subgroupAll(true);        // ERROR extension not enabled (vote)
+  subgroupAny(false);       // ERROR extension not enabled (vote)
+  subgroupAllEqual(f4);     // ERROR extension not enabled (vote)
+
+  gl_SubgroupEqMask;                        // ERROR extension not enabled (ballot)
+  gl_SubgroupGeMask;                        // ERROR extension not enabled (ballot)
+  gl_SubgroupGtMask;                        // ERROR extension not enabled (ballot)
+  gl_SubgroupLeMask;                        // ERROR extension not enabled (ballot)
+  gl_SubgroupLtMask;                        // ERROR extension not enabled (ballot)
+  subgroupBroadcast(f4, 0);                 // ERROR extension not enabled (ballot)
+  subgroupBroadcastFirst(f4);               // ERROR extension not enabled (ballot)
+  uvec4 ballot = subgroupBallot(false);     // ERROR extension not enabled (ballot)
+  subgroupInverseBallot(uvec4(0x1));        // ERROR extension not enabled (ballot)
+  subgroupBallotBitExtract(ballot, 0);      // ERROR extension not enabled (ballot)
+  subgroupBallotBitCount(ballot);           // ERROR extension not enabled (ballot)
+  subgroupBallotInclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)
+  subgroupBallotExclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)
+  subgroupBallotFindLSB(ballot);            // ERROR extension not enabled (ballot)
+  subgroupBallotFindMSB(ballot);            // ERROR extension not enabled (ballot)
+
+  subgroupShuffle(f4, 0);           // ERROR extension not enabled (shuffle)
+  subgroupShuffleXor(f4, 0x1);      // ERROR extension not enabled (shuffle)
+  subgroupShuffleUp(f4, 1);         // ERROR extension not enabled (shuffle_relative)
+  subgroupShuffleDown(f4, 1);       // ERROR extension not enabled (shuffle_relative)
+
+  result = subgroupAdd(f4);         // ERROR, extension not enabled (arith)
+  subgroupMul(f4);                  // ERROR, extension not enabled (arith)
+  subgroupMin(f4);                  // ERROR, extension not enabled (arith)
+  subgroupMax(f4);                  // ERROR, extension not enabled (arith)
+  subgroupAnd(ballot);              // ERROR, extension not enabled (arith)
+  subgroupOr(ballot);               // ERROR, extension not enabled (arith)
+  subgroupXor(ballot);              // ERROR, extension not enabled (arith)
+  subgroupInclusiveAdd(f4);         // ERROR, extension not enabled (arith)
+  subgroupInclusiveMul(f4);         // ERROR, extension not enabled (arith)
+  subgroupInclusiveMin(f4);         // ERROR, extension not enabled (arith)
+  subgroupInclusiveMax(f4);         // ERROR, extension not enabled (arith)
+  subgroupInclusiveAnd(ballot);     // ERROR, extension not enabled (arith)
+  subgroupInclusiveOr(ballot);      // ERROR, extension not enabled (arith)
+  subgroupInclusiveXor(ballot);     // ERROR, extension not enabled (arith)
+  subgroupExclusiveAdd(f4);         // ERROR, extension not enabled (arith)
+  subgroupExclusiveMul(f4);         // ERROR, extension not enabled (arith)
+  subgroupExclusiveMin(f4);         // ERROR, extension not enabled (arith)
+  subgroupExclusiveMax(f4);         // ERROR, extension not enabled (arith)
+  subgroupExclusiveAnd(ballot);     // ERROR, extension not enabled (arith)
+  subgroupExclusiveOr(ballot);      // ERROR, extension not enabled (arith)
+  subgroupExclusiveXor(ballot);     // ERROR, extension not enabled (arith)
+
+  subgroupClusteredAdd(f4, 2);      // ERROR, extension not enabled (clustered)
+  subgroupClusteredMul(f4, 2);      // ERROR, extension not enabled (clustered)
+  subgroupClusteredMin(f4, 2);      // ERROR, extension not enabled (clustered)
+  subgroupClusteredMax(f4, 2);      // ERROR, extension not enabled (clustered)
+  subgroupClusteredAnd(ballot, 2);  // ERROR, extension not enabled (clustered)
+  subgroupClusteredOr(ballot, 2);   // ERROR, extension not enabled (clustered)
+  subgroupClusteredXor(ballot, 2);  // ERROR, extension not enabled (clustered)
+
+  subgroupQuadBroadcast(f4, 0);     // ERROR, extension not enabled (quad)
+  subgroupQuadSwapHorizontal(f4);   // ERROR, extension not enabled (quad)
+  subgroupQuadSwapVertical(f4);     // ERROR, extension not enabled (quad)
+  subgroupQuadSwapDiagonal(f4);     // ERROR, extension not enabled (quad)
+
+  uvec4 parti = subgroupPartitionNV(f4);                // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedAddNV(f4, parti);                  // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedMulNV(f4, parti);                  // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedMinNV(f4, parti);                  // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedMaxNV(f4, parti);                  // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedAndNV(ballot, parti);              // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedOrNV(ballot, parti);               // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedXorNV(ballot, parti);              // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedInclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)
+  subgroupPartitionedExclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)
+
+  return result;
+}
+
+
+layout(location = 1) rayPayloadInNV vec4 incomingPayload;
+void main()
+{
+	uvec3 v0 = gl_LaunchIDNV;
+	uvec3 v1 = gl_LaunchSizeNV;
+	int v2 = gl_PrimitiveID;
+	int v3 = gl_InstanceID;
+	int v4 = gl_InstanceCustomIndexNV;
+	vec3 v5 = gl_WorldRayOriginNV;
+	vec3 v6 = gl_WorldRayDirectionNV;
+	vec3 v7 = gl_ObjectRayOriginNV;
+	vec3 v8 = gl_ObjectRayDirectionNV;
+	float v9 = gl_RayTminNV;
+	float v10 = gl_RayTmaxNV;
+	float v11 = gl_HitTNV;
+	uint v12 = gl_HitKindNV;
+	mat4x3 v13 = gl_ObjectToWorldNV;
+	mat4x3 v14 = gl_WorldToObjectNV;
+	incomingPayload = vec4(0.5f);
+	if (v2 == 1)
+	    ignoreIntersectionNV();
+	else
+	    terminateRayNV();
+}
+
+#extension GL_KHR_shader_subgroup_basic: enable
+void basic_works (void)
+{
+  gl_SubgroupSize;
+  gl_SubgroupInvocationID;
+  subgroupBarrier();
+  subgroupMemoryBarrier();
+  subgroupMemoryBarrierBuffer();
+  subgroupMemoryBarrierImage();
+  subgroupElect();
+}
+
+#extension GL_KHR_shader_subgroup_ballot: enable
+void ballot_works(vec4 f4) {
+  gl_SubgroupEqMask;
+  gl_SubgroupGeMask;
+  gl_SubgroupGtMask;
+  gl_SubgroupLeMask;
+  gl_SubgroupLtMask;
+  subgroupBroadcast(f4, 0);
+  subgroupBroadcastFirst(f4);
+  uvec4 ballot = subgroupBallot(false);
+  subgroupInverseBallot(uvec4(0x1));
+  subgroupBallotBitExtract(ballot, 0);
+  subgroupBallotBitCount(ballot);
+  subgroupBallotInclusiveBitCount(ballot);
+  subgroupBallotExclusiveBitCount(ballot);
+  subgroupBallotFindLSB(ballot);
+  subgroupBallotFindMSB(ballot);
+}
+
+#extension GL_KHR_shader_subgroup_vote: enable
+void vote_works(vec4 f4)
+{
+  subgroupAll(true);
+  subgroupAny(false);
+  subgroupAllEqual(f4);
+}
+
+#extension GL_KHR_shader_subgroup_shuffle: enable
+#extension GL_KHR_shader_subgroup_shuffle_relative: enable
+void shuffle_works(vec4 f4)
+{
+  subgroupShuffle(f4, 0);
+  subgroupShuffleXor(f4, 0x1);
+  subgroupShuffleUp(f4, 1);
+  subgroupShuffleDown(f4, 1);
+}
+
+#extension GL_KHR_shader_subgroup_arithmetic: enable
+void arith_works(vec4 f4)
+{
+  uvec4 ballot;
+  subgroupAdd(f4);
+  subgroupMul(f4);
+  subgroupMin(f4);
+  subgroupMax(f4);
+  subgroupAnd(ballot);
+  subgroupOr(ballot);
+  subgroupXor(ballot);
+  subgroupInclusiveAdd(f4);
+  subgroupInclusiveMul(f4);
+  subgroupInclusiveMin(f4);
+  subgroupInclusiveMax(f4);
+  subgroupInclusiveAnd(ballot);
+  subgroupInclusiveOr(ballot);
+  subgroupInclusiveXor(ballot);
+  subgroupExclusiveAdd(f4);
+  subgroupExclusiveMul(f4);
+  subgroupExclusiveMin(f4);
+  subgroupExclusiveMax(f4);
+  subgroupExclusiveAnd(ballot);
+  subgroupExclusiveOr(ballot);
+  subgroupExclusiveXor(ballot);
+}
+
+#extension GL_KHR_shader_subgroup_clustered: enable
+void clustered_works(vec4 f4)
+{
+  uvec4 ballot = uvec4(0x55,0,0,0);
+  subgroupClusteredAdd(f4, 2);
+  subgroupClusteredMul(f4, 2);
+  subgroupClusteredMin(f4, 2);
+  subgroupClusteredMax(f4, 2);
+  subgroupClusteredAnd(ballot, 2);
+  subgroupClusteredOr(ballot, 2);
+  subgroupClusteredXor(ballot, 2);
+}
+
+#extension GL_KHR_shader_subgroup_quad: enable
+void quad_works(vec4 f4)
+{
+  subgroupQuadBroadcast(f4, 0);
+  subgroupQuadSwapHorizontal(f4);
+  subgroupQuadSwapVertical(f4);
+  subgroupQuadSwapDiagonal(f4);
+}
+
+#extension GL_NV_shader_subgroup_partitioned: enable
+void partitioned_works(vec4 f4)
+{
+  uvec4 parti = subgroupPartitionNV(f4);
+  uvec4 ballot = uvec4(0x55,0,0,0);
+  subgroupPartitionedAddNV(f4, parti);
+  subgroupPartitionedMulNV(f4, parti);
+  subgroupPartitionedMinNV(f4, parti);
+  subgroupPartitionedMaxNV(f4, parti);
+  subgroupPartitionedAndNV(ballot, parti);
+  subgroupPartitionedOrNV(ballot, parti);
+  subgroupPartitionedXorNV(ballot, parti);
+  subgroupPartitionedInclusiveAddNV(f4, parti);
+  subgroupPartitionedInclusiveMulNV(f4, parti);
+  subgroupPartitionedInclusiveMinNV(f4, parti);
+  subgroupPartitionedInclusiveMaxNV(f4, parti);
+  subgroupPartitionedInclusiveAndNV(ballot, parti);
+  subgroupPartitionedInclusiveOrNV(ballot, parti);
+  subgroupPartitionedInclusiveXorNV(ballot, parti);
+  subgroupPartitionedExclusiveAddNV(f4, parti);
+  subgroupPartitionedExclusiveMulNV(f4, parti);
+  subgroupPartitionedExclusiveMinNV(f4, parti);
+  subgroupPartitionedExclusiveMaxNV(f4, parti);
+  subgroupPartitionedExclusiveAndNV(ballot, parti);
+  subgroupPartitionedExclusiveOrNV(ballot, parti);
+  subgroupPartitionedExclusiveXorNV(ballot, parti);
+}
+