Snap for 7570015 from db114a3f94e5185846a457adcabf76f247ed170a to mainline-sdkext-release

Change-Id: I347fb8a360ac29c933560a4f44e2f3a932eb7f8d
diff --git a/.appveyor.yml b/.appveyor.yml
index 44d5f04..500d4bd 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -4,7 +4,7 @@
 # build version format
 version: "{build}"
 
-os: Visual Studio 2013
+os: Visual Studio 2015
 
 platform:
   - x64
@@ -48,9 +48,6 @@
   - C:/Python27/python.exe update_glslang_sources.py
   - set PATH=C:\ninja;C:\Python36;%PATH%
   - git clone https://github.com/google/googletest.git External/googletest
-  - cd External/googletest
-  - git checkout 440527a61e1c91188195f7de212c63c77e8f0a45
-  - cd ../..
 
 build:
   parallel: true  # enable MSBuild parallel builds
@@ -58,7 +55,7 @@
 
 build_script:
   - mkdir build && cd build
-  - cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=install ..
+  - cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=install ..
   - cmake --build . --config %CONFIGURATION% --target install
 
 test_script:
@@ -105,4 +102,4 @@
     force_update: true
     on:
       branch: master
-      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
+      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
diff --git a/.gitattributes b/.gitattributes
old mode 100755
new mode 100644
diff --git a/.gitignore b/.gitignore
index a1fe394..ab25cec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,9 +2,19 @@
 *.a
 *.so
 *.exe
+.vscode/
 tags
 TAGS
+bazel-*
 build/
 Test/localResults/
 External/googletest
 External/spirv-tools
+out/
+
+# GN generated files
+.cipd/
+*.gclient_entries
+third_party/
+buildtools/
+tools/
diff --git a/.gn b/.gn
new file mode 100644
index 0000000..5befb80
--- /dev/null
+++ b/.gn
@@ -0,0 +1,39 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+buildconfig = "//build/config/BUILDCONFIG.gn"
+
+default_args = {
+    clang_use_chrome_plugins = false
+    use_custom_libcxx = false
+}
diff --git a/.travis.yml b/.travis.yml
index 1fa3fc0..87838b8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -61,7 +61,17 @@
     fi
 
 before_script:
-  - git clone --depth=1 https://github.com/google/googletest.git External/googletest
+  # check out pre-breakage version of googletest; can be deleted when
+  # issue 3128 is fixed
+  # git clone --depth=1 https://github.com/google/googletest.git External/googletest
+  - mkdir -p External/googletest
+  - cd External/googletest
+  - git init
+  - git remote add origin https://github.com/google/googletest.git
+  - git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725
+  - git reset --hard FETCH_HEAD
+  - cd ../..
+  # get spirv-tools and spirv-headers
   - ./update_glslang_sources.py
 
 script:
diff --git a/Android.bp b/Android.bp
index ac32ee3..528087c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,153 +1,232 @@
+
+// This file is derived (manually) from the CMake targets.
+// deqp depends on:
+// - glslang
+//   - OGLCompiler
+//   - OSDependent
+//   - MachineIndependent
+//     - OGLCompiler
+//     - OSDependent
+//     - GenericCodeGen
+// - SPIRV
+//   - MachineIndependent
+//     - ...
+// - SPVRemapper
+
+package {
+    default_applicable_licenses: ["external_deqp-deps_glslang_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+//
+// large-scale-change included anything that looked like it might be a license
+// text as a license_text. e.g. LICENSE, NOTICE, COPYING etc.
+//
+// Please consider removing redundant or irrelevant files from 'license_text:'.
+//
+// large-scale-change filtered out the below license kinds as false-positives:
+//   SPDX-license-identifier-GPL
+//   SPDX-license-identifier-GPL-3.0
+// See: http://go/android-license-faq
+license {
+    name: "external_deqp-deps_glslang_license",
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-Apache-2.0",
+        "SPDX-license-identifier-BSD",
+        "SPDX-license-identifier-MIT",
+    ],
+    license_text: [
+        "LICENSE",
+        "LICENSE.txt",
+    ],
+}
+
+genrule {
+    name: "deqp_glslang_gen_build_info_h",
+    srcs: ["CHANGES.md", "build_info.h.tmpl"],
+    out: ["glslang/build_info.h"],
+    cmd: "$(location) $$(dirname $(location CHANGES.md)) -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)",
+    tool_files: ["build_info.py"],
+}
+
 cc_defaults {
-    cpp_std: "c++11",
+    name: "deqp_glslang_defaults",
+    defaults: ["deqp_and_deps_defaults"],
     cppflags: [
-        "-DAMD_EXTENSIONS",
-        "-DENABLE_HLSL",
-        "-DGLSLANG_OSINCLUDE_UNIX",
-        "-DNV_EXTENSIONS",
-        "-Wall",
-        "-Werror",
-        "-fno-exceptions",
+        "-Wno-implicit-fallthrough",
+        "-Wno-missing-field-initializers",
+        "-Wno-unused-variable",
+        "-Wno-implicit-int-conversion",
+        "-Wno-sign-conversion",
     ],
     export_include_dirs: [
         ".",
     ],
-    name: "deqp_glslang_defaults",
-    rtti: false,
-    sdk_version: "27",
-    stl: "libc++_static",
+    generated_headers: [
+        "deqp_glslang_gen_build_info_h",
+    ],
 }
 
 cc_library_static {
+    name: "deqp_glslang_OSDependent",
     defaults: [
         "deqp_glslang_defaults",
     ],
     export_include_dirs: [
         "glslang/OSDependent",
     ],
-    name: "deqp_OSDependent",
     srcs: [
         "glslang/OSDependent/Unix/ossource.cpp",
     ],
 }
 
 cc_library_static {
+    name: "deqp_glslang_OGLCompiler",
     defaults: [
         "deqp_glslang_defaults",
     ],
     export_include_dirs: [
         "OGLCompilersDLL",
     ],
-    local_include_dirs: [
-        "OGLCompilersDLL",
-    ],
-    name: "deqp_OGLCompiler",
     srcs: [
         "OGLCompilersDLL/InitializeDll.cpp",
     ],
 }
 
 cc_library_static {
-    cppflags: [
-        "-Wno-implicit-fallthrough",
-    ],
+    name: "deqp_glslang_MachineIndependent",
     defaults: [
         "deqp_glslang_defaults",
     ],
-    local_include_dirs: [
-        ".",
-        "hlsl",
-    ],
-    name: "deqp_HLSL",
-    srcs: [
-        "hlsl/hlslAttributes.cpp",
-        "hlsl/hlslGrammar.cpp",
-        "hlsl/hlslOpMap.cpp",
-        "hlsl/hlslParseables.cpp",
-        "hlsl/hlslParseHelper.cpp",
-        "hlsl/hlslScanContext.cpp",
-        "hlsl/hlslTokenStream.cpp",
-    ],
-}
-
-cc_library_static {
-    cppflags: [
-        "-Wno-implicit-fallthrough",
-        "-Wno-missing-field-initializers",
-        "-Wno-unused-variable",
-    ],
-    defaults: [
-        "deqp_glslang_defaults",
-    ],
-    local_include_dirs: [
+    export_include_dirs: [
         "glslang/MachineIndependent",
+        "glslang/HLSL",
     ],
-    name: "deqp_glslang",
     srcs: [
-        "glslang/GenericCodeGen/CodeGen.cpp",
-        "glslang/GenericCodeGen/Link.cpp",
+//        "glslang/MachineIndependent/glslang.m4",
+//        "glslang/MachineIndependent/glslang.y",
+        "glslang/MachineIndependent/glslang_tab.cpp",
         "glslang/MachineIndependent/attribute.cpp",
         "glslang/MachineIndependent/Constant.cpp",
-        "glslang/MachineIndependent/glslang_tab.cpp",
+        "glslang/MachineIndependent/iomapper.cpp",
         "glslang/MachineIndependent/InfoSink.cpp",
         "glslang/MachineIndependent/Initialize.cpp",
-        "glslang/MachineIndependent/Intermediate.cpp",
-        "glslang/MachineIndependent/intermOut.cpp",
         "glslang/MachineIndependent/IntermTraverse.cpp",
-        "glslang/MachineIndependent/iomapper.cpp",
-        "glslang/MachineIndependent/limits.cpp",
-        "glslang/MachineIndependent/linkValidate.cpp",
-        "glslang/MachineIndependent/parseConst.cpp",
+        "glslang/MachineIndependent/Intermediate.cpp",
         "glslang/MachineIndependent/ParseContextBase.cpp",
         "glslang/MachineIndependent/ParseHelper.cpp",
         "glslang/MachineIndependent/PoolAlloc.cpp",
-        "glslang/MachineIndependent/propagateNoContraction.cpp",
-        "glslang/MachineIndependent/reflection.cpp",
         "glslang/MachineIndependent/RemoveTree.cpp",
         "glslang/MachineIndependent/Scan.cpp",
         "glslang/MachineIndependent/ShaderLang.cpp",
         "glslang/MachineIndependent/SymbolTable.cpp",
         "glslang/MachineIndependent/Versions.cpp",
+        "glslang/MachineIndependent/intermOut.cpp",
+        "glslang/MachineIndependent/limits.cpp",
+        "glslang/MachineIndependent/linkValidate.cpp",
+        "glslang/MachineIndependent/parseConst.cpp",
+        "glslang/MachineIndependent/reflection.cpp",
+        "glslang/MachineIndependent/preprocessor/Pp.cpp",
         "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
         "glslang/MachineIndependent/preprocessor/PpContext.cpp",
-        "glslang/MachineIndependent/preprocessor/Pp.cpp",
         "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
         "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
+        "glslang/MachineIndependent/propagateNoContraction.cpp",
+
+        "glslang/HLSL/hlslAttributes.cpp",
+        "glslang/HLSL/hlslParseHelper.cpp",
+        "glslang/HLSL/hlslScanContext.cpp",
+        "glslang/HLSL/hlslOpMap.cpp",
+        "glslang/HLSL/hlslTokenStream.cpp",
+        "glslang/HLSL/hlslGrammar.cpp",
+        "glslang/HLSL/hlslParseables.cpp",
     ],
     static_libs: [
-        "deqp_OSDependent",
-        "deqp_OGLCompiler",
-        "deqp_HLSL",
+        "deqp_glslang_OGLCompiler",
+        "deqp_glslang_OSDependent",
+        "deqp_glslang_GenericCodeGen",
     ],
 }
 
 cc_library_static {
-    cppflags: [
-        "-Wno-implicit-fallthrough",
-        "-Wno-unused-parameter",
+    name: "deqp_glslang_glslang",
+    defaults: [
+        "deqp_glslang_defaults",
     ],
+    export_include_dirs: [
+        "glslang",
+    ],
+    srcs: [
+        "glslang/CInterface/glslang_c_interface.cpp"
+    ],
+    static_libs: [
+        "deqp_glslang_OGLCompiler",
+        "deqp_glslang_OSDependent",
+        "deqp_glslang_MachineIndependent",
+    ],
+}
+
+cc_library_static {
+    name: "deqp_glslang_SPIRV",
     defaults: [
         "deqp_glslang_defaults",
     ],
     export_include_dirs: [
         "SPIRV",
     ],
-    local_include_dirs: [
-        "SPIRV",
-    ],
-    name: "deqp_SPIRV",
     srcs: [
         "SPIRV/GlslangToSpv.cpp",
         "SPIRV/InReadableOrder.cpp",
         "SPIRV/Logger.cpp",
-        "SPIRV/SPVRemapper.cpp",
         "SPIRV/SpvBuilder.cpp",
         "SPIRV/SpvPostProcess.cpp",
+        "SPIRV/doc.cpp",
         "SPIRV/SpvTools.cpp",
         "SPIRV/disassemble.cpp",
-        "SPIRV/doc.cpp",
+        "SPIRV/CInterface/spirv_c_interface.cpp",
     ],
     static_libs: [
-        "deqp_glslang",
+        "deqp_glslang_MachineIndependent",
+    ],
+}
+
+cc_library_static {
+    name: "deqp_glslang_SPVRemapper",
+    defaults: [
+        "deqp_glslang_defaults",
+    ],
+    export_include_dirs: [
+        "SPIRV",
+    ],
+    srcs: [
+        "SPIRV/SPVRemapper.cpp",
+        "SPIRV/doc.cpp",
+    ],
+}
+
+cc_library_static {
+    name: "deqp_glslang_GenericCodeGen",
+    defaults: [
+        "deqp_glslang_defaults",
+    ],
+    export_include_dirs: [
+        "glslang/GenericCodeGen",
+    ],
+    srcs: [
+        "glslang/GenericCodeGen/CodeGen.cpp",
+        "glslang/GenericCodeGen/Link.cpp",
     ],
 }
diff --git a/BUILD.bazel b/BUILD.bazel
index 5930608..bfb7797 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 package(
     default_visibility = ["//visibility:public"],
 )
@@ -10,6 +43,20 @@
 
 exports_files(["LICENSE"])
 
+# Build information generation script
+py_binary(
+    name = "build_info",
+    srcs = ["build_info.py"],
+)
+
+genrule(
+    name = "gen_build_info_h",
+    srcs = ["CHANGES.md", "build_info.h.tmpl"],
+    outs = ["glslang/build_info.h"],
+    cmd = "$(location build_info) $$(dirname $(location CHANGES.md)) -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)",
+    tools = [":build_info"],
+)
+
 COMMON_COPTS = select({
     "@bazel_tools//src/conditions:windows": [""],
     "//conditions:default": [
@@ -34,15 +81,13 @@
     srcs = glob(
         [
             "glslang/GenericCodeGen/*.cpp",
+            "glslang/HLSL/*.cpp",
             "glslang/MachineIndependent/*.cpp",
             "glslang/MachineIndependent/preprocessor/*.cpp",
-            "hlsl/*.cpp",
         ],
         exclude = [
-            "glslang/MachineIndependent/pch.cpp",
+            "glslang/HLSL/pch.h",
             "glslang/MachineIndependent/pch.h",
-            "hlsl/pch.cpp",
-            "hlsl/pch.h",
         ],
     ) + [
         "OGLCompilersDLL/InitializeDll.cpp",
@@ -53,15 +98,16 @@
             ["glslang/OSDependent/Unix/ossource.cpp"],
     }),
     hdrs = glob([
+        "glslang/HLSL/*.h",
         "glslang/Include/*.h",
         "glslang/MachineIndependent/*.h",
         "glslang/MachineIndependent/preprocessor/*.h",
-        "hlsl/*.h",
     ]) + [
         "OGLCompilersDLL/InitializeDll.h",
         "StandAlone/DirStackFileIncluder.h",
         "glslang/OSDependent/osinclude.h",
         "glslang/Public/ShaderLang.h",
+        ":gen_build_info_h",
     ],
     copts = COMMON_COPTS,
     defines = [
diff --git a/BUILD.gn b/BUILD.gn
index 49b4b0a..973ca98 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -46,169 +46,240 @@
   _configs_to_add = [ "//build/config/compiler:no_chromium_code" ]
 }
 
+action("glslang_build_info") {
+  script = "build_info.py"
+
+  src_dir = "."
+  changes_file = "CHANGES.md"
+  template_file = "build_info.h.tmpl"
+  out_file = "${target_gen_dir}/include/glslang/build_info.h"
+
+  inputs = [
+    changes_file,
+    script,
+    template_file,
+  ]
+  outputs = [ out_file ]
+  args = [
+    rebase_path(src_dir, root_build_dir),
+    "-i",
+    rebase_path(template_file, root_build_dir),
+    "-o",
+    rebase_path(out_file, root_build_dir),
+  ]
+}
+
 spirv_tools_dir = glslang_spirv_tools_dir
+if (!defined(glslang_angle)) {
+  glslang_angle = false
+}
 
 config("glslang_public") {
   include_dirs = [ "." ]
+  if (!is_win || is_clang) {
+    cflags = [ "-Wno-conversion" ]
+  }
+}
 
+config("glslang_hlsl") {
   defines = [ "ENABLE_HLSL=1" ]
 }
 
-source_set("glslang_sources") {
-  public_configs = [ ":glslang_public" ]
+template("glslang_sources_common") {
+  source_set(target_name) {
+    public_configs = [ ":glslang_public" ]
 
-  sources = [
-    "OGLCompilersDLL/InitializeDll.cpp",
-    "OGLCompilersDLL/InitializeDll.h",
-    "SPIRV/GLSL.ext.AMD.h",
-    "SPIRV/GLSL.ext.EXT.h",
-    "SPIRV/GLSL.ext.KHR.h",
-    "SPIRV/GLSL.ext.NV.h",
-    "SPIRV/GLSL.std.450.h",
-    "SPIRV/GlslangToSpv.cpp",
-    "SPIRV/GlslangToSpv.h",
-    "SPIRV/InReadableOrder.cpp",
-    "SPIRV/Logger.cpp",
-    "SPIRV/Logger.h",
-    "SPIRV/NonSemanticDebugPrintf.h",
-    "SPIRV/SPVRemapper.cpp",
-    "SPIRV/SPVRemapper.h",
-    "SPIRV/SpvBuilder.cpp",
-    "SPIRV/SpvBuilder.h",
-    "SPIRV/SpvPostProcess.cpp",
-    "SPIRV/SpvTools.cpp",
-    "SPIRV/SpvTools.h",
-    "SPIRV/bitutils.h",
-    "SPIRV/disassemble.cpp",
-    "SPIRV/disassemble.h",
-    "SPIRV/doc.cpp",
-    "SPIRV/doc.h",
-    "SPIRV/hex_float.h",
-    "SPIRV/spirv.hpp",
-    "SPIRV/spvIR.h",
-    "glslang/GenericCodeGen/CodeGen.cpp",
-    "glslang/GenericCodeGen/Link.cpp",
-    "glslang/Include/BaseTypes.h",
-    "glslang/Include/Common.h",
-    "glslang/Include/ConstantUnion.h",
-    "glslang/Include/InfoSink.h",
-    "glslang/Include/InitializeGlobals.h",
-    "glslang/Include/PoolAlloc.h",
-    "glslang/Include/ResourceLimits.h",
-    "glslang/Include/ShHandle.h",
-    "glslang/Include/Types.h",
-    "glslang/Include/arrays.h",
-    "glslang/Include/intermediate.h",
-    "glslang/Include/revision.h",
-    "glslang/MachineIndependent/Constant.cpp",
-    "glslang/MachineIndependent/InfoSink.cpp",
-    "glslang/MachineIndependent/Initialize.cpp",
-    "glslang/MachineIndependent/Initialize.h",
-    "glslang/MachineIndependent/IntermTraverse.cpp",
-    "glslang/MachineIndependent/Intermediate.cpp",
-    "glslang/MachineIndependent/LiveTraverser.h",
-    "glslang/MachineIndependent/ParseContextBase.cpp",
-    "glslang/MachineIndependent/ParseHelper.cpp",
-    "glslang/MachineIndependent/ParseHelper.h",
-    "glslang/MachineIndependent/PoolAlloc.cpp",
-    "glslang/MachineIndependent/RemoveTree.cpp",
-    "glslang/MachineIndependent/RemoveTree.h",
-    "glslang/MachineIndependent/Scan.cpp",
-    "glslang/MachineIndependent/Scan.h",
-    "glslang/MachineIndependent/ScanContext.h",
-    "glslang/MachineIndependent/ShaderLang.cpp",
-    "glslang/MachineIndependent/SymbolTable.cpp",
-    "glslang/MachineIndependent/SymbolTable.h",
-    "glslang/MachineIndependent/Versions.cpp",
-    "glslang/MachineIndependent/Versions.h",
-    "glslang/MachineIndependent/attribute.cpp",
-    "glslang/MachineIndependent/attribute.h",
-    "glslang/MachineIndependent/gl_types.h",
-    "glslang/MachineIndependent/glslang_tab.cpp",
-    "glslang/MachineIndependent/glslang_tab.cpp.h",
-    "glslang/MachineIndependent/intermOut.cpp",
-    "glslang/MachineIndependent/iomapper.cpp",
-    "glslang/MachineIndependent/iomapper.h",
-    "glslang/MachineIndependent/limits.cpp",
-    "glslang/MachineIndependent/linkValidate.cpp",
-    "glslang/MachineIndependent/localintermediate.h",
-    "glslang/MachineIndependent/parseConst.cpp",
-    "glslang/MachineIndependent/parseVersions.h",
-    "glslang/MachineIndependent/preprocessor/Pp.cpp",
-    "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
-    "glslang/MachineIndependent/preprocessor/PpContext.cpp",
-    "glslang/MachineIndependent/preprocessor/PpContext.h",
-    "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
-    "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
-    "glslang/MachineIndependent/preprocessor/PpTokens.h",
-    "glslang/MachineIndependent/propagateNoContraction.cpp",
-    "glslang/MachineIndependent/propagateNoContraction.h",
-    "glslang/MachineIndependent/reflection.cpp",
-    "glslang/MachineIndependent/reflection.h",
-    "glslang/OSDependent/osinclude.h",
-    "glslang/Public/ShaderLang.h",
-    "hlsl/hlslAttributes.cpp",
-    "hlsl/hlslAttributes.h",
-    "hlsl/hlslGrammar.cpp",
-    "hlsl/hlslGrammar.h",
-    "hlsl/hlslOpMap.cpp",
-    "hlsl/hlslOpMap.h",
-    "hlsl/hlslParseHelper.cpp",
-    "hlsl/hlslParseHelper.h",
-    "hlsl/hlslParseables.cpp",
-    "hlsl/hlslParseables.h",
-    "hlsl/hlslScanContext.cpp",
-    "hlsl/hlslScanContext.h",
-    "hlsl/hlslTokenStream.cpp",
-    "hlsl/hlslTokenStream.h",
-    "hlsl/hlslTokens.h",
-  ]
+    if (invoker.enable_hlsl) {
+      public_configs += [ ":glslang_hlsl" ]
+    }
 
-  defines = [ "ENABLE_OPT=1" ]
-
-  if (is_win) {
-    sources += [ "glslang/OSDependent/Windows/ossource.cpp" ]
-    defines += [ "GLSLANG_OSINCLUDE_WIN32" ]
-  } else {
-    sources += [ "glslang/OSDependent/Unix/ossource.cpp" ]
-    defines += [ "GLSLANG_OSINCLUDE_UNIX" ]
-  }
-
-  if (is_clang) {
-    cflags = [
-      "-Wno-extra-semi",
-      "-Wno-ignored-qualifiers",
-      "-Wno-implicit-fallthrough",
-      "-Wno-inconsistent-missing-override",
-      "-Wno-sign-compare",
-      "-Wno-unused-variable",
-      "-Wno-missing-field-initializers",
-      "-Wno-newline-eof",
+    sources = [
+      "OGLCompilersDLL/InitializeDll.cpp",
+      "OGLCompilersDLL/InitializeDll.h",
+      "SPIRV/GLSL.ext.AMD.h",
+      "SPIRV/GLSL.ext.EXT.h",
+      "SPIRV/GLSL.ext.KHR.h",
+      "SPIRV/GLSL.ext.NV.h",
+      "SPIRV/GLSL.std.450.h",
+      "SPIRV/GlslangToSpv.cpp",
+      "SPIRV/GlslangToSpv.h",
+      "SPIRV/InReadableOrder.cpp",
+      "SPIRV/Logger.cpp",
+      "SPIRV/Logger.h",
+      "SPIRV/NonSemanticDebugPrintf.h",
+      "SPIRV/SPVRemapper.cpp",
+      "SPIRV/SPVRemapper.h",
+      "SPIRV/SpvBuilder.cpp",
+      "SPIRV/SpvBuilder.h",
+      "SPIRV/SpvPostProcess.cpp",
+      "SPIRV/SpvTools.h",
+      "SPIRV/bitutils.h",
+      "SPIRV/disassemble.cpp",
+      "SPIRV/disassemble.h",
+      "SPIRV/doc.cpp",
+      "SPIRV/doc.h",
+      "SPIRV/hex_float.h",
+      "SPIRV/spirv.hpp",
+      "SPIRV/spvIR.h",
+      "glslang/GenericCodeGen/CodeGen.cpp",
+      "glslang/GenericCodeGen/Link.cpp",
+      "glslang/Include/BaseTypes.h",
+      "glslang/Include/Common.h",
+      "glslang/Include/ConstantUnion.h",
+      "glslang/Include/InfoSink.h",
+      "glslang/Include/InitializeGlobals.h",
+      "glslang/Include/PoolAlloc.h",
+      "glslang/Include/ResourceLimits.h",
+      "glslang/Include/ShHandle.h",
+      "glslang/Include/Types.h",
+      "glslang/Include/arrays.h",
+      "glslang/Include/intermediate.h",
+      "glslang/MachineIndependent/Constant.cpp",
+      "glslang/MachineIndependent/InfoSink.cpp",
+      "glslang/MachineIndependent/Initialize.cpp",
+      "glslang/MachineIndependent/Initialize.h",
+      "glslang/MachineIndependent/IntermTraverse.cpp",
+      "glslang/MachineIndependent/Intermediate.cpp",
+      "glslang/MachineIndependent/LiveTraverser.h",
+      "glslang/MachineIndependent/ParseContextBase.cpp",
+      "glslang/MachineIndependent/ParseHelper.cpp",
+      "glslang/MachineIndependent/ParseHelper.h",
+      "glslang/MachineIndependent/PoolAlloc.cpp",
+      "glslang/MachineIndependent/RemoveTree.cpp",
+      "glslang/MachineIndependent/RemoveTree.h",
+      "glslang/MachineIndependent/Scan.cpp",
+      "glslang/MachineIndependent/Scan.h",
+      "glslang/MachineIndependent/ScanContext.h",
+      "glslang/MachineIndependent/ShaderLang.cpp",
+      "glslang/MachineIndependent/SymbolTable.cpp",
+      "glslang/MachineIndependent/SymbolTable.h",
+      "glslang/MachineIndependent/Versions.cpp",
+      "glslang/MachineIndependent/Versions.h",
+      "glslang/MachineIndependent/attribute.cpp",
+      "glslang/MachineIndependent/attribute.h",
+      "glslang/MachineIndependent/gl_types.h",
+      "glslang/MachineIndependent/glslang_tab.cpp",
+      "glslang/MachineIndependent/glslang_tab.cpp.h",
+      "glslang/MachineIndependent/intermOut.cpp",
+      "glslang/MachineIndependent/iomapper.cpp",
+      "glslang/MachineIndependent/iomapper.h",
+      "glslang/MachineIndependent/limits.cpp",
+      "glslang/MachineIndependent/linkValidate.cpp",
+      "glslang/MachineIndependent/localintermediate.h",
+      "glslang/MachineIndependent/parseConst.cpp",
+      "glslang/MachineIndependent/parseVersions.h",
+      "glslang/MachineIndependent/preprocessor/Pp.cpp",
+      "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
+      "glslang/MachineIndependent/preprocessor/PpContext.cpp",
+      "glslang/MachineIndependent/preprocessor/PpContext.h",
+      "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
+      "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
+      "glslang/MachineIndependent/preprocessor/PpTokens.h",
+      "glslang/MachineIndependent/propagateNoContraction.cpp",
+      "glslang/MachineIndependent/propagateNoContraction.h",
+      "glslang/MachineIndependent/reflection.cpp",
+      "glslang/MachineIndependent/reflection.h",
+      "glslang/OSDependent/osinclude.h",
+      "glslang/Public/ShaderLang.h",
     ]
-  }
-  if (is_win && !is_clang) {
-    cflags = [
-      "/wd4018",  # signed/unsigned mismatch
-      "/wd4189",  # local variable is initialized but not referenced
+
+    # Workaround gn issue complaining about these not being allowed even though GLSLANG_HLSL is not
+    # defined.
+    sources += [
+      "glslang/HLSL/hlslParseHelper.h",
+      "glslang/HLSL/hlslParseables.h",
+      "glslang/HLSL/hlslScanContext.h",
+      "glslang/HLSL/hlslTokens.h",
     ]
+
+    if (invoker.enable_hlsl) {
+      sources += [
+        "glslang/HLSL/hlslAttributes.cpp",
+        "glslang/HLSL/hlslAttributes.h",
+        "glslang/HLSL/hlslGrammar.cpp",
+        "glslang/HLSL/hlslGrammar.h",
+        "glslang/HLSL/hlslOpMap.cpp",
+        "glslang/HLSL/hlslOpMap.h",
+        "glslang/HLSL/hlslParseHelper.cpp",
+        "glslang/HLSL/hlslParseables.cpp",
+        "glslang/HLSL/hlslScanContext.cpp",
+        "glslang/HLSL/hlslTokenStream.cpp",
+        "glslang/HLSL/hlslTokenStream.h",
+      ]
+    }
+
+    defines = []
+    if (invoker.enable_opt) {
+      sources += [ "SPIRV/SpvTools.cpp" ]
+      defines += [ "ENABLE_OPT=1" ]
+    }
+    if (invoker.is_angle) {
+      defines += [ "GLSLANG_ANGLE" ]
+    }
+
+    if (is_win) {
+      sources += [ "glslang/OSDependent/Windows/ossource.cpp" ]
+      defines += [ "GLSLANG_OSINCLUDE_WIN32" ]
+    } else {
+      sources += [ "glslang/OSDependent/Unix/ossource.cpp" ]
+      defines += [ "GLSLANG_OSINCLUDE_UNIX" ]
+    }
+
+    if (is_clang) {
+      cflags = [
+        "-Wno-extra-semi",
+        "-Wno-ignored-qualifiers",
+        "-Wno-implicit-fallthrough",
+        "-Wno-inconsistent-missing-override",
+        "-Wno-missing-field-initializers",
+        "-Wno-newline-eof",
+        "-Wno-sign-compare",
+        "-Wno-suggest-destructor-override",
+        "-Wno-suggest-override",
+        "-Wno-unused-variable",
+      ]
+    }
+    if (is_win && !is_clang) {
+      cflags = [
+        "/wd4018",  # signed/unsigned mismatch
+        "/wd4189",  # local variable is initialized but not referenced
+      ]
+    }
+
+    include_dirs = [ "${target_gen_dir}/include" ]
+
+    deps = [ ":glslang_build_info" ]
+
+    if (invoker.enable_opt) {
+      deps += [
+        "${spirv_tools_dir}:spvtools_opt",
+        "${spirv_tools_dir}:spvtools_val",
+      ]
+      include_dirs += [ "${spirv_tools_dir}/include" ]
+    }
+
+    configs -= _configs_to_remove
+    configs += _configs_to_add
   }
+}
 
-  deps = [
-    "${spirv_tools_dir}:spvtools_opt",
-    "${spirv_tools_dir}:spvtools_val",
-  ]
+glslang_sources_common("glslang_lib_sources") {
+  enable_opt = !glslang_angle
+  enable_hlsl = !glslang_angle
+  is_angle = glslang_angle
+}
 
-  configs -= _configs_to_remove
-  configs += _configs_to_add
+glslang_sources_common("glslang_sources") {
+  enable_opt = true
+  enable_hlsl = true
+  is_angle = false
 }
 
 source_set("glslang_default_resource_limits_sources") {
   sources = [
     "StandAlone/ResourceLimits.cpp",
     "StandAlone/ResourceLimits.h",
-  ]
-  deps = [
-    ":glslang_sources",
+    "glslang/Include/ResourceLimits.h",
   ]
   public_configs = [ ":glslang_public" ]
 
@@ -226,22 +297,27 @@
   }
   defines = [ "ENABLE_OPT=1" ]
   deps = [
+    ":glslang_build_info",
     ":glslang_default_resource_limits_sources",
     ":glslang_sources",
   ]
+  public_configs = [ ":glslang_hlsl" ]
+
+  include_dirs = [
+    "${target_gen_dir}/include",
+    "${spirv_tools_dir}/include",
+  ]
 
   configs -= _configs_to_remove
   configs += _configs_to_add
 }
 
 executable("spirv-remap") {
-  sources = [
-    "StandAlone/spirv-remap.cpp",
-  ]
+  sources = [ "StandAlone/spirv-remap.cpp" ]
   defines = [ "ENABLE_OPT=1" ]
-  deps = [
-    ":glslang_sources",
-  ]
+  deps = [ ":glslang_sources" ]
+
+  include_dirs = [ "${spirv_tools_dir}/include" ]
 
   configs -= _configs_to_remove
   configs += _configs_to_add
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..6328041
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,34 @@
+# Revision history for `glslang`
+
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](https://semver.org/).
+
+## 11.0.0 2020-07-20
+
+### Breaking changes
+
+#### Visual Studio 2013 is no longer supported
+
+[As scheduled](https://github.com/KhronosGroup/glslang/blob/9eef54b2513ca6b40b47b07d24f453848b65c0df/README.md#planned-deprecationsremovals),
+Microsoft Visual Studio 2013 is no longer officially supported. Please upgrade
+to at least Visual Studio 2015.
+
+## 10.15.3847 2020-07-20
+
+### Breaking changes
+
+* The following files have been removed:
+  * `glslang/include/revision.h`
+  * `glslang/include/revision.template`
+
+The `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL` defines have been removed
+from the public headers. \
+Instead each build script now uses the new `build_info.py`
+script along with the `build_info.h.tmpl` and this `CHANGES.md` file to generate
+the glslang build-time generated header `glslang/build_info.h`.
+
+The new public API to obtain the `glslang` version is `glslang::GetVersion()`.
+
+### Other changes
+* `glslang` shared objects produced by CMake are now `SONAME` versioned using
+   [Semantic Versioning 2.0.0](https://semver.org/).
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd9baf8..5b176e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,3 +1,39 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+project(glslang
+    LANGUAGES CXX)
+
 # increase to 3.1 once all major distributions
 # include a version of CMake >= 3.1
 cmake_minimum_required(VERSION 2.8.12)
@@ -24,6 +60,14 @@
     set(LIB_TYPE SHARED)
 endif()
 
+if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
+    # This logic inside SPIRV-Tools, which can upset build target dependencies
+    # if changed after targets are already defined. To prevent these issues,
+    # ensure CMAKE_BUILD_TYPE is assigned early and at the glslang root scope.
+    message(STATUS "No build type selected, default to Debug")
+    set(CMAKE_BUILD_TYPE "Debug")
+endif()
+
 option(SKIP_GLSLANG_INSTALL "Skip installation" ${SKIP_GLSLANG_INSTALL})
 if(NOT ${SKIP_GLSLANG_INSTALL})
   set(ENABLE_GLSLANG_INSTALL ON)
@@ -57,6 +101,7 @@
     OFF)
 
 option(ENABLE_RTTI "Enables RTTI" OFF)
+option(ENABLE_EXCEPTIONS "Enables Exceptions" OFF)
 option(ENABLE_OPT "Enables spirv-opt capability if present" ON)
 option(ENABLE_PCH "Enables Precompiled header" ON)
 option(ENABLE_CTEST "Enables testing" ON)
@@ -73,20 +118,6 @@
     endif(CCACHE_FOUND)
 endif()
 
-# Precompiled header macro. Parameters are source file list and filename for pch cpp file.
-macro(glslang_pch SRCS PCHCPP)
-  if(MSVC AND CMAKE_GENERATOR MATCHES "^Visual Studio" AND NOT ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND ENABLE_PCH)
-    set(PCH_NAME "$(IntDir)\\pch.pch")
-    # make source files use/depend on PCH_NAME
-    set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS "/Yupch.h /FIpch.h /Fp${PCH_NAME} /Zm300" OBJECT_DEPENDS "${PCH_NAME}")
-    # make PCHCPP file compile and generate PCH_NAME
-    set_source_files_properties(${PCHCPP} PROPERTIES COMPILE_FLAGS "/Ycpch.h /Fp${PCH_NAME} /Zm300" OBJECT_OUTPUTS "${PCH_NAME}")
-    list(APPEND ${SRCS} "${PCHCPP}")
-  endif()
-endmacro(glslang_pch)
-
-project(glslang)
-
 if(ENABLE_CTEST)
     include(CTest)
 endif()
@@ -121,9 +152,19 @@
     if(NOT ENABLE_RTTI)
         add_compile_options(-fno-rtti)
     endif()
+    if(NOT ENABLE_EXCEPTIONS)
+        add_compile_options(-fno-exceptions)
+    endif()
     if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0.0")
         add_compile_options(-Werror=deprecated-copy)
     endif()
+
+    if(NOT CMAKE_VERSION VERSION_LESS "3.13")
+        # Error if there's symbols that are not found at link time.
+        # add_link_options() was added in CMake 3.13 - if using an earlier
+        # version don't set this - it should be caught by presubmits anyway.
+        add_link_options("-Wl,--no-undefined")
+    endif()
 elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND NOT MSVC)
     add_compile_options(-Wall -Wuninitialized -Wunused -Wunused-local-typedefs
                         -Wunused-parameter -Wunused-value  -Wunused-variable)
@@ -131,9 +172,27 @@
     if(NOT ENABLE_RTTI)
         add_compile_options(-fno-rtti)
     endif()
+    if(NOT ENABLE_EXCEPTIONS)
+        add_compile_options(-fno-exceptions)
+    endif()
+
+    if(NOT CMAKE_VERSION VERSION_LESS "3.13")
+        # Error if there's symbols that are not found at link time.
+        # add_link_options() was added in CMake 3.13 - if using an earlier
+        # version don't set this - it should be caught by presubmits anyway.
+        add_link_options("-Wl,-undefined,error")
+    endif()
 elseif(MSVC)
     if(NOT ENABLE_RTTI)
-        add_compile_options(/GR-) # Disable RTTI
+        string(FIND "${CMAKE_CXX_FLAGS}" "/GR" MSVC_HAS_GR)
+        if(MSVC_HAS_GR)
+            string(REGEX REPLACE "/GR" "/GR-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+        else()
+            add_compile_options(/GR-) # Disable RTTI
+        endif()
+    endif()
+    if(ENABLE_EXCEPTIONS)
+        add_compile_options(/EHsc) # Enable Exceptions
     endif()
 endif()
 
@@ -141,7 +200,7 @@
     if(MSVC)
         add_compile_options(/Os /GR-)
     else()
-        add_compile_options(-Os -fno-exceptions)
+        add_compile_options(-Os -fno-rtti -fno-exceptions)
         if(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND NOT MSVC)
             add_compile_options(-Wno-unused-parameter)
             add_compile_options(-Wno-unused-variable -Wno-unused-const-variable)
@@ -169,13 +228,96 @@
     endif()
 endfunction(glslang_set_link_args)
 
+if(NOT COMMAND find_host_package)
+    macro(find_host_package)
+        find_package(${ARGN})
+    endmacro()
+endif()
+
 # CMake needs to find the right version of python, right from the beginning,
 # otherwise, it will find the wrong version and fail later
-if(BUILD_EXTERNAL AND IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/External)
-    find_package(PythonInterp 3 REQUIRED)
+find_host_package(PythonInterp 3 REQUIRED)
 
-	# We depend on these for later projects, so they should come first.
-	add_subdirectory(External)
+# Root directory for build-time generated include files
+set(GLSLANG_GENERATED_INCLUDEDIR "${CMAKE_BINARY_DIR}/include")
+
+################################################################################
+# Build version information generation
+################################################################################
+set(GLSLANG_CHANGES_FILE      "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES.md")
+set(GLSLANG_BUILD_INFO_PY     "${CMAKE_CURRENT_SOURCE_DIR}/build_info.py")
+set(GLSLANG_BUILD_INFO_H_TMPL "${CMAKE_CURRENT_SOURCE_DIR}/build_info.h.tmpl")
+set(GLSLANG_BUILD_INFO_H      "${GLSLANG_GENERATED_INCLUDEDIR}/glslang/build_info.h")
+
+# Command to build the build_info.h file
+add_custom_command(
+    OUTPUT  ${GLSLANG_BUILD_INFO_H}
+    COMMAND ${PYTHON_EXECUTABLE} "${GLSLANG_BUILD_INFO_PY}"
+            ${CMAKE_CURRENT_SOURCE_DIR}
+            "-i" ${GLSLANG_BUILD_INFO_H_TMPL}
+            "-o" ${GLSLANG_BUILD_INFO_H}
+    DEPENDS ${GLSLANG_BUILD_INFO_PY}
+            ${GLSLANG_CHANGES_FILE}
+            ${GLSLANG_BUILD_INFO_H_TMPL}
+    COMMENT "Generating ${GLSLANG_BUILD_INFO_H}")
+
+# Target to build the build_info.h file
+add_custom_target(glslang-build-info DEPENDS ${GLSLANG_BUILD_INFO_H})
+
+# Populate the CMake GLSLANG_VERSION* variables with the build version
+# information.
+execute_process(
+    COMMAND ${PYTHON_EXECUTABLE} "${GLSLANG_BUILD_INFO_PY}"
+            ${CMAKE_CURRENT_SOURCE_DIR} "<major>.<minor>.<patch><-flavor>;<major>;<minor>;<patch>;<flavor>"
+    OUTPUT_VARIABLE "GLSLANG_VERSIONS"
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+list(GET "GLSLANG_VERSIONS" 0 "GLSLANG_VERSION")
+list(GET "GLSLANG_VERSIONS" 1 "GLSLANG_VERSION_MAJOR")
+list(GET "GLSLANG_VERSIONS" 2 "GLSLANG_VERSION_MINOR")
+list(GET "GLSLANG_VERSIONS" 3 "GLSLANG_VERSION_PATCH")
+list(GET "GLSLANG_VERSIONS" 4 "GLSLANG_VERSION_FLAVOR")
+configure_file(${GLSLANG_CHANGES_FILE} "${CMAKE_CURRENT_BINARY_DIR}/CHANGES.md") # Required to re-run cmake on version change
+
+# glslang_add_build_info_dependency() adds the glslang-build-info dependency and
+# generated include directories to target.
+function(glslang_add_build_info_dependency target)
+    target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${GLSLANG_GENERATED_INCLUDEDIR}>)
+    add_dependencies(${target} glslang-build-info)
+endfunction()
+
+# glslang_only_export_explicit_symbols() makes the symbol visibility hidden by
+# default for <target> when building shared libraries, and sets the
+# GLSLANG_IS_SHARED_LIBRARY define, and GLSLANG_EXPORTING to 1 when specifically
+# building <target>.
+function(glslang_only_export_explicit_symbols target)
+    if(BUILD_SHARED_LIBS)
+        target_compile_definitions(${target} PUBLIC "GLSLANG_IS_SHARED_LIBRARY=1")
+        if(WIN32)
+            target_compile_definitions(${target} PRIVATE "GLSLANG_EXPORTING=1")
+        else()
+            target_compile_options(${target} PRIVATE "-fvisibility=hidden")
+        endif()
+    endif()
+endfunction()
+
+# glslang_pch() adds precompiled header rules to <target> for the pre-compiled
+# header file <pch>. As target_precompile_headers() was added in CMake 3.16,
+# this is a no-op if called on earlier versions of CMake.
+if(NOT CMAKE_VERSION VERSION_LESS "3.16" AND ENABLE_PCH)
+    function(glslang_pch target pch)
+        target_precompile_headers(${target} PRIVATE ${pch})
+    endfunction()
+else()
+    function(glslang_pch target pch)
+    endfunction()
+    if(ENABLE_PCH)
+        message("Your CMake version is ${CMAKE_VERSION}. Update to at least 3.16 to enable precompiled headers to speed up incremental builds")
+    endif()
+endif()
+
+if(BUILD_EXTERNAL AND IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/External)
+    # We depend on these for later projects, so they should come first.
+    add_subdirectory(External)
 endif()
 
 if(NOT TARGET SPIRV-Tools-opt)
@@ -205,7 +347,7 @@
     add_subdirectory(gtests)
 endif()
 
-if(BUILD_TESTING)
+if(ENABLE_CTEST AND BUILD_TESTING)
     # glslang-testsuite runs a bash script on Windows.
     # Make sure to use '-o igncr' flag to ignore carriage returns (\r).
     set(IGNORE_CR_FLAG "")
@@ -226,4 +368,4 @@
     add_test(NAME glslang-testsuite
         COMMAND bash ${IGNORE_CR_FLAG} runtests ${RESULTS_PATH} ${VALIDATOR_PATH} ${REMAP_PATH}
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Test/)
-endif(BUILD_TESTING)
+endif()
diff --git a/ChooseMSVCCRT.cmake b/ChooseMSVCCRT.cmake
index 2097881..b156126 100644
--- a/ChooseMSVCCRT.cmake
+++ b/ChooseMSVCCRT.cmake
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 # The macro choose_msvc_crt() takes a list of possible
 # C runtimes to choose from, in the form of compiler flags,
 # to present to the user. (MTd for /MTd, etc)
diff --git a/DEPS b/DEPS
new file mode 100644
index 0000000..2f5fa8e
--- /dev/null
+++ b/DEPS
@@ -0,0 +1,82 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+use_relative_paths = True
+
+gclient_gn_args_file = 'build/config/gclient_args.gni'
+
+vars = {
+  'chromium_git': 'https://chromium.googlesource.com',
+  'build_with_chromium': False,
+}
+
+deps = {
+
+  './build': {
+    'url': '{chromium_git}/chromium/src/build.git@85ee3b7692e5284f08bd3c9459fb5685eed7b838',
+    'condition': 'not build_with_chromium',
+  },
+
+  './buildtools': {
+    'url': '{chromium_git}/chromium/src/buildtools.git@4be464e050b3d05060471788f926b34c641db9fd',
+    'condition': 'not build_with_chromium',
+  },
+
+  './tools/clang': {
+    'url': '{chromium_git}/chromium/src/tools/clang.git@3a982adabb720aa8f3e3885d40bf3fe506990157',
+    'condition': 'not build_with_chromium',
+  },
+
+}
+
+hooks = [
+  {
+    'name': 'sysroot_x64',
+    'pattern': '.',
+    'condition': 'checkout_linux and (checkout_x64 and not build_with_chromium)',
+    'action': ['python', './build/linux/sysroot_scripts/install-sysroot.py',
+               '--arch=x64'],
+  },
+  {
+    # Note: On Win, this should run after win_toolchain, as it may use it.
+    'name': 'clang',
+    'pattern': '.',
+    'action': ['python', './tools/clang/scripts/update.py'],
+    'condition': 'not build_with_chromium',
+  },
+]
+
+recursedeps = [
+  # buildtools provides clang_format, libc++, and libc++abi
+  'buildtools',
+]
diff --git a/External/CMakeLists.txt b/External/CMakeLists.txt
index 6ff4f47..cbabd2e 100644
--- a/External/CMakeLists.txt
+++ b/External/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 # Suppress all warnings from external projects.
 set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS -w)
 
diff --git a/LICENSE.txt b/LICENSE.txt
index a10c094..5f58565 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,6 +1,6 @@
 Here, glslang proper means core GLSL parsing, HLSL parsing, and SPIR-V code
-generation. Glslang proper requires use of two licenses, one that covers
-non-preprocessing and an additional one that covers preprocessing.
+generation. Glslang proper requires use of a number of licenses, one that covers
+preprocessing and others that covers non-preprocessing.
 
 Bison was removed long ago. You can build glslang from the source grammar,
 using tools of your choice, without using bison or any bison files.
@@ -23,6 +23,10 @@
 
 The core of glslang-proper, minus the preprocessor is licenced as follows:
 
+--------------------------------------------------------------------------------
+3-Clause BSD License
+--------------------------------------------------------------------------------
+
 //
 // Copyright (C) 2015-2018 Google, Inc.
 // Copyright (C) <various other dates and companies>
@@ -59,9 +63,281 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
+
+--------------------------------------------------------------------------------
+2-Clause BSD License
 --------------------------------------------------------------------------------
 
-The preprocessor has the core license stated above, plus an additional licence:
+Copyright 2020 The Khronos Group Inc
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--------------------------------------------------------------------------------
+The MIT License
+--------------------------------------------------------------------------------
+
+Copyright 2020 The Khronos Group Inc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+--------------------------------------------------------------------------------
+APACHE LICENSE, VERSION 2.0
+--------------------------------------------------------------------------------
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+--------------------------------------------------------------------------------
+GPL 3 with special bison exception
+--------------------------------------------------------------------------------
+
+   Bison implementation for Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.
+
+--------------------------------------------------------------------------------
+================================================================================
+--------------------------------------------------------------------------------
+
+The preprocessor has the core licenses stated above, plus an additional licence:
 
 /****************************************************************************\
 Copyright (c) 2002, NVIDIA Corporation.
diff --git a/OGLCompilersDLL/CMakeLists.txt b/OGLCompilersDLL/CMakeLists.txt
index e009674..0b007d4 100644
--- a/OGLCompilersDLL/CMakeLists.txt
+++ b/OGLCompilersDLL/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 set(SOURCES InitializeDll.cpp InitializeDll.h)
 
 add_library(OGLCompiler STATIC ${SOURCES})
diff --git a/README.md b/README.md
old mode 100755
new mode 100644
index ff844c0..9b8cfb3
--- a/README.md
+++ b/README.md
@@ -1,19 +1,26 @@
 # News
 
-[![Build Status](https://travis-ci.org/KhronosGroup/glslang.svg?branch=master)](https://travis-ci.org/KhronosGroup/glslang)
-[![Build status](https://ci.appveyor.com/api/projects/status/q6fi9cb0qnhkla68/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
+1. Visual Studio 2013 is no longer supported
 
-## Planned Deprecations/Removals
+   [As scheduled](https://github.com/KhronosGroup/glslang/blob/9eef54b2513ca6b40b47b07d24f453848b65c0df/README.md#planned-deprecationsremovals),
+Microsoft Visual Studio 2013 is no longer officially supported. \
+   Please upgrade to at least Visual Studio 2015.
 
-1. **SPIRV Folder, 1-May, 2020.** Glslang, when installed through CMake,
+2. The versioning scheme is being improved, and you might notice some differences.  This is currently WIP, but will be coming soon.  See, for example, PR #2277.
+
+3. If you get a new **compilation error due to a missing header**, it might be caused by this planned removal:
+
+**SPIRV Folder, 1-May, 2020.** Glslang, when installed through CMake,
 will install a `SPIRV` folder into `${CMAKE_INSTALL_INCLUDEDIR}`.
 This `SPIRV` folder is being moved to `glslang/SPIRV`.
 During the transition the `SPIRV` folder will be installed into both locations.
 The old install of `SPIRV/` will be removed as a CMake install target no sooner than May 1, 2020.
 See issue #1964.
 
-2. **Visual Studio 2013, 20-July, 2020.** Keeping code compiling for MS Visual Studio 2013 will no longer be
-a goal as of July 20, 2020, the fifth anniversary of the release of Visual Studio 2015.
+If people are only using this location to get spirv.hpp, I recommend they get that from [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) instead.
+
+[![Build Status](https://travis-ci.org/KhronosGroup/glslang.svg?branch=master)](https://travis-ci.org/KhronosGroup/glslang)
+[![Build status](https://ci.appveyor.com/api/projects/status/q6fi9cb0qnhkla68/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
 
 # Glslang Components and Status
 
@@ -81,7 +88,7 @@
 There is also a non-shader extension
 * `.conf` for a configuration file of limits, see usage statement for example
 
-## Building
+## Building (CMake)
 
 Instead of building manually, you can also download the binaries for your
 platform directly from the [master-tot release][master-tot-release] on GitHub.
@@ -92,7 +99,7 @@
 ### Dependencies
 
 * A C++11 compiler.
-  (For MSVS: 2015 is recommended, 2013 is fully supported/tested, and 2010 support is attempted, but not tested.)
+  (For MSVS: use 2015 or later.)
 * [CMake][cmake]: for generating compilation targets.
 * make: _Linux_, ninja is an alternative, if configured.
 * [Python 3.x][python]: for executing SPIRV-Tools scripts. (Optional if not using SPIRV-Tools and the 'External' subdirectory does not exist.)
@@ -118,12 +125,12 @@
 git clone https://github.com/google/googletest.git External/googletest
 ```
 
-If you want to use googletest with Visual Studio 2013, you also need to check out an older version:
+TEMPORARY NOTICE: additionally perform the following to avoid a current
+breakage in googletest:
 
 ```bash
-# to use googletest with Visual Studio 2013
 cd External/googletest
-git checkout 440527a61e1c91188195f7de212c63c77e8f0a45
+git checkout 0c400f67fcf305869c5fb113dd296eca266c9725
 cd ../..
 ```
 
@@ -186,6 +193,36 @@
 If using MSVC, after running CMake to configure, use the
 Configuration Manager to check the `INSTALL` project.
 
+### Building (GN)
+
+glslang can also be built with the [GN build system](https://gn.googlesource.com/gn/).
+
+#### 1) Install `depot_tools`
+
+Download [depot_tools.zip](https://storage.googleapis.com/chrome-infra/depot_tools.zip),
+extract to a directory, and add this directory to your `PATH`.
+
+#### 2) Synchronize dependencies and generate build files
+
+This only needs to be done once after updating `glslang`.
+
+With the current directory set to your `glslang` checkout, type:
+
+```bash
+./update_glslang_sources.py
+gclient sync --gclientfile=standalone.gclient
+gn gen out/Default
+```
+
+#### 3) Build
+
+With the current directory set to your `glslang` checkout, type:
+
+```bash
+cd out/Default
+ninja
+```
+
 ### If you need to change the GLSL grammar
 
 The grammar in `glslang/MachineIndependent/glslang.y` has to be recompiled with
diff --git a/SPIRV/CInterface/spirv_c_interface.cpp b/SPIRV/CInterface/spirv_c_interface.cpp
new file mode 100644
index 0000000..a0790f4
--- /dev/null
+++ b/SPIRV/CInterface/spirv_c_interface.cpp
@@ -0,0 +1,110 @@
+/**
+    This code is based on the glslang_c_interface implementation by Viktor Latypov
+**/
+
+/**
+BSD 2-Clause License
+
+Copyright (c) 2019, Viktor Latypov
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+**/
+
+#include "glslang/Include/glslang_c_interface.h"
+
+#include "SPIRV/GlslangToSpv.h"
+#include "SPIRV/Logger.h"
+#include "SPIRV/SpvTools.h"
+
+typedef struct glslang_program_s {
+    glslang::TProgram* program;
+    std::vector<unsigned int> spirv;
+    std::string loggerMessages;
+} glslang_program_t;
+
+static EShLanguage c_shader_stage(glslang_stage_t stage)
+{
+    switch (stage) {
+    case GLSLANG_STAGE_VERTEX:
+        return EShLangVertex;
+    case GLSLANG_STAGE_TESSCONTROL:
+        return EShLangTessControl;
+    case GLSLANG_STAGE_TESSEVALUATION:
+        return EShLangTessEvaluation;
+    case GLSLANG_STAGE_GEOMETRY:
+        return EShLangGeometry;
+    case GLSLANG_STAGE_FRAGMENT:
+        return EShLangFragment;
+    case GLSLANG_STAGE_COMPUTE:
+        return EShLangCompute;
+    case GLSLANG_STAGE_RAYGEN_NV:
+        return EShLangRayGen;
+    case GLSLANG_STAGE_INTERSECT_NV:
+        return EShLangIntersect;
+    case GLSLANG_STAGE_ANYHIT_NV:
+        return EShLangAnyHit;
+    case GLSLANG_STAGE_CLOSESTHIT_NV:
+        return EShLangClosestHit;
+    case GLSLANG_STAGE_MISS_NV:
+        return EShLangMiss;
+    case GLSLANG_STAGE_CALLABLE_NV:
+        return EShLangCallable;
+    case GLSLANG_STAGE_TASK_NV:
+        return EShLangTaskNV;
+    case GLSLANG_STAGE_MESH_NV:
+        return EShLangMeshNV;
+    default:
+        break;
+    }
+    return EShLangCount;
+}
+
+GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage)
+{
+    spv::SpvBuildLogger logger;
+    glslang::SpvOptions spvOptions;
+    spvOptions.validate = true;
+
+    const glslang::TIntermediate* intermediate = program->program->getIntermediate(c_shader_stage(stage));
+
+    glslang::GlslangToSpv(*intermediate, program->spirv, &logger, &spvOptions);
+
+    program->loggerMessages = logger.getAllMessages();
+}
+
+GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program) { return program->spirv.size(); }
+
+GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int* out)
+{
+    memcpy(out, program->spirv.data(), program->spirv.size() * sizeof(unsigned int));
+}
+
+GLSLANG_EXPORT unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program)
+{
+    return program->spirv.data();
+}
+
+GLSLANG_EXPORT const char* glslang_program_SPIRV_get_messages(glslang_program_t* program)
+{
+    return program->loggerMessages.empty() ? nullptr : program->loggerMessages.c_str();
+}
diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
index 9040609..d699dad 100644
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 set(SOURCES
     GlslangToSpv.cpp
     InReadableOrder.cpp
@@ -6,7 +39,8 @@
     SpvPostProcess.cpp
     doc.cpp
     SpvTools.cpp
-    disassemble.cpp)
+    disassemble.cpp
+    CInterface/spirv_c_interface.cpp)
 
 set(SPVREMAP_SOURCES
     SPVRemapper.cpp
@@ -38,8 +72,10 @@
 set_property(TARGET SPIRV PROPERTY FOLDER glslang)
 set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_include_directories(SPIRV PUBLIC
-	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
-	$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+
+glslang_add_build_info_dependency(SPIRV)
 
 if (ENABLE_SPVREMAPPER)
     add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
@@ -59,12 +95,12 @@
         PRIVATE ${spirv-tools_SOURCE_DIR}/include
         PRIVATE ${spirv-tools_SOURCE_DIR}/source
     )
-    target_link_libraries(SPIRV glslang SPIRV-Tools-opt)
+    target_link_libraries(SPIRV PRIVATE MachineIndependent SPIRV-Tools-opt)
     target_include_directories(SPIRV PUBLIC
-		$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
-		$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
 else()
-    target_link_libraries(SPIRV glslang)
+    target_link_libraries(SPIRV PRIVATE MachineIndependent)
 endif(ENABLE_OPT)
 
 if(WIN32)
@@ -98,6 +134,5 @@
 
     install(EXPORT SPIRVTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
 
-    install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SPIRV/)
     install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/SPIRV/)
 endif(ENABLE_GLSLANG_INSTALL)
diff --git a/SPIRV/GLSL.ext.EXT.h b/SPIRV/GLSL.ext.EXT.h
index 40164b6..20b9e54 100644
--- a/SPIRV/GLSL.ext.EXT.h
+++ b/SPIRV/GLSL.ext.EXT.h
@@ -35,5 +35,7 @@
 static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
 static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
 static const char* const E_SPV_EXT_demote_to_helper_invocation = "SPV_EXT_demote_to_helper_invocation";
+static const char* const E_SPV_EXT_shader_atomic_float_add = "SPV_EXT_shader_atomic_float_add";
+static const char* const E_SPV_EXT_shader_image_int64 = "SPV_EXT_shader_image_int64";
 
 #endif  // #ifndef GLSLextEXT_H
diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h
index d783a8f..175fa8d 100644
--- a/SPIRV/GLSL.ext.KHR.h
+++ b/SPIRV/GLSL.ext.KHR.h
@@ -48,4 +48,8 @@
 static const char* const E_SPV_KHR_non_semantic_info            = "SPV_KHR_non_semantic_info";
 static const char* const E_SPV_KHR_ray_tracing                  = "SPV_KHR_ray_tracing";
 static const char* const E_SPV_KHR_ray_query                    = "SPV_KHR_ray_query";
+static const char* const E_SPV_KHR_fragment_shading_rate        = "SPV_KHR_fragment_shading_rate";
+static const char* const E_SPV_KHR_terminate_invocation         = "SPV_KHR_terminate_invocation";
+static const char* const E_SPV_KHR_workgroup_memory_explicit_layout = "SPV_KHR_workgroup_memory_explicit_layout";
+
 #endif  // #ifndef GLSLextKHR_H
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 3bed678..5ad2d33 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -56,7 +56,9 @@
 #include "../glslang/MachineIndependent/localintermediate.h"
 #include "../glslang/MachineIndependent/SymbolTable.h"
 #include "../glslang/Include/Common.h"
-#include "../glslang/Include/revision.h"
+
+// Build-time generated includes
+#include "glslang/build_info.h"
 
 #include <fstream>
 #include <iomanip>
@@ -147,6 +149,7 @@
     spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier);
+    spv::Decoration TranslateNonUniformDecoration(const spv::Builder::AccessChain::CoherentFlags& coherentFlags);
     spv::Builder::AccessChain::CoherentFlags TranslateCoherent(const glslang::TType& type);
     spv::MemoryAccessMask TranslateMemoryAccess(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
     spv::ImageOperandsMask TranslateImageOperands(const spv::Builder::AccessChain::CoherentFlags &coherentFlags);
@@ -187,6 +190,7 @@
     bool originalParam(glslang::TStorageQualifier, const glslang::TType&, bool implicitThisParam);
     void makeFunctions(const glslang::TIntermSequence&);
     void makeGlobalInitializers(const glslang::TIntermSequence&);
+    void collectRayTracingLinkerObjects();
     void visitFunctions(const glslang::TIntermSequence&);
     void handleFunctionEntry(const glslang::TIntermAggregate* node);
     void translateArguments(const glslang::TIntermAggregate& node, std::vector<spv::Id>& arguments,
@@ -270,6 +274,9 @@
     // requiring local translation to and from SPIR-V type on every access.
     // Maps <builtin-variable-id -> AST-required-type-id>
     std::unordered_map<spv::Id, spv::Id> forceType;
+
+    // Used later for generating OpTraceKHR/OpExecuteCallableKHR
+    std::unordered_map<unsigned int, glslang::TIntermSymbol *> locationToSymbol[2];
 };
 
 //
@@ -281,6 +288,8 @@
 {
 #ifdef GLSLANG_WEB
     return spv::SourceLanguageESSL;
+#elif defined(GLSLANG_ANGLE)
+    return spv::SourceLanguageGLSL;
 #endif
 
     switch (source) {
@@ -371,6 +380,7 @@
         case glslang::EvqBuffer:       return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock;
         case glslang::EvqVaryingIn:    return spv::DecorationBlock;
         case glslang::EvqVaryingOut:   return spv::DecorationBlock;
+        case glslang::EvqShared:       return spv::DecorationBlock;
 #ifndef GLSLANG_WEB
         case glslang::EvqPayload:      return spv::DecorationBlock;
         case glslang::EvqPayloadIn:    return spv::DecorationBlock;
@@ -427,6 +437,7 @@
             break;
         case glslang::EbtBlock:
             switch (type.getQualifier().storage) {
+            case glslang::EvqShared:
             case glslang::EvqUniform:
             case glslang::EvqBuffer:
                 switch (type.getQualifier().layoutPacking) {
@@ -535,6 +546,20 @@
         return spv::DecorationMax;
 }
 
+// If lvalue flags contains nonUniform, return SPIR-V NonUniform decoration.
+spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(
+    const spv::Builder::AccessChain::CoherentFlags& coherentFlags)
+{
+#ifndef GLSLANG_WEB
+    if (coherentFlags.isNonUniform()) {
+        builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5);
+        builder.addCapability(spv::CapabilityShaderNonUniformEXT);
+        return spv::DecorationNonUniformEXT;
+    } else
+#endif
+        return spv::DecorationMax;
+}
+
 spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess(
     const spv::Builder::AccessChain::CoherentFlags &coherentFlags)
 {
@@ -610,6 +635,7 @@
                        flags.volatil;
     flags.isImage = type.getBasicType() == glslang::EbtSampler;
 #endif
+    flags.nonUniform = type.getQualifier().nonUniform;
     return flags;
 }
 
@@ -705,13 +731,20 @@
         return spv::BuiltInCullDistance;
 
     case glslang::EbvViewportIndex:
-        builder.addCapability(spv::CapabilityMultiViewport);
+        if (glslangIntermediate->getStage() == EShLangGeometry ||
+            glslangIntermediate->getStage() == EShLangFragment) {
+            builder.addCapability(spv::CapabilityMultiViewport);
+        }
         if (glslangIntermediate->getStage() == EShLangVertex ||
             glslangIntermediate->getStage() == EShLangTessControl ||
             glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
-            builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
-            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            if (builder.getSpvVersion() < spv::Spv_1_5) {
+                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
+                builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            }
+            else
+                builder.addCapability(spv::CapabilityShaderViewportIndex);
         }
         return spv::BuiltInViewportIndex;
 
@@ -730,13 +763,19 @@
         if (glslangIntermediate->getStage() == EShLangMeshNV) {
             return spv::BuiltInLayer;
         }
-        builder.addCapability(spv::CapabilityGeometry);
+        if (glslangIntermediate->getStage() == EShLangGeometry ||
+            glslangIntermediate->getStage() == EShLangFragment) {
+            builder.addCapability(spv::CapabilityGeometry);
+        }
         if (glslangIntermediate->getStage() == EShLangVertex ||
             glslangIntermediate->getStage() == EShLangTessControl ||
             glslangIntermediate->getStage() == EShLangTessEvaluation) {
 
-            builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
-            builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            if (builder.getSpvVersion() < spv::Spv_1_5) {
+                builder.addIncorporatedExtension(spv::E_SPV_EXT_shader_viewport_index_layer, spv::Spv_1_5);
+                builder.addCapability(spv::CapabilityShaderViewportIndexLayerEXT);
+            } else
+                builder.addCapability(spv::CapabilityShaderLayer);
         }
         return spv::BuiltInLayer;
 
@@ -765,6 +804,16 @@
         builder.addCapability(spv::CapabilityStencilExportEXT);
         return spv::BuiltInFragStencilRefEXT;
 
+    case glslang::EbvShadingRateKHR:
+        builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
+        builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
+        return spv::BuiltInShadingRateKHR;
+
+    case glslang::EbvPrimitiveShadingRateKHR:
+        builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
+        builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
+        return spv::BuiltInPrimitiveShadingRateKHR;
+
     case glslang::EbvInvocationId:         return spv::BuiltInInvocationId;
     case glslang::EbvTessLevelInner:       return spv::BuiltInTessLevelInner;
     case glslang::EbvTessLevelOuter:       return spv::BuiltInTessLevelOuter;
@@ -959,7 +1008,17 @@
     case glslang::EbvInstanceCustomIndex:
         return spv::BuiltInInstanceCustomIndexKHR;
     case glslang::EbvHitT:
-        return spv::BuiltInHitTKHR;
+        {
+            // this is a GLSL alias of RayTmax
+            // in SPV_NV_ray_tracing it has a dedicated builtin
+            // but in SPV_KHR_ray_tracing it gets mapped to RayTmax
+            auto& extensions = glslangIntermediate->getRequestedExtensions();
+            if (extensions.find("GL_NV_ray_tracing") != extensions.end()) {
+                return spv::BuiltInHitTNV;
+            } else {
+                return spv::BuiltInRayTmaxKHR;
+            }
+        }
     case glslang::EbvHitKind:
         return spv::BuiltInHitKindKHR;
     case glslang::EbvObjectToWorld:
@@ -1067,6 +1126,10 @@
         builder.addCapability(spv::CapabilityStorageImageExtendedFormats);
         break;
 
+    case glslang::ElfR64ui:
+    case glslang::ElfR64i:
+        builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+        builder.addCapability(spv::CapabilityInt64ImageEXT);
     default:
         break;
     }
@@ -1113,6 +1176,8 @@
     case glslang::ElfRg8ui:         return spv::ImageFormatRg8ui;
     case glslang::ElfR16ui:         return spv::ImageFormatR16ui;
     case glslang::ElfR8ui:          return spv::ImageFormatR8ui;
+    case glslang::ElfR64ui:         return spv::ImageFormatR64ui;
+    case glslang::ElfR64i:          return spv::ImageFormatR64i;
     default:                        return spv::ImageFormatMax;
     }
 }
@@ -1183,7 +1248,7 @@
 spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::TType& type)
 {
     if (type.getBasicType() == glslang::EbtRayQuery)
-        return spv::StorageClassFunction;
+        return spv::StorageClassPrivate;
     if (type.getQualifier().isPipeInput())
         return spv::StorageClassInput;
     if (type.getQualifier().isPipeOutput())
@@ -1215,6 +1280,12 @@
         return spv::StorageClassUniformConstant;
     }
 
+    if (type.getQualifier().storage == glslang::EvqShared && type.getBasicType() == glslang::EbtBlock) {
+        builder.addExtension(spv::E_SPV_KHR_workgroup_memory_explicit_layout);
+        builder.addCapability(spv::CapabilityWorkgroupMemoryExplicitLayoutKHR);
+        return spv::StorageClassWorkgroup;
+    }
+
     switch (type.getQualifier().storage) {
     case glslang::EvqGlobal:        return spv::StorageClassPrivate;
     case glslang::EvqConstReadOnly: return spv::StorageClassFunction;
@@ -1292,7 +1363,8 @@
     // basically samplerXXX/subpass/sampler/texture are all included
     // if they are the global-scope-class, not the function parameter
     // (or local, if they ever exist) class.
-    if (type.getBasicType() == glslang::EbtSampler)
+    if (type.getBasicType() == glslang::EbtSampler ||
+        type.getBasicType() == glslang::EbtAccStruct)
         return type.getQualifier().isUniformOrBuffer();
 
     // None of the above.
@@ -1348,6 +1420,8 @@
     if (parent.writeonly)
         child.writeonly = true;
 #endif
+    if (parent.nonUniform)
+        child.nonUniform = true;
 }
 
 bool HasNonLayoutQualifiers(const glslang::TType& type, const glslang::TQualifier& qualifier)
@@ -1439,7 +1513,7 @@
     // Add the source extensions
     const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
     for (auto it = sourceExtensions.begin(); it != sourceExtensions.end(); ++it)
-        builder.addSourceExtension(it->first.c_str());
+        builder.addSourceExtension(it->c_str());
 
     // Add the top-level modes for this shader.
 
@@ -1448,8 +1522,8 @@
         builder.addExecutionMode(shaderEntry, spv::ExecutionModeXfb);
     }
 
-    if (sourceExtensions.find("GL_EXT_ray_flags_primitive_culling") != sourceExtensions.end()) {
-        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingProvisionalKHR);
+    if (glslangIntermediate->getLayoutPrimitiveCulling()) {
+        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingKHR);
     }
 
     unsigned int mode;
@@ -1616,7 +1690,7 @@
     {
         auto& extensions = glslangIntermediate->getRequestedExtensions();
         if (extensions.find("GL_NV_ray_tracing") == extensions.end()) {
-            builder.addCapability(spv::CapabilityRayTracingProvisionalKHR);
+            builder.addCapability(spv::CapabilityRayTracingKHR);
             builder.addExtension("SPV_KHR_ray_tracing");
         }
         else {
@@ -1705,21 +1779,30 @@
     if (symbol->getType().getQualifier().isSpecConstant())
         spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
 
+#ifdef ENABLE_HLSL
+    // Skip symbol handling if it is string-typed
+    if (symbol->getBasicType() == glslang::EbtString)
+        return;
+#endif
+
     // getSymbolId() will set up all the IO decorations on the first call.
     // Formal function parameters were mapped during makeFunctions().
     spv::Id id = getSymbolId(symbol);
 
     if (builder.isPointer(id)) {
-        // Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
-        // Consider adding to the OpEntryPoint interface list.
-        // Only looking at structures if they have at least one member.
-        if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) {
-            spv::StorageClass sc = builder.getStorageClass(id);
-            // Before SPIR-V 1.4, we only want to include Input and Output.
-            // Starting with SPIR-V 1.4, we want all globals.
-            if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && sc != spv::StorageClassFunction) ||
-                (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) {
-                iOSet.insert(id);
+        if (!symbol->getType().getQualifier().isParamInput() &&
+            !symbol->getType().getQualifier().isParamOutput()) {
+            // Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
+            // Consider adding to the OpEntryPoint interface list.
+            // Only looking at structures if they have at least one member.
+            if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) {
+                spv::StorageClass sc = builder.getStorageClass(id);
+                // Before SPIR-V 1.4, we only want to include Input and Output.
+                // Starting with SPIR-V 1.4, we want all globals.
+                if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalStorage(id)) ||
+                    (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) {
+                    iOSet.insert(id);
+                }
             }
         }
 
@@ -1844,9 +1927,11 @@
                 spv::Id leftRValue = accessChainLoad(node->getLeft()->getType());
 
                 // do the operation
+                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());
+                coherentFlags |= TranslateCoherent(node->getRight()->getType());
                 OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()),
                                               TranslateNoContractionDecoration(node->getType().getQualifier()),
-                                              TranslateNonUniformDecoration(node->getType().getQualifier()) };
+                                              TranslateNonUniformDecoration(coherentFlags) };
                 rValue = createBinaryOperation(node->getOp(), decorations,
                                                convertGlslangToSpvType(node->getType()), leftRValue, rValue,
                                                node->getType().getBasicType());
@@ -1877,13 +1962,16 @@
             if (! node->getLeft()->getType().isArray() &&
                 node->getLeft()->getType().isVector() &&
                 node->getOp() == glslang::EOpIndexDirect) {
+                // Swizzle is uniform so propagate uniform into access chain
+                spv::Builder::AccessChain::CoherentFlags coherentFlags = TranslateCoherent(node->getLeft()->getType());
+                coherentFlags.nonUniform = 0;
                 // This is essentially a hard-coded vector swizzle of size 1,
                 // so short circuit the access-chain stuff with a swizzle.
                 std::vector<unsigned> swizzle;
                 swizzle.push_back(glslangIndex);
                 int dummySize;
                 builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()),
-                                               TranslateCoherent(node->getLeft()->getType()),
+                                               coherentFlags,
                                                glslangIntermediate->getBaseAlignmentScalar(
                                                    node->getLeft()->getType(), dummySize));
             } else {
@@ -1914,9 +2002,14 @@
                     }
                 }
 
+                // Struct reference propagates uniform lvalue
+                spv::Builder::AccessChain::CoherentFlags coherentFlags =
+                        TranslateCoherent(node->getLeft()->getType());
+                coherentFlags.nonUniform = 0;
+
                 // normal case for indexing array or structure or block
                 builder.accessChainPush(builder.makeIntConstant(spvIndex),
-                    TranslateCoherent(node->getLeft()->getType()),
+                        coherentFlags,
                         node->getLeft()->getType().getBufferReferenceAlignment());
 
                 // Add capabilities here for accessing PointSize and clip/cull distance.
@@ -1950,15 +2043,20 @@
             // restore the saved access chain
             builder.setAccessChain(partial);
 
+            // Only if index is nonUniform should we propagate nonUniform into access chain
+            spv::Builder::AccessChain::CoherentFlags index_flags = TranslateCoherent(node->getRight()->getType());
+            spv::Builder::AccessChain::CoherentFlags coherent_flags = TranslateCoherent(node->getLeft()->getType());
+            coherent_flags.nonUniform = index_flags.nonUniform;
+
             if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector()) {
                 int dummySize;
-                builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType()),
-                                                TranslateCoherent(node->getLeft()->getType()),
+                builder.accessChainPushComponent(
+                    index, convertGlslangToSpvType(node->getLeft()->getType()), coherent_flags,
                                                 glslangIntermediate->getBaseAlignmentScalar(node->getLeft()->getType(),
                                                 dummySize));
             } else
-                builder.accessChainPush(index, TranslateCoherent(node->getLeft()->getType()),
-                    node->getLeft()->getType().getBufferReferenceAlignment());
+                builder.accessChainPush(index, coherent_flags,
+                                        node->getLeft()->getType().getBufferReferenceAlignment());
         }
         return false;
     case glslang::EOpVectorSwizzle:
@@ -2042,17 +2140,18 @@
             // these require changing a 64-bit scaler -> a vector of 32-bit components
             if (glslangType.isVector())
                 break;
-            std::pair<spv::Id, spv::Id> ret(builder.makeVectorType(builder.makeUintType(32), 4),
-                                            builder.makeUintType(64));
+            spv::Id ivec4_type = builder.makeVectorType(builder.makeUintType(32), 4);
+            spv::Id uint64_type = builder.makeUintType(64);
+            std::pair<spv::Id, spv::Id> ret(ivec4_type, uint64_type);
             return ret;
         }
         // There are no SPIR-V builtins defined for these and map onto original non-transposed
         // builtins. During visitBinary we insert a transpose
         case glslang::EbvWorldToObject3x4:
         case glslang::EbvObjectToWorld3x4: {
-            std::pair<spv::Id, spv::Id> ret(builder.makeMatrixType(builder.makeFloatType(32), 4, 3),
-                builder.makeMatrixType(builder.makeFloatType(32), 3, 4)
-            );
+            spv::Id mat43 = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);
+            spv::Id mat34 = builder.makeMatrixType(builder.makeFloatType(32), 3, 4);
+            std::pair<spv::Id, spv::Id> ret(mat43, mat34);
             return ret;
         }
         default:
@@ -2082,7 +2181,7 @@
             // handle 32-bit v.xy* -> 64-bit
             builder.clearAccessChain();
             builder.setAccessChainLValue(object);
-            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, objectTypeId);
+            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, spv::DecorationMax, objectTypeId);
             std::vector<spv::Id> components;
             components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 0));
             components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 1));
@@ -2098,7 +2197,7 @@
             // and we insert a transpose after loading the original non-transposed builtins
             builder.clearAccessChain();
             builder.setAccessChainLValue(object);
-            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, objectTypeId);
+            object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, spv::DecorationMax, objectTypeId);
             return builder.createUnaryOp(spv::OpTranspose, desiredTypeId, object);
 
     } else  {
@@ -2284,7 +2383,8 @@
 
             // The result of operation is always stored, but conditionally the
             // consumed result.  The consumed result is always an r-value.
-            builder.accessChainStore(result);
+            builder.accessChainStore(result,
+                                     TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags));
             builder.clearAccessChain();
             if (node->getOp() == glslang::EOpPreIncrement ||
                 node->getOp() == glslang::EOpPreDecrement)
@@ -2413,6 +2513,10 @@
             // anything else gets there, so visit out of order, doing them all now.
             makeGlobalInitializers(node->getAsAggregate()->getSequence());
 
+            //Pre process linker objects for ray tracing stages
+            if (glslangIntermediate->isRayTracingStage())
+                collectRayTracingLinkerObjects();
+
             // Initializers are done, don't want to visit again, but functions and link objects need to be processed,
             // so do them manually.
             visitFunctions(node->getAsAggregate()->getSequence());
@@ -2603,6 +2707,10 @@
         else
             constructed = builder.createConstructor(precision, arguments, resultType());
 
+        if (node->getType().getQualifier().isNonUniform()) {
+            builder.addDecoration(constructed, spv::DecorationNonUniformEXT);
+        }
+
         builder.clearAccessChain();
         builder.setAccessChainRValue(constructed);
 
@@ -2718,10 +2826,12 @@
         binOp = node->getOp();
         break;
 
-    case glslang::EOpIgnoreIntersection:
-    case glslang::EOpTerminateRay:
-    case glslang::EOpTrace:
-    case glslang::EOpExecuteCallable:
+    case glslang::EOpIgnoreIntersectionNV:
+    case glslang::EOpTerminateRayNV:
+    case glslang::EOpTraceNV:
+    case glslang::EOpTraceKHR:
+    case glslang::EOpExecuteCallableNV:
+    case glslang::EOpExecuteCallableKHR:
     case glslang::EOpWritePackedPrimitiveIndices4x8NV:
         noReturnValue = true;
         break;
@@ -2730,7 +2840,7 @@
     case glslang::EOpRayQueryGenerateIntersection:
     case glslang::EOpRayQueryConfirmIntersection:
         builder.addExtension("SPV_KHR_ray_query");
-        builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayQueryKHR);
         noReturnValue = true;
         break;
     case glslang::EOpRayQueryProceed:
@@ -2753,7 +2863,7 @@
     case glslang::EOpRayQueryGetIntersectionObjectToWorld:
     case glslang::EOpRayQueryGetIntersectionWorldToObject:
         builder.addExtension("SPV_KHR_ray_query");
-        builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayQueryKHR);
         break;
     case glslang::EOpCooperativeMatrixLoad:
     case glslang::EOpCooperativeMatrixStore:
@@ -2977,7 +3087,8 @@
                 // receive the result, and must later swizzle that into the original
                 // l-value.
                 complexLvalues.push_back(builder.getAccessChain());
-                temporaryLvalues.push_back(builder.createVariable(spv::StorageClassFunction,
+                temporaryLvalues.push_back(builder.createVariable(
+                    spv::NoPrecision, spv::StorageClassFunction,
                     builder.accessChainGetInferredType(), "swizzleTemp"));
                 operands.push_back(temporaryLvalues.back());
             } else {
@@ -3005,11 +3116,18 @@
                     )) {
                 bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst();
                 operands.push_back(builder.makeIntConstant(cond ? 1 : 0));
-            }
-            else {
+             } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) ||
+                        (arg == 1  && glslangOp == glslang::EOpExecuteCallableKHR)) {
+                 const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : 1;
+                 const int set = glslangOp == glslang::EOpTraceKHR ? 0 : 1;
+                 const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst();
+                 auto itNode = locationToSymbol[set].find(location);
+                 visitSymbol(itNode->second);
+                 spv::Id symId = getSymbolId(itNode->second);
+                 operands.push_back(symId);
+             } else {
                 operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType()));
-            }
-
+             }
         }
     }
 
@@ -3080,7 +3198,8 @@
 
         for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {
             builder.setAccessChain(complexLvalues[i]);
-            builder.accessChainStore(builder.createLoad(temporaryLvalues[i]));
+            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision),
+                TranslateNonUniformDecoration(complexLvalues[i].coherentFlags));
         }
     }
 
@@ -3197,7 +3316,8 @@
         } else {
             // We need control flow to select the result.
             // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path.
-            result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
+            result = builder.createVariable(TranslatePrecisionDecoration(node->getType()),
+                spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
 
             // Selection control:
             const spv::SelectionControlMask control = TranslateSelectionControl(*node);
@@ -3222,8 +3342,10 @@
     // Execute the one side needed, as per the condition
     const auto executeOneSide = [&]() {
         // Always emit control flow.
-        if (node->getBasicType() != glslang::EbtVoid)
-            result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));
+        if (node->getBasicType() != glslang::EbtVoid) {
+            result = builder.createVariable(TranslatePrecisionDecoration(node->getType()), spv::StorageClassFunction,
+                convertGlslangToSpvType(node->getType()));
+        }
 
         // Selection control:
         const spv::SelectionControlMask control = TranslateSelectionControl(*node);
@@ -3408,7 +3530,11 @@
 
     switch (node->getFlowOp()) {
     case glslang::EOpKill:
-        builder.makeDiscard();
+        builder.makeStatementTerminator(spv::OpKill, "post-discard");
+        break;
+    case glslang::EOpTerminateInvocation:
+        builder.addExtension(spv::E_SPV_KHR_terminate_invocation);
+        builder.makeStatementTerminator(spv::OpTerminateInvocation, "post-terminate-invocation");
         break;
     case glslang::EOpBreak:
         if (breakForLoop.top())
@@ -3420,15 +3546,17 @@
         builder.createLoopContinue();
         break;
     case glslang::EOpReturn:
-        if (node->getExpression()) {
+        if (node->getExpression() != nullptr) {
             const glslang::TType& glslangReturnType = node->getExpression()->getType();
             spv::Id returnId = accessChainLoad(glslangReturnType);
-            if (builder.getTypeId(returnId) != currentFunction->getReturnType()) {
+            if (builder.getTypeId(returnId) != currentFunction->getReturnType() ||
+                TranslatePrecisionDecoration(glslangReturnType) != currentFunction->getReturnPrecision()) {
                 builder.clearAccessChain();
-                spv::Id copyId = builder.createVariable(spv::StorageClassFunction, currentFunction->getReturnType());
+                spv::Id copyId = builder.createVariable(currentFunction->getReturnPrecision(),
+                    spv::StorageClassFunction, currentFunction->getReturnType());
                 builder.setAccessChainLValue(copyId);
                 multiTypeStore(glslangReturnType, returnId);
-                returnId = builder.createLoad(copyId);
+                returnId = builder.createLoad(copyId, currentFunction->getReturnPrecision());
             }
             builder.makeReturn(false, returnId);
         } else
@@ -3443,6 +3571,12 @@
         builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation);
         builder.addCapability(spv::CapabilityDemoteToHelperInvocationEXT);
         break;
+    case glslang::EOpTerminateRayKHR:
+        builder.makeStatementTerminator(spv::OpTerminateRayKHR, "post-terminateRayKHR");
+        break;
+    case glslang::EOpIgnoreIntersectionKHR:
+        builder.makeStatementTerminator(spv::OpIgnoreIntersectionKHR, "post-ignoreIntersectionKHR");
+        break;
 #endif
 
     default:
@@ -3497,6 +3631,11 @@
             break;
 #endif
         default:
+            if (storageClass == spv::StorageClassWorkgroup &&
+                node->getType().getBasicType() == glslang::EbtBlock) {
+                builder.addCapability(spv::CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR);
+                break;
+            }
             if (node->getType().contains16BitFloat())
                 builder.addCapability(spv::CapabilityFloat16);
             if (node->getType().contains16BitInt())
@@ -3515,6 +3654,9 @@
         } else if (storageClass == spv::StorageClassStorageBuffer) {
             builder.addIncorporatedExtension(spv::E_SPV_KHR_8bit_storage, spv::Spv_1_5);
             builder.addCapability(spv::CapabilityStorageBuffer8BitAccess);
+        } else if (storageClass == spv::StorageClassWorkgroup &&
+                   node->getType().getBasicType() == glslang::EbtBlock) {
+            builder.addCapability(spv::CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR);
         } else {
             builder.addCapability(spv::CapabilityInt8);
         }
@@ -3524,7 +3666,19 @@
     if (glslang::IsAnonymous(name))
         name = "";
 
-    return builder.createVariable(storageClass, spvType, name);
+    spv::Id initializer = spv::NoResult;
+
+    if (node->getType().getQualifier().storage == glslang::EvqUniform && !node->getConstArray().empty()) {
+        int nextConst = 0;
+        initializer = createSpvConstantFromConstUnionArray(node->getType(),
+                                                           node->getConstArray(),
+                                                           nextConst,
+                                                           false /* specConst */);
+    } else if (node->getType().getQualifier().isNullInit()) {
+        initializer = builder.makeNullConstant(spvType);
+    }
+
+    return builder.createVariable(spv::NoPrecision, storageClass, spvType, name, initializer);
 }
 
 // Return type Id of the sampled type.
@@ -3539,6 +3693,12 @@
             builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch);
             builder.addCapability(spv::CapabilityFloat16ImageAMD);
             return builder.makeFloatType(16);
+        case glslang::EbtInt64:      return builder.makeIntType(64);
+            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+            builder.addCapability(spv::CapabilityFloat16ImageAMD);
+        case glslang::EbtUint64:     return builder.makeUintType(64);
+            builder.addExtension(spv::E_SPV_EXT_shader_image_int64);
+            builder.addCapability(spv::CapabilityFloat16ImageAMD);
 #endif
         default:
             assert(0);
@@ -3645,10 +3805,36 @@
         spvType = builder.makeUintType(32);
         break;
     case glslang::EbtAccStruct:
+        switch (glslangIntermediate->getStage()) {
+        case EShLangRayGen:
+        case EShLangIntersect:
+        case EShLangAnyHit:
+        case EShLangClosestHit:
+        case EShLangMiss:
+        case EShLangCallable:
+            // these all should have the RayTracingNV/KHR capability already
+            break;
+        default:
+            {
+                auto& extensions = glslangIntermediate->getRequestedExtensions();
+                if (extensions.find("GL_EXT_ray_query") != extensions.end()) {
+                    builder.addExtension(spv::E_SPV_KHR_ray_query);
+                    builder.addCapability(spv::CapabilityRayQueryKHR);
+                }
+            }
+            break;
+        }
         spvType = builder.makeAccelerationStructureType();
         break;
     case glslang::EbtRayQuery:
-        spvType = builder.makeRayQueryType();
+        {
+            auto& extensions = glslangIntermediate->getRequestedExtensions();
+            if (extensions.find("GL_EXT_ray_query") != extensions.end()) {
+                builder.addExtension(spv::E_SPV_KHR_ray_query);
+                builder.addCapability(spv::CapabilityRayQueryKHR);
+            }
+            spvType = builder.makeRayQueryType();
+        }
         break;
     case glslang::EbtReference:
         {
@@ -3904,6 +4090,8 @@
     // Name and decorate the non-hidden members
     int offset = -1;
     int locationOffset = 0;  // for use within the members of this struct
+    bool memberLocationInvalid = type.isArrayOfArrays() ||
+        (type.isArray() && (type.getQualifier().isArrayedIo(glslangIntermediate->getStage()) == false));
     for (int i = 0; i < (int)glslangMembers->size(); i++) {
         glslang::TType& glslangMember = *(*glslangMembers)[i].type;
         int member = i;
@@ -3956,7 +4144,7 @@
         // just track whether a member needs to be decorated.
         // Ignore member locations if the container is an array, as that's
         // ill-specified and decisions have been made to not allow this.
-        if (! type.isArray() && memberQualifier.hasLocation())
+        if (!memberLocationInvalid && memberQualifier.hasLocation())
             builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
 
         if (qualifier.hasLocation())      // track for upcoming inheritance
@@ -4062,6 +4250,7 @@
     alignment |= type.getBufferReferenceAlignment();
 
     spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type),
+        TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),
         TranslateNonUniformDecoration(type.getQualifier()),
         nominalTypeId,
         spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask),
@@ -4129,7 +4318,7 @@
     unsigned int alignment = builder.getAccessChain().alignment;
     alignment |= type.getBufferReferenceAlignment();
 
-    builder.accessChainStore(rvalue,
+    builder.accessChainStore(rvalue, TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags),
                              spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) &
                                 ~spv::MemoryAccessMakePointerVisibleKHRMask),
                              TranslateMemoryScope(coherentFlags), alignment);
@@ -4234,6 +4423,7 @@
     // has to be a uniform or buffer block or task in/out blocks
     if (type.getQualifier().storage != glslang::EvqUniform &&
         type.getQualifier().storage != glslang::EvqBuffer &&
+        type.getQualifier().storage != glslang::EvqShared &&
         !type.getQualifier().isTaskMemory())
         return glslang::ElpNone;
 
@@ -4388,8 +4578,10 @@
     assert(qualifier == glslang::EvqIn ||
            qualifier == glslang::EvqOut ||
            qualifier == glslang::EvqInOut ||
+           qualifier == glslang::EvqUniform ||
            qualifier == glslang::EvqConstReadOnly);
-    return qualifier != glslang::EvqConstReadOnly;
+    return qualifier != glslang::EvqConstReadOnly &&
+           qualifier != glslang::EvqUniform;
 }
 
 // Is parameter pass-by-original?
@@ -4515,7 +4707,39 @@
         }
     }
 }
+// Walk over all linker objects to create a map for payload and callable data linker objects
+// and their location to be used during codegen for OpTraceKHR and OpExecuteCallableKHR
+// This is done here since it is possible that these linker objects are not be referenced in the AST
+void TGlslangToSpvTraverser::collectRayTracingLinkerObjects()
+{
+    glslang::TIntermAggregate* linkerObjects = glslangIntermediate->findLinkerObjects();
+    for (auto& objSeq : linkerObjects->getSequence()) {
+        auto objNode = objSeq->getAsSymbolNode();
+        if (objNode != nullptr) {
+            if (objNode->getQualifier().hasLocation()) {
+                unsigned int location = objNode->getQualifier().layoutLocation;
+                auto st = objNode->getQualifier().storage;
+                int set;
+                switch (st)
+                {
+                case glslang::EvqPayload:
+                case glslang::EvqPayloadIn:
+                    set = 0;
+                    break;
+                case glslang::EvqCallableData:
+                case glslang::EvqCallableDataIn:
+                    set = 1;
+                    break;
 
+                default:
+                    set = -1;
+                }
+                if (set != -1)
+                    locationToSymbol[set].insert(std::make_pair(location, objNode));
+            }
+        }
+    }
+}
 // Process all the functions, while skipping initializers.
 void TGlslangToSpvTraverser::visitFunctions(const glslang::TIntermSequence& glslFunctions)
 {
@@ -4659,8 +4883,10 @@
         }
 
         if (lvalue) {
-            arguments.push_back(builder.accessChainGetLValue());
+            spv::Id lvalue_id = builder.accessChainGetLValue();
+            arguments.push_back(lvalue_id);
             lvalueCoherentFlags = builder.getAccessChain().coherentFlags;
+            builder.addDecoration(lvalue_id, TranslateNonUniformDecoration(lvalueCoherentFlags));
             lvalueCoherentFlags |= TranslateCoherent(glslangArguments[i]->getAsTyped()->getType());
         } else
 #endif
@@ -4713,7 +4939,7 @@
         translateArguments(*node->getAsAggregate(), arguments, lvalueCoherentFlags);
     else
         translateArguments(*node->getAsUnaryNode(), arguments);
-    spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision());
+    spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
 
     spv::Builder::TextureParameters params = { };
     params.sampler = arguments[0];
@@ -4723,12 +4949,15 @@
 
     const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;
 
+    if (builder.isSampledImage(params.sampler) &&
+        ((cracked.query && node->getOp() != glslang::EOpTextureQueryLod) || cracked.fragMask || cracked.fetch)) {
+        params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
+        if (imageType.getQualifier().isNonUniform()) {
+            builder.addDecoration(params.sampler, spv::DecorationNonUniformEXT);
+        }
+    }
     // Check for queries
     if (cracked.query) {
-        // OpImageQueryLod works on a sampled image, for other queries the image has to be extracted first
-        if (node->getOp() != glslang::EOpTextureQueryLod && builder.isSampledImage(params.sampler))
-            params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
-
         switch (node->getOp()) {
         case glslang::EOpImageQuerySize:
         case glslang::EOpTextureQuerySize:
@@ -4982,10 +5211,6 @@
         auto opIt = arguments.begin();
         std::vector<spv::Id> operands;
 
-        // Extract the image if necessary
-        if (builder.isSampledImage(params.sampler))
-            params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
-
         operands.push_back(params.sampler);
         ++opIt;
 
@@ -5046,13 +5271,6 @@
             bias = true;
     }
 
-    // See if the sampler param should really be just the SPV image part
-    if (cracked.fetch) {
-        // a fetch needs to have the image extracted first
-        if (builder.isSampledImage(params.sampler))
-            params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
-    }
-
 #ifndef GLSLANG_WEB
     if (cracked.gather) {
         const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
@@ -5212,7 +5430,7 @@
 
             builder.accessChainPush(builder.makeIntConstant(i), flags, 0);
             builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1),
-                i+1));
+                i+1), TranslateNonUniformDecoration(imageType.getQualifier()));
         }
         return builder.createCompositeExtract(res, resultType(), 0);
     }
@@ -5317,7 +5535,7 @@
             ++lValueCount;
         } else if (writableParam(qualifiers[a])) {
             // need space to hold the copy
-            arg = builder.createVariable(spv::StorageClassFunction,
+            arg = builder.createVariable(function->getParamPrecision(a), spv::StorageClassFunction,
                 builder.getContainedTypeId(function->getParamType(a)), "param");
             if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {
                 // need to copy the input into output space
@@ -5330,12 +5548,14 @@
             ++lValueCount;
         } else {
             // process r-value, which involves a copy for a type mismatch
-            if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a])) {
-                spv::Id argCopy = builder.createVariable(spv::StorageClassFunction, function->getParamType(a), "arg");
+            if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a]) ||
+                TranslatePrecisionDecoration(*argTypes[a]) != function->getParamPrecision(a))
+            {
+                spv::Id argCopy = builder.createVariable(function->getParamPrecision(a), spv::StorageClassFunction, function->getParamType(a), "arg");
                 builder.clearAccessChain();
                 builder.setAccessChainLValue(argCopy);
                 multiTypeStore(*argTypes[a], rValues[rValueCount]);
-                arg = builder.createLoad(argCopy);
+                arg = builder.createLoad(argCopy, function->getParamPrecision(a));
             } else
                 arg = rValues[rValueCount];
             ++rValueCount;
@@ -5346,6 +5566,7 @@
     // 3. Make the call.
     spv::Id result = builder.createFunctionCall(function, spvArgs);
     builder.setPrecision(result, TranslatePrecisionDecoration(node->getType()));
+    builder.addDecoration(result, TranslateNonUniformDecoration(node->getType().getQualifier()));
 
     // 4. Copy back out an "out" arguments.
     lValueCount = 0;
@@ -5354,7 +5575,8 @@
             ++lValueCount;
         else if (writableParam(qualifiers[a])) {
             if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
-                spv::Id copy = builder.createLoad(spvArgs[a]);
+                spv::Id copy = builder.createLoad(spvArgs[a], spv::NoPrecision);
+                builder.addDecoration(copy, TranslateNonUniformDecoration(argTypes[a]->getQualifier()));
                 builder.setAccessChain(lValues[lValueCount]);
                 multiTypeStore(*argTypes[a], copy);
             }
@@ -5599,7 +5821,7 @@
     case glslang::EOpNotEqual:
     case glslang::EOpVectorNotEqual:
         if (isFloat)
-            binOp = spv::OpFOrdNotEqual;
+            binOp = spv::OpFUnordNotEqual;
         else if (isBool)
             binOp = spv::OpLogicalNotEqual;
         else
@@ -6142,6 +6364,11 @@
     case glslang::EOpConstructReference:
         unaryOp = spv::OpBitcast;
         break;
+
+    case glslang::EOpConvUint64ToAccStruct:
+    case glslang::EOpConvUvec2ToAccStruct:
+        unaryOp = spv::OpConvertUToAccelerationStructureKHR;
+        break;
 #endif
 
     case glslang::EOpCopyObject:
@@ -6297,7 +6524,7 @@
     case glslang::EOpConvFloatToBool:
         zero = builder.makeFloatConstant(0.0F);
         zero = makeSmearedConstant(zero, vectorSize);
-        return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero);
+        return builder.createBinOp(spv::OpFUnordNotEqual, destType, operand, zero);
     case glslang::EOpConvBoolToFloat:
         convOp = spv::OpSelect;
         zero = builder.makeFloatConstant(0.0F);
@@ -6446,11 +6673,11 @@
     case glslang::EOpConvDoubleToBool:
         zero = builder.makeDoubleConstant(0.0);
         zero = makeSmearedConstant(zero, vectorSize);
-        return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero);
+        return builder.createBinOp(spv::OpFUnordNotEqual, destType, operand, zero);
     case glslang::EOpConvFloat16ToBool:
         zero = builder.makeFloat16Constant(0.0F);
         zero = makeSmearedConstant(zero, vectorSize);
-        return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero);
+        return builder.createBinOp(spv::OpFUnordNotEqual, destType, operand, zero);
     case glslang::EOpConvBoolToDouble:
         convOp = spv::OpSelect;
         zero = builder.makeDoubleConstant(0.0);
@@ -6655,6 +6882,14 @@
     case glslang::EOpImageAtomicAdd:
     case glslang::EOpAtomicCounterAdd:
         opCode = spv::OpAtomicIAdd;
+        if (typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) {
+            opCode = spv::OpAtomicFAddEXT;
+            builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add);
+            if (typeProxy == glslang::EbtFloat)
+                builder.addCapability(spv::CapabilityAtomicFloat32AddEXT);
+            else
+                builder.addCapability(spv::CapabilityAtomicFloat64AddEXT);
+        }
         break;
     case glslang::EOpAtomicCounterSubtract:
         opCode = spv::OpAtomicISub;
@@ -6778,6 +7013,10 @@
         builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
     }
 
+    if (builder.getConstantScalar(scopeId) == spv::ScopeQueueFamily) {
+        builder.addCapability(spv::CapabilityVulkanMemoryModelKHR);
+    }
+
     if (glslangIntermediate->usingVulkanMemoryModel() && builder.getConstantScalar(scopeId) == spv::ScopeDevice) {
         builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR);
     }
@@ -7720,10 +7959,16 @@
         typeId = builder.makeBoolType();
         opCode = spv::OpReportIntersectionKHR;
         break;
-    case glslang::EOpTrace:
+    case glslang::EOpTraceNV:
+        builder.createNoResultOp(spv::OpTraceNV, operands);
+        return 0;
+    case glslang::EOpTraceKHR:
         builder.createNoResultOp(spv::OpTraceRayKHR, operands);
         return 0;
-    case glslang::EOpExecuteCallable:
+    case glslang::EOpExecuteCallableNV:
+        builder.createNoResultOp(spv::OpExecuteCallableNV, operands);
+        return 0;
+    case glslang::EOpExecuteCallableKHR:
         builder.createNoResultOp(spv::OpExecuteCallableKHR, operands);
         return 0;
 
@@ -7768,7 +8013,7 @@
         opCode = spv::OpRayQueryGetIntersectionInstanceIdKHR;
         break;
     case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:
-        typeId = builder.makeIntType(32);
+        typeId = builder.makeUintType(32);
         opCode = spv::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR;
         break;
     case glslang::EOpRayQueryGetIntersectionGeometryIndex:
@@ -8011,11 +8256,11 @@
         spv::Id id = builder.createBuiltinCall(typeId, getExtBuiltins(spv::E_SPV_AMD_gcn_shader), spv::TimeAMD, args);
         return builder.setPrecision(id, precision);
     }
-    case glslang::EOpIgnoreIntersection:
-        builder.createNoResultOp(spv::OpIgnoreIntersectionKHR);
+    case glslang::EOpIgnoreIntersectionNV:
+        builder.createNoResultOp(spv::OpIgnoreIntersectionNV);
         return 0;
-    case glslang::EOpTerminateRay:
-        builder.createNoResultOp(spv::OpTerminateRayKHR);
+    case glslang::EOpTerminateRayNV:
+        builder.createNoResultOp(spv::OpTerminateRayNV);
         return 0;
     case glslang::EOpRayQueryInitialize:
         builder.createNoResultOp(spv::OpRayQueryInitializeKHR);
@@ -8143,7 +8388,8 @@
     }
 
 #ifndef GLSLANG_WEB
-    if (symbol->getType().isImage()) {
+    // Subgroup builtins which have input storage class are volatile for ray tracing stages.
+    if (symbol->getType().isImage() || symbol->getQualifier().isPipeInput()) {
         std::vector<spv::Decoration> memory;
         TranslateMemoryDecoration(symbol->getType().getQualifier(), memory,
             glslangIntermediate->usingVulkanMemoryModel());
@@ -8151,9 +8397,6 @@
             builder.addDecoration(id, memory[i]);
     }
 
-    // nonuniform
-    builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier()));
-
     if (builtIn == spv::BuiltInSampleMask) {
           spv::Decoration decoration;
           // GL_NV_sample_mask_override_coverage extension
@@ -8270,6 +8513,18 @@
 
     // We now know we have a specialization constant to build
 
+    // Extra capabilities may be needed.
+    if (node.getType().contains8BitInt())
+        builder.addCapability(spv::CapabilityInt8);
+    if (node.getType().contains16BitFloat())
+        builder.addCapability(spv::CapabilityFloat16);
+    if (node.getType().contains16BitInt())
+        builder.addCapability(spv::CapabilityInt16);
+    if (node.getType().contains64BitInt())
+        builder.addCapability(spv::CapabilityInt64);
+    if (node.getType().containsDouble())
+        builder.addCapability(spv::CapabilityFloat64);
+
     // gl_WorkGroupSize is a special case until the front-end handles hierarchical specialization constants,
     // even then, it's specialization ids are handled by special case syntax in GLSL: layout(local_size_x = ...
     if (node.getType().getQualifier().builtIn == glslang::EbvWorkGroupSize) {
@@ -8625,7 +8880,9 @@
     // return 6; // revert version 5 change, which makes a different (new) kind of incorrect code,
                  // versions 4 and 6 each generate OpArrayLength as it has long been done
     // return 7; // GLSL volatile keyword maps to both SPIR-V decorations Volatile and Coherent
-    return 8; // switch to new dead block eliminator; use OpUnreachable
+    // return 8; // switch to new dead block eliminator; use OpUnreachable
+    // return 9; // don't include opaque function parameters in OpEntryPoint global's operand list
+    return 10; // Generate OpFUnordNotEqual for != comparisons
 }
 
 // Write SPIR-V out to a binary file
@@ -8645,14 +8902,15 @@
 // Write SPIR-V out to a text file with 32-bit hexadecimal words
 void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName)
 {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     std::ofstream out;
     out.open(baseName, std::ios::binary | std::ios::out);
     if (out.fail())
         printf("ERROR: Failed to open file: %s\n", baseName);
-    out << "\t// " << 
-        GetSpirvGeneratorVersion() << "." << GLSLANG_MINOR_VERSION << "." << GLSLANG_PATCH_LEVEL <<
-        std::endl;
+    out << "\t// " <<
+        GetSpirvGeneratorVersion() <<
+        GLSLANG_VERSION_MAJOR << "." << GLSLANG_VERSION_MINOR << "." << GLSLANG_VERSION_PATCH <<
+        GLSLANG_VERSION_FLAVOR << std::endl;
     if (varName != nullptr) {
         out << "\t #pragma once" << std::endl;
         out << "const uint32_t " << varName << "[] = {" << std::endl;
@@ -8671,6 +8929,7 @@
     }
     if (varName != nullptr) {
         out << "};";
+        out << std::endl;
     }
     out.close();
 #endif
@@ -8708,10 +8967,14 @@
     // If from HLSL, run spirv-opt to "legalize" the SPIR-V for Vulkan
     // eg. forward and remove memory writes of opaque types.
     bool prelegalization = intermediate.getSource() == EShSourceHlsl;
-    if ((intermediate.getSource() == EShSourceHlsl || options->optimizeSize) && !options->disableOptimizer) {
-        SpirvToolsLegalize(intermediate, spirv, logger, options);
+    if ((prelegalization || options->optimizeSize) && !options->disableOptimizer) {
+        SpirvToolsTransform(intermediate, spirv, logger, options);
         prelegalization = false;
     }
+    else if (options->stripDebugInfo) {
+        // Strip debug info even if optimization is disabled.
+        SpirvToolsStripDebugInfo(intermediate, spirv, logger);
+    }
 
     if (options->validate)
         SpirvToolsValidate(intermediate, spirv, logger, prelegalization);
diff --git a/SPIRV/GlslangToSpv.h b/SPIRV/GlslangToSpv.h
old mode 100755
new mode 100644
diff --git a/SPIRV/SPVRemapper.cpp b/SPIRV/SPVRemapper.cpp
index fd0bb89..56d7f43 100644
--- a/SPIRV/SPVRemapper.cpp
+++ b/SPIRV/SPVRemapper.cpp
@@ -625,6 +625,9 @@
                 break;
             }
 
+            case spv::OperandVariableLiteralStrings:
+                return nextInst;
+
             // Execution mode might have extra literal operands.  Skip them.
             case spv::OperandExecutionMode:
                 return nextInst;
@@ -827,7 +830,15 @@
             [&](spv::Id& id) {
                 if (thisOpCode != spv::OpNop) {
                     ++idCounter;
-                    const std::uint32_t hashval = opCounter[thisOpCode] * thisOpCode * 50047 + idCounter + fnId * 117;
+                    const std::uint32_t hashval =
+                        // Explicitly cast operands to unsigned int to avoid integer
+                        // promotion to signed int followed by integer overflow,
+                        // which would result in undefined behavior.
+                        static_cast<unsigned int>(opCounter[thisOpCode])
+                        * thisOpCode
+                        * 50047
+                        + idCounter
+                        + static_cast<unsigned int>(fnId) * 117;
 
                     if (isOldIdUnmapped(id))
                         localId(id, nextUnusedId(hashval % softTypeIdLimit + firstMappedID));
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 6cf70a1..1401bb0 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -621,13 +621,13 @@
 Id Builder::makeRayQueryType()
 {
     Instruction *type;
-    if (groupedTypes[OpTypeRayQueryProvisionalKHR].size() == 0) {
-        type = new Instruction(getUniqueId(), NoType, OpTypeRayQueryProvisionalKHR);
-        groupedTypes[OpTypeRayQueryProvisionalKHR].push_back(type);
+    if (groupedTypes[OpTypeRayQueryKHR].size() == 0) {
+        type = new Instruction(getUniqueId(), NoType, OpTypeRayQueryKHR);
+        groupedTypes[OpTypeRayQueryKHR].push_back(type);
         constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
         module.mapInstruction(type);
     } else {
-        type = groupedTypes[OpTypeRayQueryProvisionalKHR].back();
+        type = groupedTypes[OpTypeRayQueryKHR].back();
     }
 
     return type->getResultId();
@@ -869,6 +869,30 @@
     }
 }
 
+Id Builder::makeNullConstant(Id typeId)
+{
+    Instruction* constant;
+
+    // See if we already made it.
+    Id existing = NoResult;
+    for (int i = 0; i < (int)nullConstants.size(); ++i) {
+        constant = nullConstants[i];
+        if (constant->getTypeId() == typeId)
+            existing = constant->getResultId();
+    }
+
+    if (existing != NoResult)
+        return existing;
+
+    // Make it
+    Instruction* c = new Instruction(getUniqueId(), typeId, OpConstantNull);
+    constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(c));
+    nullConstants.push_back(c);
+    module.mapInstruction(c);
+
+    return c->getResultId();
+}
+
 Id Builder::makeBoolConstant(bool b, bool specConstant)
 {
     Id typeId = makeBoolType();
@@ -1183,6 +1207,28 @@
     executionModes.push_back(std::unique_ptr<Instruction>(instr));
 }
 
+void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const std::vector<unsigned>& literals)
+{
+    Instruction* instr = new Instruction(OpExecutionMode);
+    instr->addIdOperand(entryPoint->getId());
+    instr->addImmediateOperand(mode);
+    for (auto literal : literals)
+        instr->addImmediateOperand(literal);
+
+    executionModes.push_back(std::unique_ptr<Instruction>(instr));
+}
+
+void Builder::addExecutionModeId(Function* entryPoint, ExecutionMode mode, const std::vector<Id>& operandIds)
+{
+    Instruction* instr = new Instruction(OpExecutionModeId);
+    instr->addIdOperand(entryPoint->getId());
+    instr->addImmediateOperand(mode);
+    for (auto operandId : operandIds)
+        instr->addIdOperand(operandId);
+
+    executionModes.push_back(std::unique_ptr<Instruction>(instr));
+}
+
 void Builder::addName(Id id, const char* string)
 {
     Instruction* name = new Instruction(OpName);
@@ -1221,7 +1267,7 @@
     if (decoration == spv::DecorationMax)
         return;
 
-    Instruction* dec = new Instruction(OpDecorateStringGOOGLE);
+    Instruction* dec = new Instruction(OpDecorateString);
     dec->addIdOperand(id);
     dec->addImmediateOperand(decoration);
     dec->addStringOperand(s);
@@ -1229,6 +1275,34 @@
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addDecoration(Id id, Decoration decoration, const std::vector<unsigned>& literals)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorate);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    for (auto literal : literals)
+        dec->addImmediateOperand(literal);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
+void Builder::addDecoration(Id id, Decoration decoration, const std::vector<const char*>& strings)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateString);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    for (auto string : strings)
+        dec->addStringOperand(string);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration)
 {
     if (decoration == spv::DecorationMax)
@@ -1242,6 +1316,21 @@
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addDecorationId(Id id, Decoration decoration, const std::vector<Id>& operandIds)
+{
+    if(decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateId);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+
+    for (auto operandId : operandIds)
+        dec->addIdOperand(operandId);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, int num)
 {
     if (decoration == spv::DecorationMax)
@@ -1271,6 +1360,36 @@
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const std::vector<unsigned>& literals)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpMemberDecorate);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(member);
+    dec->addImmediateOperand(decoration);
+    for (auto literal : literals)
+        dec->addImmediateOperand(literal);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
+void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const std::vector<const char*>& strings)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpMemberDecorateString);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(member);
+    dec->addImmediateOperand(decoration);
+    for (auto string : strings)
+        dec->addStringOperand(string);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 // Comments in header
 Function* Builder::makeEntryPoint(const char* entryPoint)
 {
@@ -1297,9 +1416,12 @@
 
     // Set up the precisions
     setPrecision(function->getId(), precision);
+    function->setReturnPrecision(precision);
     for (unsigned p = 0; p < (unsigned)decorations.size(); ++p) {
-        for (int d = 0; d < (int)decorations[p].size(); ++d)
+        for (int d = 0; d < (int)decorations[p].size(); ++d) {
             addDecoration(firstParamId + p, decorations[p][d]);
+            function->addParamPrecision(p, decorations[p][d]);
+        }
     }
 
     // CFG
@@ -1349,14 +1471,14 @@
 }
 
 // Comments in header
-void Builder::makeDiscard()
+void Builder::makeStatementTerminator(spv::Op opcode, const char *name)
 {
-    buildPoint->addInstruction(std::unique_ptr<Instruction>(new Instruction(OpKill)));
-    createAndSetNoPredecessorBlock("post-discard");
+    buildPoint->addInstruction(std::unique_ptr<Instruction>(new Instruction(opcode)));
+    createAndSetNoPredecessorBlock(name);
 }
 
 // Comments in header
-Id Builder::createVariable(StorageClass storageClass, Id type, const char* name, Id initializer)
+Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name, Id initializer)
 {
     Id pointerType = makePointer(storageClass, type);
     Instruction* inst = new Instruction(getUniqueId(), pointerType, OpVariable);
@@ -1378,6 +1500,7 @@
 
     if (name)
         addName(inst->getResultId(), name);
+    setPrecision(inst->getResultId(), precision);
 
     return inst->getResultId();
 }
@@ -1434,7 +1557,8 @@
 }
 
 // Comments in header
-Id Builder::createLoad(Id lValue, spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)
+Id Builder::createLoad(Id lValue, spv::Decoration precision, spv::MemoryAccessMask memoryAccess,
+    spv::Scope scope, unsigned int alignment)
 {
     Instruction* load = new Instruction(getUniqueId(), getDerefTypeId(lValue), OpLoad);
     load->addIdOperand(lValue);
@@ -1452,6 +1576,7 @@
     }
 
     buildPoint->addInstruction(std::unique_ptr<Instruction>(load));
+    setPrecision(load->getResultId(), precision);
 
     return load->getResultId();
 }
@@ -2166,7 +2291,7 @@
         Op op;
         switch (getMostBasicTypeClass(valueType)) {
         case OpTypeFloat:
-            op = equal ? OpFOrdEqual : OpFOrdNotEqual;
+            op = equal ? OpFOrdEqual : OpFUnordNotEqual;
             break;
         case OpTypeInt:
         default:
@@ -2660,12 +2785,14 @@
 }
 
 // Comments in header
-void Builder::accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)
+void Builder::accessChainStore(Id rvalue, Decoration nonUniform, spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)
 {
     assert(accessChain.isRValue == false);
 
     transferAccessChainSwizzle(true);
     Id base = collapseAccessChain();
+    addDecoration(base, nonUniform);
+
     Id source = rvalue;
 
     // dynamic component should be gone
@@ -2674,7 +2801,7 @@
     // If swizzle still exists, it is out-of-order or not full, we must load the target vector,
     // extract and insert elements to perform writeMask and/or swizzle.
     if (accessChain.swizzle.size() > 0) {
-        Id tempBaseId = createLoad(base);
+        Id tempBaseId = createLoad(base, spv::NoPrecision);
         source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);
     }
 
@@ -2688,8 +2815,9 @@
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType,
-    spv::MemoryAccessMask memoryAccess, spv::Scope scope, unsigned int alignment)
+Id Builder::accessChainLoad(Decoration precision, Decoration l_nonUniform,
+    Decoration r_nonUniform, Id resultType, spv::MemoryAccessMask memoryAccess,
+    spv::Scope scope, unsigned int alignment)
 {
     Id id;
 
@@ -2713,17 +2841,19 @@
 
             if (constant) {
                 id = createCompositeExtract(accessChain.base, swizzleBase, indexes);
+                setPrecision(id, precision);
             } else {
                 Id lValue = NoResult;
-                if (spvVersion >= Spv_1_4) {
+                if (spvVersion >= Spv_1_4 && isValidInitializer(accessChain.base)) {
                     // make a new function variable for this r-value, using an initializer,
                     // and mark it as NonWritable so that downstream it can be detected as a lookup
                     // table
-                    lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable",
-                        accessChain.base);
+                    lValue = createVariable(NoPrecision, StorageClassFunction, getTypeId(accessChain.base),
+                        "indexable", accessChain.base);
                     addDecoration(lValue, DecorationNonWritable);
                 } else {
-                    lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable");
+                    lValue = createVariable(NoPrecision, StorageClassFunction, getTypeId(accessChain.base),
+                        "indexable");
                     // store into it
                     createStore(accessChain.base, lValue);
                 }
@@ -2732,9 +2862,8 @@
                 accessChain.isRValue = false;
 
                 // load through the access chain
-                id = createLoad(collapseAccessChain());
+                id = createLoad(collapseAccessChain(), precision);
             }
-            setPrecision(id, precision);
         } else
             id = accessChain.base;  // no precision, it was set when this was defined
     } else {
@@ -2752,10 +2881,9 @@
         // Buffer accesses need the access chain decorated, and this is where
         // loaded image types get decorated. TODO: This should maybe move to
         // createImageTextureFunctionCall.
-        addDecoration(id, nonUniform);
-        id = createLoad(id, memoryAccess, scope, alignment);
-        setPrecision(id, precision);
-        addDecoration(id, nonUniform);
+        addDecoration(id, l_nonUniform);
+        id = createLoad(id, precision, memoryAccess, scope, alignment);
+        addDecoration(id, r_nonUniform);
     }
 
     // Done, unless there are swizzles to do
@@ -2776,7 +2904,7 @@
     if (accessChain.component != NoResult)
         id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision);
 
-    addDecoration(id, nonUniform);
+    addDecoration(id, r_nonUniform);
     return id;
 }
 
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 71b90d6..73847e1 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -248,6 +248,13 @@
         { return module.getInstruction(resultId)->getImmediateOperand(0); }
     StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }
 
+    bool isVariableOpCode(Op opcode) const { return opcode == OpVariable; }
+    bool isVariable(Id resultId) const { return isVariableOpCode(getOpCode(resultId)); }
+    bool isGlobalStorage(Id resultId) const { return getStorageClass(resultId) != StorageClassFunction; }
+    bool isGlobalVariable(Id resultId) const { return isVariable(resultId) && isGlobalStorage(resultId); }
+    // See if a resultId is valid for use as an initializer.
+    bool isValidInitializer(Id resultId) const { return isConstant(resultId) || isGlobalVariable(resultId); }
+
     int getScalarTypeWidth(Id typeId) const
     {
         Id scalarTypeId = getScalarTypeId(typeId);
@@ -286,6 +293,7 @@
     }
 
     // For making new constants (will return old constant if the requested one was already made).
+    Id makeNullConstant(Id typeId);
     Id makeBoolConstant(bool b, bool specConstant = false);
     Id makeInt8Constant(int i, bool specConstant = false)
         { return makeIntConstant(makeIntType(8),  (unsigned)i, specConstant); }
@@ -314,13 +322,20 @@
     // Methods for adding information outside the CFG.
     Instruction* addEntryPoint(ExecutionModel, Function*, const char* name);
     void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);
+    void addExecutionMode(Function*, ExecutionMode mode, const std::vector<unsigned>& literals);
+    void addExecutionModeId(Function*, ExecutionMode mode, const std::vector<Id>& operandIds);
     void addName(Id, const char* name);
     void addMemberName(Id, int member, const char* name);
     void addDecoration(Id, Decoration, int num = -1);
     void addDecoration(Id, Decoration, const char*);
+    void addDecoration(Id, Decoration, const std::vector<unsigned>& literals);
+    void addDecoration(Id, Decoration, const std::vector<const char*>& strings);
     void addDecorationId(Id id, Decoration, Id idDecoration);
+    void addDecorationId(Id id, Decoration, const std::vector<Id>& operandIds);
     void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);
     void addMemberDecoration(Id, unsigned int member, Decoration, const char*);
+    void addMemberDecoration(Id, unsigned int member, Decoration, const std::vector<unsigned>& literals);
+    void addMemberDecoration(Id, unsigned int member, Decoration, const std::vector<const char*>& strings);
 
     // At the end of what block do the next create*() instructions go?
     void setBuildPoint(Block* bp) { buildPoint = bp; }
@@ -343,11 +358,13 @@
     // Generate all the code needed to finish up a function.
     void leaveFunction();
 
-    // Create a discard.
-    void makeDiscard();
+    // Create block terminator instruction for certain statements like
+    // discard, terminate-invocation, terminateRayEXT, or ignoreIntersectionEXT
+    void makeStatementTerminator(spv::Op opcode, const char *name);
 
     // Create a global or function local or IO variable.
-    Id createVariable(StorageClass, Id type, const char* name = 0, Id initializer = NoResult);
+    Id createVariable(Decoration precision, StorageClass, Id type, const char* name = nullptr,
+        Id initializer = NoResult);
 
     // Create an intermediate with an undefined value.
     Id createUndefined(Id type);
@@ -357,7 +374,8 @@
         spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
 
     // Load from an Id and return it
-    Id createLoad(Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
+    Id createLoad(Id lValue, spv::Decoration precision,
+        spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
         spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
 
     // Create an OpAccessChain instruction
@@ -608,6 +626,7 @@
             CoherentFlags operator |=(const CoherentFlags &other) { return *this; }
 #else
             bool isVolatile() const { return volatil; }
+            bool isNonUniform() const { return nonUniform; }
             bool anyCoherent() const {
                 return coherent || devicecoherent || queuefamilycoherent || workgroupcoherent ||
                     subgroupcoherent || shadercallcoherent;
@@ -622,6 +641,7 @@
             unsigned nonprivate : 1;
             unsigned volatil : 1;
             unsigned isImage : 1;
+            unsigned nonUniform : 1;
 
             void clear() {
                 coherent = 0;
@@ -633,6 +653,7 @@
                 nonprivate = 0;
                 volatil = 0;
                 isImage = 0;
+                nonUniform = 0;
             }
 
             CoherentFlags operator |=(const CoherentFlags &other) {
@@ -645,6 +666,7 @@
                 nonprivate |= other.nonprivate;
                 volatil |= other.volatil;
                 isImage |= other.isImage;
+                nonUniform |= other.nonUniform;
                 return *this;
             }
 #endif
@@ -705,11 +727,12 @@
     }
 
     // use accessChain and swizzle to store value
-    void accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
+    void accessChainStore(Id rvalue, Decoration nonUniform,
+        spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
         spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
 
     // use accessChain and swizzle to load an r-value
-    Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType,
+    Id accessChainLoad(Decoration precision, Decoration l_nonUniform, Decoration r_nonUniform, Id ResultType,
         spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax,
             unsigned int alignment = 0);
 
@@ -816,6 +839,8 @@
     std::unordered_map<unsigned int, std::vector<Instruction*>> groupedStructConstants;
     // map type opcodes to type instructions
     std::unordered_map<unsigned int, std::vector<Instruction*>> groupedTypes;
+    // list of OpConstantNull instructions
+    std::vector<Instruction*> nullConstants;
 
     // stack of switches
     std::stack<Block*> switchMerges;
diff --git a/SPIRV/SpvPostProcess.cpp b/SPIRV/SpvPostProcess.cpp
index d40174d..23d7b5a 100644
--- a/SPIRV/SpvPostProcess.cpp
+++ b/SPIRV/SpvPostProcess.cpp
@@ -436,6 +436,38 @@
             }
         }
     }
+
+    // If any Vulkan memory model-specific functionality is used, update the
+    // OpMemoryModel to match.
+    if (capabilities.find(spv::CapabilityVulkanMemoryModelKHR) != capabilities.end()) {
+        memoryModel = spv::MemoryModelVulkanKHR;
+        addIncorporatedExtension(spv::E_SPV_KHR_vulkan_memory_model, spv::Spv_1_5);
+    }
+
+    // Add Aliased decoration if there's more than one Workgroup Block variable.
+    if (capabilities.find(spv::CapabilityWorkgroupMemoryExplicitLayoutKHR) != capabilities.end()) {
+        assert(entryPoints.size() == 1);
+        auto &ep = entryPoints[0];
+
+        std::vector<Id> workgroup_variables;
+        for (int i = 0; i < (int)ep->getNumOperands(); i++) {
+            if (!ep->isIdOperand(i))
+                continue;
+
+            const Id id = ep->getIdOperand(i);
+            const Instruction *instr = module.getInstruction(id);
+            if (instr->getOpCode() != spv::OpVariable)
+                continue;
+
+            if (instr->getImmediateOperand(0) == spv::StorageClassWorkgroup)
+                workgroup_variables.push_back(id);
+        }
+
+        if (workgroup_variables.size() > 1) {
+            for (size_t i = 0; i < workgroup_variables.size(); i++)
+                addDecoration(workgroup_variables[i], spv::DecorationAliased);
+        }
+    }
 }
 #endif
 
diff --git a/SPIRV/SpvTools.cpp b/SPIRV/SpvTools.cpp
index 1e968ba..5cfc426 100644
--- a/SPIRV/SpvTools.cpp
+++ b/SPIRV/SpvTools.cpp
@@ -44,7 +44,6 @@
 
 #include "SpvTools.h"
 #include "spirv-tools/optimizer.hpp"
-#include "spirv-tools/libspirv.h"
 
 namespace glslang {
 
@@ -80,12 +79,52 @@
     return spv_target_env::SPV_ENV_UNIVERSAL_1_0;
 }
 
+// Callback passed to spvtools::Optimizer::SetMessageConsumer
+void OptimizerMesssageConsumer(spv_message_level_t level, const char *source,
+        const spv_position_t &position, const char *message)
+{
+    auto &out = std::cerr;
+    switch (level)
+    {
+    case SPV_MSG_FATAL:
+    case SPV_MSG_INTERNAL_ERROR:
+    case SPV_MSG_ERROR:
+        out << "error: ";
+        break;
+    case SPV_MSG_WARNING:
+        out << "warning: ";
+        break;
+    case SPV_MSG_INFO:
+    case SPV_MSG_DEBUG:
+        out << "info: ";
+        break;
+    default:
+        break;
+    }
+    if (source)
+    {
+        out << source << ":";
+    }
+    out << position.line << ":" << position.column << ":" << position.index << ":";
+    if (message)
+    {
+        out << " " << message;
+    }
+    out << std::endl;
+}
 
-// Use the SPIRV-Tools disassembler to print SPIR-V.
+// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.
 void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv)
 {
+    SpirvToolsDisassemble(out, spirv, spv_target_env::SPV_ENV_UNIVERSAL_1_3);
+}
+
+// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,
+                           spv_target_env requested_context)
+{
     // disassemble
-    spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
+    spv_context context = spvContextCreate(requested_context);
     spv_text text;
     spv_diagnostic diagnostic = nullptr;
     spvBinaryToText(context, spirv.data(), spirv.size(),
@@ -114,6 +153,8 @@
     spv_validator_options options = spvValidatorOptionsCreate();
     spvValidatorOptionsSetRelaxBlockLayout(options, intermediate.usingHlslOffsets());
     spvValidatorOptionsSetBeforeHlslLegalization(options, prelegalization);
+    spvValidatorOptionsSetScalarBlockLayout(options, intermediate.usingScalarBlockLayout());
+    spvValidatorOptionsSetWorkgroupScalarBlockLayout(options, intermediate.usingScalarBlockLayout());
     spvValidateWithOptions(context, options, &binary, &diagnostic);
 
     // report
@@ -128,52 +169,21 @@
     spvContextDestroy(context);
 }
 
-// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
-// legalizing HLSL SPIR-V.
-void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
-                        spv::SpvBuildLogger* logger, const SpvOptions* options)
+// Apply the SPIRV-Tools optimizer to generated SPIR-V.  HLSL SPIR-V is legalized in the process.
+void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                         spv::SpvBuildLogger* logger, const SpvOptions* options)
 {
-    spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2;
+    spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger);
 
     spvtools::Optimizer optimizer(target_env);
-    optimizer.SetMessageConsumer(
-        [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
-            auto &out = std::cerr;
-            switch (level)
-            {
-            case SPV_MSG_FATAL:
-            case SPV_MSG_INTERNAL_ERROR:
-            case SPV_MSG_ERROR:
-                out << "error: ";
-                break;
-            case SPV_MSG_WARNING:
-                out << "warning: ";
-                break;
-            case SPV_MSG_INFO:
-            case SPV_MSG_DEBUG:
-                out << "info: ";
-                break;
-            default:
-                break;
-            }
-            if (source)
-            {
-                out << source << ":";
-            }
-            out << position.line << ":" << position.column << ":" << position.index << ":";
-            if (message)
-            {
-                out << " " << message;
-            }
-            out << std::endl;
-        });
+    optimizer.SetMessageConsumer(OptimizerMesssageConsumer);
 
     // If debug (specifically source line info) is being generated, propagate
     // line information into all SPIR-V instructions. This avoids loss of
     // information when instructions are deleted or moved. Later, remove
     // redundant information to minimize final SPRIR-V size.
-    if (options->generateDebugInfo) {
-        optimizer.RegisterPass(spvtools::CreatePropagateLineInfoPass());
+    if (options->stripDebugInfo) {
+        optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());
     }
     optimizer.RegisterPass(spvtools::CreateWrapOpKillPass());
     optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
@@ -202,9 +212,25 @@
     }
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
-    if (options->generateDebugInfo) {
-        optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass());
-    }
+
+    spvtools::OptimizerOptions spvOptOptions;
+    optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
+    spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on
+    optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);
+}
+
+// Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V.  This is implicitly done by
+// SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if
+// optimization is disabled.
+void SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate,
+        std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger)
+{
+    spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger);
+
+    spvtools::Optimizer optimizer(target_env);
+    optimizer.SetMessageConsumer(OptimizerMesssageConsumer);
+
+    optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());
 
     spvtools::OptimizerOptions spvOptOptions;
     optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
diff --git a/SPIRV/SpvTools.h b/SPIRV/SpvTools.h
index 59c914d..3fb3cba 100644
--- a/SPIRV/SpvTools.h
+++ b/SPIRV/SpvTools.h
@@ -41,9 +41,10 @@
 #ifndef GLSLANG_SPV_TOOLS_H
 #define GLSLANG_SPV_TOOLS_H
 
-#ifdef ENABLE_OPT
+#if ENABLE_OPT
 #include <vector>
 #include <ostream>
+#include "spirv-tools/libspirv.h"
 #endif
 
 #include "glslang/MachineIndependent/localintermediate.h"
@@ -52,28 +53,38 @@
 namespace glslang {
 
 struct SpvOptions {
-    SpvOptions() : generateDebugInfo(false), disableOptimizer(true),
+    SpvOptions() : generateDebugInfo(false), stripDebugInfo(false), disableOptimizer(true),
         optimizeSize(false), disassemble(false), validate(false) { }
     bool generateDebugInfo;
+    bool stripDebugInfo;
     bool disableOptimizer;
     bool optimizeSize;
     bool disassemble;
     bool validate;
 };
 
-#ifdef ENABLE_OPT
+#if ENABLE_OPT
 
-// Use the SPIRV-Tools disassembler to print SPIR-V.
+// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment.
 void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv);
 
+// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment.
+void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv,
+                           spv_target_env requested_context);
+
 // Apply the SPIRV-Tools validator to generated SPIR-V.
 void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
                         spv::SpvBuildLogger*, bool prelegalization);
 
-// Apply the SPIRV-Tools optimizer to generated SPIR-V, for the purpose of
-// legalizing HLSL SPIR-V.
-void SpirvToolsLegalize(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
-                        spv::SpvBuildLogger*, const SpvOptions*);
+// Apply the SPIRV-Tools optimizer to generated SPIR-V.  HLSL SPIR-V is legalized in the process.
+void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
+                         spv::SpvBuildLogger*, const SpvOptions*);
+
+// Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V.  This is implicitly done by
+// SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if
+// optimization is disabled.
+void SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate,
+        std::vector<unsigned int>& spirv, spv::SpvBuildLogger*);
 
 #endif
 
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index 4faa89e..73c988c 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -46,7 +46,6 @@
 
 #include "disassemble.h"
 #include "doc.h"
-#include "SpvTools.h"
 
 namespace spv {
     extern "C" {
@@ -519,6 +518,10 @@
         case OperandLiteralString:
             numOperands -= disassembleString();
             break;
+        case OperandVariableLiteralStrings:
+            while (numOperands > 0)
+                numOperands -= disassembleString();
+            return;
         case OperandMemoryAccess:
             outputMask(OperandMemoryAccess, stream[word++]);
             --numOperands;
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index b1f2b82..6805c3a 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -134,7 +134,7 @@
     }
 }
 
-const int ExecutionModeCeiling = 33;
+const int ExecutionModeCeiling = 40;
 
 const char* ExecutionModeString(int mode)
 {
@@ -173,7 +173,21 @@
     case 31: return "ContractionOff";
     case 32: return "Bad";
 
-    case 4446:  return "PostDepthCoverage";
+    case ExecutionModeInitializer:              return "Initializer";
+    case ExecutionModeFinalizer:                return "Finalizer";
+    case ExecutionModeSubgroupSize:             return "SubgroupSize";
+    case ExecutionModeSubgroupsPerWorkgroup:    return "SubgroupsPerWorkgroup";
+    case ExecutionModeSubgroupsPerWorkgroupId:  return "SubgroupsPerWorkgroupId";
+    case ExecutionModeLocalSizeId:              return "LocalSizeId";
+    case ExecutionModeLocalSizeHintId:          return "LocalSizeHintId";
+
+    case ExecutionModePostDepthCoverage:        return "PostDepthCoverage";
+    case ExecutionModeDenormPreserve:           return "DenormPreserve";
+    case ExecutionModeDenormFlushToZero:        return "DenormFlushToZero";
+    case ExecutionModeSignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve";
+    case ExecutionModeRoundingModeRTE:          return "RoundingModeRTE";
+    case ExecutionModeRoundingModeRTZ:          return "RoundingModeRTZ";
+    case ExecutionModeStencilRefReplacingEXT:   return "StencilRefReplacingEXT";
 
     case ExecutionModeOutputLinesNV:            return "OutputLinesNV";
     case ExecutionModeOutputPrimitivesNV:       return "OutputPrimitivesNV";
@@ -188,6 +202,11 @@
     case ExecutionModeShadingRateInterlockOrderedEXT:   return "ShadingRateInterlockOrderedEXT";
     case ExecutionModeShadingRateInterlockUnorderedEXT: return "ShadingRateInterlockUnorderedEXT";
 
+    case ExecutionModeMaxWorkgroupSizeINTEL:    return "MaxWorkgroupSizeINTEL";
+    case ExecutionModeMaxWorkDimINTEL:          return "MaxWorkDimINTEL";
+    case ExecutionModeNoGlobalOffsetINTEL:      return "NoGlobalOffsetINTEL";
+    case ExecutionModeNumSIMDWorkitemsINTEL:    return "NumSIMDWorkitemsINTEL";
+
     case ExecutionModeCeiling:
     default: return "Bad";
     }
@@ -353,6 +372,8 @@
     case 4424: return "BaseVertex";
     case 4425: return "BaseInstance";
     case 4426: return "DrawIndex";
+    case 4432: return "PrimitiveShadingRateKHR";
+    case 4444: return "ShadingRateKHR";
     case 5014: return "FragStencilRefEXT";
 
     case 4992: return "BaryCoordNoPerspAMD";
@@ -374,7 +395,7 @@
     case BuiltInRayGeometryIndexKHR:         return "RayGeometryIndexKHR";
     case BuiltInObjectToWorldKHR:            return "ObjectToWorldKHR";
     case BuiltInWorldToObjectKHR:            return "WorldToObjectKHR";
-    case BuiltInHitTKHR:                     return "HitTKHR";
+    case BuiltInHitTNV:                      return "HitTNV";
     case BuiltInHitKindKHR:                  return "HitKindKHR";
     case BuiltInIncomingRayFlagsKHR:         return "IncomingRayFlagsKHR";
     case BuiltInViewportMaskNV:              return "ViewportMaskNV";
@@ -502,6 +523,8 @@
     case 37: return "Rg8ui";
     case 38: return "R16ui";
     case 39: return "R8ui";
+    case 40: return "R64ui";
+    case 41: return "R64i";
 
     default:
         return "Bad";
@@ -892,9 +915,9 @@
     case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
     case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
     case CapabilityRayTracingNV:                    return "RayTracingNV";
-    case CapabilityRayTracingProvisionalKHR:        return "RayTracingProvisionalKHR";
-    case CapabilityRayQueryProvisionalKHR:          return "RayQueryProvisionalKHR";
-    case CapabilityRayTraversalPrimitiveCullingProvisionalKHR: return "RayTraversalPrimitiveCullingProvisionalKHR";
+    case CapabilityRayTracingKHR:                   return "RayTracingKHR";
+    case CapabilityRayQueryKHR:                     return "RayQueryKHR";
+    case CapabilityRayTraversalPrimitiveCullingKHR: return "RayTraversalPrimitiveCullingKHR";
     case CapabilityComputeDerivativeGroupQuadsNV:   return "ComputeDerivativeGroupQuadsNV";
     case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
     case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
@@ -933,11 +956,21 @@
     case CapabilityFragmentShaderPixelInterlockEXT:         return "CapabilityFragmentShaderPixelInterlockEXT";
     case CapabilityFragmentShaderShadingRateInterlockEXT:   return "CapabilityFragmentShaderShadingRateInterlockEXT";
 
+    case CapabilityFragmentShadingRateKHR:                  return "FragmentShadingRateKHR";
+
     case CapabilityDemoteToHelperInvocationEXT:             return "DemoteToHelperInvocationEXT";
     case CapabilityShaderClockKHR:                          return "ShaderClockKHR";
+    case CapabilityInt64ImageEXT:                           return "Int64ImageEXT";
 
     case CapabilityIntegerFunctions2INTEL:              return "CapabilityIntegerFunctions2INTEL";
 
+    case CapabilityAtomicFloat32AddEXT:                     return "AtomicFloat32AddEXT";
+    case CapabilityAtomicFloat64AddEXT:                     return "AtomicFloat64AddEXT";
+
+    case CapabilityWorkgroupMemoryExplicitLayoutKHR:            return "CapabilityWorkgroupMemoryExplicitLayoutKHR";
+    case CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR:  return "CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR";
+    case CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR: return "CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR";
+
     default: return "Bad";
     }
 }
@@ -1269,6 +1302,7 @@
     case 320: return "OpImageSparseRead";
 
     case OpModuleProcessed: return "OpModuleProcessed";
+    case OpExecutionModeId: return "OpExecutionModeId";
     case OpDecorateId:      return "OpDecorateId";
 
     case 333: return "OpGroupNonUniformElect";
@@ -1306,6 +1340,8 @@
     case 365: return "OpGroupNonUniformQuadBroadcast";
     case 366: return "OpGroupNonUniformQuadSwap";
 
+    case OpTerminateInvocation: return "OpTerminateInvocation";
+
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4428: return "OpSubgroupAllKHR";
@@ -1313,6 +1349,8 @@
     case 4430: return "OpSubgroupAllEqualKHR";
     case 4432: return "OpSubgroupReadInvocationKHR";
 
+    case OpAtomicFAddEXT: return "OpAtomicFAddEXT";
+
     case 5000: return "OpGroupIAddNonUniformAMD";
     case 5001: return "OpGroupFAddNonUniformAMD";
     case 5002: return "OpGroupFMinNonUniformAMD";
@@ -1330,17 +1368,23 @@
     case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
     case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
 
+    case OpReportIntersectionKHR:             return "OpReportIntersectionKHR";
+    case OpIgnoreIntersectionNV:              return "OpIgnoreIntersectionNV";
+    case OpIgnoreIntersectionKHR:             return "OpIgnoreIntersectionKHR";
+    case OpTerminateRayNV:                    return "OpTerminateRayNV";
+    case OpTerminateRayKHR:                   return "OpTerminateRayKHR";
+    case OpTraceNV:                           return "OpTraceNV";
+    case OpTraceRayKHR:                       return "OpTraceRayKHR";
+    case OpTypeAccelerationStructureKHR:      return "OpTypeAccelerationStructureKHR";
+    case OpExecuteCallableNV:                 return "OpExecuteCallableNV";
+    case OpExecuteCallableKHR:                return "OpExecuteCallableKHR";
+    case OpConvertUToAccelerationStructureKHR: return "OpConvertUToAccelerationStructureKHR";
+
     case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
-    case OpReportIntersectionKHR:            return "OpReportIntersectionKHR";
-    case OpIgnoreIntersectionKHR:            return "OpIgnoreIntersectionKHR";
-    case OpTerminateRayKHR:                  return "OpTerminateRayKHR";
-    case OpTraceRayKHR:                      return "OpTraceRayKHR";
-    case OpTypeAccelerationStructureKHR:     return "OpTypeAccelerationStructureKHR";
-    case OpExecuteCallableKHR:               return "OpExecuteCallableKHR";
     case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
     case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
 
-    case OpTypeRayQueryProvisionalKHR:                                        return "OpTypeRayQueryProvisionalKHR";
+    case OpTypeRayQueryKHR:                                                   return "OpTypeRayQueryKHR";
     case OpRayQueryInitializeKHR:                                             return "OpRayQueryInitializeKHR";
     case OpRayQueryTerminateKHR:                                              return "OpRayQueryTerminateKHR";
     case OpRayQueryGenerateIntersectionKHR:                                   return "OpRayQueryGenerateIntersectionKHR";
@@ -1418,6 +1462,7 @@
     InstructionDesc[OpMemoryModel].setResultAndType(false, false);
     InstructionDesc[OpEntryPoint].setResultAndType(false, false);
     InstructionDesc[OpExecutionMode].setResultAndType(false, false);
+    InstructionDesc[OpExecutionModeId].setResultAndType(false, false);
     InstructionDesc[OpTypeVoid].setResultAndType(true, false);
     InstructionDesc[OpTypeBool].setResultAndType(true, false);
     InstructionDesc[OpTypeInt].setResultAndType(true, false);
@@ -1471,6 +1516,7 @@
     InstructionDesc[OpBranchConditional].setResultAndType(false, false);
     InstructionDesc[OpSwitch].setResultAndType(false, false);
     InstructionDesc[OpKill].setResultAndType(false, false);
+    InstructionDesc[OpTerminateInvocation].setResultAndType(false, false);
     InstructionDesc[OpReturn].setResultAndType(false, false);
     InstructionDesc[OpReturnValue].setResultAndType(false, false);
     InstructionDesc[OpUnreachable].setResultAndType(false, false);
@@ -1604,6 +1650,10 @@
     InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'");
     InstructionDesc[OpExecutionMode].operands.push(OperandOptionalLiteral, "See <<Execution_Mode,Execution Mode>>");
 
+    InstructionDesc[OpExecutionModeId].operands.push(OperandId, "'Entry Point'");
+    InstructionDesc[OpExecutionModeId].operands.push(OperandExecutionMode, "'Mode'");
+    InstructionDesc[OpExecutionModeId].operands.push(OperandVariableIds, "See <<Execution_Mode,Execution Mode>>");
+
     InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'");
     InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'");
 
@@ -1697,7 +1747,7 @@
 
     InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'");
     InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, "");
-    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'");
 
     InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'");
     InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'");
@@ -1707,7 +1757,7 @@
     InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'");
     InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'");
     InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, "");
-    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'");
 
     InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'");
     InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'");
@@ -2260,6 +2310,11 @@
     InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'");
     InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'");
 
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'");
+    InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'");
+
     InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'");
     InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'");
     InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'");
@@ -2726,7 +2781,20 @@
 
     InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false);
 
-    InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'NV Acceleration Structure'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'");
+    InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'");
+    InstructionDesc[OpTraceNV].setResultAndType(false, false);
+
+    InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'");
@@ -2742,17 +2810,28 @@
     InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'");
     InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'");
 
+    InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false);
+
     InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false);
 
+    InstructionDesc[OpTerminateRayNV].setResultAndType(false, false);
+
     InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false);
     
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index");
+    InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID");
+    InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false);
+
     InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index");
-    InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData ID");
+    InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData");
     InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false);
 
+    InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value");
+    InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true);
+
     // Ray Query
     InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false);
-    InstructionDesc[OpTypeRayQueryProvisionalKHR].setResultAndType(true, false);
+    InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false);
 
     InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'");
     InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'");
diff --git a/SPIRV/doc.h b/SPIRV/doc.h
index 293256a..2a0b28c 100644
--- a/SPIRV/doc.h
+++ b/SPIRV/doc.h
@@ -125,6 +125,7 @@
     OperandVariableLiteralId,
     OperandLiteralNumber,
     OperandLiteralString,
+    OperandVariableLiteralStrings,
     OperandSource,
     OperandExecutionModel,
     OperandAddressing,
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
index dae36cf..af629ef 100644
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -50,11 +50,11 @@
 typedef unsigned int Id;
 
 #define SPV_VERSION 0x10500
-#define SPV_REVISION 3
+#define SPV_REVISION 4
 
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int Version = 0x00010500;
-static const unsigned int Revision = 3;
+static const unsigned int Revision = 4;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 
@@ -168,6 +168,16 @@
     ExecutionModeSampleInterlockUnorderedEXT = 5369,
     ExecutionModeShadingRateInterlockOrderedEXT = 5370,
     ExecutionModeShadingRateInterlockUnorderedEXT = 5371,
+    ExecutionModeSharedLocalMemorySizeINTEL = 5618,
+    ExecutionModeRoundingModeRTPINTEL = 5620,
+    ExecutionModeRoundingModeRTNINTEL = 5621,
+    ExecutionModeFloatingPointModeALTINTEL = 5622,
+    ExecutionModeFloatingPointModeIEEEINTEL = 5623,
+    ExecutionModeMaxWorkgroupSizeINTEL = 5893,
+    ExecutionModeMaxWorkDimINTEL = 5894,
+    ExecutionModeNoGlobalOffsetINTEL = 5895,
+    ExecutionModeNumSIMDWorkitemsINTEL = 5896,
+    ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,
     ExecutionModeMax = 0x7fffffff,
 };
 
@@ -199,6 +209,9 @@
     StorageClassShaderRecordBufferNV = 5343,
     StorageClassPhysicalStorageBuffer = 5349,
     StorageClassPhysicalStorageBufferEXT = 5349,
+    StorageClassCodeSectionINTEL = 5605,
+    StorageClassDeviceOnlyINTEL = 5936,
+    StorageClassHostOnlyINTEL = 5937,
     StorageClassMax = 0x7fffffff,
 };
 
@@ -269,6 +282,8 @@
     ImageFormatRg8ui = 37,
     ImageFormatR16ui = 38,
     ImageFormatR8ui = 39,
+    ImageFormatR64ui = 40,
+    ImageFormatR64i = 41,
     ImageFormatMax = 0x7fffffff,
 };
 
@@ -367,6 +382,8 @@
     FPFastMathModeNSZShift = 2,
     FPFastMathModeAllowRecipShift = 3,
     FPFastMathModeFastShift = 4,
+    FPFastMathModeAllowContractFastINTELShift = 16,
+    FPFastMathModeAllowReassocINTELShift = 17,
     FPFastMathModeMax = 0x7fffffff,
 };
 
@@ -377,6 +394,8 @@
     FPFastMathModeNSZMask = 0x00000004,
     FPFastMathModeAllowRecipMask = 0x00000008,
     FPFastMathModeFastMask = 0x00000010,
+    FPFastMathModeAllowContractFastINTELMask = 0x00010000,
+    FPFastMathModeAllowReassocINTELMask = 0x00020000,
 };
 
 enum FPRoundingMode {
@@ -477,11 +496,45 @@
     DecorationRestrictPointerEXT = 5355,
     DecorationAliasedPointer = 5356,
     DecorationAliasedPointerEXT = 5356,
+    DecorationSIMTCallINTEL = 5599,
+    DecorationReferencedIndirectlyINTEL = 5602,
+    DecorationClobberINTEL = 5607,
+    DecorationSideEffectsINTEL = 5608,
+    DecorationVectorComputeVariableINTEL = 5624,
+    DecorationFuncParamIOKindINTEL = 5625,
+    DecorationVectorComputeFunctionINTEL = 5626,
+    DecorationStackCallINTEL = 5627,
+    DecorationGlobalVariableOffsetINTEL = 5628,
     DecorationCounterBuffer = 5634,
     DecorationHlslCounterBufferGOOGLE = 5634,
     DecorationHlslSemanticGOOGLE = 5635,
     DecorationUserSemantic = 5635,
     DecorationUserTypeGOOGLE = 5636,
+    DecorationFunctionRoundingModeINTEL = 5822,
+    DecorationFunctionDenormModeINTEL = 5823,
+    DecorationRegisterINTEL = 5825,
+    DecorationMemoryINTEL = 5826,
+    DecorationNumbanksINTEL = 5827,
+    DecorationBankwidthINTEL = 5828,
+    DecorationMaxPrivateCopiesINTEL = 5829,
+    DecorationSinglepumpINTEL = 5830,
+    DecorationDoublepumpINTEL = 5831,
+    DecorationMaxReplicatesINTEL = 5832,
+    DecorationSimpleDualPortINTEL = 5833,
+    DecorationMergeINTEL = 5834,
+    DecorationBankBitsINTEL = 5835,
+    DecorationForcePow2DepthINTEL = 5836,
+    DecorationBurstCoalesceINTEL = 5899,
+    DecorationCacheSizeINTEL = 5900,
+    DecorationDontStaticallyCoalesceINTEL = 5901,
+    DecorationPrefetchINTEL = 5902,
+    DecorationStallEnableINTEL = 5905,
+    DecorationFuseLoopsInFunctionINTEL = 5907,
+    DecorationBufferLocationINTEL = 5921,
+    DecorationIOPipeStorageINTEL = 5944,
+    DecorationFunctionFloatingPointModeINTEL = 6080,
+    DecorationSingleElementVectorINTEL = 6085,
+    DecorationVectorComputeCallableFunctionINTEL = 6087,
     DecorationMax = 0x7fffffff,
 };
 
@@ -540,8 +593,10 @@
     BuiltInBaseVertex = 4424,
     BuiltInBaseInstance = 4425,
     BuiltInDrawIndex = 4426,
+    BuiltInPrimitiveShadingRateKHR = 4432,
     BuiltInDeviceIndex = 4438,
     BuiltInViewIndex = 4440,
+    BuiltInShadingRateKHR = 4444,
     BuiltInBaryCoordNoPerspAMD = 4992,
     BuiltInBaryCoordNoPerspCentroidAMD = 4993,
     BuiltInBaryCoordNoPerspSampleAMD = 4994,
@@ -592,7 +647,6 @@
     BuiltInObjectToWorldNV = 5330,
     BuiltInWorldToObjectKHR = 5331,
     BuiltInWorldToObjectNV = 5331,
-    BuiltInHitTKHR = 5332,
     BuiltInHitTNV = 5332,
     BuiltInHitKindKHR = 5333,
     BuiltInHitKindNV = 5333,
@@ -628,6 +682,14 @@
     LoopControlIterationMultipleShift = 6,
     LoopControlPeelCountShift = 7,
     LoopControlPartialCountShift = 8,
+    LoopControlInitiationIntervalINTELShift = 16,
+    LoopControlMaxConcurrencyINTELShift = 17,
+    LoopControlDependencyArrayINTELShift = 18,
+    LoopControlPipelineEnableINTELShift = 19,
+    LoopControlLoopCoalesceINTELShift = 20,
+    LoopControlMaxInterleavingINTELShift = 21,
+    LoopControlSpeculatedIterationsINTELShift = 22,
+    LoopControlNoFusionINTELShift = 23,
     LoopControlMax = 0x7fffffff,
 };
 
@@ -642,6 +704,14 @@
     LoopControlIterationMultipleMask = 0x00000040,
     LoopControlPeelCountMask = 0x00000080,
     LoopControlPartialCountMask = 0x00000100,
+    LoopControlInitiationIntervalINTELMask = 0x00010000,
+    LoopControlMaxConcurrencyINTELMask = 0x00020000,
+    LoopControlDependencyArrayINTELMask = 0x00040000,
+    LoopControlPipelineEnableINTELMask = 0x00080000,
+    LoopControlLoopCoalesceINTELMask = 0x00100000,
+    LoopControlMaxInterleavingINTELMask = 0x00200000,
+    LoopControlSpeculatedIterationsINTELMask = 0x00400000,
+    LoopControlNoFusionINTELMask = 0x00800000,
 };
 
 enum FunctionControlShift {
@@ -838,8 +908,12 @@
     CapabilityGroupNonUniformQuad = 68,
     CapabilityShaderLayer = 69,
     CapabilityShaderViewportIndex = 70,
+    CapabilityFragmentShadingRateKHR = 4422,
     CapabilitySubgroupBallotKHR = 4423,
     CapabilityDrawParameters = 4427,
+    CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,
+    CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,
+    CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,
     CapabilitySubgroupVoteKHR = 4431,
     CapabilityStorageBuffer16BitAccess = 4433,
     CapabilityStorageUniformBufferBlock16 = 4433,
@@ -862,12 +936,15 @@
     CapabilityRoundingModeRTE = 4467,
     CapabilityRoundingModeRTZ = 4468,
     CapabilityRayQueryProvisionalKHR = 4471,
-    CapabilityRayTraversalPrimitiveCullingProvisionalKHR = 4478,
+    CapabilityRayQueryKHR = 4472,
+    CapabilityRayTraversalPrimitiveCullingKHR = 4478,
+    CapabilityRayTracingKHR = 4479,
     CapabilityFloat16ImageAMD = 5008,
     CapabilityImageGatherBiasLodAMD = 5009,
     CapabilityFragmentMaskAMD = 5010,
     CapabilityStencilExportEXT = 5013,
     CapabilityImageReadWriteLodAMD = 5015,
+    CapabilityInt64ImageEXT = 5016,
     CapabilityShaderClockKHR = 5055,
     CapabilitySampleMaskOverrideCoverageNV = 5249,
     CapabilityGeometryShaderPassthroughNV = 5251,
@@ -927,10 +1004,37 @@
     CapabilitySubgroupBufferBlockIOINTEL = 5569,
     CapabilitySubgroupImageBlockIOINTEL = 5570,
     CapabilitySubgroupImageMediaBlockIOINTEL = 5579,
+    CapabilityRoundToInfinityINTEL = 5582,
+    CapabilityFloatingPointModeINTEL = 5583,
     CapabilityIntegerFunctions2INTEL = 5584,
+    CapabilityFunctionPointersINTEL = 5603,
+    CapabilityIndirectReferencesINTEL = 5604,
+    CapabilityAsmINTEL = 5606,
+    CapabilityVectorComputeINTEL = 5617,
+    CapabilityVectorAnyINTEL = 5619,
     CapabilitySubgroupAvcMotionEstimationINTEL = 5696,
     CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,
     CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,
+    CapabilityVariableLengthArrayINTEL = 5817,
+    CapabilityFunctionFloatControlINTEL = 5821,
+    CapabilityFPGAMemoryAttributesINTEL = 5824,
+    CapabilityFPFastMathModeINTEL = 5837,
+    CapabilityArbitraryPrecisionIntegersINTEL = 5844,
+    CapabilityUnstructuredLoopControlsINTEL = 5886,
+    CapabilityFPGALoopControlsINTEL = 5888,
+    CapabilityKernelAttributesINTEL = 5892,
+    CapabilityFPGAKernelAttributesINTEL = 5897,
+    CapabilityFPGAMemoryAccessesINTEL = 5898,
+    CapabilityFPGAClusterAttributesINTEL = 5904,
+    CapabilityLoopFuseINTEL = 5906,
+    CapabilityFPGABufferLocationINTEL = 5920,
+    CapabilityUSMStorageClassesINTEL = 5935,
+    CapabilityIOPipesINTEL = 5943,
+    CapabilityBlockingPipesINTEL = 5945,
+    CapabilityFPGARegINTEL = 5948,
+    CapabilityAtomicFloat32AddEXT = 6033,
+    CapabilityAtomicFloat64AddEXT = 6034,
+    CapabilityLongConstantCompositeINTEL = 6089,
     CapabilityMax = 0x7fffffff,
 };
 
@@ -981,6 +1085,34 @@
     RayQueryCandidateIntersectionTypeMax = 0x7fffffff,
 };
 
+enum FragmentShadingRateShift {
+    FragmentShadingRateVertical2PixelsShift = 0,
+    FragmentShadingRateVertical4PixelsShift = 1,
+    FragmentShadingRateHorizontal2PixelsShift = 2,
+    FragmentShadingRateHorizontal4PixelsShift = 3,
+    FragmentShadingRateMax = 0x7fffffff,
+};
+
+enum FragmentShadingRateMask {
+    FragmentShadingRateMaskNone = 0,
+    FragmentShadingRateVertical2PixelsMask = 0x00000001,
+    FragmentShadingRateVertical4PixelsMask = 0x00000002,
+    FragmentShadingRateHorizontal2PixelsMask = 0x00000004,
+    FragmentShadingRateHorizontal4PixelsMask = 0x00000008,
+};
+
+enum FPDenormMode {
+  FPDenormModePreserve = 0,
+  FPDenormModeFlushToZero = 1,
+  FPDenormModeMax = 0x7fffffff,
+};
+
+enum FPOperationMode {
+  FPOperationModeIEEE = 0,
+  FPOperationModeALT = 1,
+  FPOperationModeMax = 0x7fffffff,
+};
+
 enum Op {
     OpNop = 0,
     OpUndef = 1,
@@ -1326,13 +1458,19 @@
     OpPtrEqual = 401,
     OpPtrNotEqual = 402,
     OpPtrDiff = 403,
+    OpTerminateInvocation = 4416,
     OpSubgroupBallotKHR = 4421,
     OpSubgroupFirstInvocationKHR = 4422,
     OpSubgroupAllKHR = 4428,
     OpSubgroupAnyKHR = 4429,
     OpSubgroupAllEqualKHR = 4430,
     OpSubgroupReadInvocationKHR = 4432,
-    OpTypeRayQueryProvisionalKHR = 4472,
+    OpTraceRayKHR = 4445,
+    OpExecuteCallableKHR = 4446,
+    OpConvertUToAccelerationStructureKHR = 4447,
+    OpIgnoreIntersectionKHR = 4448,
+    OpTerminateRayKHR = 4449,
+    OpTypeRayQueryKHR = 4472,
     OpRayQueryInitializeKHR = 4473,
     OpRayQueryTerminateKHR = 4474,
     OpRayQueryGenerateIntersectionKHR = 4475,
@@ -1355,15 +1493,11 @@
     OpWritePackedPrimitiveIndices4x8NV = 5299,
     OpReportIntersectionKHR = 5334,
     OpReportIntersectionNV = 5334,
-    OpIgnoreIntersectionKHR = 5335,
     OpIgnoreIntersectionNV = 5335,
-    OpTerminateRayKHR = 5336,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
-    OpTraceRayKHR = 5337,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
-    OpExecuteCallableKHR = 5344,
     OpExecuteCallableNV = 5344,
     OpTypeCooperativeMatrixNV = 5358,
     OpCooperativeMatrixLoadNV = 5359,
@@ -1398,6 +1532,11 @@
     OpUSubSatINTEL = 5596,
     OpIMul32x16INTEL = 5597,
     OpUMul32x16INTEL = 5598,
+    OpConstFunctionPointerINTEL = 5600,
+    OpFunctionPointerCallINTEL = 5601,
+    OpAsmTargetINTEL = 5609,
+    OpAsmINTEL = 5610,
+    OpAsmCallINTEL = 5611,
     OpDecorateString = 5632,
     OpDecorateStringGOOGLE = 5632,
     OpMemberDecorateString = 5633,
@@ -1520,6 +1659,15 @@
     OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,
     OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,
     OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,
+    OpVariableLengthArrayINTEL = 5818,
+    OpSaveMemoryINTEL = 5819,
+    OpRestoreMemoryINTEL = 5820,
+    OpLoopControlINTEL = 5887,
+    OpPtrCastToCrossWorkgroupINTEL = 5934,
+    OpCrossWorkgroupCastToPtrINTEL = 5938,
+    OpReadPipeBlockingINTEL = 5946,
+    OpWritePipeBlockingINTEL = 5947,
+    OpFPGARegINTEL = 5949,
     OpRayQueryGetRayTMinKHR = 6016,
     OpRayQueryGetRayFlagsKHR = 6017,
     OpRayQueryGetIntersectionTKHR = 6018,
@@ -1537,6 +1685,11 @@
     OpRayQueryGetWorldRayOriginKHR = 6030,
     OpRayQueryGetIntersectionObjectToWorldKHR = 6031,
     OpRayQueryGetIntersectionWorldToObjectKHR = 6032,
+    OpAtomicFAddEXT = 6035,
+    OpTypeBufferSurfaceINTEL = 6086,
+    OpTypeStructContinuedINTEL = 6090,
+    OpConstantCompositeContinuedINTEL = 6091,
+    OpSpecConstantCompositeContinuedINTEL = 6092,
     OpMax = 0x7fffffff,
 };
 
@@ -1889,13 +2042,19 @@
     case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
     case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
     case OpPtrDiff: *hasResult = true; *hasResultType = true; break;
+    case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;
     case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;
-    case OpTypeRayQueryProvisionalKHR: *hasResult = true; *hasResultType = false; break;
+    case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;
+    case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;
+    case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
+    case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
+    case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;
+    case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;
     case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
     case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
     case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
@@ -1955,6 +2114,11 @@
     case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
     case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
     case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
+    case OpConstFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;
     case OpDecorateString: *hasResult = false; *hasResultType = false; break;
     case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;
     case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;
@@ -2075,6 +2239,15 @@
     case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;
     case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;
+    case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;
+    case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
+    case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;
     case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;
     case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;
     case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;
@@ -2092,6 +2265,11 @@
     case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
     case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
     case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
+    case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;
+    case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;
+    case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;
+    case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;
+    case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;
     }
 }
 #endif /* SPV_ENABLE_UTILITY_CODE */
@@ -2107,6 +2285,7 @@
 inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
 inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
 inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }
+inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }
 
 }  // end namespace spv
 
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
old mode 100755
new mode 100644
index 6523035..486e80d
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -55,6 +55,7 @@
 #include <iostream>
 #include <memory>
 #include <vector>
+#include <set>
 
 namespace spv {
 
@@ -262,6 +263,7 @@
         case OpBranchConditional:
         case OpSwitch:
         case OpKill:
+        case OpTerminateInvocation:
         case OpReturn:
         case OpReturnValue:
         case OpUnreachable:
@@ -351,10 +353,28 @@
     const std::vector<Block*>& getBlocks() const { return blocks; }
     void addLocalVariable(std::unique_ptr<Instruction> inst);
     Id getReturnType() const { return functionInstruction.getTypeId(); }
+    void setReturnPrecision(Decoration precision)
+    {
+        if (precision == DecorationRelaxedPrecision)
+            reducedPrecisionReturn = true;
+    }
+    Decoration getReturnPrecision() const
+        { return reducedPrecisionReturn ? DecorationRelaxedPrecision : NoPrecision; }
 
     void setImplicitThis() { implicitThis = true; }
     bool hasImplicitThis() const { return implicitThis; }
 
+    void addParamPrecision(unsigned param, Decoration precision)
+    {
+        if (precision == DecorationRelaxedPrecision)
+            reducedPrecisionParams.insert(param);
+    }
+    Decoration getParamPrecision(unsigned param) const
+    {
+        return reducedPrecisionParams.find(param) != reducedPrecisionParams.end() ?
+            DecorationRelaxedPrecision : NoPrecision;
+    }
+
     void dump(std::vector<unsigned int>& out) const
     {
         // OpFunction
@@ -379,6 +399,8 @@
     std::vector<Instruction*> parameterInstructions;
     std::vector<Block*> blocks;
     bool implicitThis;  // true if this is a member function expecting to be passed a 'this' as the first argument
+    bool reducedPrecisionReturn;
+    std::set<int> reducedPrecisionParams;  // list of parameter indexes that need a relaxed precision arg
 };
 
 //
@@ -439,7 +461,8 @@
 // - the OpFunction instruction
 // - all the OpFunctionParameter instructions
 __inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, Module& parent)
-    : parent(parent), functionInstruction(id, resultType, OpFunction), implicitThis(false)
+    : parent(parent), functionInstruction(id, resultType, OpFunction), implicitThis(false),
+      reducedPrecisionReturn(false)
 {
     // OpFunction
     functionInstruction.addImmediateOperand(FunctionControlMaskNone);
diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
index 591ac34..bff9ab6 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 add_library(glslang-default-resource-limits
             ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp)
@@ -8,7 +41,6 @@
                            PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                            PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
 
-
 set(SOURCES StandAlone.cpp DirStackFileIncluder.h)
 
 add_executable(glslangValidator ${SOURCES})
@@ -37,6 +69,12 @@
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
 
+if(ENABLE_OPT)
+    target_include_directories(glslangValidator
+        PRIVATE ${spirv-tools_SOURCE_DIR}/include
+    )
+endif(ENABLE_OPT)
+
 if(ENABLE_SPVREMAPPER)
     set(REMAPPER_SOURCES spirv-remap.cpp)
     add_executable(spirv-remap ${REMAPPER_SOURCES})
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index a7ce53d..fdbf027 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -44,7 +44,6 @@
 #include "Worklist.h"
 #include "DirStackFileIncluder.h"
 #include "./../glslang/Include/ShHandle.h"
-#include "./../glslang/Include/revision.h"
 #include "./../glslang/Public/ShaderLang.h"
 #include "../SPIRV/GlslangToSpv.h"
 #include "../SPIRV/GLSL.std.450.h"
@@ -62,8 +61,11 @@
 
 #include "../glslang/OSDependent/osinclude.h"
 
+// Build-time generated includes
+#include "glslang/build_info.h"
+
 extern "C" {
-    SH_IMPORT_EXPORT void ShOutputHtml();
+    GLSLANG_EXPORT void ShOutputHtml();
 }
 
 // Command-line options
@@ -106,6 +108,8 @@
 bool SpvToolsDisassembler = false;
 bool SpvToolsValidate = false;
 bool NaNClamp = false;
+bool stripDebugInfo = false;
+bool beQuiet = false;
 
 //
 // Return codes from main/exit().
@@ -555,6 +559,12 @@
                         ReflectOptions |= EShReflectionAllBlockVariables;
                     } else if (lowerword == "reflect-unwrap-io-blocks") {
                         ReflectOptions |= EShReflectionUnwrapIOBlocks;
+                    } else if (lowerword == "reflect-all-io-variables") {
+                        ReflectOptions |= EShReflectionAllIOVariables;
+                    } else if (lowerword == "reflect-shared-std140-ubo") {
+                        ReflectOptions |= EShReflectionSharedStd140UBO;
+                    } else if (lowerword == "reflect-shared-std140-ssbo") {
+                        ReflectOptions |= EShReflectionSharedStd140SSBO;
                     } else if (lowerword == "resource-set-bindings" ||  // synonyms
                                lowerword == "resource-set-binding"  ||
                                lowerword == "rsb") {
@@ -654,6 +664,8 @@
                         variableName = argv[1];
                         bumpArg();
                         break;
+                    } else if (lowerword == "quiet") {
+                        beQuiet = true;
                     } else if (lowerword == "version") {
                         Options |= EOptionDumpVersions;
                     } else if (lowerword == "help") {
@@ -684,6 +696,8 @@
                 setOpenGlSpv();
                 if (argv[0][2] != 0)
                     ClientInputSemanticsVersion = getAttachedNumber("-G<num> client input semantics");
+                if (ClientInputSemanticsVersion != 100)
+                    Error("unknown client version for -G, should be 100");
                 break;
             case 'H':
                 Options |= EOptionHumanReadableSpv;
@@ -720,6 +734,8 @@
                 setVulkanSpv();
                 if (argv[0][2] != 0)
                     ClientInputSemanticsVersion = getAttachedNumber("-V<num> client input semantics");
+                if (ClientInputSemanticsVersion != 100)
+                    Error("unknown client version for -V, should be 100");
                 break;
             case 'c':
                 Options |= EOptionDumpConfig;
@@ -744,7 +760,13 @@
                     Error("-f: expected hlsl_functionality1");
                 break;
             case 'g':
-                Options |= EOptionDebug;
+                // Override previous -g or -g0 argument
+                stripDebugInfo = false;
+                Options &= ~EOptionDebug;
+                if (argv[0][2] == '0')
+                    stripDebugInfo = true;
+                else
+                    Options |= EOptionDebug;
                 break;
             case 'h':
                 usage();
@@ -822,6 +844,10 @@
         (Options & EOptionReadHlsl) == 0)
         Error("uniform array flattening only valid when compiling HLSL source.");
 
+    if ((Options & EOptionReadHlsl) && (Client == glslang::EShClientOpenGL)) {
+        Error("Using HLSL input under OpenGL semantics is not currently supported.");
+    }
+
     // rationalize client and target language
     if (TargetLanguage == glslang::EShTargetNone) {
         switch (ClientVersion) {
@@ -1095,7 +1121,8 @@
 
         if (! (Options & EOptionSuppressInfolog) &&
             ! (Options & EOptionMemoryLeakMode)) {
-            PutsIfNonEmpty(compUnit.fileName[0].c_str());
+            if (!beQuiet)
+                PutsIfNonEmpty(compUnit.fileName[0].c_str());
             PutsIfNonEmpty(shader->getInfoLog());
             PutsIfNonEmpty(shader->getInfoDebugLog());
         }
@@ -1144,6 +1171,8 @@
                     glslang::SpvOptions spvOptions;
                     if (Options & EOptionDebug)
                         spvOptions.generateDebugInfo = true;
+                    else if (stripDebugInfo)
+                        spvOptions.stripDebugInfo = true;
                     spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0;
                     spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0;
                     spvOptions.disassemble = SpvToolsDisassembler;
@@ -1259,13 +1288,13 @@
 #endif
 
     if (Options & EOptionDumpBareVersion) {
-        printf("%d.%d.%d\n",
-            glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL);
+        printf("%d:%d.%d.%d%s\n", glslang::GetSpirvGeneratorVersion(), GLSLANG_VERSION_MAJOR, GLSLANG_VERSION_MINOR,
+                GLSLANG_VERSION_PATCH, GLSLANG_VERSION_FLAVOR);
         if (workList.empty())
             return ESuccess;
     } else if (Options & EOptionDumpVersions) {
-        printf("Glslang Version: %d.%d.%d\n",
-            glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL);
+        printf("Glslang Version: %d:%d.%d.%d%s\n", glslang::GetSpirvGeneratorVersion(), GLSLANG_VERSION_MAJOR,
+                GLSLANG_VERSION_MINOR, GLSLANG_VERSION_PATCH, GLSLANG_VERSION_FLAVOR);
         printf("ESSL Version: %s\n", glslang::GetEsslVersionString());
         printf("GLSL Version: %s\n", glslang::GetGlslVersionString());
         std::string spirvVersion;
@@ -1536,7 +1565,8 @@
            "              'ver', when present, is the version of the input semantics,\n"
            "              which will appear in #define GL_SPIRV ver;\n"
            "              '--client opengl100' is the same as -G100;\n"
-           "              a '--target-env' for OpenGL will also imply '-G'\n"
+           "              a '--target-env' for OpenGL will also imply '-G';\n"
+           "              currently only supports GLSL\n"
            "  -H          print human readable form of SPIR-V; turns on -V\n"
            "  -I<dir>     add dir to the include search path; includer's directory\n"
            "              is searched first, followed by left-to-right order of -I\n"
@@ -1562,6 +1592,7 @@
            "              'hlsl_functionality1' enables use of the\n"
            "              SPV_GOOGLE_hlsl_functionality1 extension\n"
            "  -g          generate debug information\n"
+           "  -g0         strip debug information\n"
            "  -h          print this usage message\n"
            "  -i          intermediate tree (glslang AST) is printed out\n"
            "  -l          link all input files together to form a single module\n"
@@ -1593,11 +1624,14 @@
            "  --hlsl-iomap                      perform IO mapping in HLSL register space\n"
            "  --hlsl-enable-16bit-types         allow 16-bit types in SPIR-V for HLSL\n"
            "  --hlsl-dx9-compatible             interprets sampler declarations as a\n"
-           "                                    texture/sampler combo like DirectX9 would.\n"
+           "                                    texture/sampler combo like DirectX9 would,\n"
+           "                                    and recognizes DirectX9-specific semantics\n"
            "  --invert-y | --iy                 invert position.Y output in vertex shader\n"
            "  --keep-uncalled | --ku            don't eliminate uncalled functions\n"
            "  --nan-clamp                       favor non-NaN operand in min, max, and clamp\n"
            "  --no-storage-format | --nsf       use Unknown image format\n"
+           "  --quiet                           do not print anything to stdout, unless\n"
+           "                                    requested by another option\n"
            "  --reflect-strict-array-suffix     use strict array suffix rules when\n"
            "                                    reflecting\n"
            "  --reflect-basic-array-suffix      arrays of basic types will have trailing [0]\n"
diff --git a/Test/100scope.vert b/Test/100scope.vert
index b0a72d1..6643730 100644
--- a/Test/100scope.vert
+++ b/Test/100scope.vert
@@ -2,7 +2,7 @@
 

 int f(int a, int b, int c)

 {

-	int a = b;  // ERROR, redefinition

+	int a = b;

 

     {

 		float a = float(a) + 1.0;

diff --git a/Test/310.frag b/Test/310.frag
old mode 100755
new mode 100644
diff --git a/Test/330.frag b/Test/330.frag
index 364fc0a..cf22d7a 100644
--- a/Test/330.frag
+++ b/Test/330.frag
@@ -149,3 +149,7 @@
 } colorsBuffer;
 
 
+void testOverload() {
+    float overloadTest = 42;
+    overloadTest = smoothstep(0, 1, overloadTest);
+}
\ No newline at end of file
diff --git a/Test/420.frag b/Test/420.frag
index d3020b3..4c0b15f 100644
--- a/Test/420.frag
+++ b/Test/420.frag
@@ -34,6 +34,21 @@
     origu = atomicCompSwap(atomu, 10u, 8u);
 }
 
+layout(binding = 2,std430) buffer ssboElem01
+{
+    int member01;
+    int memberArr01[2];
+    int memberUnsizedArr01[];
+} ssboStd430Arr[2];
+
+// if turns on EShReflectionSharedStd140SSBO, SPIR-V would be different
+layout(binding = 3,shared) buffer ssboElem02
+{
+    int member02;
+    int memberArr02[2];
+    int memberUnsizedArr02[];
+} ssboSharedArr[2];
+
 #extension GL_ARB_shader_storage_buffer_object : disable
 
 layout(binding = 1,std430) buffer BufferFail // Error std430 and "buffer" block support disabled 
diff --git a/Test/baseLegalResults/hlsl.aliasOpaque.frag.out b/Test/baseLegalResults/hlsl.aliasOpaque.frag.out
index 887e4ac..2afdb10 100644
--- a/Test/baseLegalResults/hlsl.aliasOpaque.frag.out
+++ b/Test/baseLegalResults/hlsl.aliasOpaque.frag.out
@@ -1,7 +1,7 @@
 hlsl.aliasOpaque.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 87
+// Generated by (magic number): 8000a
+// Id's are bound by 89
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -16,7 +16,7 @@
                               Decorate 47(gss) DescriptorSet 0
                               Decorate 47(gss) Binding 0
                               Decorate 51(gtex) DescriptorSet 0
-                              Decorate 51(gtex) Binding 0
+                              Decorate 51(gtex) Binding 2
                               Decorate 62(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -38,11 +38,11 @@
 62(@entryPointOutput):     61(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              70:           6 Load 47(gss)
-              72:           8 Load 51(gtex)
-              84:          32 SampledImage 72 70
-              85:   11(fvec4) ImageSampleImplicitLod 84 37
-              86:   11(fvec4) VectorTimesScalar 85 54
-                              Store 62(@entryPointOutput) 86
+              71:           6 Load 47(gss)
+              73:           8 Load 51(gtex)
+              86:          32 SampledImage 73 71
+              87:   11(fvec4) ImageSampleImplicitLod 86 37
+              88:   11(fvec4) VectorTimesScalar 87 54
+                              Store 62(@entryPointOutput) 88
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaque.frag.out b/Test/baseLegalResults/hlsl.flattenOpaque.frag.out
index ad9e6c1..7bb33e6 100644
--- a/Test/baseLegalResults/hlsl.flattenOpaque.frag.out
+++ b/Test/baseLegalResults/hlsl.flattenOpaque.frag.out
@@ -1,7 +1,7 @@
 hlsl.flattenOpaque.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 185
+// Generated by (magic number): 8000a
+// Id's are bound by 190
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -18,11 +18,11 @@
                               Decorate 38(tex) DescriptorSet 0
                               Decorate 38(tex) Binding 0
                               Decorate 82(s.s2D) DescriptorSet 0
-                              Decorate 82(s.s2D) Binding 0
+                              Decorate 82(s.s2D) Binding 1
                               Decorate 97(s2.s2D) DescriptorSet 0
-                              Decorate 97(s2.s2D) Binding 0
+                              Decorate 97(s2.s2D) Binding 2
                               Decorate 100(s2.tex) DescriptorSet 0
-                              Decorate 100(s2.tex) Binding 0
+                              Decorate 100(s2.tex) Binding 3
                               Decorate 120(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -45,25 +45,25 @@
 120(@entryPointOutput):    119(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-             134:           6 Load 82(s.s2D)
-             158:          22 Load 38(tex)
-             161:          45 SampledImage 158 134
-             162:   10(fvec4) ImageSampleImplicitLod 161 49
-             138:           6 Load 82(s.s2D)
-             164:          22 Load 38(tex)
-             167:          45 SampledImage 164 138
-             169:   10(fvec4) ImageSampleImplicitLod 167 49
-             142:   10(fvec4) FAdd 162 169
-             143:           6 Load 97(s2.s2D)
-             145:          22 Load 100(s2.tex)
-             175:          45 SampledImage 145 143
-             176:   10(fvec4) ImageSampleImplicitLod 175 49
-             149:   10(fvec4) FAdd 142 176
-             150:           6 Load 97(s2.s2D)
-             152:          22 Load 100(s2.tex)
-             182:          45 SampledImage 152 150
-             184:   10(fvec4) ImageSampleImplicitLod 182 49
-             156:   10(fvec4) FAdd 149 184
-                              Store 120(@entryPointOutput) 156
+             135:           6 Load 82(s.s2D)
+             160:          22 Load 38(tex)
+             163:          45 SampledImage 160 135
+             164:   10(fvec4) ImageSampleImplicitLod 163 49
+             139:           6 Load 82(s.s2D)
+             167:          22 Load 38(tex)
+             170:          45 SampledImage 167 139
+             172:   10(fvec4) ImageSampleImplicitLod 170 49
+             143:   10(fvec4) FAdd 164 172
+             144:           6 Load 97(s2.s2D)
+             146:          22 Load 100(s2.tex)
+             179:          45 SampledImage 146 144
+             180:   10(fvec4) ImageSampleImplicitLod 179 49
+             150:   10(fvec4) FAdd 143 180
+             151:           6 Load 97(s2.s2D)
+             153:          22 Load 100(s2.tex)
+             187:          45 SampledImage 153 151
+             189:   10(fvec4) ImageSampleImplicitLod 187 49
+             157:   10(fvec4) FAdd 150 189
+                              Store 120(@entryPointOutput) 157
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
index 6ed8da2..0e8583f 100644
--- a/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
+++ b/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
@@ -1,7 +1,7 @@
 hlsl.flattenOpaqueInit.vert
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 134
+// Generated by (magic number): 8000a
+// Id's are bound by 139
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -15,7 +15,7 @@
                               Decorate 43(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 43(g_tInputTexture_sampler) Binding 0
                               Decorate 47(g_tInputTexture) DescriptorSet 0
-                              Decorate 47(g_tInputTexture) Binding 0
+                              Decorate 47(g_tInputTexture) Binding 1
                               Decorate 80(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -37,18 +37,18 @@
 80(@entryPointOutput):     79(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              90:           6 Load 43(g_tInputTexture_sampler)
-              91:           8 Load 47(g_tInputTexture)
-             111:          31 SampledImage 91 90
-             112:   11(fvec4) ImageSampleExplicitLod 111 36 Lod 37
-             115:           6 Load 43(g_tInputTexture_sampler)
-             117:           8 Load 47(g_tInputTexture)
-             125:          31 SampledImage 117 115
-             126:   11(fvec4) ImageSampleExplicitLod 125 36 Lod 37
-              99:   11(fvec4) FAdd 112 126
-             132:          31 SampledImage 91 90
-             133:   11(fvec4) ImageSampleExplicitLod 132 36 Lod 37
-             104:   11(fvec4) FAdd 99 133
-                              Store 80(@entryPointOutput) 104
+              91:           6 Load 43(g_tInputTexture_sampler)
+              92:           8 Load 47(g_tInputTexture)
+             113:          31 SampledImage 92 91
+             114:   11(fvec4) ImageSampleExplicitLod 113 36 Lod 37
+             118:           6 Load 43(g_tInputTexture_sampler)
+             120:           8 Load 47(g_tInputTexture)
+             129:          31 SampledImage 120 118
+             130:   11(fvec4) ImageSampleExplicitLod 129 36 Lod 37
+             100:   11(fvec4) FAdd 114 130
+             137:          31 SampledImage 92 91
+             138:   11(fvec4) ImageSampleExplicitLod 137 36 Lod 37
+             105:   11(fvec4) FAdd 100 138
+                              Store 80(@entryPointOutput) 105
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out b/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out
index 81ab5e6..fe858ef 100644
--- a/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out
+++ b/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out
@@ -1,7 +1,7 @@
 hlsl.flattenOpaqueInitMix.vert
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 97
+// Generated by (magic number): 8000a
+// Id's are bound by 99
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -15,7 +15,7 @@
                               Decorate 44(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 44(g_tInputTexture_sampler) Binding 0
                               Decorate 47(g_tInputTexture) DescriptorSet 0
-                              Decorate 47(g_tInputTexture) Binding 0
+                              Decorate 47(g_tInputTexture) Binding 1
                               Decorate 57(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -33,13 +33,13 @@
               49:    7(float) Constant 1056964608
               56:             TypePointer Output 11(fvec4)
 57(@entryPointOutput):     56(ptr) Variable Output
-              96:   36(fvec2) ConstantComposite 49 49
+              98:   36(fvec2) ConstantComposite 49 49
          4(main):           2 Function None 3
                5:             Label
-              63:           6 Load 44(g_tInputTexture_sampler)
-              64:           8 Load 47(g_tInputTexture)
-              73:          28 SampledImage 64 63
-              79:   11(fvec4) ImageSampleExplicitLod 73 96 Lod 38
-                              Store 57(@entryPointOutput) 79
+              64:           6 Load 44(g_tInputTexture_sampler)
+              65:           8 Load 47(g_tInputTexture)
+              75:          28 SampledImage 65 64
+              81:   11(fvec4) ImageSampleExplicitLod 75 98 Lod 38
+                              Store 57(@entryPointOutput) 81
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenSubset.frag.out b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
index 562070d..0edf712 100644
--- a/Test/baseLegalResults/hlsl.flattenSubset.frag.out
+++ b/Test/baseLegalResults/hlsl.flattenSubset.frag.out
@@ -1,7 +1,7 @@
 hlsl.flattenSubset.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 66
+// Generated by (magic number): 8000a
+// Id's are bound by 67
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -17,7 +17,7 @@
                               Decorate 21(samp) DescriptorSet 0
                               Decorate 21(samp) Binding 0
                               Decorate 33(tex) DescriptorSet 0
-                              Decorate 33(tex) Binding 0
+                              Decorate 33(tex) Binding 1
                               Decorate 47(vpos) Location 0
                               Decorate 50(@entryPointOutput) Location 0
                2:             TypeVoid
@@ -40,10 +40,10 @@
 50(@entryPointOutput):     49(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              57:          13 Load 21(samp)
-              61:          31 Load 33(tex)
-              64:          37 SampledImage 61 57
-              65:    7(fvec4) ImageSampleImplicitLod 64 41
-                              Store 50(@entryPointOutput) 65
+              58:          13 Load 21(samp)
+              62:          31 Load 33(tex)
+              65:          37 SampledImage 62 58
+              66:    7(fvec4) ImageSampleImplicitLod 65 41
+                              Store 50(@entryPointOutput) 66
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
index 5cc280b..00bd55b 100644
--- a/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
+++ b/Test/baseLegalResults/hlsl.flattenSubset2.frag.out
@@ -1,6 +1,6 @@
 hlsl.flattenSubset2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out b/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
index f4c9c5a..824aa49 100644
--- a/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
+++ b/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
@@ -1,7 +1,7 @@
 hlsl.partialFlattenLocal.vert
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 158
+// Generated by (magic number): 8000a
+// Id's are bound by 159
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
@@ -38,44 +38,44 @@
          83(pos):     82(ptr) Variable Input
               85:             TypePointer Output 7(fvec4)
 86(@entryPointOutput):     85(ptr) Variable Output
-             130:             TypePointer Function 17
-             132:             TypePointer Function 20
+             131:             TypePointer Function 17
+             133:             TypePointer Function 20
          4(main):           2 Function None 3
                5:             Label
-             133:    132(ptr) Variable Function
-             131:    130(ptr) Variable Function
+             134:    133(ptr) Variable Function
+             132:    131(ptr) Variable Function
               84:    7(fvec4) Load 83(pos)
-             136:     34(ptr) AccessChain 131 25
-                              Store 136 33
-             137:     39(ptr) AccessChain 133 25
-                              Store 137 38
-                              Branch 100
-             100:             Label
-             157:     21(int) Phi 25 5 119 106
-             105:    54(bool) SLessThan 157 31
-                              LoopMerge 101 106 None
-                              BranchConditional 105 106 101
-             106:               Label
-             138:     39(ptr)   AccessChain 133 157
-             110:   18(fvec2)   Load 138
-             139:     34(ptr)   AccessChain 131 157
-             112:   14(fvec3)   Load 139
-             113:   18(fvec2)   VectorShuffle 112 112 0 1
-             114:   18(fvec2)   FAdd 113 110
-             140:     34(ptr)   AccessChain 131 157
-             116:   14(fvec3)   Load 140
-             117:   14(fvec3)   VectorShuffle 116 114 3 4 2
-                                Store 140 117
-             119:     21(int)   IAdd 157 31
-                                Branch 100
+             137:     34(ptr) AccessChain 132 25
+                              Store 137 33
+             138:     39(ptr) AccessChain 134 25
+                              Store 138 38
+                              Branch 101
              101:             Label
-             142:          17 Load 131
-             156:   14(fvec3) CompositeExtract 142 0
-             124:    6(float) CompositeExtract 156 0
-             125:    6(float) CompositeExtract 156 1
-             126:    6(float) CompositeExtract 156 2
-             127:    7(fvec4) CompositeConstruct 124 125 126 32
-             128:    7(fvec4) FAdd 84 127
-                              Store 86(@entryPointOutput) 128
+             158:     21(int) Phi 25 5 119 105
+             104:    54(bool) SLessThan 158 31
+                              LoopMerge 120 105 None
+                              BranchConditional 104 105 120
+             105:               Label
+             139:     39(ptr)   AccessChain 134 158
+             109:   18(fvec2)   Load 139
+             140:     34(ptr)   AccessChain 132 158
+             111:   14(fvec3)   Load 140
+             112:   18(fvec2)   VectorShuffle 111 111 0 1
+             113:   18(fvec2)   FAdd 112 109
+             141:     34(ptr)   AccessChain 132 158
+             115:   14(fvec3)   Load 141
+             116:   14(fvec3)   VectorShuffle 115 113 3 4 2
+                                Store 141 116
+             119:     21(int)   IAdd 158 31
+                                Branch 101
+             120:             Label
+             143:          17 Load 132
+             157:   14(fvec3) CompositeExtract 143 0
+             125:    6(float) CompositeExtract 157 0
+             126:    6(float) CompositeExtract 157 1
+             127:    6(float) CompositeExtract 157 2
+             128:    7(fvec4) CompositeConstruct 125 126 127 32
+             129:    7(fvec4) FAdd 84 128
+                              Store 86(@entryPointOutput) 129
                               Return
                               FunctionEnd
diff --git a/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out b/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
index 7be570b..8975ed2 100644
--- a/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
+++ b/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out
@@ -1,6 +1,6 @@
 hlsl.partialFlattenMixed.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Shader
diff --git a/Test/baseResults/100scope.vert.out b/Test/baseResults/100scope.vert.out
index c59c8fd..1696a2e 100644
--- a/Test/baseResults/100scope.vert.out
+++ b/Test/baseResults/100scope.vert.out
@@ -1,5 +1,4 @@
 100scope.vert
-ERROR: 0:5: 'a' : redefinition 
 ERROR: 0:17: 'b' : function name is redeclaration of existing name 
 ERROR: 0:20: 'c' : redefinition 
 ERROR: 0:22: 'f' : redefinition 
@@ -13,7 +12,7 @@
 ERROR: 0:57: 'z' : redefinition 
 ERROR: 0:73: 'degrees' : can't use function syntax on variable 
 ERROR: 0:76: 'vertex-shader struct output' : not supported for this version or the enabled extensions 
-ERROR: 14 compilation errors.  No code generated.
+ERROR: 13 compilation errors.  No code generated.
 
 
 Shader version: 100
@@ -23,18 +22,22 @@
 0:3      'a' ( in highp int)
 0:3      'b' ( in highp int)
 0:3      'c' ( in highp int)
-0:?     Sequence
+0:5    Sequence
+0:5      Sequence
+0:5        move second child to first child ( temp highp int)
+0:5          'a' ( temp highp int)
+0:5          'b' ( in highp int)
 0:8      Sequence
 0:8        Sequence
 0:8          move second child to first child ( temp highp float)
 0:8            'a' ( temp highp float)
 0:8            add ( temp highp float)
 0:8              Convert int to float ( temp highp float)
-0:8                'a' ( in highp int)
+0:8                'a' ( temp highp int)
 0:8              Constant:
 0:8                1.000000
 0:11      Branch: Return with expression
-0:11        'a' ( in highp int)
+0:11        'a' ( temp highp int)
 0:25  Function Definition: cos(f1; ( global highp float)
 0:25    Function Parameters: 
 0:25      'x' ( in highp float)
@@ -138,18 +141,22 @@
 0:3      'a' ( in highp int)
 0:3      'b' ( in highp int)
 0:3      'c' ( in highp int)
-0:?     Sequence
+0:5    Sequence
+0:5      Sequence
+0:5        move second child to first child ( temp highp int)
+0:5          'a' ( temp highp int)
+0:5          'b' ( in highp int)
 0:8      Sequence
 0:8        Sequence
 0:8          move second child to first child ( temp highp float)
 0:8            'a' ( temp highp float)
 0:8            add ( temp highp float)
 0:8              Convert int to float ( temp highp float)
-0:8                'a' ( in highp int)
+0:8                'a' ( temp highp int)
 0:8              Constant:
 0:8                1.000000
 0:11      Branch: Return with expression
-0:11        'a' ( in highp int)
+0:11        'a' ( temp highp int)
 0:36  Function Definition: main( ( global void)
 0:36    Function Parameters: 
 0:?     Sequence
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 8922026..535a8a6 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -936,7 +936,6 @@
 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: can't handle multiple entry points per stage
-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:
@@ -961,7 +960,6 @@
 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: can't handle multiple entry points per stage
-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:
diff --git a/Test/baseResults/300block.frag.out b/Test/baseResults/300block.frag.out
index 6f7de91..e5b07dd 100644
--- a/Test/baseResults/300block.frag.out
+++ b/Test/baseResults/300block.frag.out
@@ -38,7 +38,7 @@
 0:44          Convert uint to float ( temp lowp float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
-0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t} fbs})
+0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
 0:44                Constant:
 0:44                  0 (const uint)
 0:44              Constant:
@@ -78,7 +78,7 @@
 0:55        2 (const int)
 0:?   Linker Objects
 0:?     's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
-0:?     'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t} fbs})
+0:?     'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
 0:?     'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:?     'insts' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump float f, layout( column_major shared) uniform mediump uint u})
@@ -106,7 +106,7 @@
 0:44          Convert uint to float ( temp lowp float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
-0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t} fbs})
+0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
 0:44                Constant:
 0:44                  0 (const uint)
 0:44              Constant:
@@ -146,7 +146,7 @@
 0:55        2 (const int)
 0:?   Linker Objects
 0:?     's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
-0:?     'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t} fbs})
+0:?     'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
 0:?     'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:?     'insts' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:?     'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump float f, layout( column_major shared) uniform mediump uint u})
diff --git a/Test/baseResults/300layout.vert.out b/Test/baseResults/300layout.vert.out
index e245cbc..527425b 100644
--- a/Test/baseResults/300layout.vert.out
+++ b/Test/baseResults/300layout.vert.out
@@ -1,6 +1,7 @@
 300layout.vert
 ERROR: 0:7: 'vertex input arrays' : not supported with this profile: es
 ERROR: 0:8: 'in' : cannot be a structure or array 
+ERROR: 0:8: 's' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:8: 'vertex input arrays' : not supported with this profile: es
 ERROR: 0:8: 'location' : overlapping use of location 10
 ERROR: 0:12: 'layout' : cannot specify matrix layout on a variable declaration 
@@ -18,7 +19,7 @@
 ERROR: 0:50: 'shared' : not supported in this stage: vertex
 ERROR: 0:54: 'layout' : cannot specify packing on a variable declaration 
 ERROR: 0:57: 'location' : overlapping use of location 40
-ERROR: 19 compilation errors.  No code generated.
+ERROR: 20 compilation errors.  No code generated.
 
 
 Shader version: 300
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 538b750..85b0116 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -7,9 +7,9 @@
 ERROR: 0:39: 'location qualifier on input' : not supported in this stage: compute
 ERROR: 0:40: 'in' : global storage input qualifier cannot be used in a compute shader 
 ERROR: 0:41: 'out' : global storage output qualifier cannot be used in a compute shader 
-ERROR: 0:44: 'shared' : cannot apply layout qualifiers to a shared variable 
+ERROR: 0:44: 'shared block' : not supported for this version or the enabled extensions 
 ERROR: 0:44: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers 
-ERROR: 0:45: 'shared' :  cannot initialize this type of qualifier  
+ERROR: 0:45: 'shared' : initializer can only be a null initializer ('{}') 
 ERROR: 0:47: 'local_size' : can only apply to 'in' 
 ERROR: 0:47: 'local_size' : can only apply to 'in' 
 ERROR: 0:47: 'local_size' : can only apply to 'in' 
@@ -115,6 +115,11 @@
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex)
+0:45  Sequence
+0:45    move second child to first child ( temp highp float)
+0:45      'fs' ( shared highp float)
+0:45      Constant:
+0:45        4.200000
 0:59  Function Definition: foo( ( global void)
 0:59    Function Parameters: 
 0:61    Sequence
@@ -553,6 +558,11 @@
 0:36              Constant:
 0:36                1 (const uint)
 0:36            'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex)
+0:45  Sequence
+0:45    move second child to first child ( temp highp float)
+0:45      'fs' ( shared highp float)
+0:45      Constant:
+0:45        4.200000
 0:?   Linker Objects
 0:?     'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
 0:?       2 (const uint)
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 9fe93e9..9f73c67 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -40,10 +40,14 @@
 ERROR: 0:114: 'in' : cannot be bool 
 ERROR: 0:115: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: ino
 ERROR: 0:117: 'fragment-shader array-of-array input' : not supported with this profile: es
+ERROR: 0:120: 'S' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:120: 'fragment-shader array-of-struct input' : not supported with this profile: es
+ERROR: 0:121: 'S' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:121: 'fragment-shader array-of-struct input' : not supported with this profile: es
 ERROR: 0:123: 'fragment-shader struct input containing an array' : not supported with this profile: es
+ERROR: 0:123: 'SA' : A structure containing an array is not allowed as input in ES 
 ERROR: 0:125: 'fragment-shader struct input containing structure' : not supported with this profile: es
+ERROR: 0:125: 'SS' : A structure containing an struct is not allowed as input in ES 
 ERROR: 0:133: 'output block' : not supported in this stage: fragment
 ERROR: 0:138: '' : cannot nest a structure definition inside a structure or block 
 ERROR: 0:146: 'location' : overlapping use of location 13
@@ -139,7 +143,7 @@
 ERROR: 0:463: 'return' : void function cannot return a value 
 ERROR: 0:472: '=' :  cannot convert from ' temp mediump uint' to ' temp mediump int'
 ERROR: 0:485: '=' :  cannot convert from ' global mediump int' to ' temp mediump uint'
-ERROR: 132 compilation errors.  No code generated.
+ERROR: 136 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/Test/baseResults/310.inheritMemory.frag.out b/Test/baseResults/310.inheritMemory.frag.out
index 6d5528b..e74d4ab 100644
--- a/Test/baseResults/310.inheritMemory.frag.out
+++ b/Test/baseResults/310.inheritMemory.frag.out
@@ -30,13 +30,13 @@
 0:30        's' ( temp structure{ global 10-element array of mediump float buff})
 0:32      Function Call: non_ro_fun(f1[10]; ( global void)
 0:32        buff: direct index for structure (layout( column_major std430 offset=0) buffer 10-element array of mediump float)
-0:32          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:32          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:32          Constant:
 0:32            0 (const int)
 0:33      Function Call: non_ro_fun(f1[10]; ( global void)
-0:33        buff: direct index for structure ( global 10-element array of mediump float)
-0:33          s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:33            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:33        buff: direct index for structure (layout( std430) global 10-element array of mediump float)
+0:33          s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:33            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:33            Constant:
 0:33              1 (const int)
 0:33          Constant:
@@ -44,16 +44,16 @@
 0:34      Function Call: non_ro_funf(f1; ( global void)
 0:34        direct index (layout( column_major std430 offset=0) temp mediump float)
 0:34          buff: direct index for structure (layout( column_major std430 offset=0) buffer 10-element array of mediump float)
-0:34            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:34            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:34            Constant:
 0:34              0 (const int)
 0:34          Constant:
 0:34            3 (const int)
 0:35      Function Call: non_ro_funf(f1; ( global void)
-0:35        direct index ( temp mediump float)
-0:35          buff: direct index for structure ( global 10-element array of mediump float)
-0:35            s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:35              'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:35        direct index (layout( std430) temp mediump float)
+0:35          buff: direct index for structure (layout( std430) global 10-element array of mediump float)
+0:35            s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:35              'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:35              Constant:
 0:35                1 (const int)
 0:35            Constant:
@@ -61,19 +61,19 @@
 0:35          Constant:
 0:35            3 (const int)
 0:36      Function Call: non_ro_funS(struct-S-f1[10]1; ( global void)
-0:36        s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:36          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:36        s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:36          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:36          Constant:
 0:36            1 (const int)
 0:38      Function Call: non_ro_fun(f1[10]; ( global void)
 0:38        buff_ro: direct index for structure (layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float)
-0:38          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:38          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:38          Constant:
 0:38            0 (const int)
 0:39      Function Call: non_ro_fun(f1[10]; ( global void)
-0:39        buff: direct index for structure ( readonly global 10-element array of mediump float)
-0:39          s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:39            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:39        buff: direct index for structure (layout( std430) readonly global 10-element array of mediump float)
+0:39          s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:39            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:39            Constant:
 0:39              1 (const int)
 0:39          Constant:
@@ -81,16 +81,16 @@
 0:40      Function Call: non_ro_funf(f1; ( global void)
 0:40        direct index (layout( column_major std430 offset=0) readonly temp mediump float)
 0:40          buff_ro: direct index for structure (layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float)
-0:40            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:40            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:40            Constant:
 0:40              0 (const int)
 0:40          Constant:
 0:40            3 (const int)
 0:41      Function Call: non_ro_funf(f1; ( global void)
-0:41        direct index ( readonly temp mediump float)
-0:41          buff: direct index for structure ( readonly global 10-element array of mediump float)
-0:41            s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:41              'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:41        direct index (layout( std430) readonly temp mediump float)
+0:41          buff: direct index for structure (layout( std430) readonly global 10-element array of mediump float)
+0:41            s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:41              'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:41              Constant:
 0:41                1 (const int)
 0:41            Constant:
@@ -98,13 +98,13 @@
 0:41          Constant:
 0:41            3 (const int)
 0:42      Function Call: non_ro_funS(struct-S-f1[10]1; ( global void)
-0:42        s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:42          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:42        s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:42          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:42          Constant:
 0:42            1 (const int)
 0:?   Linker Objects
-0:?     'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
-0:?     'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:?     'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
+0:?     'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:?     'fragColor' ( out mediump 4-component vector of float)
 
 
@@ -142,13 +142,13 @@
 0:30        's' ( temp structure{ global 10-element array of mediump float buff})
 0:32      Function Call: non_ro_fun(f1[10]; ( global void)
 0:32        buff: direct index for structure (layout( column_major std430 offset=0) buffer 10-element array of mediump float)
-0:32          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:32          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:32          Constant:
 0:32            0 (const int)
 0:33      Function Call: non_ro_fun(f1[10]; ( global void)
-0:33        buff: direct index for structure ( global 10-element array of mediump float)
-0:33          s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:33            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:33        buff: direct index for structure (layout( std430) global 10-element array of mediump float)
+0:33          s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:33            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:33            Constant:
 0:33              1 (const int)
 0:33          Constant:
@@ -156,16 +156,16 @@
 0:34      Function Call: non_ro_funf(f1; ( global void)
 0:34        direct index (layout( column_major std430 offset=0) temp mediump float)
 0:34          buff: direct index for structure (layout( column_major std430 offset=0) buffer 10-element array of mediump float)
-0:34            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:34            'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:34            Constant:
 0:34              0 (const int)
 0:34          Constant:
 0:34            3 (const int)
 0:35      Function Call: non_ro_funf(f1; ( global void)
-0:35        direct index ( temp mediump float)
-0:35          buff: direct index for structure ( global 10-element array of mediump float)
-0:35            s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:35              'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:35        direct index (layout( std430) temp mediump float)
+0:35          buff: direct index for structure (layout( std430) global 10-element array of mediump float)
+0:35            s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:35              'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:35              Constant:
 0:35                1 (const int)
 0:35            Constant:
@@ -173,19 +173,19 @@
 0:35          Constant:
 0:35            3 (const int)
 0:36      Function Call: non_ro_funS(struct-S-f1[10]1; ( global void)
-0:36        s: direct index for structure (layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff})
-0:36          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:36        s: direct index for structure (layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:36          'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:36          Constant:
 0:36            1 (const int)
 0:38      Function Call: non_ro_fun(f1[10]; ( global void)
 0:38        buff_ro: direct index for structure (layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float)
-0:38          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:38          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:38          Constant:
 0:38            0 (const int)
 0:39      Function Call: non_ro_fun(f1[10]; ( global void)
-0:39        buff: direct index for structure ( readonly global 10-element array of mediump float)
-0:39          s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:39            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:39        buff: direct index for structure (layout( std430) readonly global 10-element array of mediump float)
+0:39          s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:39            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:39            Constant:
 0:39              1 (const int)
 0:39          Constant:
@@ -193,16 +193,16 @@
 0:40      Function Call: non_ro_funf(f1; ( global void)
 0:40        direct index (layout( column_major std430 offset=0) readonly temp mediump float)
 0:40          buff_ro: direct index for structure (layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float)
-0:40            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:40            'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:40            Constant:
 0:40              0 (const int)
 0:40          Constant:
 0:40            3 (const int)
 0:41      Function Call: non_ro_funf(f1; ( global void)
-0:41        direct index ( readonly temp mediump float)
-0:41          buff: direct index for structure ( readonly global 10-element array of mediump float)
-0:41            s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:41              'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:41        direct index (layout( std430) readonly temp mediump float)
+0:41          buff: direct index for structure (layout( std430) readonly global 10-element array of mediump float)
+0:41            s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:41              'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:41              Constant:
 0:41                1 (const int)
 0:41            Constant:
@@ -210,12 +210,12 @@
 0:41          Constant:
 0:41            3 (const int)
 0:42      Function Call: non_ro_funS(struct-S-f1[10]1; ( global void)
-0:42        s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff})
-0:42          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
+0:42        s_ro: direct index for structure (layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff})
+0:42          'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
 0:42          Constant:
 0:42            1 (const int)
 0:?   Linker Objects
-0:?     'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{ global 10-element array of mediump float buff} s_ro})
-0:?     'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{ global 10-element array of mediump float buff} s})
+0:?     'ro_buffer' (layout( binding=2 column_major std430) readonly buffer block{layout( column_major std430 offset=0) readonly buffer 10-element array of mediump float buff_ro, layout( column_major std430 offset=40) readonly buffer structure{layout( std430) global 10-element array of mediump float buff} s_ro})
+0:?     'non_ro_buffer' (layout( binding=2 column_major std430) buffer block{layout( column_major std430 offset=0) buffer 10-element array of mediump float buff, layout( column_major std430 offset=40) buffer structure{layout( std430) global 10-element array of mediump float buff} s})
 0:?     'fragColor' ( out mediump 4-component vector of float)
 
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index a910e34..1d2152d 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -21,6 +21,7 @@
 ERROR: 0:107: 'input block' : not supported in this stage: vertex
 ERROR: 0:109: 'gl_PerVertex' : block redeclaration has extra members 
 ERROR: 0:119: 'gl_PointSize' : member of nameless block was not redeclared 
+ERROR: 0:119: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:119: 'assign' :  cannot convert from ' const float' to ' gl_PointSize highp void PointSize'
 ERROR: 0:122: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:127: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
@@ -96,7 +97,7 @@
 ERROR: 0:400: 'interpolateAtCentroid' : no matching overloaded function found 
 ERROR: 0:401: 'interpolateAtSample' : no matching overloaded function found 
 ERROR: 0:402: 'interpolateAtOffset' : no matching overloaded function found 
-ERROR: 93 compilation errors.  No code generated.
+ERROR: 94 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out
index 451cc0b..eec22cc 100644
--- a/Test/baseResults/310AofA.vert.out
+++ b/Test/baseResults/310AofA.vert.out
@@ -61,7 +61,7 @@
 0:49      Constant:
 0:49        0.000000
 0:50      Branch: Return with expression
-0:50        Construct float ( temp 4-element array of 7-element array of float)
+0:50        Construct float ( temp 4-element array of 7-element array of highp float)
 0:50          direct index ( temp 7-element array of highp float)
 0:50            'a' ( in 5-element array of 7-element array of highp float)
 0:50            Constant:
@@ -76,7 +76,7 @@
 0:50            Constant:
 0:50              3 (const int)
 0:51      Branch: Return with expression
-0:51        Construct float ( temp 4-element array of 7-element array of float)
+0:51        Construct float ( temp 4-element array of 7-element array of highp float)
 0:51          direct index ( temp 7-element array of highp float)
 0:51            'a' ( in 5-element array of 7-element array of highp float)
 0:51            Constant:
@@ -91,7 +91,7 @@
 0:51            Constant:
 0:51              3 (const int)
 0:52      Branch: Return with expression
-0:52        Construct float ( temp 4-element array of 7-element array of float)
+0:52        Construct float ( temp 4-element array of 7-element array of highp float)
 0:52          direct index ( temp 7-element array of highp float)
 0:52            'a' ( in 5-element array of 7-element array of highp float)
 0:52            Constant:
diff --git a/Test/baseResults/320.vert.out b/Test/baseResults/320.vert.out
index bf127d4..0313b61 100644
--- a/Test/baseResults/320.vert.out
+++ b/Test/baseResults/320.vert.out
@@ -4,6 +4,7 @@
 ERROR: 0:16: 'input block' : not supported in this stage: vertex
 ERROR: 0:18: 'gl_PerVertex' : block redeclaration has extra members 
 ERROR: 0:28: 'gl_PointSize' : member of nameless block was not redeclared 
+ERROR: 0:28: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:28: 'assign' :  cannot convert from ' const float' to ' gl_PointSize highp void PointSize'
 ERROR: 0:31: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
 ERROR: 0:36: 'flat/smooth/noperspective' : cannot use interpolation qualifiers on an interface block 
@@ -33,7 +34,7 @@
 ERROR: 0:252: 'interpolateAtCentroid' : no matching overloaded function found 
 ERROR: 0:253: 'interpolateAtSample' : no matching overloaded function found 
 ERROR: 0:254: 'interpolateAtOffset' : no matching overloaded function found 
-ERROR: 34 compilation errors.  No code generated.
+ERROR: 35 compilation errors.  No code generated.
 
 
 Shader version: 320
diff --git a/Test/baseResults/330.frag.out b/Test/baseResults/330.frag.out
index e919b5b..d95cd30 100644
--- a/Test/baseResults/330.frag.out
+++ b/Test/baseResults/330.frag.out
@@ -83,6 +83,22 @@
 0:135        'KeyMem' ( global structure{ global int precise})
 0:135        Constant:
 0:135          0 (const int)
+0:152  Function Definition: testOverload( ( global void)
+0:152    Function Parameters: 
+0:153    Sequence
+0:153      Sequence
+0:153        move second child to first child ( temp float)
+0:153          'overloadTest' ( temp float)
+0:153          Constant:
+0:153            42.000000
+0:154      move second child to first child ( temp float)
+0:154        'overloadTest' ( temp float)
+0:154        smoothstep ( global float)
+0:154          Constant:
+0:154            0.000000
+0:154          Constant:
+0:154            1.000000
+0:154          'overloadTest' ( temp float)
 0:?   Linker Objects
 0:?     'inVar' ( smooth in 4-component vector of float)
 0:?     'outVar' (layout( location=0 index=0) out 4-component vector of float)
diff --git a/Test/baseResults/400.frag.out b/Test/baseResults/400.frag.out
index 90f73dc..b7e88df 100644
--- a/Test/baseResults/400.frag.out
+++ b/Test/baseResults/400.frag.out
@@ -34,7 +34,7 @@
 ERROR: 0:184: 'textureQueryLod' : no matching overloaded function found 
 ERROR: 0:184: 'assign' :  cannot convert from ' const float' to ' temp 2-component vector of float'
 ERROR: 0:197: 'subroutine' : feature not yet implemented 
-ERROR: 0:197: '' : default qualifier requires 'uniform', 'buffer', 'in', or 'out' storage qualification 
+ERROR: 0:197: '' : default qualifier requires 'uniform', 'buffer', 'in', 'out' or 'shared' storage qualification 
 ERROR: 0:198: 'subroutine' : feature not yet implemented 
 ERROR: 0:199: 'subroutine' : feature not yet implemented 
 ERROR: 0:201: '' :  syntax error, unexpected PRECISE, expecting IDENTIFIER
diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out
index c38ba48..498da5a 100644
--- a/Test/baseResults/410.geom.out
+++ b/Test/baseResults/410.geom.out
@@ -5,9 +5,10 @@
 ERROR: 0:32: 'gl_Position' : no such field in structure 
 ERROR: 0:32: '=' :  cannot convert from ' temp block{ in float PointSize gl_PointSize}' to ' temp 4-component vector of float'
 ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared 
+ERROR: 0:33: 'assign' :  l-value required "gl_PerVertex" (can't modify void)
 ERROR: 0:33: 'assign' :  cannot convert from ' const 4-component vector of float' to 'layout( stream=0) gl_Position void Position'
 WARNING: 0:38: 'return' : type conversion on return values was not explicitly allowed until version 420 
-ERROR: 7 compilation errors.  No code generated.
+ERROR: 8 compilation errors.  No code generated.
 
 
 Shader version: 410
diff --git a/Test/baseResults/420.frag.out b/Test/baseResults/420.frag.out
index 1a7586a..19b5c9b 100644
--- a/Test/baseResults/420.frag.out
+++ b/Test/baseResults/420.frag.out
@@ -4,8 +4,8 @@
 ERROR: 0:12: 'gl_FragDepth' : cannot redeclare after use 
 ERROR: 0:14: 'atomic_uint' : array must be explicitly sized 
 ERROR: 0:17: 'imageSize' : required extension not requested: GL_ARB_shader_image_size
-ERROR: 0:39: 'std430' : not supported for this version or the enabled extensions 
-ERROR: 0:39: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
+ERROR: 0:54: 'std430' : not supported for this version or the enabled extensions 
+ERROR: 0:54: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
 ERROR: 7 compilation errors.  No code generated.
 
 
@@ -82,6 +82,8 @@
 0:?     'iv2dim' ( global 2-component vector of int)
 0:?     'iv2dim1' ( global 2-component vector of int)
 0:?     'anon@0' (layout( binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer int atomi, layout( column_major std430 offset=4) buffer uint atomu})
+0:?     'ssboStd430Arr' (layout( binding=2 column_major std430) buffer 2-element array of block{layout( column_major std430 offset=0) buffer int member01, layout( column_major std430 offset=4) buffer 2-element array of int memberArr01, layout( column_major std430 offset=12) buffer unsized 1-element array of int memberUnsizedArr01})
+0:?     'ssboSharedArr' (layout( binding=3 column_major shared) buffer 2-element array of block{layout( column_major shared) buffer int member02, layout( column_major shared) buffer 2-element array of int memberArr02, layout( column_major shared) buffer unsized 1-element array of int memberUnsizedArr02})
 
 
 Linked fragment stage:
@@ -117,4 +119,6 @@
 0:?     'iv2dim' ( global 2-component vector of int)
 0:?     'iv2dim1' ( global 2-component vector of int)
 0:?     'anon@0' (layout( binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer int atomi, layout( column_major std430 offset=4) buffer uint atomu})
+0:?     'ssboStd430Arr' (layout( binding=2 column_major std430) buffer 2-element array of block{layout( column_major std430 offset=0) buffer int member01, layout( column_major std430 offset=4) buffer 2-element array of int memberArr01, layout( column_major std430 offset=12) buffer unsized 1-element array of int memberUnsizedArr01})
+0:?     'ssboSharedArr' (layout( binding=3 column_major shared) buffer 2-element array of block{layout( column_major shared) buffer int member02, layout( column_major shared) buffer 2-element array of int memberArr02, layout( column_major shared) buffer unsized 1-element array of int memberUnsizedArr02})
 
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index 3d49327..1a57b34 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -48,7 +48,7 @@
 ERROR: 0:142: 'r8_snorm' : does not apply to signed integer images 
 ERROR: 0:143: 'rgba32ui' : does not apply to signed integer images 
 ERROR: 0:144: 'r8ui' : does not apply to signed integer images 
-ERROR: 0:147: 'offset on block member' : not supported for this version or the enabled extensions 
+ERROR: 0:147: '"offset" on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:147: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:157: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:157: 'assign' :  cannot convert from ' const float' to ' temp int'
diff --git a/Test/baseResults/430.comp.out b/Test/baseResults/430.comp.out
index 55c8238..4d8495b 100644
--- a/Test/baseResults/430.comp.out
+++ b/Test/baseResults/430.comp.out
@@ -5,9 +5,9 @@
 ERROR: 0:43: 'location qualifier on input' : not supported in this stage: compute
 ERROR: 0:44: 'in' : global storage input qualifier cannot be used in a compute shader 
 ERROR: 0:45: 'out' : global storage output qualifier cannot be used in a compute shader 
-ERROR: 0:48: 'shared' : cannot apply layout qualifiers to a shared variable 
+ERROR: 0:48: 'shared block' : not supported for this version or the enabled extensions 
 ERROR: 0:48: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers 
-ERROR: 0:49: 'shared' :  cannot initialize this type of qualifier  
+ERROR: 0:49: 'shared' : initializer can only be a null initializer ('{}') 
 ERROR: 0:52: 'local_size' : cannot change previously set size 
 ERROR: 0:54: 'local_size' : can only apply to 'in' 
 ERROR: 0:54: 'local_size' : can only apply to 'in' 
@@ -52,6 +52,11 @@
 0:39            10 (const int)
 0:39        true case
 0:40        Barrier ( global void)
+0:49  Sequence
+0:49    move second child to first child ( temp float)
+0:49      'fs' ( shared float)
+0:49      Constant:
+0:49        4.200000
 0:66  Function Definition: foo( ( global void)
 0:66    Function Parameters: 
 0:68    Sequence
@@ -184,6 +189,11 @@
 0:39            10 (const int)
 0:39        true case
 0:40        Barrier ( global void)
+0:49  Sequence
+0:49    move second child to first child ( temp float)
+0:49      'fs' ( shared float)
+0:49      Constant:
+0:49        4.200000
 0:?   Linker Objects
 0:?     'gl_WorkGroupSize' ( const 3-component vector of uint WorkGroupSize)
 0:?       2 (const uint)
diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out
index 4bac5fc..db56eab 100644
--- a/Test/baseResults/430.vert.out
+++ b/Test/baseResults/430.vert.out
@@ -26,12 +26,12 @@
 ERROR: 0:62: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
 ERROR: 0:64: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
 ERROR: 0:65: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
-ERROR: 0:65: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:66: 'offset on block member' : not supported for this version or the enabled extensions 
+ERROR: 0:65: '"offset" on block member' : not supported for this version or the enabled extensions 
+ERROR: 0:66: '"offset" on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:64: 'align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:65: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:66: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
-ERROR: 0:71: 'offset on block member' : not supported for this version or the enabled extensions 
+ERROR: 0:71: '"offset" on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:74: 'gl_MaxTransformFeedbackBuffers' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:75: 'gl_MaxTransformFeedbackInterleavedComponents' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:78: 'transform feedback qualifier' : not supported for this version or the enabled extensions 
diff --git a/Test/baseResults/array100.frag.out b/Test/baseResults/array100.frag.out
index e6f9f8d..ecb55f9 100644
--- a/Test/baseResults/array100.frag.out
+++ b/Test/baseResults/array100.frag.out
@@ -31,7 +31,7 @@
 0:9      'a' ( in 5-element array of mediump float)
 0:11    Sequence
 0:11      Branch: Return with expression
-0:11        Construct float ( temp 4-element array of float)
+0:11        Construct float ( temp 4-element array of mediump float)
 0:11          direct index ( temp mediump float)
 0:11            'a' ( in 5-element array of mediump float)
 0:11            Constant:
@@ -168,7 +168,7 @@
 0:9      'a' ( in 5-element array of mediump float)
 0:11    Sequence
 0:11      Branch: Return with expression
-0:11        Construct float ( temp 4-element array of float)
+0:11        Construct float ( temp 4-element array of mediump float)
 0:11          direct index ( temp mediump float)
 0:11            'a' ( in 5-element array of mediump float)
 0:11            Constant:
diff --git a/Test/baseResults/compoundsuffix.frag.hlsl b/Test/baseResults/compoundsuffix.frag.hlsl
index 650d1d0..5a62488 100644
--- a/Test/baseResults/compoundsuffix.frag.hlsl
+++ b/Test/baseResults/compoundsuffix.frag.hlsl
@@ -1,6 +1,6 @@
 compoundsuffix.frag.hlsl

 // Module Version 10000

-// Generated by (magic number): 80008

+// Generated by (magic number): 8000a

 // Id's are bound by 22

 

                               Capability Shader

diff --git a/Test/baseResults/contradict_0.geom.out b/Test/baseResults/contradict_0.geom.out
new file mode 100644
index 0000000..0429657
--- /dev/null
+++ b/Test/baseResults/contradict_0.geom.out
@@ -0,0 +1,63 @@
+contradict_0.geom
+Shader version: 330
+invocations = -1
+max_vertices = 4
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:8  Function Definition: main( ( global void)
+0:8    Function Parameters: 
+0:10    Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp float)
+0:10          'v' ( temp float)
+0:10          Function Call: getV( ( global float)
+0:11      EndPrimitive ( global void)
+0:12      EndPrimitive ( global void)
+0:?   Linker Objects
+
+contradict_1.geom
+Shader version: 330
+invocations = -1
+max_vertices = 6
+input primitive = lines
+output primitive = line_strip
+0:? Sequence
+0:6  Function Definition: getV( ( global float)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          1.000000
+0:?   Linker Objects
+
+
+Linked geometry stage:
+
+ERROR: Linking geometry stage: Contradictory layout max_vertices values
+ERROR: Linking geometry stage: Contradictory input layout primitives
+ERROR: Linking geometry stage: Contradictory output layout primitives
+
+Shader version: 330
+invocations = 1
+max_vertices = 4
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:8  Function Definition: main( ( global void)
+0:8    Function Parameters: 
+0:10    Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp float)
+0:10          'v' ( temp float)
+0:10          Function Call: getV( ( global float)
+0:11      EndPrimitive ( global void)
+0:12      EndPrimitive ( global void)
+0:6  Function Definition: getV( ( global float)
+0:6    Function Parameters: 
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          1.000000
+0:?   Linker Objects
+
diff --git a/Test/baseResults/cppBad3.vert.out b/Test/baseResults/cppBad3.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppBad4.vert.out b/Test/baseResults/cppBad4.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppBad5.vert.out b/Test/baseResults/cppBad5.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/cppDeepNest.frag.out b/Test/baseResults/cppDeepNest.frag.out
index 969a256..49b9aa3 100644
--- a/Test/baseResults/cppDeepNest.frag.out
+++ b/Test/baseResults/cppDeepNest.frag.out
@@ -1,7 +1,7 @@
 cppDeepNest.frag
 ERROR: 0:66: '#if/#ifdef/#ifndef' : maximum nesting depth exceeded 
 ERROR: 0:66: '' : missing #endif 
-ERROR: 0:66: '' :  syntax error, unexpected $end
+ERROR: 0:66: '' :  syntax error, unexpected end of file
 ERROR: 3 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/cppMerge.frag.out b/Test/baseResults/cppMerge.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/glsl.140.layoutOffset.error.vert.out b/Test/baseResults/glsl.140.layoutOffset.error.vert.out
new file mode 100644
index 0000000..ce33d15
--- /dev/null
+++ b/Test/baseResults/glsl.140.layoutOffset.error.vert.out
@@ -0,0 +1,50 @@
+glsl.140.layoutOffset.error.vert
+ERROR: 0:5: 'offset' : not supported with this profile: none
+ERROR: 0:5: '"offset" on block member' : not supported for this version or the enabled extensions 
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 140
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        'out_vs' ( smooth out 4-component vector of float)
+0:13        add ( temp 4-component vector of float)
+0:13          'in_vs' ( in 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major std140 offset=0) uniform 4-component vector of float)
+0:13            'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 140
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        'out_vs' ( smooth out 4-component vector of float)
+0:13        add ( temp 4-component vector of float)
+0:13          'in_vs' ( in 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major std140 offset=0) uniform 4-component vector of float)
+0:13            'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/glsl.430.layoutOffset.error.vert.out b/Test/baseResults/glsl.430.layoutOffset.error.vert.out
new file mode 100644
index 0000000..64160ce
--- /dev/null
+++ b/Test/baseResults/glsl.430.layoutOffset.error.vert.out
@@ -0,0 +1,49 @@
+glsl.430.layoutOffset.error.vert
+ERROR: 0:5: '"offset" on block member' : not supported for this version or the enabled extensions 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 430
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        'out_vs' ( smooth out 4-component vector of float)
+0:13        add ( temp 4-component vector of float)
+0:13          'in_vs' ( in 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major std140 offset=0) uniform 4-component vector of float)
+0:13            'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 430
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        'out_vs' ( smooth out 4-component vector of float)
+0:13        add ( temp 4-component vector of float)
+0:13          'in_vs' ( in 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major std140 offset=0) uniform 4-component vector of float)
+0:13            'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform 4-component vector of float a})
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/glsl.460.subgroup.rcall.out b/Test/baseResults/glsl.460.subgroup.rcall.out
index 6bffdc9..2b2d89b 100644
--- a/Test/baseResults/glsl.460.subgroup.rcall.out
+++ b/Test/baseResults/glsl.460.subgroup.rcall.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -359,8 +359,8 @@
 0:119  Function Definition: basic_works( ( global void)
 0:119    Function Parameters: 
 0:121    Sequence
-0:121      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:122      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:121      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:122      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:123      subgroupBarrier ( global void)
 0:124      subgroupMemoryBarrier ( global void)
 0:125      subgroupMemoryBarrierBuffer ( global void)
@@ -370,11 +370,11 @@
 0:131    Function Parameters: 
 0:131      'f4' ( in 4-component vector of float)
 0:132    Sequence
-0:132      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:133      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:134      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:135      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:136      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:132      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:133      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:134      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:135      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:136      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:137      subgroupBroadcast ( global 4-component vector of float)
 0:137        'f4' ( in 4-component vector of float)
 0:137        Constant:
@@ -624,15 +624,15 @@
 0:247    Sequence
 0:247      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:248      'gl_SMCountNV' ( in uint SMCountNV)
-0:249      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:250      'gl_SMIDNV' ( in uint SMIDNV)
+0:249      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:250      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:257  Function Definition: sm_builtins( ( global void)
 0:257    Function Parameters: 
 0:259    Sequence
 0:259      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:260      'gl_SMCountNV' ( in uint SMCountNV)
-0:261      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:262      'gl_SMIDNV' ( in uint SMIDNV)
+0:261      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:262      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'data0' (layout( location=0) callableDataNV 4-component vector of float)
 0:?     'anon@0' (layout( location=1) callableDataInNV block{ callableDataInNV uint data1})
diff --git a/Test/baseResults/glsl.460.subgroup.rchit.out b/Test/baseResults/glsl.460.subgroup.rchit.out
index 1ea9e69..f5083e0 100644
--- a/Test/baseResults/glsl.460.subgroup.rchit.out
+++ b/Test/baseResults/glsl.460.subgroup.rchit.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -425,8 +425,8 @@
 0:129  Function Definition: basic_works( ( global void)
 0:129    Function Parameters: 
 0:131    Sequence
-0:131      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:132      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:131      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:132      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:133      subgroupBarrier ( global void)
 0:134      subgroupMemoryBarrier ( global void)
 0:135      subgroupMemoryBarrierBuffer ( global void)
@@ -436,11 +436,11 @@
 0:141    Function Parameters: 
 0:141      'f4' ( in 4-component vector of float)
 0:142    Sequence
-0:142      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:143      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:144      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:145      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:146      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:142      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:143      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:144      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:145      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:146      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:147      subgroupBroadcast ( global 4-component vector of float)
 0:147        'f4' ( in 4-component vector of float)
 0:147        Constant:
@@ -690,15 +690,15 @@
 0:257    Sequence
 0:257      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:258      'gl_SMCountNV' ( in uint SMCountNV)
-0:259      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:260      'gl_SMIDNV' ( in uint SMIDNV)
+0:259      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:260      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:267  Function Definition: sm_builtins( ( global void)
 0:267    Function Parameters: 
 0:269    Sequence
 0:269      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:270      'gl_SMCountNV' ( in uint SMCountNV)
-0:271      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:272      'gl_SMIDNV' ( in uint SMIDNV)
+0:271      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:272      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'localPayload' (layout( location=0) rayPayloadNV 4-component vector of float)
diff --git a/Test/baseResults/glsl.460.subgroup.rgen.out b/Test/baseResults/glsl.460.subgroup.rgen.out
index dfe1e2b..56283bb 100644
--- a/Test/baseResults/glsl.460.subgroup.rgen.out
+++ b/Test/baseResults/glsl.460.subgroup.rgen.out
@@ -109,8 +109,8 @@
 0:4    Function Parameters: 
 0:4      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:7      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:8      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:7      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:8      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:9      subgroupBarrier ( global void)
 0:10      subgroupMemoryBarrier ( global void)
 0:11      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:19          false (const bool)
 0:20      subgroupAllEqual ( global bool)
 0:20        'f4' ( in 4-component vector of float)
-0:22      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:23      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:24      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:25      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:26      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:22      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:23      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:24      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:25      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:26      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:27      subgroupBroadcast ( global 4-component vector of float)
 0:27        'f4' ( in 4-component vector of float)
 0:27        Constant:
@@ -389,8 +389,8 @@
 0:123  Function Definition: basic_works( ( global void)
 0:123    Function Parameters: 
 0:125    Sequence
-0:125      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:126      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:125      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:126      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:127      subgroupBarrier ( global void)
 0:128      subgroupMemoryBarrier ( global void)
 0:129      subgroupMemoryBarrierBuffer ( global void)
@@ -400,11 +400,11 @@
 0:135    Function Parameters: 
 0:135      'f4' ( in 4-component vector of float)
 0:136    Sequence
-0:136      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:137      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:138      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:139      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:140      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:136      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:137      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:138      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:139      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:140      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:141      subgroupBroadcast ( global 4-component vector of float)
 0:141        'f4' ( in 4-component vector of float)
 0:141        Constant:
@@ -654,15 +654,15 @@
 0:251    Sequence
 0:251      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:252      'gl_SMCountNV' ( in uint SMCountNV)
-0:253      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:254      'gl_SMIDNV' ( in uint SMIDNV)
+0:253      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:254      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:261  Function Definition: sm_builtins( ( global void)
 0:261    Function Parameters: 
 0:263    Sequence
 0:263      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:264      'gl_SMCountNV' ( in uint SMCountNV)
-0:265      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:266      'gl_SMIDNV' ( in uint SMIDNV)
+0:265      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:266      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV0' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'accNV1' (layout( set=0 binding=1) uniform accelerationStructureNV)
diff --git a/Test/baseResults/glsl.460.subgroup.rint.out b/Test/baseResults/glsl.460.subgroup.rint.out
index 9915ecf..a7de7d3 100644
--- a/Test/baseResults/glsl.460.subgroup.rint.out
+++ b/Test/baseResults/glsl.460.subgroup.rint.out
@@ -109,8 +109,8 @@
 0:5    Function Parameters: 
 0:5      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:8      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:9      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:8      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:9      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:10      subgroupBarrier ( global void)
 0:11      subgroupMemoryBarrier ( global void)
 0:12      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:20          false (const bool)
 0:21      subgroupAllEqual ( global bool)
 0:21        'f4' ( in 4-component vector of float)
-0:23      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:24      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:25      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:26      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:27      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:23      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:24      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:25      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:26      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:27      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:28      subgroupBroadcast ( global 4-component vector of float)
 0:28        'f4' ( in 4-component vector of float)
 0:28        Constant:
@@ -403,8 +403,8 @@
 0:129  Function Definition: basic_works( ( global void)
 0:129    Function Parameters: 
 0:131    Sequence
-0:131      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:132      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:131      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:132      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:133      subgroupBarrier ( global void)
 0:134      subgroupMemoryBarrier ( global void)
 0:135      subgroupMemoryBarrierBuffer ( global void)
@@ -414,11 +414,11 @@
 0:141    Function Parameters: 
 0:141      'f4' ( in 4-component vector of float)
 0:142    Sequence
-0:142      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:143      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:144      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:145      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:146      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:142      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:143      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:144      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:145      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:146      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:147      subgroupBroadcast ( global 4-component vector of float)
 0:147        'f4' ( in 4-component vector of float)
 0:147        Constant:
@@ -668,15 +668,15 @@
 0:257    Sequence
 0:257      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:258      'gl_SMCountNV' ( in uint SMCountNV)
-0:259      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:260      'gl_SMIDNV' ( in uint SMIDNV)
+0:259      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:260      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:267  Function Definition: sm_builtins( ( global void)
 0:267    Function Parameters: 
 0:269    Sequence
 0:269      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:270      'gl_SMCountNV' ( in uint SMCountNV)
-0:271      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:272      'gl_SMIDNV' ( in uint SMIDNV)
+0:271      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:272      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'iAttr' ( hitAttributeNV 4-component vector of float)
 
diff --git a/Test/baseResults/glsl.460.subgroup.rmiss.out b/Test/baseResults/glsl.460.subgroup.rmiss.out
index ddf7d1b..865d88c 100644
--- a/Test/baseResults/glsl.460.subgroup.rmiss.out
+++ b/Test/baseResults/glsl.460.subgroup.rmiss.out
@@ -109,8 +109,8 @@
 0:5    Function Parameters: 
 0:5      'f4' ( in 4-component vector of float)
 0:?     Sequence
-0:8      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:9      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:8      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:9      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:10      subgroupBarrier ( global void)
 0:11      subgroupMemoryBarrier ( global void)
 0:12      subgroupMemoryBarrierBuffer ( global void)
@@ -128,11 +128,11 @@
 0:20          false (const bool)
 0:21      subgroupAllEqual ( global bool)
 0:21        'f4' ( in 4-component vector of float)
-0:23      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:24      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:25      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:26      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:27      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:23      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:24      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:25      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:26      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:27      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:28      subgroupBroadcast ( global 4-component vector of float)
 0:28        'f4' ( in 4-component vector of float)
 0:28        Constant:
@@ -397,8 +397,8 @@
 0:123  Function Definition: basic_works( ( global void)
 0:123    Function Parameters: 
 0:125    Sequence
-0:125      'gl_SubgroupSize' ( in uint SubgroupSize)
-0:126      'gl_SubgroupInvocationID' ( in uint SubgroupInvocationID)
+0:125      'gl_SubgroupSize' ( volatile in uint SubgroupSize)
+0:126      'gl_SubgroupInvocationID' ( volatile in uint SubgroupInvocationID)
 0:127      subgroupBarrier ( global void)
 0:128      subgroupMemoryBarrier ( global void)
 0:129      subgroupMemoryBarrierBuffer ( global void)
@@ -408,11 +408,11 @@
 0:135    Function Parameters: 
 0:135      'f4' ( in 4-component vector of float)
 0:136    Sequence
-0:136      'gl_SubgroupEqMask' ( in 4-component vector of uint SubgroupEqMask)
-0:137      'gl_SubgroupGeMask' ( in 4-component vector of uint SubgroupGeMask)
-0:138      'gl_SubgroupGtMask' ( in 4-component vector of uint SubgroupGtMask)
-0:139      'gl_SubgroupLeMask' ( in 4-component vector of uint SubgroupLeMask)
-0:140      'gl_SubgroupLtMask' ( in 4-component vector of uint SubgroupLtMask)
+0:136      'gl_SubgroupEqMask' ( volatile in 4-component vector of uint SubgroupEqMask)
+0:137      'gl_SubgroupGeMask' ( volatile in 4-component vector of uint SubgroupGeMask)
+0:138      'gl_SubgroupGtMask' ( volatile in 4-component vector of uint SubgroupGtMask)
+0:139      'gl_SubgroupLeMask' ( volatile in 4-component vector of uint SubgroupLeMask)
+0:140      'gl_SubgroupLtMask' ( volatile in 4-component vector of uint SubgroupLtMask)
 0:141      subgroupBroadcast ( global 4-component vector of float)
 0:141        'f4' ( in 4-component vector of float)
 0:141        Constant:
@@ -662,15 +662,15 @@
 0:251    Sequence
 0:251      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:252      'gl_SMCountNV' ( in uint SMCountNV)
-0:253      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:254      'gl_SMIDNV' ( in uint SMIDNV)
+0:253      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:254      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:261  Function Definition: sm_builtins( ( global void)
 0:261    Function Parameters: 
 0:263    Sequence
 0:263      'gl_WarpsPerSMNV' ( in uint WarpsPerSMNV)
 0:264      'gl_SMCountNV' ( in uint SMCountNV)
-0:265      'gl_WarpIDNV' ( in uint WarpIDNV)
-0:266      'gl_SMIDNV' ( in uint SMIDNV)
+0:265      'gl_WarpIDNV' ( volatile in uint WarpIDNV)
+0:266      'gl_SMIDNV' ( volatile in uint SMIDNV)
 0:?   Linker Objects
 0:?     'accNV' (layout( set=0 binding=0) uniform accelerationStructureNV)
 0:?     'localPayload' (layout( location=0) rayPayloadNV 4-component vector of float)
diff --git a/Test/baseResults/glsl.entryPointRename.vert.bad.out b/Test/baseResults/glsl.entryPointRename.vert.bad.out
index 7b99bbe..ce34fbf 100644
--- a/Test/baseResults/glsl.entryPointRename.vert.bad.out
+++ b/Test/baseResults/glsl.entryPointRename.vert.bad.out
@@ -2,7 +2,7 @@
 ERROR: Source entry point must be "main"
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/glsl.entryPointRename.vert.out b/Test/baseResults/glsl.entryPointRename.vert.out
index 3044dee..71319c9 100644
--- a/Test/baseResults/glsl.entryPointRename.vert.out
+++ b/Test/baseResults/glsl.entryPointRename.vert.out
@@ -1,6 +1,6 @@
 glsl.entryPointRename.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/glsl.es300.layoutOffset.error.vert.out b/Test/baseResults/glsl.es300.layoutOffset.error.vert.out
new file mode 100644
index 0000000..3343b9f
--- /dev/null
+++ b/Test/baseResults/glsl.es300.layoutOffset.error.vert.out
@@ -0,0 +1,51 @@
+glsl.es300.layoutOffset.error.vert
+ERROR: 0:3: 'binding' : not supported for this version or the enabled extensions 
+ERROR: 0:3: 'offset' : not supported for this version or the enabled extensions 
+ERROR: 0:3: 'offset' : only applies to block members, not blocks 
+ERROR: 3 compilation errors.  No code generated.
+
+
+Shader version: 300
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp highp 4-component vector of float)
+0:13        'out_vs' ( smooth out highp 4-component vector of float)
+0:13        add ( temp highp 4-component vector of float)
+0:13          'in_vs' ( in highp 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major shared) uniform highp 4-component vector of float)
+0:13            'anon@0' (layout( binding=0 column_major shared offset=0) uniform block{layout( column_major shared) uniform highp 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 column_major shared offset=0) uniform block{layout( column_major shared) uniform highp 4-component vector of float a})
+0:?     'in_vs' ( in highp 4-component vector of float)
+0:?     'out_vs' ( smooth out highp 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 300
+ERROR: node is still EOpNull!
+0:11  Function Definition: main( ( global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child ( temp highp 4-component vector of float)
+0:13        'out_vs' ( smooth out highp 4-component vector of float)
+0:13        add ( temp highp 4-component vector of float)
+0:13          'in_vs' ( in highp 4-component vector of float)
+0:13          a: direct index for structure (layout( column_major shared) uniform highp 4-component vector of float)
+0:13            'anon@0' (layout( binding=0 column_major shared offset=0) uniform block{layout( column_major shared) uniform highp 4-component vector of float a})
+0:13            Constant:
+0:13              0 (const uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout( binding=0 column_major shared offset=0) uniform block{layout( column_major shared) uniform highp 4-component vector of float a})
+0:?     'in_vs' ( in highp 4-component vector of float)
+0:?     'out_vs' ( smooth out highp 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
+
diff --git a/Test/baseResults/glspv.esversion.vert.out b/Test/baseResults/glspv.esversion.vert.out
index 9f92513..2a0932a 100644
--- a/Test/baseResults/glspv.esversion.vert.out
+++ b/Test/baseResults/glspv.esversion.vert.out
@@ -1,6 +1,6 @@
 glspv.esversion.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 10
 
                               Capability Shader
diff --git a/Test/baseResults/glspv.version.frag.out b/Test/baseResults/glspv.version.frag.out
index 42c73dd..a90d9eb 100644
--- a/Test/baseResults/glspv.version.frag.out
+++ b/Test/baseResults/glspv.version.frag.out
@@ -2,7 +2,7 @@
 ERROR: #version: compilation for SPIR-V does not support the compatibility profile
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 6
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.PointSize.geom.out b/Test/baseResults/hlsl.PointSize.geom.out
index 80fee61..2b3d954 100644
--- a/Test/baseResults/hlsl.PointSize.geom.out
+++ b/Test/baseResults/hlsl.PointSize.geom.out
@@ -71,7 +71,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.PointSize.vert.out b/Test/baseResults/hlsl.PointSize.vert.out
index 2390a5a..12a4d64 100644
--- a/Test/baseResults/hlsl.PointSize.vert.out
+++ b/Test/baseResults/hlsl.PointSize.vert.out
@@ -38,7 +38,7 @@
 0:?     '@entryPointOutput' ( out float PointSize)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 16
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.aliasOpaque.frag.out b/Test/baseResults/hlsl.aliasOpaque.frag.out
index d22bac6..9218a82 100644
--- a/Test/baseResults/hlsl.aliasOpaque.frag.out
+++ b/Test/baseResults/hlsl.aliasOpaque.frag.out
@@ -143,7 +143,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 64
 
                               Capability Shader
@@ -167,11 +167,11 @@
                               Name 56  "param"
                               Name 62  "@entryPointOutput"
                               Decorate 44(gss2) DescriptorSet 0
-                              Decorate 44(gss2) Binding 0
+                              Decorate 44(gss2) Binding 1
                               Decorate 47(gss) DescriptorSet 0
                               Decorate 47(gss) Binding 0
                               Decorate 51(gtex) DescriptorSet 0
-                              Decorate 51(gtex) Binding 0
+                              Decorate 51(gtex) Binding 2
                               Decorate 62(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.amend.frag.out b/Test/baseResults/hlsl.amend.frag.out
index 7fd0727..dde6e29 100644
--- a/Test/baseResults/hlsl.amend.frag.out
+++ b/Test/baseResults/hlsl.amend.frag.out
@@ -160,7 +160,7 @@
 0:?     'm' ( global 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 57
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.array.flatten.frag.out b/Test/baseResults/hlsl.array.flatten.frag.out
index 4c2a8c1..5b99f5d 100644
--- a/Test/baseResults/hlsl.array.flatten.frag.out
+++ b/Test/baseResults/hlsl.array.flatten.frag.out
@@ -345,7 +345,7 @@
 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 143
 
                               Capability Shader
@@ -393,17 +393,17 @@
                               Name 141  "g_samp_explicit[1]"
                               Name 142  "g_samp_explicit[2]"
                               Decorate 42(g_tex[1]) DescriptorSet 0
-                              Decorate 42(g_tex[1]) Binding 0
+                              Decorate 42(g_tex[1]) Binding 4
                               Decorate 45(g_samp[1]) DescriptorSet 0
-                              Decorate 45(g_samp[1]) Binding 0
+                              Decorate 45(g_samp[1]) Binding 10
                               Decorate 65(g_samp[0]) DescriptorSet 0
-                              Decorate 65(g_samp[0]) Binding 0
+                              Decorate 65(g_samp[0]) Binding 9
                               Decorate 70(g_samp[2]) DescriptorSet 0
-                              Decorate 70(g_samp[2]) Binding 0
+                              Decorate 70(g_samp[2]) Binding 11
                               Decorate 74(g_tex[0]) DescriptorSet 0
                               Decorate 74(g_tex[0]) Binding 0
                               Decorate 79(g_tex[2]) DescriptorSet 0
-                              Decorate 79(g_tex[2]) Binding 0
+                              Decorate 79(g_tex[2]) Binding 8
                               Decorate 88 ArrayStride 48
                               Decorate 89 ArrayStride 48
                               Decorate 90 ArrayStride 16
@@ -416,7 +416,7 @@
                               MemberDecorate 91($Global) 2 Offset 384
                               Decorate 91($Global) Block
                               Decorate 93 DescriptorSet 0
-                              Decorate 93 Binding 0
+                              Decorate 93 Binding 12
                               Decorate 134(ps_output.color) Location 0
                               Decorate 137(g_tex_explicit[0]) DescriptorSet 0
                               Decorate 137(g_tex_explicit[0]) Binding 1
diff --git a/Test/baseResults/hlsl.array.frag.out b/Test/baseResults/hlsl.array.frag.out
index 7178102..5b6afbd 100644
--- a/Test/baseResults/hlsl.array.frag.out
+++ b/Test/baseResults/hlsl.array.frag.out
@@ -290,7 +290,7 @@
 0:?     'input' (layout( location=1) in 3-element array of 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 126
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.array.implicit-size.frag.out b/Test/baseResults/hlsl.array.implicit-size.frag.out
index 402807e..566bc9d 100644
--- a/Test/baseResults/hlsl.array.implicit-size.frag.out
+++ b/Test/baseResults/hlsl.array.implicit-size.frag.out
@@ -163,7 +163,7 @@
 0:?     'g_mystruct' ( global 2-element array of structure{ temp int i,  temp float f})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.array.multidim.frag.out b/Test/baseResults/hlsl.array.multidim.frag.out
index 6c852c3..fa2be65 100644
--- a/Test/baseResults/hlsl.array.multidim.frag.out
+++ b/Test/baseResults/hlsl.array.multidim.frag.out
@@ -134,7 +134,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 57
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.assoc.frag.out b/Test/baseResults/hlsl.assoc.frag.out
index 2002b0d..69a631e 100644
--- a/Test/baseResults/hlsl.assoc.frag.out
+++ b/Test/baseResults/hlsl.assoc.frag.out
@@ -132,7 +132,7 @@
 0:?     'a5' (layout( location=4) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 58
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attribute.expression.comp.out b/Test/baseResults/hlsl.attribute.expression.comp.out
index 1ff2123..3fc9b5b 100644
--- a/Test/baseResults/hlsl.attribute.expression.comp.out
+++ b/Test/baseResults/hlsl.attribute.expression.comp.out
@@ -82,7 +82,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attribute.frag.out b/Test/baseResults/hlsl.attribute.frag.out
index 2290cd8..0d1f709 100644
--- a/Test/baseResults/hlsl.attribute.frag.out
+++ b/Test/baseResults/hlsl.attribute.frag.out
@@ -50,7 +50,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attributeC11.frag.out b/Test/baseResults/hlsl.attributeC11.frag.out
index 14bdcdd..1b651a3 100644
--- a/Test/baseResults/hlsl.attributeC11.frag.out
+++ b/Test/baseResults/hlsl.attributeC11.frag.out
@@ -95,7 +95,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 51
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
index a486d1e..244fe7d 100644
--- a/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
+++ b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
@@ -56,7 +56,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.automap.frag.out b/Test/baseResults/hlsl.automap.frag.out
index 7691b89..240e67a 100644
--- a/Test/baseResults/hlsl.automap.frag.out
+++ b/Test/baseResults/hlsl.automap.frag.out
@@ -18,12 +18,12 @@
 tb1: offset 0, type 1404, size 1, index 5, binding -1, stages 16
 
 Uniform block reflection:
-t4: offset -1, type ffffffff, size 0, index -1, binding 14, stages 16, numMembers 1
-t5: offset -1, type ffffffff, size 0, index -1, binding 15, stages 16, numMembers 1
-u5: offset -1, type ffffffff, size 0, index -1, binding 45, stages 16, numMembers 1
-u6: offset -1, type ffffffff, size 0, index -1, binding 46, stages 16, numMembers 1
-cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 16, numMembers 1
-tb: offset -1, type ffffffff, size 4, index -1, binding 17, stages 16, numMembers 1
+t4: offset -1, type ffffffff, size 16, index 0, binding 14, stages 16, numMembers 1
+t5: offset -1, type ffffffff, size 4, index 1, binding 15, stages 16, numMembers 1
+u5: offset -1, type ffffffff, size 4, index 2, binding 45, stages 16, numMembers 1
+u6: offset -1, type ffffffff, size 4, index 3, binding 46, stages 16, numMembers 1
+cb: offset -1, type ffffffff, size 4, index 4, binding 51, stages 16, numMembers 1
+tb: offset -1, type ffffffff, size 4, index 5, binding 17, stages 16, numMembers 1
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/hlsl.basic.comp.out b/Test/baseResults/hlsl.basic.comp.out
index fb26bc3..d71429c 100644
--- a/Test/baseResults/hlsl.basic.comp.out
+++ b/Test/baseResults/hlsl.basic.comp.out
@@ -64,7 +64,7 @@
 0:?     'gti' ( in 3-component vector of int LocalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.basic.geom.out b/Test/baseResults/hlsl.basic.geom.out
index ee123d4..6dea921 100644
--- a/Test/baseResults/hlsl.basic.geom.out
+++ b/Test/baseResults/hlsl.basic.geom.out
@@ -188,7 +188,7 @@
 0:?     'OutputStream.something' (layout( location=1) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 68
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.boolConv.vert.out b/Test/baseResults/hlsl.boolConv.vert.out
index 8762faf..6a8e516 100644
--- a/Test/baseResults/hlsl.boolConv.vert.out
+++ b/Test/baseResults/hlsl.boolConv.vert.out
@@ -204,7 +204,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 99
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out
index e41c02d..04a783c 100644
--- a/Test/baseResults/hlsl.buffer.frag.out
+++ b/Test/baseResults/hlsl.buffer.frag.out
@@ -147,7 +147,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 73
 
                               Capability Shader
@@ -197,7 +197,7 @@
                               MemberDecorate 24(cbufName2) 0 Offset 0
                               Decorate 24(cbufName2) Block
                               Decorate 26 DescriptorSet 0
-                              Decorate 26 Binding 0
+                              Decorate 26 Binding 3
                               MemberDecorate 31(buf1) 0 Offset 0
                               Decorate 31(buf1) Block
                               Decorate 33 DescriptorSet 0
@@ -206,12 +206,12 @@
                               MemberDecorate 37(buf2) 0 Offset 0
                               Decorate 37(buf2) BufferBlock
                               Decorate 39 DescriptorSet 0
-                              Decorate 39 Binding 0
+                              Decorate 39 Binding 1
                               MemberDecorate 43(cbufName) 0 Offset 0
                               MemberDecorate 43(cbufName) 1 Offset 20
                               Decorate 43(cbufName) Block
                               Decorate 45 DescriptorSet 0
-                              Decorate 45 Binding 0
+                              Decorate 45 Binding 2
                               MemberDecorate 50(tbufName) 0 NonWritable
                               MemberDecorate 50(tbufName) 0 Offset 16
                               MemberDecorate 50(tbufName) 1 NonWritable
diff --git a/Test/baseResults/hlsl.calculatelod.dx10.frag.out b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
index 698350c..4ee2481 100644
--- a/Test/baseResults/hlsl.calculatelod.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelod.dx10.frag.out
@@ -358,7 +358,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 148
 
                               Capability Shader
@@ -405,21 +405,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4a) DescriptorSet 0
-                              Decorate 33(g_tTex1di4a) Binding 0
+                              Decorate 33(g_tTex1di4a) Binding 2
                               Decorate 45(g_tTex1du4a) DescriptorSet 0
-                              Decorate 45(g_tTex1du4a) Binding 0
+                              Decorate 45(g_tTex1du4a) Binding 3
                               Decorate 56(g_tTex2df4a) DescriptorSet 0
-                              Decorate 56(g_tTex2df4a) Binding 0
+                              Decorate 56(g_tTex2df4a) Binding 4
                               Decorate 67(g_tTex2di4a) DescriptorSet 0
-                              Decorate 67(g_tTex2di4a) Binding 0
+                              Decorate 67(g_tTex2di4a) Binding 5
                               Decorate 79(g_tTex2du4a) DescriptorSet 0
-                              Decorate 79(g_tTex2du4a) Binding 0
+                              Decorate 79(g_tTex2du4a) Binding 6
                               Decorate 92(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 92(g_tTexcdf4a) Binding 0
+                              Decorate 92(g_tTexcdf4a) Binding 7
                               Decorate 104(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 104(g_tTexcdi4a) Binding 0
+                              Decorate 104(g_tTexcdi4a) Binding 8
                               Decorate 115(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 115(g_tTexcdu4a) Binding 0
+                              Decorate 115(g_tTexcdu4a) Binding 9
                               Decorate 140(@entryPointOutput.Color) Location 0
                               Decorate 144(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 147(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
index e4bcb61..6abe22c 100644
--- a/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
+++ b/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out
@@ -358,7 +358,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 148
 
                               Capability Shader
@@ -405,21 +405,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4a) DescriptorSet 0
-                              Decorate 33(g_tTex1di4a) Binding 0
+                              Decorate 33(g_tTex1di4a) Binding 2
                               Decorate 45(g_tTex1du4a) DescriptorSet 0
-                              Decorate 45(g_tTex1du4a) Binding 0
+                              Decorate 45(g_tTex1du4a) Binding 3
                               Decorate 56(g_tTex2df4a) DescriptorSet 0
-                              Decorate 56(g_tTex2df4a) Binding 0
+                              Decorate 56(g_tTex2df4a) Binding 4
                               Decorate 67(g_tTex2di4a) DescriptorSet 0
-                              Decorate 67(g_tTex2di4a) Binding 0
+                              Decorate 67(g_tTex2di4a) Binding 5
                               Decorate 79(g_tTex2du4a) DescriptorSet 0
-                              Decorate 79(g_tTex2du4a) Binding 0
+                              Decorate 79(g_tTex2du4a) Binding 6
                               Decorate 92(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 92(g_tTexcdf4a) Binding 0
+                              Decorate 92(g_tTexcdf4a) Binding 7
                               Decorate 104(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 104(g_tTexcdi4a) Binding 0
+                              Decorate 104(g_tTexcdi4a) Binding 8
                               Decorate 115(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 115(g_tTexcdu4a) Binding 0
+                              Decorate 115(g_tTexcdu4a) Binding 9
                               Decorate 140(@entryPointOutput.Color) Location 0
                               Decorate 144(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 147(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.cast.frag.out b/Test/baseResults/hlsl.cast.frag.out
index aa657f3..3efbd52 100644
--- a/Test/baseResults/hlsl.cast.frag.out
+++ b/Test/baseResults/hlsl.cast.frag.out
@@ -70,7 +70,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.cbuffer-identifier.vert.out b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
index 5cec136..93f35d6 100644
--- a/Test/baseResults/hlsl.cbuffer-identifier.vert.out
+++ b/Test/baseResults/hlsl.cbuffer-identifier.vert.out
@@ -250,7 +250,7 @@
 0:?     'input.Norm' (layout( location=1) in 3-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 93
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.charLit.vert.out b/Test/baseResults/hlsl.charLit.vert.out
index 4846f8f..2151d43 100644
--- a/Test/baseResults/hlsl.charLit.vert.out
+++ b/Test/baseResults/hlsl.charLit.vert.out
@@ -146,7 +146,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 58
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clip.frag.out b/Test/baseResults/hlsl.clip.frag.out
index a0ebb74..691b20b 100644
--- a/Test/baseResults/hlsl.clip.frag.out
+++ b/Test/baseResults/hlsl.clip.frag.out
@@ -74,7 +74,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-1.frag.out b/Test/baseResults/hlsl.clipdistance-1.frag.out
index 4382505..0cfee39 100644
--- a/Test/baseResults/hlsl.clipdistance-1.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-1.frag.out
@@ -98,7 +98,7 @@
 0:?     'cull' ( in 1-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-1.geom.out b/Test/baseResults/hlsl.clipdistance-1.geom.out
index 5348359..a9a0b82 100644
--- a/Test/baseResults/hlsl.clipdistance-1.geom.out
+++ b/Test/baseResults/hlsl.clipdistance-1.geom.out
@@ -550,7 +550,7 @@
 0:?     'OutputStream.clip' ( out 2-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 118
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.clipdistance-1.vert.out b/Test/baseResults/hlsl.clipdistance-1.vert.out
index 7d8b49f..41478e1 100644
--- a/Test/baseResults/hlsl.clipdistance-1.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-1.vert.out
@@ -108,7 +108,7 @@
 0:?     'cull' ( out 1-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 46
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-2.frag.out b/Test/baseResults/hlsl.clipdistance-2.frag.out
index d1da7bc..15a9512 100644
--- a/Test/baseResults/hlsl.clipdistance-2.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-2.frag.out
@@ -290,7 +290,7 @@
 0:?     'cull' ( in 4-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-2.geom.out b/Test/baseResults/hlsl.clipdistance-2.geom.out
index bdee84f..bb8d137 100644
--- a/Test/baseResults/hlsl.clipdistance-2.geom.out
+++ b/Test/baseResults/hlsl.clipdistance-2.geom.out
@@ -724,7 +724,7 @@
 0:?     'OutputStream.clip' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 128
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.clipdistance-2.vert.out b/Test/baseResults/hlsl.clipdistance-2.vert.out
index 77bd23d..5ccbb1e 100644
--- a/Test/baseResults/hlsl.clipdistance-2.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-2.vert.out
@@ -420,7 +420,7 @@
 0:?     'cull' ( out 4-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 89
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-3.frag.out b/Test/baseResults/hlsl.clipdistance-3.frag.out
index c7eda56..1d9f54e 100644
--- a/Test/baseResults/hlsl.clipdistance-3.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-3.frag.out
@@ -98,7 +98,7 @@
 0:?     'cull' ( in 2-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-3.geom.out b/Test/baseResults/hlsl.clipdistance-3.geom.out
index 2e6b5f6..5fa7df7 100644
--- a/Test/baseResults/hlsl.clipdistance-3.geom.out
+++ b/Test/baseResults/hlsl.clipdistance-3.geom.out
@@ -630,7 +630,7 @@
 0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 127
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.clipdistance-3.vert.out b/Test/baseResults/hlsl.clipdistance-3.vert.out
index c9289a5..1882a5a 100644
--- a/Test/baseResults/hlsl.clipdistance-3.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-3.vert.out
@@ -136,7 +136,7 @@
 0:?     'cull' ( out 2-element array of float CullDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 51
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-4.frag.out b/Test/baseResults/hlsl.clipdistance-4.frag.out
index 8a46b15..5cef564 100644
--- a/Test/baseResults/hlsl.clipdistance-4.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-4.frag.out
@@ -174,7 +174,7 @@
 0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 57
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-4.geom.out b/Test/baseResults/hlsl.clipdistance-4.geom.out
index 31d3205..e942301 100644
--- a/Test/baseResults/hlsl.clipdistance-4.geom.out
+++ b/Test/baseResults/hlsl.clipdistance-4.geom.out
@@ -612,7 +612,7 @@
 0:?     'OutputStream.clip1' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 130
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.clipdistance-4.vert.out b/Test/baseResults/hlsl.clipdistance-4.vert.out
index 7fca9d4..8e8fe6d 100644
--- a/Test/baseResults/hlsl.clipdistance-4.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-4.vert.out
@@ -270,7 +270,7 @@
 0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-5.frag.out b/Test/baseResults/hlsl.clipdistance-5.frag.out
index f0adb05..ab366e5 100644
--- a/Test/baseResults/hlsl.clipdistance-5.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-5.frag.out
@@ -232,7 +232,7 @@
 0:?     'v.ClipRect' ( in 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 62
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-5.vert.out b/Test/baseResults/hlsl.clipdistance-5.vert.out
index 264c22c..6dbe0a6 100644
--- a/Test/baseResults/hlsl.clipdistance-5.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-5.vert.out
@@ -318,7 +318,7 @@
 0:?     '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 73
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-6.frag.out b/Test/baseResults/hlsl.clipdistance-6.frag.out
index 49c225a..770f990 100644
--- a/Test/baseResults/hlsl.clipdistance-6.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-6.frag.out
@@ -282,7 +282,7 @@
 0:?     'v.clip1' ( in 8-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 79
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-6.vert.out b/Test/baseResults/hlsl.clipdistance-6.vert.out
index 024d028..1adbdfc 100644
--- a/Test/baseResults/hlsl.clipdistance-6.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-6.vert.out
@@ -428,7 +428,7 @@
 0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 86
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-7.frag.out b/Test/baseResults/hlsl.clipdistance-7.frag.out
index 5ff568e..9f5e519 100644
--- a/Test/baseResults/hlsl.clipdistance-7.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-7.frag.out
@@ -270,7 +270,7 @@
 0:?     'v.clip1' ( in 8-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-7.vert.out b/Test/baseResults/hlsl.clipdistance-7.vert.out
index 24eced8..13bc844 100644
--- a/Test/baseResults/hlsl.clipdistance-7.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-7.vert.out
@@ -384,7 +384,7 @@
 0:?     '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 81
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-8.frag.out b/Test/baseResults/hlsl.clipdistance-8.frag.out
index f4e55ac..8f2a9c2 100644
--- a/Test/baseResults/hlsl.clipdistance-8.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-8.frag.out
@@ -186,7 +186,7 @@
 0:?     'v.clip1' ( in 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-8.vert.out b/Test/baseResults/hlsl.clipdistance-8.vert.out
index 456e11f..fbc2c2a 100644
--- a/Test/baseResults/hlsl.clipdistance-8.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-8.vert.out
@@ -240,7 +240,7 @@
 0:?     '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 62
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-9.frag.out b/Test/baseResults/hlsl.clipdistance-9.frag.out
index 0a17eaf..b42727f 100644
--- a/Test/baseResults/hlsl.clipdistance-9.frag.out
+++ b/Test/baseResults/hlsl.clipdistance-9.frag.out
@@ -144,7 +144,7 @@
 0:?     'clip0' ( in 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 68
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.clipdistance-9.vert.out b/Test/baseResults/hlsl.clipdistance-9.vert.out
index 61b996f..7df3064 100644
--- a/Test/baseResults/hlsl.clipdistance-9.vert.out
+++ b/Test/baseResults/hlsl.clipdistance-9.vert.out
@@ -194,7 +194,7 @@
 0:?     'clip0' ( out 4-element array of float ClipDistance)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 67
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.color.hull.tesc.out b/Test/baseResults/hlsl.color.hull.tesc.out
index c5be8e4..e3c0a3e 100644
--- a/Test/baseResults/hlsl.color.hull.tesc.out
+++ b/Test/baseResults/hlsl.color.hull.tesc.out
@@ -89,23 +89,108 @@
 0:63  Function Definition: main( ( temp void)
 0:63    Function Parameters: 
 0:?     Sequence
-0:63      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      Sequence
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                0 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                0 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                1 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                1 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                2 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              2 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                2 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              2 (const int)
 0:63      move second child to first child ( temp uint)
 0:?         'pointId' ( temp uint)
 0:?         'pointId' ( in uint InvocationID)
 0:63      move second child to first child ( temp uint)
 0:?         'patchId' ( temp uint)
 0:?         'patchId' ( in uint PrimitiveID)
-0:63      move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:63        indirect index (layout( location=0) out structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'pointId' ( in uint InvocationID)
-0:63        Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'pointId' ( temp uint)
-0:?           'patchId' ( temp uint)
+0:63      Sequence
+0:63        move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63          'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63          Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?             'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?             'pointId' ( temp uint)
+0:?             'patchId' ( temp uint)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.position' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'pointId' ( in uint InvocationID)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          indirect index (layout( location=1) out 4-component vector of float)
+0:?             '@entryPointOutput.color' (layout( location=1) out 3-element array of 4-component vector of float)
+0:?             'pointId' ( in uint InvocationID)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63            Constant:
+0:63              1 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -168,8 +253,10 @@
 0:?                   1 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     '@entryPointOutput.position' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=1) out 3-element array of 4-component vector of float)
+0:?     'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:?     'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
 0:?     'pointId' ( in uint InvocationID)
 0:?     'patchId' ( in uint PrimitiveID)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
@@ -269,23 +356,108 @@
 0:63  Function Definition: main( ( temp void)
 0:63    Function Parameters: 
 0:?     Sequence
-0:63      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63      Sequence
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                0 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                0 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                1 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                1 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              1 (const int)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                2 (const int)
+0:63            Constant:
+0:63              0 (const int)
+0:63          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:63            Constant:
+0:63              2 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            direct index ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63              Constant:
+0:63                2 (const int)
+0:63            Constant:
+0:63              1 (const int)
+0:63          direct index (layout( location=1) in 4-component vector of float)
+0:?             'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
+0:63            Constant:
+0:63              2 (const int)
 0:63      move second child to first child ( temp uint)
 0:?         'pointId' ( temp uint)
 0:?         'pointId' ( in uint InvocationID)
 0:63      move second child to first child ( temp uint)
 0:?         'patchId' ( temp uint)
 0:?         'patchId' ( in uint PrimitiveID)
-0:63      move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:63        indirect index (layout( location=0) out structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'pointId' ( in uint InvocationID)
-0:63        Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?           'pointId' ( temp uint)
-0:?           'patchId' ( temp uint)
+0:63      Sequence
+0:63        move second child to first child ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63          'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63          Function Call: @main(struct-HullInputType-vf3-vf41[3];u1;u1; ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?             'patch' ( temp 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?             'pointId' ( temp uint)
+0:?             'patchId' ( temp uint)
+0:63        move second child to first child ( temp 3-component vector of float)
+0:63          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.position' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'pointId' ( in uint InvocationID)
+0:63          position: direct index for structure ( temp 3-component vector of float)
+0:63            'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63            Constant:
+0:63              0 (const int)
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          indirect index (layout( location=1) out 4-component vector of float)
+0:?             '@entryPointOutput.color' (layout( location=1) out 3-element array of 4-component vector of float)
+0:?             'pointId' ( in uint InvocationID)
+0:63          color: direct index for structure ( temp 4-component vector of float)
+0:63            'flattenTemp' ( temp structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:63            Constant:
+0:63              1 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -348,21 +520,23 @@
 0:?                   1 (const int)
 0:?   Linker Objects
 0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform float tessellationAmount, layout( row_major std140) uniform 3-component vector of float padding})
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
-0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float position,  temp 4-component vector of float color})
+0:?     '@entryPointOutput.position' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     '@entryPointOutput.color' (layout( location=1) out 3-element array of 4-component vector of float)
+0:?     'patch.position' (layout( location=0) in 3-element array of 3-component vector of float)
+0:?     'patch.color' (layout( location=1) in 3-element array of 4-component vector of float)
 0:?     'pointId' ( in uint InvocationID)
 0:?     'patchId' ( in uint PrimitiveID)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 127
+// Generated by (magic number): 8000a
+// Id's are bound by 159
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 72 76 79 83 110 123
+                              EntryPoint TessellationControl 4  "main" 73 80 99 102 113 120 142 155
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingEqual
@@ -392,33 +566,38 @@
                               Name 35  ""
                               Name 56  "output"
                               Name 70  "patch"
-                              Name 72  "patch"
-                              Name 74  "pointId"
-                              Name 76  "pointId"
-                              Name 78  "patchId"
-                              Name 79  "patchId"
-                              Name 83  "@entryPointOutput"
-                              Name 85  "param"
-                              Name 87  "param"
-                              Name 89  "param"
-                              Name 102  "@patchConstantResult"
-                              Name 103  "param"
+                              Name 73  "patch.position"
+                              Name 80  "patch.color"
+                              Name 97  "pointId"
+                              Name 99  "pointId"
+                              Name 101  "patchId"
+                              Name 102  "patchId"
+                              Name 104  "flattenTemp"
                               Name 105  "param"
-                              Name 110  "@patchConstantOutput.edges"
-                              Name 123  "@patchConstantOutput.inside"
+                              Name 107  "param"
+                              Name 109  "param"
+                              Name 113  "@entryPointOutput.position"
+                              Name 120  "@entryPointOutput.color"
+                              Name 134  "@patchConstantResult"
+                              Name 135  "param"
+                              Name 137  "param"
+                              Name 142  "@patchConstantOutput.edges"
+                              Name 155  "@patchConstantOutput.inside"
                               MemberDecorate 33(TessellationBuffer) 0 Offset 0
                               MemberDecorate 33(TessellationBuffer) 1 Offset 4
                               Decorate 33(TessellationBuffer) Block
                               Decorate 35 DescriptorSet 0
                               Decorate 35 Binding 0
-                              Decorate 72(patch) Location 0
-                              Decorate 76(pointId) BuiltIn InvocationId
-                              Decorate 79(patchId) BuiltIn PrimitiveId
-                              Decorate 83(@entryPointOutput) Location 0
-                              Decorate 110(@patchConstantOutput.edges) Patch
-                              Decorate 110(@patchConstantOutput.edges) BuiltIn TessLevelOuter
-                              Decorate 123(@patchConstantOutput.inside) Patch
-                              Decorate 123(@patchConstantOutput.inside) BuiltIn TessLevelInner
+                              Decorate 73(patch.position) Location 0
+                              Decorate 80(patch.color) Location 1
+                              Decorate 99(pointId) BuiltIn InvocationId
+                              Decorate 102(patchId) BuiltIn PrimitiveId
+                              Decorate 113(@entryPointOutput.position) Location 0
+                              Decorate 120(@entryPointOutput.color) Location 1
+                              Decorate 142(@patchConstantOutput.edges) Patch
+                              Decorate 142(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+                              Decorate 155(@patchConstantOutput.inside) Patch
+                              Decorate 155(@patchConstantOutput.inside) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -448,83 +627,122 @@
               55:             TypePointer Function 22(HullOutputType)
               58:             TypePointer Function 7(fvec3)
               63:             TypePointer Function 8(fvec4)
-              71:             TypePointer Input 12
-       72(patch):     71(ptr) Variable Input
-              75:             TypePointer Input 10(int)
-     76(pointId):     75(ptr) Variable Input
-     79(patchId):     75(ptr) Variable Input
-              81:             TypeArray 22(HullOutputType) 11
-              82:             TypePointer Output 81
-83(@entryPointOutput):     82(ptr) Variable Output
-              92:             TypePointer Output 22(HullOutputType)
-              94:     10(int) Constant 2
-              95:     10(int) Constant 4
-              96:     10(int) Constant 0
-              98:             TypeBool
-             108:             TypeArray 6(float) 95
-             109:             TypePointer Output 108
-110(@patchConstantOutput.edges):    109(ptr) Variable Output
-             113:             TypePointer Output 6(float)
-             121:             TypeArray 6(float) 94
-             122:             TypePointer Output 121
-123(@patchConstantOutput.inside):    122(ptr) Variable Output
+              71:             TypeArray 7(fvec3) 11
+              72:             TypePointer Input 71
+73(patch.position):     72(ptr) Variable Input
+              74:             TypePointer Input 7(fvec3)
+              78:             TypeArray 8(fvec4) 11
+              79:             TypePointer Input 78
+ 80(patch.color):     79(ptr) Variable Input
+              81:             TypePointer Input 8(fvec4)
+              98:             TypePointer Input 10(int)
+     99(pointId):     98(ptr) Variable Input
+    102(patchId):     98(ptr) Variable Input
+             112:             TypePointer Output 71
+113(@entryPointOutput.position):    112(ptr) Variable Output
+             117:             TypePointer Output 7(fvec3)
+             119:             TypePointer Output 78
+120(@entryPointOutput.color):    119(ptr) Variable Output
+             124:             TypePointer Output 8(fvec4)
+             126:     10(int) Constant 2
+             127:     10(int) Constant 4
+             128:     10(int) Constant 0
+             130:             TypeBool
+             140:             TypeArray 6(float) 127
+             141:             TypePointer Output 140
+142(@patchConstantOutput.edges):    141(ptr) Variable Output
+             145:             TypePointer Output 6(float)
+             153:             TypeArray 6(float) 126
+             154:             TypePointer Output 153
+155(@patchConstantOutput.inside):    154(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
        70(patch):     13(ptr) Variable Function
-     74(pointId):     14(ptr) Variable Function
-     78(patchId):     14(ptr) Variable Function
-       85(param):     13(ptr) Variable Function
-       87(param):     14(ptr) Variable Function
-       89(param):     14(ptr) Variable Function
-102(@patchConstantResult):     29(ptr) Variable Function
-      103(param):     13(ptr) Variable Function
-      105(param):     14(ptr) Variable Function
-              73:          12 Load 72(patch)
-                              Store 70(patch) 73
-              77:     10(int) Load 76(pointId)
-                              Store 74(pointId) 77
-              80:     10(int) Load 79(patchId)
-                              Store 78(patchId) 80
-              84:     10(int) Load 76(pointId)
-              86:          12 Load 70(patch)
-                              Store 85(param) 86
-              88:     10(int) Load 74(pointId)
-                              Store 87(param) 88
-              90:     10(int) Load 78(patchId)
-                              Store 89(param) 90
-              91:22(HullOutputType) FunctionCall 27(@main(struct-HullInputType-vf3-vf41[3];u1;u1;) 85(param) 87(param) 89(param)
-              93:     92(ptr) AccessChain 83(@entryPointOutput) 84
-                              Store 93 91
-                              ControlBarrier 94 95 96
-              97:     10(int) Load 76(pointId)
-              99:    98(bool) IEqual 97 32
-                              SelectionMerge 101 None
-                              BranchConditional 99 100 101
-             100:               Label
-             104:          12   Load 70(patch)
-                                Store 103(param) 104
-             106:     10(int)   Load 79(patchId)
-                                Store 105(param) 106
-             107:16(ConstantOutputType)   FunctionCall 20(ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;) 103(param) 105(param)
-                                Store 102(@patchConstantResult) 107
-             111:     39(ptr)   AccessChain 102(@patchConstantResult) 32 32
-             112:    6(float)   Load 111
-             114:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 32
-                                Store 114 112
-             115:     39(ptr)   AccessChain 102(@patchConstantResult) 32 41
-             116:    6(float)   Load 115
-             117:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 41
-                                Store 117 116
-             118:     39(ptr)   AccessChain 102(@patchConstantResult) 32 45
-             119:    6(float)   Load 118
-             120:    113(ptr)   AccessChain 110(@patchConstantOutput.edges) 45
-                                Store 120 119
-             124:     39(ptr)   AccessChain 102(@patchConstantResult) 41
-             125:    6(float)   Load 124
-             126:    113(ptr)   AccessChain 123(@patchConstantOutput.inside) 32
-                                Store 126 125
-                                Branch 101
-             101:             Label
+     97(pointId):     14(ptr) Variable Function
+    101(patchId):     14(ptr) Variable Function
+104(flattenTemp):     55(ptr) Variable Function
+      105(param):     13(ptr) Variable Function
+      107(param):     14(ptr) Variable Function
+      109(param):     14(ptr) Variable Function
+134(@patchConstantResult):     29(ptr) Variable Function
+      135(param):     13(ptr) Variable Function
+      137(param):     14(ptr) Variable Function
+              75:     74(ptr) AccessChain 73(patch.position) 32
+              76:    7(fvec3) Load 75
+              77:     58(ptr) AccessChain 70(patch) 32 32
+                              Store 77 76
+              82:     81(ptr) AccessChain 80(patch.color) 32
+              83:    8(fvec4) Load 82
+              84:     63(ptr) AccessChain 70(patch) 32 41
+                              Store 84 83
+              85:     74(ptr) AccessChain 73(patch.position) 41
+              86:    7(fvec3) Load 85
+              87:     58(ptr) AccessChain 70(patch) 41 32
+                              Store 87 86
+              88:     81(ptr) AccessChain 80(patch.color) 41
+              89:    8(fvec4) Load 88
+              90:     63(ptr) AccessChain 70(patch) 41 41
+                              Store 90 89
+              91:     74(ptr) AccessChain 73(patch.position) 45
+              92:    7(fvec3) Load 91
+              93:     58(ptr) AccessChain 70(patch) 45 32
+                              Store 93 92
+              94:     81(ptr) AccessChain 80(patch.color) 45
+              95:    8(fvec4) Load 94
+              96:     63(ptr) AccessChain 70(patch) 45 41
+                              Store 96 95
+             100:     10(int) Load 99(pointId)
+                              Store 97(pointId) 100
+             103:     10(int) Load 102(patchId)
+                              Store 101(patchId) 103
+             106:          12 Load 70(patch)
+                              Store 105(param) 106
+             108:     10(int) Load 97(pointId)
+                              Store 107(param) 108
+             110:     10(int) Load 101(patchId)
+                              Store 109(param) 110
+             111:22(HullOutputType) FunctionCall 27(@main(struct-HullInputType-vf3-vf41[3];u1;u1;) 105(param) 107(param) 109(param)
+                              Store 104(flattenTemp) 111
+             114:     10(int) Load 99(pointId)
+             115:     58(ptr) AccessChain 104(flattenTemp) 32
+             116:    7(fvec3) Load 115
+             118:    117(ptr) AccessChain 113(@entryPointOutput.position) 114
+                              Store 118 116
+             121:     10(int) Load 99(pointId)
+             122:     63(ptr) AccessChain 104(flattenTemp) 41
+             123:    8(fvec4) Load 122
+             125:    124(ptr) AccessChain 120(@entryPointOutput.color) 121
+                              Store 125 123
+                              ControlBarrier 126 127 128
+             129:     10(int) Load 99(pointId)
+             131:   130(bool) IEqual 129 32
+                              SelectionMerge 133 None
+                              BranchConditional 131 132 133
+             132:               Label
+             136:          12   Load 70(patch)
+                                Store 135(param) 136
+             138:     10(int)   Load 102(patchId)
+                                Store 137(param) 138
+             139:16(ConstantOutputType)   FunctionCall 20(ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;) 135(param) 137(param)
+                                Store 134(@patchConstantResult) 139
+             143:     39(ptr)   AccessChain 134(@patchConstantResult) 32 32
+             144:    6(float)   Load 143
+             146:    145(ptr)   AccessChain 142(@patchConstantOutput.edges) 32
+                                Store 146 144
+             147:     39(ptr)   AccessChain 134(@patchConstantResult) 32 41
+             148:    6(float)   Load 147
+             149:    145(ptr)   AccessChain 142(@patchConstantOutput.edges) 41
+                                Store 149 148
+             150:     39(ptr)   AccessChain 134(@patchConstantResult) 32 45
+             151:    6(float)   Load 150
+             152:    145(ptr)   AccessChain 142(@patchConstantOutput.edges) 45
+                                Store 152 151
+             156:     39(ptr)   AccessChain 134(@patchConstantResult) 41
+             157:    6(float)   Load 156
+             158:    145(ptr)   AccessChain 155(@patchConstantOutput.inside) 32
+                                Store 158 157
+                                Branch 133
+             133:             Label
                               Return
                               FunctionEnd
 20(ColorPatchConstantFunction(struct-HullInputType-vf3-vf41[3];u1;):16(ConstantOutputType) Function None 17
diff --git a/Test/baseResults/hlsl.comparison.vec.frag.out b/Test/baseResults/hlsl.comparison.vec.frag.out
index 5936c9a..1bf2ced 100644
--- a/Test/baseResults/hlsl.comparison.vec.frag.out
+++ b/Test/baseResults/hlsl.comparison.vec.frag.out
@@ -262,7 +262,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 96
 
                               Capability Shader
@@ -355,7 +355,7 @@
                               Store 25(r00) 28
               30:    7(fvec4) Load 10(a)
               31:    7(fvec4) Load 17(v04)
-              32:   23(bvec4) FOrdNotEqual 30 31
+              32:   23(bvec4) FUnordNotEqual 30 31
                               Store 29(r01) 32
               34:    7(fvec4) Load 10(a)
               35:    7(fvec4) Load 17(v04)
@@ -373,7 +373,7 @@
               47:    7(fvec4) Load 10(a)
               48:    6(float) Load 21(v01)
               49:    7(fvec4) CompositeConstruct 48 48 48 48
-              50:   23(bvec4) FOrdNotEqual 47 49
+              50:   23(bvec4) FUnordNotEqual 47 49
                               Store 46(r11) 50
               52:    7(fvec4) Load 10(a)
               53:    6(float) Load 21(v01)
@@ -393,7 +393,7 @@
               67:    6(float) Load 21(v01)
               68:    7(fvec4) CompositeConstruct 67 67 67 67
               69:    7(fvec4) Load 10(a)
-              70:   23(bvec4) FOrdNotEqual 68 69
+              70:   23(bvec4) FUnordNotEqual 68 69
                               Store 66(r21) 70
               72:    6(float) Load 21(v01)
               73:    7(fvec4) CompositeConstruct 72 72 72 72
diff --git a/Test/baseResults/hlsl.conditional.frag.out b/Test/baseResults/hlsl.conditional.frag.out
index e23d49c..84396d5 100644
--- a/Test/baseResults/hlsl.conditional.frag.out
+++ b/Test/baseResults/hlsl.conditional.frag.out
@@ -522,7 +522,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 206
 
                               Capability Shader
@@ -644,7 +644,7 @@
               39:    7(fvec4) Load 38
               41:     34(ptr) AccessChain 31 40
               42:    7(fvec4) Load 41
-              46:   43(bvec4) FOrdNotEqual 42 45
+              46:   43(bvec4) FUnordNotEqual 42 45
               47:    7(fvec4) Select 46 39 36
               50:     49(ptr) AccessChain 31 48
               51:    6(float) Load 50
@@ -654,7 +654,7 @@
               56:    7(fvec4) CompositeConstruct 55 55 55 55
               57:     34(ptr) AccessChain 31 40
               58:    7(fvec4) Load 57
-              59:   43(bvec4) FOrdNotEqual 58 45
+              59:   43(bvec4) FUnordNotEqual 58 45
               60:    7(fvec4) Select 59 56 52
               61:    7(fvec4) FAdd 47 60
               62:     34(ptr) AccessChain 31 33
@@ -675,7 +675,7 @@
               77:    7(fvec4) CompositeConstruct 76 76 76 76
               78:     34(ptr) AccessChain 31 40
               79:    7(fvec4) Load 78
-              80:   43(bvec4) FOrdNotEqual 79 45
+              80:   43(bvec4) FUnordNotEqual 79 45
               81:    7(fvec4) Select 80 77 74
               82:    7(fvec4) FAdd 72 81
                               ReturnValue 82
@@ -687,7 +687,7 @@
               87:    6(float) Load 86
               88:     49(ptr) AccessChain 31 48
               89:    6(float) Load 88
-              90:    13(bool) FOrdNotEqual 87 89
+              90:    13(bool) FUnordNotEqual 87 89
               91:     49(ptr) AccessChain 31 53
               92:    6(float) Load 91
               93:     34(ptr) AccessChain 31 33
diff --git a/Test/baseResults/hlsl.constantbuffer.frag.out b/Test/baseResults/hlsl.constantbuffer.frag.out
index 48d849b..12e819b 100644
--- a/Test/baseResults/hlsl.constantbuffer.frag.out
+++ b/Test/baseResults/hlsl.constantbuffer.frag.out
@@ -133,7 +133,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 66
 
                               Capability Shader
@@ -160,7 +160,7 @@
                               MemberDecorate 12(cb3) 1 Offset 4
                               Decorate 12(cb3) Block
                               Decorate 18(cb3) DescriptorSet 0
-                              Decorate 18(cb3) Binding 0
+                              Decorate 18(cb3) Binding 1
                               MemberDecorate 31(cb1) 0 Offset 0
                               Decorate 31(cb1) Block
                               Decorate 33(cb1) DescriptorSet 0
@@ -170,7 +170,7 @@
                               MemberDecorate 46(cbuff) 0 Offset 0
                               Decorate 46(cbuff) Block
                               Decorate 48 DescriptorSet 0
-                              Decorate 48 Binding 0
+                              Decorate 48 Binding 2
                               Decorate 64(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.constructArray.vert.out b/Test/baseResults/hlsl.constructArray.vert.out
index 8ba41bc..b070735 100644
--- a/Test/baseResults/hlsl.constructArray.vert.out
+++ b/Test/baseResults/hlsl.constructArray.vert.out
@@ -268,7 +268,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 89
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.constructexpr.frag.out b/Test/baseResults/hlsl.constructexpr.frag.out
index 085821a..a6d387f 100644
--- a/Test/baseResults/hlsl.constructexpr.frag.out
+++ b/Test/baseResults/hlsl.constructexpr.frag.out
@@ -104,7 +104,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.constructimat.frag.out b/Test/baseResults/hlsl.constructimat.frag.out
index a5014db..d2d3d01 100644
--- a/Test/baseResults/hlsl.constructimat.frag.out
+++ b/Test/baseResults/hlsl.constructimat.frag.out
@@ -545,7 +545,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 98
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.coverage.frag.out b/Test/baseResults/hlsl.coverage.frag.out
index a148073..cb81d56 100644
--- a/Test/baseResults/hlsl.coverage.frag.out
+++ b/Test/baseResults/hlsl.coverage.frag.out
@@ -119,7 +119,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 52
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.dashI.vert.out b/Test/baseResults/hlsl.dashI.vert.out
index d5e7e20..7351443 100644
--- a/Test/baseResults/hlsl.dashI.vert.out
+++ b/Test/baseResults/hlsl.dashI.vert.out
@@ -1,6 +1,6 @@
 hlsl.dashI.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out b/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
index 559708d..9ca0146 100644
--- a/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
+++ b/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out
@@ -1,6 +1,6 @@
 hlsl.deadFunctionMissingBody.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.depthGreater.frag.out b/Test/baseResults/hlsl.depthGreater.frag.out
index 7092802..31a7006 100644
--- a/Test/baseResults/hlsl.depthGreater.frag.out
+++ b/Test/baseResults/hlsl.depthGreater.frag.out
@@ -50,7 +50,7 @@
 0:?     'depth' ( out float FragDepth)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.depthLess.frag.out b/Test/baseResults/hlsl.depthLess.frag.out
index 275eaf1..d062c77 100644
--- a/Test/baseResults/hlsl.depthLess.frag.out
+++ b/Test/baseResults/hlsl.depthLess.frag.out
@@ -42,7 +42,7 @@
 0:?     '@entryPointOutput' ( out float FragDepth)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 16
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.discard.frag.out b/Test/baseResults/hlsl.discard.frag.out
index 23ed871..41766f6 100644
--- a/Test/baseResults/hlsl.discard.frag.out
+++ b/Test/baseResults/hlsl.discard.frag.out
@@ -108,7 +108,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
@@ -178,7 +178,7 @@
               30:           2 FunctionCall 10(foo(f1;) 25(param)
               32:      7(ptr) AccessChain 15(input) 31
               33:    6(float) Load 32
-              35:    20(bool) FOrdNotEqual 33 34
+              35:    20(bool) FUnordNotEqual 33 34
                               SelectionMerge 37 None
                               BranchConditional 35 36 37
               36:               Label
diff --git a/Test/baseResults/hlsl.doLoop.frag.out b/Test/baseResults/hlsl.doLoop.frag.out
index 2b65a76..0d93e8d 100644
--- a/Test/baseResults/hlsl.doLoop.frag.out
+++ b/Test/baseResults/hlsl.doLoop.frag.out
@@ -198,7 +198,7 @@
 0:?     'input' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 99
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.domain.1.tese.out b/Test/baseResults/hlsl.domain.1.tese.out
index 0b7b275..4e53e7c 100644
--- a/Test/baseResults/hlsl.domain.1.tese.out
+++ b/Test/baseResults/hlsl.domain.1.tese.out
@@ -56,9 +56,79 @@
 0:22  Function Definition: main( ( temp void)
 0:22    Function Parameters: 
 0:?     Sequence
-0:22      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      Sequence
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                0 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              1 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              1 (const int)
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              2 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              2 (const int)
 0:22      move second child to first child ( temp float)
 0:?         'f' ( temp float)
 0:?         'f' (layout( location=2) patch in float)
@@ -134,7 +204,8 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'f' (layout( location=2) patch in float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
@@ -201,9 +272,79 @@
 0:22  Function Definition: main( ( temp void)
 0:22    Function Parameters: 
 0:?     Sequence
-0:22      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22      Sequence
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                0 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                0 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              0 (const int)
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              1 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                1 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              1 (const int)
+0:22        move second child to first child ( temp 4-component vector of float)
+0:22          pos: direct index for structure ( temp 4-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              0 (const int)
+0:22          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:22            Constant:
+0:22              2 (const int)
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          norm: direct index for structure ( temp 3-component vector of float)
+0:22            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:22              Constant:
+0:22                2 (const int)
+0:22            Constant:
+0:22              1 (const int)
+0:22          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:22            Constant:
+0:22              2 (const int)
 0:22      move second child to first child ( temp float)
 0:?         'f' ( temp float)
 0:?         'f' (layout( location=2) patch in float)
@@ -279,20 +420,21 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'f' (layout( location=2) patch in float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 103
+// Generated by (magic number): 8000a
+// Id's are bound by 125
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 54 58 62 68 82 96 100
+                              EntryPoint TessellationEvaluation 4  "main" 55 62 82 85 91 104 118 122
                               ExecutionMode 4 Triangles
                               Source HLSL 500
                               Name 4  "main"
@@ -312,31 +454,33 @@
                               Name 23  "pcf_data"
                               Name 27  "o"
                               Name 52  "i"
-                              Name 54  "i"
-                              Name 56  "f"
-                              Name 58  "f"
-                              Name 60  "tesscoord"
-                              Name 62  "tesscoord"
-                              Name 64  "pcf_data"
-                              Name 68  "pcf_data.flTessFactor"
-                              Name 82  "pcf_data.flInsideTessFactor"
-                              Name 86  "flattenTemp"
-                              Name 88  "param"
-                              Name 90  "param"
-                              Name 92  "param"
-                              Name 96  "@entryPointOutput.pos"
-                              Name 100  "@entryPointOutput.norm"
-                              Decorate 54(i) Location 0
-                              Decorate 58(f) Patch
-                              Decorate 58(f) Location 2
-                              Decorate 62(tesscoord) Patch
-                              Decorate 62(tesscoord) BuiltIn TessCoord
-                              Decorate 68(pcf_data.flTessFactor) Patch
-                              Decorate 68(pcf_data.flTessFactor) BuiltIn TessLevelOuter
-                              Decorate 82(pcf_data.flInsideTessFactor) Patch
-                              Decorate 82(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
-                              Decorate 96(@entryPointOutput.pos) Location 0
-                              Decorate 100(@entryPointOutput.norm) Location 1
+                              Name 55  "i.pos"
+                              Name 62  "i.norm"
+                              Name 80  "f"
+                              Name 82  "f"
+                              Name 84  "tesscoord"
+                              Name 85  "tesscoord"
+                              Name 87  "pcf_data"
+                              Name 91  "pcf_data.flTessFactor"
+                              Name 104  "pcf_data.flInsideTessFactor"
+                              Name 108  "flattenTemp"
+                              Name 110  "param"
+                              Name 112  "param"
+                              Name 114  "param"
+                              Name 118  "@entryPointOutput.pos"
+                              Name 122  "@entryPointOutput.norm"
+                              Decorate 55(i.pos) Location 0
+                              Decorate 62(i.norm) Location 1
+                              Decorate 82(f) Patch
+                              Decorate 82(f) Location 2
+                              Decorate 85(tesscoord) Patch
+                              Decorate 85(tesscoord) BuiltIn TessCoord
+                              Decorate 91(pcf_data.flTessFactor) Patch
+                              Decorate 91(pcf_data.flTessFactor) BuiltIn TessLevelOuter
+                              Decorate 104(pcf_data.flInsideTessFactor) Patch
+                              Decorate 104(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 118(@entryPointOutput.pos) Location 0
+                              Decorate 122(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -361,72 +505,99 @@
               40:     28(int) Constant 1
               42:     10(int) Constant 1
               51:             TypePointer Function 12
-              53:             TypePointer Input 12
-           54(i):     53(ptr) Variable Input
-              57:             TypePointer Input 6(float)
-           58(f):     57(ptr) Variable Input
-              61:             TypePointer Input 8(fvec3)
-   62(tesscoord):     61(ptr) Variable Input
-              65:     10(int) Constant 4
-              66:             TypeArray 6(float) 65
-              67:             TypePointer Input 66
-68(pcf_data.flTessFactor):     67(ptr) Variable Input
-              75:     28(int) Constant 2
-              79:     10(int) Constant 2
-              80:             TypeArray 6(float) 79
-              81:             TypePointer Input 80
-82(pcf_data.flInsideTessFactor):     81(ptr) Variable Input
-              95:             TypePointer Output 7(fvec4)
-96(@entryPointOutput.pos):     95(ptr) Variable Output
-              99:             TypePointer Output 8(fvec3)
-100(@entryPointOutput.norm):     99(ptr) Variable Output
+              53:             TypeArray 7(fvec4) 11
+              54:             TypePointer Input 53
+       55(i.pos):     54(ptr) Variable Input
+              56:             TypePointer Input 7(fvec4)
+              60:             TypeArray 8(fvec3) 11
+              61:             TypePointer Input 60
+      62(i.norm):     61(ptr) Variable Input
+              63:             TypePointer Input 8(fvec3)
+              73:     28(int) Constant 2
+              81:             TypePointer Input 6(float)
+           82(f):     81(ptr) Variable Input
+   85(tesscoord):     63(ptr) Variable Input
+              88:     10(int) Constant 4
+              89:             TypeArray 6(float) 88
+              90:             TypePointer Input 89
+91(pcf_data.flTessFactor):     90(ptr) Variable Input
+             101:     10(int) Constant 2
+             102:             TypeArray 6(float) 101
+             103:             TypePointer Input 102
+104(pcf_data.flInsideTessFactor):    103(ptr) Variable Input
+             117:             TypePointer Output 7(fvec4)
+118(@entryPointOutput.pos):    117(ptr) Variable Output
+             121:             TypePointer Output 8(fvec3)
+122(@entryPointOutput.norm):    121(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            52(i):     51(ptr) Variable Function
-           56(f):     13(ptr) Variable Function
-   60(tesscoord):     14(ptr) Variable Function
-    64(pcf_data):     17(ptr) Variable Function
- 86(flattenTemp):     26(ptr) Variable Function
-       88(param):     13(ptr) Variable Function
-       90(param):     14(ptr) Variable Function
-       92(param):     17(ptr) Variable Function
-              55:          12 Load 54(i)
-                              Store 52(i) 55
-              59:    6(float) Load 58(f)
-                              Store 56(f) 59
-              63:    8(fvec3) Load 62(tesscoord)
-                              Store 60(tesscoord) 63
-              69:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 29
-              70:    6(float) Load 69
-              71:     13(ptr) AccessChain 64(pcf_data) 29 29
-                              Store 71 70
-              72:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 40
-              73:    6(float) Load 72
-              74:     13(ptr) AccessChain 64(pcf_data) 29 40
-                              Store 74 73
-              76:     57(ptr) AccessChain 68(pcf_data.flTessFactor) 75
-              77:    6(float) Load 76
-              78:     13(ptr) AccessChain 64(pcf_data) 29 75
-                              Store 78 77
-              83:     57(ptr) AccessChain 82(pcf_data.flInsideTessFactor) 29
-              84:    6(float) Load 83
-              85:     13(ptr) AccessChain 64(pcf_data) 40
-                              Store 85 84
-              87:          12 Load 52(i)
-              89:    6(float) Load 56(f)
-                              Store 88(param) 89
-              91:    8(fvec3) Load 60(tesscoord)
-                              Store 90(param) 91
-              93:16(pcf_in_t) Load 64(pcf_data)
-                              Store 92(param) 93
-              94: 18(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;) 87 88(param) 90(param) 92(param)
-                              Store 86(flattenTemp) 94
-              97:     38(ptr) AccessChain 86(flattenTemp) 29
-              98:    7(fvec4) Load 97
-                              Store 96(@entryPointOutput.pos) 98
-             101:     14(ptr) AccessChain 86(flattenTemp) 40
-             102:    8(fvec3) Load 101
-                              Store 100(@entryPointOutput.norm) 102
+           80(f):     13(ptr) Variable Function
+   84(tesscoord):     14(ptr) Variable Function
+    87(pcf_data):     17(ptr) Variable Function
+108(flattenTemp):     26(ptr) Variable Function
+      110(param):     13(ptr) Variable Function
+      112(param):     14(ptr) Variable Function
+      114(param):     17(ptr) Variable Function
+              57:     56(ptr) AccessChain 55(i.pos) 29
+              58:    7(fvec4) Load 57
+              59:     38(ptr) AccessChain 52(i) 29 29
+                              Store 59 58
+              64:     63(ptr) AccessChain 62(i.norm) 29
+              65:    8(fvec3) Load 64
+              66:     14(ptr) AccessChain 52(i) 29 40
+                              Store 66 65
+              67:     56(ptr) AccessChain 55(i.pos) 40
+              68:    7(fvec4) Load 67
+              69:     38(ptr) AccessChain 52(i) 40 29
+                              Store 69 68
+              70:     63(ptr) AccessChain 62(i.norm) 40
+              71:    8(fvec3) Load 70
+              72:     14(ptr) AccessChain 52(i) 40 40
+                              Store 72 71
+              74:     56(ptr) AccessChain 55(i.pos) 73
+              75:    7(fvec4) Load 74
+              76:     38(ptr) AccessChain 52(i) 73 29
+                              Store 76 75
+              77:     63(ptr) AccessChain 62(i.norm) 73
+              78:    8(fvec3) Load 77
+              79:     14(ptr) AccessChain 52(i) 73 40
+                              Store 79 78
+              83:    6(float) Load 82(f)
+                              Store 80(f) 83
+              86:    8(fvec3) Load 85(tesscoord)
+                              Store 84(tesscoord) 86
+              92:     81(ptr) AccessChain 91(pcf_data.flTessFactor) 29
+              93:    6(float) Load 92
+              94:     13(ptr) AccessChain 87(pcf_data) 29 29
+                              Store 94 93
+              95:     81(ptr) AccessChain 91(pcf_data.flTessFactor) 40
+              96:    6(float) Load 95
+              97:     13(ptr) AccessChain 87(pcf_data) 29 40
+                              Store 97 96
+              98:     81(ptr) AccessChain 91(pcf_data.flTessFactor) 73
+              99:    6(float) Load 98
+             100:     13(ptr) AccessChain 87(pcf_data) 29 73
+                              Store 100 99
+             105:     81(ptr) AccessChain 104(pcf_data.flInsideTessFactor) 29
+             106:    6(float) Load 105
+             107:     13(ptr) AccessChain 87(pcf_data) 40
+                              Store 107 106
+             109:          12 Load 52(i)
+             111:    6(float) Load 80(f)
+                              Store 110(param) 111
+             113:    8(fvec3) Load 84(tesscoord)
+                              Store 112(param) 113
+             115:16(pcf_in_t) Load 87(pcf_data)
+                              Store 114(param) 115
+             116: 18(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;) 109 110(param) 112(param) 114(param)
+                              Store 108(flattenTemp) 116
+             119:     38(ptr) AccessChain 108(flattenTemp) 29
+             120:    7(fvec4) Load 119
+                              Store 118(@entryPointOutput.pos) 120
+             123:     14(ptr) AccessChain 108(flattenTemp) 40
+             124:    8(fvec3) Load 123
+                              Store 122(@entryPointOutput.norm) 124
                               Return
                               FunctionEnd
 24(@main(struct-ds_in_t-vf4-vf31[3];f1;vf3;struct-pcf_in_t-f1[3]-f11;): 18(gs_in_t) Function None 19
diff --git a/Test/baseResults/hlsl.domain.2.tese.out b/Test/baseResults/hlsl.domain.2.tese.out
index e6ec924..05f934f 100644
--- a/Test/baseResults/hlsl.domain.2.tese.out
+++ b/Test/baseResults/hlsl.domain.2.tese.out
@@ -105,9 +105,79 @@
 0:25            Constant:
 0:25              2 (const int)
 0:?           'pcf_data.foo' (layout( location=2) patch in float)
-0:25      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                1 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                1 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              2 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              2 (const int)
 0:25      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
@@ -133,7 +203,8 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
@@ -249,9 +320,79 @@
 0:25            Constant:
 0:25              2 (const int)
 0:?           'pcf_data.foo' (layout( location=2) patch in float)
-0:25      move second child to first child ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                0 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              0 (const int)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                1 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                1 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              1 (const int)
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          pos: direct index for structure ( temp 4-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              0 (const int)
+0:25          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:25            Constant:
+0:25              2 (const int)
+0:25        move second child to first child ( temp 3-component vector of float)
+0:25          norm: direct index for structure ( temp 3-component vector of float)
+0:25            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:25              Constant:
+0:25                2 (const int)
+0:25            Constant:
+0:25              1 (const int)
+0:25          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
+0:25            Constant:
+0:25              2 (const int)
 0:25      move second child to first child ( temp 3-component vector of float)
 0:?         'tesscoord' ( temp 3-component vector of float)
 0:?         'tesscoord' ( patch in 3-component vector of float TessCoord)
@@ -277,20 +418,21 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 3-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 0:?     'pcf_data.foo' (layout( location=2) patch in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 98
+// Generated by (magic number): 8000a
+// Id's are bound by 120
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 52 67 71 77 81 91 95
+                              EntryPoint TessellationEvaluation 4  "main" 52 67 71 78 85 103 113 117
                               ExecutionMode 4 Triangles
                               Source HLSL 500
                               Name 4  "main"
@@ -314,25 +456,27 @@
                               Name 67  "pcf_data.flInsideTessFactor"
                               Name 71  "pcf_data.foo"
                               Name 75  "i"
-                              Name 77  "i"
-                              Name 79  "tesscoord"
-                              Name 81  "tesscoord"
-                              Name 83  "flattenTemp"
-                              Name 85  "param"
-                              Name 87  "param"
-                              Name 91  "@entryPointOutput.pos"
-                              Name 95  "@entryPointOutput.norm"
+                              Name 78  "i.pos"
+                              Name 85  "i.norm"
+                              Name 102  "tesscoord"
+                              Name 103  "tesscoord"
+                              Name 105  "flattenTemp"
+                              Name 107  "param"
+                              Name 109  "param"
+                              Name 113  "@entryPointOutput.pos"
+                              Name 117  "@entryPointOutput.norm"
                               Decorate 52(pcf_data.flTessFactor) Patch
                               Decorate 52(pcf_data.flTessFactor) BuiltIn TessLevelOuter
                               Decorate 67(pcf_data.flInsideTessFactor) Patch
                               Decorate 67(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
                               Decorate 71(pcf_data.foo) Patch
                               Decorate 71(pcf_data.foo) Location 2
-                              Decorate 77(i) Location 0
-                              Decorate 81(tesscoord) Patch
-                              Decorate 81(tesscoord) BuiltIn TessCoord
-                              Decorate 91(@entryPointOutput.pos) Location 0
-                              Decorate 95(@entryPointOutput.norm) Location 1
+                              Decorate 78(i.pos) Location 0
+                              Decorate 85(i.norm) Location 1
+                              Decorate 103(tesscoord) Patch
+                              Decorate 103(tesscoord) BuiltIn TessCoord
+                              Decorate 113(@entryPointOutput.pos) Location 0
+                              Decorate 117(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -368,22 +512,27 @@
 67(pcf_data.flInsideTessFactor):     66(ptr) Variable Input
 71(pcf_data.foo):     53(ptr) Variable Input
               74:             TypePointer Function 15
-              76:             TypePointer Input 15
-           77(i):     76(ptr) Variable Input
-              80:             TypePointer Input 13(fvec3)
-   81(tesscoord):     80(ptr) Variable Input
-              90:             TypePointer Output 12(fvec4)
-91(@entryPointOutput.pos):     90(ptr) Variable Output
-              94:             TypePointer Output 13(fvec3)
-95(@entryPointOutput.norm):     94(ptr) Variable Output
+              76:             TypeArray 12(fvec4) 8
+              77:             TypePointer Input 76
+       78(i.pos):     77(ptr) Variable Input
+              79:             TypePointer Input 12(fvec4)
+              83:             TypeArray 13(fvec3) 8
+              84:             TypePointer Input 83
+      85(i.norm):     84(ptr) Variable Input
+              86:             TypePointer Input 13(fvec3)
+  103(tesscoord):     86(ptr) Variable Input
+             112:             TypePointer Output 12(fvec4)
+113(@entryPointOutput.pos):    112(ptr) Variable Output
+             116:             TypePointer Output 13(fvec3)
+117(@entryPointOutput.norm):    116(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
     48(pcf_data):     11(ptr) Variable Function
            75(i):     74(ptr) Variable Function
-   79(tesscoord):     16(ptr) Variable Function
- 83(flattenTemp):     24(ptr) Variable Function
-       85(param):     11(ptr) Variable Function
-       87(param):     16(ptr) Variable Function
+  102(tesscoord):     16(ptr) Variable Function
+105(flattenTemp):     24(ptr) Variable Function
+      107(param):     11(ptr) Variable Function
+      109(param):     16(ptr) Variable Function
               54:     53(ptr) AccessChain 52(pcf_data.flTessFactor) 27
               55:    6(float) Load 54
               56:     30(ptr) AccessChain 48(pcf_data) 27 27
@@ -403,23 +552,45 @@
               72:    6(float) Load 71(pcf_data.foo)
               73:     30(ptr) AccessChain 48(pcf_data) 60
                               Store 73 72
-              78:          15 Load 77(i)
-                              Store 75(i) 78
-              82:   13(fvec3) Load 81(tesscoord)
-                              Store 79(tesscoord) 82
-              84:          15 Load 75(i)
-              86:10(pcf_in_t) Load 48(pcf_data)
-                              Store 85(param) 86
-              88:   13(fvec3) Load 79(tesscoord)
-                              Store 87(param) 88
-              89: 17(gs_in_t) FunctionCall 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;) 85(param) 84 87(param)
-                              Store 83(flattenTemp) 89
-              92:     35(ptr) AccessChain 83(flattenTemp) 27
-              93:   12(fvec4) Load 92
-                              Store 91(@entryPointOutput.pos) 93
-              96:     16(ptr) AccessChain 83(flattenTemp) 37
-              97:   13(fvec3) Load 96
-                              Store 95(@entryPointOutput.norm) 97
+              80:     79(ptr) AccessChain 78(i.pos) 27
+              81:   12(fvec4) Load 80
+              82:     35(ptr) AccessChain 75(i) 27 27
+                              Store 82 81
+              87:     86(ptr) AccessChain 85(i.norm) 27
+              88:   13(fvec3) Load 87
+              89:     16(ptr) AccessChain 75(i) 27 37
+                              Store 89 88
+              90:     79(ptr) AccessChain 78(i.pos) 37
+              91:   12(fvec4) Load 90
+              92:     35(ptr) AccessChain 75(i) 37 27
+                              Store 92 91
+              93:     86(ptr) AccessChain 85(i.norm) 37
+              94:   13(fvec3) Load 93
+              95:     16(ptr) AccessChain 75(i) 37 37
+                              Store 95 94
+              96:     79(ptr) AccessChain 78(i.pos) 60
+              97:   12(fvec4) Load 96
+              98:     35(ptr) AccessChain 75(i) 60 27
+                              Store 98 97
+              99:     86(ptr) AccessChain 85(i.norm) 60
+             100:   13(fvec3) Load 99
+             101:     16(ptr) AccessChain 75(i) 60 37
+                              Store 101 100
+             104:   13(fvec3) Load 103(tesscoord)
+                              Store 102(tesscoord) 104
+             106:          15 Load 75(i)
+             108:10(pcf_in_t) Load 48(pcf_data)
+                              Store 107(param) 108
+             110:   13(fvec3) Load 102(tesscoord)
+                              Store 109(param) 110
+             111: 17(gs_in_t) FunctionCall 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;) 107(param) 106 109(param)
+                              Store 105(flattenTemp) 111
+             114:     35(ptr) AccessChain 105(flattenTemp) 27
+             115:   12(fvec4) Load 114
+                              Store 113(@entryPointOutput.pos) 115
+             118:     16(ptr) AccessChain 105(flattenTemp) 37
+             119:   13(fvec3) Load 118
+                              Store 117(@entryPointOutput.norm) 119
                               Return
                               FunctionEnd
 22(@main(struct-pcf_in_t-f1[3]-f1-f11;struct-ds_in_t-vf4-vf31[3];vf3;): 17(gs_in_t) Function None 18
diff --git a/Test/baseResults/hlsl.domain.3.tese.out b/Test/baseResults/hlsl.domain.3.tese.out
index 4b8584c..c9b985d 100644
--- a/Test/baseResults/hlsl.domain.3.tese.out
+++ b/Test/baseResults/hlsl.domain.3.tese.out
@@ -49,9 +49,55 @@
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
-0:24      move second child to first child ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                0 (const int)
+0:24            Constant:
+0:24              0 (const int)
+0:24          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                0 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:24          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              0 (const int)
+0:24          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:24            Constant:
+0:24              1 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:24          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
+0:24            Constant:
+0:24              1 (const int)
 0:24      move second child to first child ( temp 2-component vector of float)
 0:?         'tesscoord' ( temp 2-component vector of float)
 0:?         Construct vec2 ( temp 2-component vector of float)
@@ -124,7 +170,8 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
@@ -183,9 +230,55 @@
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
-0:24      move second child to first child ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
-0:?         'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                0 (const int)
+0:24            Constant:
+0:24              0 (const int)
+0:24          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                0 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:24          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
+0:24            Constant:
+0:24              0 (const int)
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          pos: direct index for structure ( temp 4-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              0 (const int)
+0:24          direct index (layout( location=0) in 4-component vector of float)
+0:?             'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:24            Constant:
+0:24              1 (const int)
+0:24        move second child to first child ( temp 3-component vector of float)
+0:24          norm: direct index for structure ( temp 3-component vector of float)
+0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?               'i' ( temp 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:24              Constant:
+0:24                1 (const int)
+0:24            Constant:
+0:24              1 (const int)
+0:24          direct index (layout( location=1) in 3-component vector of float)
+0:?             'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
+0:24            Constant:
+0:24              1 (const int)
 0:24      move second child to first child ( temp 2-component vector of float)
 0:?         'tesscoord' ( temp 2-component vector of float)
 0:?         Construct vec2 ( temp 2-component vector of float)
@@ -258,19 +351,20 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.pos' (layout( location=0) out 4-component vector of float)
 0:?     '@entryPointOutput.norm' (layout( location=1) out 3-component vector of float)
-0:?     'i' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float pos,  temp 3-component vector of float norm})
+0:?     'i.pos' (layout( location=0) in 2-element array of 4-component vector of float)
+0:?     'i.norm' (layout( location=1) in 2-element array of 3-component vector of float)
 0:?     'tesscoord' ( patch in 3-component vector of float TessCoord)
 0:?     'pcf_data.flTessFactor' ( patch in 4-element array of float TessLevelOuter)
 0:?     'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 100
+// Generated by (magic number): 8000a
+// Id's are bound by 116
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationEvaluation 4  "main" 54 58 67 81 93 97
+                              EntryPoint TessellationEvaluation 4  "main" 55 62 74 83 97 109 113
                               ExecutionMode 4 Isolines
                               Source HLSL 500
                               Name 4  "main"
@@ -289,26 +383,28 @@
                               Name 23  "pcf_data"
                               Name 27  "o"
                               Name 52  "i"
-                              Name 54  "i"
-                              Name 56  "tesscoord"
-                              Name 58  "tesscoord"
-                              Name 63  "pcf_data"
-                              Name 67  "pcf_data.flTessFactor"
-                              Name 81  "pcf_data.flInsideTessFactor"
-                              Name 85  "flattenTemp"
-                              Name 87  "param"
-                              Name 89  "param"
-                              Name 93  "@entryPointOutput.pos"
-                              Name 97  "@entryPointOutput.norm"
-                              Decorate 54(i) Location 0
-                              Decorate 58(tesscoord) Patch
-                              Decorate 58(tesscoord) BuiltIn TessCoord
-                              Decorate 67(pcf_data.flTessFactor) Patch
-                              Decorate 67(pcf_data.flTessFactor) BuiltIn TessLevelOuter
-                              Decorate 81(pcf_data.flInsideTessFactor) Patch
-                              Decorate 81(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
-                              Decorate 93(@entryPointOutput.pos) Location 0
-                              Decorate 97(@entryPointOutput.norm) Location 1
+                              Name 55  "i.pos"
+                              Name 62  "i.norm"
+                              Name 73  "tesscoord"
+                              Name 74  "tesscoord"
+                              Name 79  "pcf_data"
+                              Name 83  "pcf_data.flTessFactor"
+                              Name 97  "pcf_data.flInsideTessFactor"
+                              Name 101  "flattenTemp"
+                              Name 103  "param"
+                              Name 105  "param"
+                              Name 109  "@entryPointOutput.pos"
+                              Name 113  "@entryPointOutput.norm"
+                              Decorate 55(i.pos) Location 0
+                              Decorate 62(i.norm) Location 1
+                              Decorate 74(tesscoord) Patch
+                              Decorate 74(tesscoord) BuiltIn TessCoord
+                              Decorate 83(pcf_data.flTessFactor) Patch
+                              Decorate 83(pcf_data.flTessFactor) BuiltIn TessLevelOuter
+                              Decorate 97(pcf_data.flInsideTessFactor) Patch
+                              Decorate 97(pcf_data.flInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 109(@entryPointOutput.pos) Location 0
+                              Decorate 113(@entryPointOutput.norm) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -336,67 +432,86 @@
               41:     10(int) Constant 1
               46:             TypePointer Function 8(fvec3)
               51:             TypePointer Function 12
-              53:             TypePointer Input 12
-           54(i):     53(ptr) Variable Input
-              57:             TypePointer Input 8(fvec3)
-   58(tesscoord):     57(ptr) Variable Input
-              64:     10(int) Constant 4
-              65:             TypeArray 6(float) 64
-              66:             TypePointer Input 65
-67(pcf_data.flTessFactor):     66(ptr) Variable Input
-              68:             TypePointer Input 6(float)
-              75:     28(int) Constant 2
-              79:             TypeArray 6(float) 11
-              80:             TypePointer Input 79
-81(pcf_data.flInsideTessFactor):     80(ptr) Variable Input
-              92:             TypePointer Output 7(fvec4)
-93(@entryPointOutput.pos):     92(ptr) Variable Output
-              96:             TypePointer Output 8(fvec3)
-97(@entryPointOutput.norm):     96(ptr) Variable Output
+              53:             TypeArray 7(fvec4) 11
+              54:             TypePointer Input 53
+       55(i.pos):     54(ptr) Variable Input
+              56:             TypePointer Input 7(fvec4)
+              60:             TypeArray 8(fvec3) 11
+              61:             TypePointer Input 60
+      62(i.norm):     61(ptr) Variable Input
+              63:             TypePointer Input 8(fvec3)
+   74(tesscoord):     63(ptr) Variable Input
+              80:     10(int) Constant 4
+              81:             TypeArray 6(float) 80
+              82:             TypePointer Input 81
+83(pcf_data.flTessFactor):     82(ptr) Variable Input
+              84:             TypePointer Input 6(float)
+              91:     28(int) Constant 2
+              95:             TypeArray 6(float) 11
+              96:             TypePointer Input 95
+97(pcf_data.flInsideTessFactor):     96(ptr) Variable Input
+             108:             TypePointer Output 7(fvec4)
+109(@entryPointOutput.pos):    108(ptr) Variable Output
+             112:             TypePointer Output 8(fvec3)
+113(@entryPointOutput.norm):    112(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            52(i):     51(ptr) Variable Function
-   56(tesscoord):     14(ptr) Variable Function
-    63(pcf_data):     18(ptr) Variable Function
- 85(flattenTemp):     26(ptr) Variable Function
-       87(param):     14(ptr) Variable Function
-       89(param):     18(ptr) Variable Function
-              55:          12 Load 54(i)
-                              Store 52(i) 55
-              59:    8(fvec3) Load 58(tesscoord)
-              60:    6(float) CompositeExtract 59 0
-              61:    6(float) CompositeExtract 59 1
-              62:   13(fvec2) CompositeConstruct 60 61
-                              Store 56(tesscoord) 62
-              69:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 29
-              70:    6(float) Load 69
-              71:     32(ptr) AccessChain 63(pcf_data) 29 29
-                              Store 71 70
-              72:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 39
-              73:    6(float) Load 72
-              74:     32(ptr) AccessChain 63(pcf_data) 29 39
-                              Store 74 73
-              76:     68(ptr) AccessChain 67(pcf_data.flTessFactor) 75
-              77:    6(float) Load 76
-              78:     32(ptr) AccessChain 63(pcf_data) 29 75
-                              Store 78 77
-              82:     68(ptr) AccessChain 81(pcf_data.flInsideTessFactor) 29
-              83:    6(float) Load 82
-              84:     32(ptr) AccessChain 63(pcf_data) 39
-                              Store 84 83
-              86:          12 Load 52(i)
-              88:   13(fvec2) Load 56(tesscoord)
-                              Store 87(param) 88
-              90:17(pcf_in_t) Load 63(pcf_data)
-                              Store 89(param) 90
-              91: 19(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;) 86 87(param) 89(param)
-                              Store 85(flattenTemp) 91
-              94:     37(ptr) AccessChain 85(flattenTemp) 29
-              95:    7(fvec4) Load 94
-                              Store 93(@entryPointOutput.pos) 95
-              98:     46(ptr) AccessChain 85(flattenTemp) 39
-              99:    8(fvec3) Load 98
-                              Store 97(@entryPointOutput.norm) 99
+   73(tesscoord):     14(ptr) Variable Function
+    79(pcf_data):     18(ptr) Variable Function
+101(flattenTemp):     26(ptr) Variable Function
+      103(param):     14(ptr) Variable Function
+      105(param):     18(ptr) Variable Function
+              57:     56(ptr) AccessChain 55(i.pos) 29
+              58:    7(fvec4) Load 57
+              59:     37(ptr) AccessChain 52(i) 29 29
+                              Store 59 58
+              64:     63(ptr) AccessChain 62(i.norm) 29
+              65:    8(fvec3) Load 64
+              66:     46(ptr) AccessChain 52(i) 29 39
+                              Store 66 65
+              67:     56(ptr) AccessChain 55(i.pos) 39
+              68:    7(fvec4) Load 67
+              69:     37(ptr) AccessChain 52(i) 39 29
+                              Store 69 68
+              70:     63(ptr) AccessChain 62(i.norm) 39
+              71:    8(fvec3) Load 70
+              72:     46(ptr) AccessChain 52(i) 39 39
+                              Store 72 71
+              75:    8(fvec3) Load 74(tesscoord)
+              76:    6(float) CompositeExtract 75 0
+              77:    6(float) CompositeExtract 75 1
+              78:   13(fvec2) CompositeConstruct 76 77
+                              Store 73(tesscoord) 78
+              85:     84(ptr) AccessChain 83(pcf_data.flTessFactor) 29
+              86:    6(float) Load 85
+              87:     32(ptr) AccessChain 79(pcf_data) 29 29
+                              Store 87 86
+              88:     84(ptr) AccessChain 83(pcf_data.flTessFactor) 39
+              89:    6(float) Load 88
+              90:     32(ptr) AccessChain 79(pcf_data) 29 39
+                              Store 90 89
+              92:     84(ptr) AccessChain 83(pcf_data.flTessFactor) 91
+              93:    6(float) Load 92
+              94:     32(ptr) AccessChain 79(pcf_data) 29 91
+                              Store 94 93
+              98:     84(ptr) AccessChain 97(pcf_data.flInsideTessFactor) 29
+              99:    6(float) Load 98
+             100:     32(ptr) AccessChain 79(pcf_data) 39
+                              Store 100 99
+             102:          12 Load 52(i)
+             104:   13(fvec2) Load 73(tesscoord)
+                              Store 103(param) 104
+             106:17(pcf_in_t) Load 79(pcf_data)
+                              Store 105(param) 106
+             107: 19(gs_in_t) FunctionCall 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;) 102 103(param) 105(param)
+                              Store 101(flattenTemp) 107
+             110:     37(ptr) AccessChain 101(flattenTemp) 29
+             111:    7(fvec4) Load 110
+                              Store 109(@entryPointOutput.pos) 111
+             114:     46(ptr) AccessChain 101(flattenTemp) 39
+             115:    8(fvec3) Load 114
+                              Store 113(@entryPointOutput.norm) 115
                               Return
                               FunctionEnd
 24(@main(struct-ds_in_t-vf4-vf31[2];vf2;struct-pcf_in_t-f1[3]-f11;): 19(gs_in_t) Function None 20
diff --git a/Test/baseResults/hlsl.earlydepthstencil.frag.out b/Test/baseResults/hlsl.earlydepthstencil.frag.out
old mode 100755
new mode 100644
index f30b89a..e6ad359
--- a/Test/baseResults/hlsl.earlydepthstencil.frag.out
+++ b/Test/baseResults/hlsl.earlydepthstencil.frag.out
@@ -108,7 +108,7 @@
 0:?     'input.Position' ( in 4-component vector of float FragCoord)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.emptystruct.init.vert.out b/Test/baseResults/hlsl.emptystruct.init.vert.out
index c3c3aef..9f5c785 100644
--- a/Test/baseResults/hlsl.emptystruct.init.vert.out
+++ b/Test/baseResults/hlsl.emptystruct.init.vert.out
@@ -60,7 +60,7 @@
 0:?     'vertexIndex' (layout( location=0) in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.emptystructreturn.frag.out b/Test/baseResults/hlsl.emptystructreturn.frag.out
index bb9c26c..2a4cabe 100644
--- a/Test/baseResults/hlsl.emptystructreturn.frag.out
+++ b/Test/baseResults/hlsl.emptystructreturn.frag.out
@@ -51,7 +51,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.emptystructreturn.vert.out b/Test/baseResults/hlsl.emptystructreturn.vert.out
index 22027bf..ad1efa7 100644
--- a/Test/baseResults/hlsl.emptystructreturn.vert.out
+++ b/Test/baseResults/hlsl.emptystructreturn.vert.out
@@ -49,7 +49,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.entry-in.frag.out b/Test/baseResults/hlsl.entry-in.frag.out
index d65532d..4c32249 100644
--- a/Test/baseResults/hlsl.entry-in.frag.out
+++ b/Test/baseResults/hlsl.entry-in.frag.out
@@ -166,7 +166,7 @@
 0:?     'i.i2' (layout( location=1) flat in 2-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 74
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.entry-out.frag.out b/Test/baseResults/hlsl.entry-out.frag.out
index e1af284..a8b47e9 100644
--- a/Test/baseResults/hlsl.entry-out.frag.out
+++ b/Test/baseResults/hlsl.entry-out.frag.out
@@ -244,7 +244,7 @@
 0:?     'out3.i' (layout( location=5) out 2-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 89
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.entry.rename.frag.out b/Test/baseResults/hlsl.entry.rename.frag.out
index b0e958b..2fd15d1 100644
--- a/Test/baseResults/hlsl.entry.rename.frag.out
+++ b/Test/baseResults/hlsl.entry.rename.frag.out
@@ -72,7 +72,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out b/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
index c4e6baf..3ca773f 100644
--- a/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
+++ b/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out
@@ -1,6 +1,6 @@
 hlsl.explicitDescriptorSet.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.explicitDescriptorSet.frag.out b/Test/baseResults/hlsl.explicitDescriptorSet.frag.out
index 9665ad2..9ba0d93 100644
--- a/Test/baseResults/hlsl.explicitDescriptorSet.frag.out
+++ b/Test/baseResults/hlsl.explicitDescriptorSet.frag.out
@@ -1,6 +1,6 @@
 hlsl.explicitDescriptorSet.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.flatten.return.frag.out b/Test/baseResults/hlsl.flatten.return.frag.out
index bc388f8..ffb9dcc 100644
--- a/Test/baseResults/hlsl.flatten.return.frag.out
+++ b/Test/baseResults/hlsl.flatten.return.frag.out
@@ -118,7 +118,7 @@
 0:?     '@entryPointOutput.other_struct_member3' (layout( location=3) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 49
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.flattenOpaque.frag.out b/Test/baseResults/hlsl.flattenOpaque.frag.out
index 688656c..d63caf5 100644
--- a/Test/baseResults/hlsl.flattenOpaque.frag.out
+++ b/Test/baseResults/hlsl.flattenOpaque.frag.out
@@ -295,7 +295,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 122
 
                               Capability Shader
@@ -339,11 +339,11 @@
                               Decorate 38(tex) DescriptorSet 0
                               Decorate 38(tex) Binding 0
                               Decorate 82(s.s2D) DescriptorSet 0
-                              Decorate 82(s.s2D) Binding 0
+                              Decorate 82(s.s2D) Binding 1
                               Decorate 97(s2.s2D) DescriptorSet 0
-                              Decorate 97(s2.s2D) Binding 0
+                              Decorate 97(s2.s2D) Binding 2
                               Decorate 100(s2.tex) DescriptorSet 0
-                              Decorate 100(s2.tex) Binding 0
+                              Decorate 100(s2.tex) Binding 3
                               Decorate 120(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
index 6d16858..d27cadc 100644
--- a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
+++ b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out
@@ -165,7 +165,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 82
 
                               Capability Shader
@@ -195,7 +195,7 @@
                               Decorate 43(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 43(g_tInputTexture_sampler) Binding 0
                               Decorate 47(g_tInputTexture) DescriptorSet 0
-                              Decorate 47(g_tInputTexture) Binding 0
+                              Decorate 47(g_tInputTexture) Binding 1
                               Decorate 80(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out b/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
index 62a2e8e..04f7009 100644
--- a/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
+++ b/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
@@ -107,7 +107,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 59
 
                               Capability Shader
@@ -131,7 +131,7 @@
                               Decorate 44(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 44(g_tInputTexture_sampler) Binding 0
                               Decorate 47(g_tInputTexture) DescriptorSet 0
-                              Decorate 47(g_tInputTexture) Binding 0
+                              Decorate 47(g_tInputTexture) Binding 1
                               Decorate 57(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.flattenSubset.frag.out b/Test/baseResults/hlsl.flattenSubset.frag.out
index f6da1a9..7ec229a 100644
--- a/Test/baseResults/hlsl.flattenSubset.frag.out
+++ b/Test/baseResults/hlsl.flattenSubset.frag.out
@@ -115,7 +115,7 @@
 0:?     'vpos' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
@@ -154,7 +154,7 @@
                               Decorate 21(samp) DescriptorSet 0
                               Decorate 21(samp) Binding 0
                               Decorate 33(tex) DescriptorSet 0
-                              Decorate 33(tex) Binding 0
+                              Decorate 33(tex) Binding 1
                               Decorate 47(vpos) Location 0
                               Decorate 50(@entryPointOutput) Location 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.flattenSubset2.frag.out b/Test/baseResults/hlsl.flattenSubset2.frag.out
index 40d92a9..bac9b30 100644
--- a/Test/baseResults/hlsl.flattenSubset2.frag.out
+++ b/Test/baseResults/hlsl.flattenSubset2.frag.out
@@ -149,7 +149,7 @@
 0:?     'vpos' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 56
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.float1.frag.out b/Test/baseResults/hlsl.float1.frag.out
index 0f7600e..00bdea9 100644
--- a/Test/baseResults/hlsl.float1.frag.out
+++ b/Test/baseResults/hlsl.float1.frag.out
@@ -65,7 +65,7 @@
 0:?     'scalar' ( global float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.float4.frag.out b/Test/baseResults/hlsl.float4.frag.out
index 8e8c821..0dbd935 100644
--- a/Test/baseResults/hlsl.float4.frag.out
+++ b/Test/baseResults/hlsl.float4.frag.out
@@ -42,7 +42,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform bool ff1, layout( offset=20) uniform float ff2, layout( binding=0 offset=32) uniform 4-component vector of float ff3, layout( binding=1 offset=48) uniform 4-component vector of float ff4})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.forLoop.frag.out b/Test/baseResults/hlsl.forLoop.frag.out
index b6c2710..7bce346 100644
--- a/Test/baseResults/hlsl.forLoop.frag.out
+++ b/Test/baseResults/hlsl.forLoop.frag.out
@@ -510,7 +510,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 240
 
                               Capability Shader
@@ -644,7 +644,7 @@
               58:             Label
               59:    9(fvec4) Load 15(input)
               60:    9(fvec4) Load 15(input)
-              63:   62(bvec4) FOrdNotEqual 59 60
+              63:   62(bvec4) FUnordNotEqual 59 60
               64:    61(bool) Any 63
                               BranchConditional 64 55 56
               55:               Label
@@ -664,7 +664,7 @@
               69:             Label
               70:    9(fvec4) Load 19(input)
               71:    9(fvec4) Load 19(input)
-              72:   62(bvec4) FOrdNotEqual 70 71
+              72:   62(bvec4) FUnordNotEqual 70 71
               73:    61(bool) Any 72
                               BranchConditional 73 66 67
               66:               Label
@@ -692,7 +692,7 @@
               86:             Label
               87:    9(fvec4) Load 22(input)
               88:    9(fvec4) Load 22(input)
-              89:   62(bvec4) FOrdNotEqual 87 88
+              89:   62(bvec4) FUnordNotEqual 87 88
               90:    61(bool) Any 89
                               BranchConditional 90 83 84
               83:               Label
diff --git a/Test/baseResults/hlsl.format.rwtexture.frag.out b/Test/baseResults/hlsl.format.rwtexture.frag.out
index 699dafe..e6eebbf 100644
--- a/Test/baseResults/hlsl.format.rwtexture.frag.out
+++ b/Test/baseResults/hlsl.format.rwtexture.frag.out
@@ -184,7 +184,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 160
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.fraggeom.frag.out b/Test/baseResults/hlsl.fraggeom.frag.out
index 7509ddc..d86fa96 100644
--- a/Test/baseResults/hlsl.fraggeom.frag.out
+++ b/Test/baseResults/hlsl.fraggeom.frag.out
@@ -64,7 +64,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.function.frag.out b/Test/baseResults/hlsl.function.frag.out
index 00b882d..faa3147 100644
--- a/Test/baseResults/hlsl.function.frag.out
+++ b/Test/baseResults/hlsl.function.frag.out
@@ -26,14 +26,14 @@
 0:12  Function Definition: fun4(u1;u1; ( temp 4-component vector of float)
 0:12    Function Parameters: 
 0:12      'id1' ( in uint)
-0:12      'id2' ( in uint)
+0:12      'id2' ( uniform uint)
 0:?     Sequence
 0:13      Branch: Return with expression
 0:13        Construct vec4 ( temp 4-component vector of float)
 0:13          Convert uint to float ( temp float)
 0:13            component-wise multiply ( temp uint)
 0:13              'id1' ( in uint)
-0:13              'id2' ( in uint)
+0:13              'id2' ( uniform uint)
 0:17  Function Definition: fun1(i1; ( temp 4-component vector of float)
 0:17    Function Parameters: 
 0:17      'index' ( in int)
@@ -84,14 +84,14 @@
 0:12  Function Definition: fun4(u1;u1; ( temp 4-component vector of float)
 0:12    Function Parameters: 
 0:12      'id1' ( in uint)
-0:12      'id2' ( in uint)
+0:12      'id2' ( uniform uint)
 0:?     Sequence
 0:13      Branch: Return with expression
 0:13        Construct vec4 ( temp 4-component vector of float)
 0:13          Convert uint to float ( temp float)
 0:13            component-wise multiply ( temp uint)
 0:13              'id1' ( in uint)
-0:13              'id2' ( in uint)
+0:13              'id2' ( uniform uint)
 0:17  Function Definition: fun1(i1; ( temp 4-component vector of float)
 0:17    Function Parameters: 
 0:17      'index' ( in int)
diff --git a/Test/baseResults/hlsl.gather.array.dx10.frag.out b/Test/baseResults/hlsl.gather.array.dx10.frag.out
index b954c2b..b679ac4 100644
--- a/Test/baseResults/hlsl.gather.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.array.dx10.frag.out
@@ -262,7 +262,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 124
 
                               Capability Shader
@@ -301,19 +301,19 @@
                               Name 120  "g_tTex1di4a"
                               Name 123  "g_tTex1du4a"
                               Decorate 16(g_tTex2df4a) DescriptorSet 0
-                              Decorate 16(g_tTex2df4a) Binding 0
+                              Decorate 16(g_tTex2df4a) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 37(g_tTex2di4a) DescriptorSet 0
-                              Decorate 37(g_tTex2di4a) Binding 0
+                              Decorate 37(g_tTex2di4a) Binding 3
                               Decorate 52(g_tTex2du4a) DescriptorSet 0
-                              Decorate 52(g_tTex2du4a) Binding 0
+                              Decorate 52(g_tTex2du4a) Binding 4
                               Decorate 64(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 64(g_tTexcdf4a) Binding 0
+                              Decorate 64(g_tTexcdf4a) Binding 5
                               Decorate 74(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 74(g_tTexcdi4a) Binding 0
+                              Decorate 74(g_tTexcdi4a) Binding 6
                               Decorate 84(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 84(g_tTexcdu4a) Binding 0
+                              Decorate 84(g_tTexcdu4a) Binding 7
                               Decorate 107(@entryPointOutput.Color) Location 0
                               Decorate 111(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 116(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.frag.out b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
index 530bccd..c80c10f 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.frag.out
@@ -258,7 +258,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 135
 
                               Capability Shader
@@ -300,19 +300,19 @@
                               Name 131  "g_tTex3di4"
                               Name 134  "g_tTex3du4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex2di4) DescriptorSet 0
-                              Decorate 36(g_tTex2di4) Binding 0
+                              Decorate 36(g_tTex2di4) Binding 3
                               Decorate 51(g_tTex2du4) DescriptorSet 0
-                              Decorate 51(g_tTex2du4) Binding 0
+                              Decorate 51(g_tTex2du4) Binding 4
                               Decorate 63(g_tTexcdf4) DescriptorSet 0
-                              Decorate 63(g_tTexcdf4) Binding 0
+                              Decorate 63(g_tTexcdf4) Binding 5
                               Decorate 74(g_tTexcdi4) DescriptorSet 0
-                              Decorate 74(g_tTexcdi4) Binding 0
+                              Decorate 74(g_tTexcdi4) Binding 6
                               Decorate 84(g_tTexcdu4) DescriptorSet 0
-                              Decorate 84(g_tTexcdu4) Binding 0
+                              Decorate 84(g_tTexcdu4) Binding 7
                               Decorate 108(@entryPointOutput.Color) Location 0
                               Decorate 112(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 115(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gather.basic.dx10.vert.out b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
index de745d1..fd0c958 100644
--- a/Test/baseResults/hlsl.gather.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.gather.basic.dx10.vert.out
@@ -220,7 +220,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 126
 
                               Capability Shader
@@ -257,19 +257,19 @@
                               Name 122  "g_tTex3di4"
                               Name 125  "g_tTex3du4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex2di4) DescriptorSet 0
-                              Decorate 36(g_tTex2di4) Binding 0
+                              Decorate 36(g_tTex2di4) Binding 3
                               Decorate 51(g_tTex2du4) DescriptorSet 0
-                              Decorate 51(g_tTex2du4) Binding 0
+                              Decorate 51(g_tTex2du4) Binding 4
                               Decorate 63(g_tTexcdf4) DescriptorSet 0
-                              Decorate 63(g_tTexcdf4) Binding 0
+                              Decorate 63(g_tTexcdf4) Binding 5
                               Decorate 74(g_tTexcdi4) DescriptorSet 0
-                              Decorate 74(g_tTexcdi4) Binding 0
+                              Decorate 74(g_tTexcdi4) Binding 6
                               Decorate 84(g_tTexcdu4) DescriptorSet 0
-                              Decorate 84(g_tTexcdu4) Binding 0
+                              Decorate 84(g_tTexcdu4) Binding 7
                               Decorate 103(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 106(g_sSamp2d) DescriptorSet 0
                               Decorate 106(g_sSamp2d) Binding 0
diff --git a/Test/baseResults/hlsl.gather.offset.dx10.frag.out b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
index 3a89712..4e40f72 100644
--- a/Test/baseResults/hlsl.gather.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offset.dx10.frag.out
@@ -208,7 +208,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 114
 
                               Capability Shader
@@ -246,13 +246,13 @@
                               Name 110  "g_tTexcdi4"
                               Name 113  "g_tTexcdu4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 39(g_tTex2di4) DescriptorSet 0
-                              Decorate 39(g_tTex2di4) Binding 0
+                              Decorate 39(g_tTex2di4) Binding 3
                               Decorate 55(g_tTex2du4) DescriptorSet 0
-                              Decorate 55(g_tTex2du4) Binding 0
+                              Decorate 55(g_tTex2du4) Binding 4
                               Decorate 79(@entryPointOutput.Color) Location 0
                               Decorate 83(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 88(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
index 3601187..54b693f 100644
--- a/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out
@@ -202,7 +202,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 97
 
                               Capability Shader
@@ -234,13 +234,13 @@
                               Name 93  "g_tTex1di4"
                               Name 96  "g_tTex1du4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 40(g_tTex2di4) DescriptorSet 0
-                              Decorate 40(g_tTex2di4) Binding 0
+                              Decorate 40(g_tTex2di4) Binding 3
                               Decorate 55(g_tTex2du4) DescriptorSet 0
-                              Decorate 55(g_tTex2du4) Binding 0
+                              Decorate 55(g_tTex2du4) Binding 4
                               Decorate 80(@entryPointOutput.Color) Location 0
                               Decorate 84(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 89(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
index c2a4901..75ea036 100644
--- a/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out
@@ -750,7 +750,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 255
 
                               Capability Shader
@@ -813,7 +813,7 @@
                               Name 251  "g_tTex1di4a"
                               Name 254  "g_tTex1du4a"
                               Decorate 16(g_tTex2df4a) DescriptorSet 0
-                              Decorate 16(g_tTex2df4a) Binding 0
+                              Decorate 16(g_tTex2df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 26($Global) 0 Offset 0
@@ -822,17 +822,17 @@
                               MemberDecorate 26($Global) 3 Offset 32
                               Decorate 26($Global) Block
                               Decorate 28 DescriptorSet 0
-                              Decorate 28 Binding 0
+                              Decorate 28 Binding 7
                               Decorate 41(g_tTex2di4a) DescriptorSet 0
-                              Decorate 41(g_tTex2di4a) Binding 0
+                              Decorate 41(g_tTex2di4a) Binding 2
                               Decorate 55(g_tTex2du4a) DescriptorSet 0
-                              Decorate 55(g_tTex2du4a) Binding 0
+                              Decorate 55(g_tTex2du4a) Binding 3
                               Decorate 131(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 131(g_tTexcdf4a) Binding 0
+                              Decorate 131(g_tTexcdf4a) Binding 4
                               Decorate 143(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4a) Binding 0
+                              Decorate 143(g_tTexcdi4a) Binding 5
                               Decorate 154(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 154(g_tTexcdu4a) Binding 0
+                              Decorate 154(g_tTexcdu4a) Binding 6
                               Decorate 238(@entryPointOutput.Color) Location 0
                               Decorate 242(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 245(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
index 8bb01d5..886ad73 100644
--- a/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out
@@ -758,7 +758,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 265
 
                               Capability Shader
@@ -824,7 +824,7 @@
                               Name 261  "g_tTex3di4"
                               Name 264  "g_tTex3du4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 26($Global) 0 Offset 0
@@ -833,17 +833,17 @@
                               MemberDecorate 26($Global) 3 Offset 32
                               Decorate 26($Global) Block
                               Decorate 28 DescriptorSet 0
-                              Decorate 28 Binding 0
+                              Decorate 28 Binding 8
                               Decorate 41(g_tTex2di4) DescriptorSet 0
-                              Decorate 41(g_tTex2di4) Binding 0
+                              Decorate 41(g_tTex2di4) Binding 3
                               Decorate 55(g_tTex2du4) DescriptorSet 0
-                              Decorate 55(g_tTex2du4) Binding 0
+                              Decorate 55(g_tTex2du4) Binding 4
                               Decorate 131(g_tTexcdf4) DescriptorSet 0
-                              Decorate 131(g_tTexcdf4) Binding 0
+                              Decorate 131(g_tTexcdf4) Binding 5
                               Decorate 143(g_tTexcdi4) DescriptorSet 0
-                              Decorate 143(g_tTexcdi4) Binding 0
+                              Decorate 143(g_tTexcdi4) Binding 6
                               Decorate 154(g_tTexcdu4) DescriptorSet 0
-                              Decorate 154(g_tTexcdu4) Binding 0
+                              Decorate 154(g_tTexcdu4) Binding 7
                               Decorate 238(@entryPointOutput.Color) Location 0
                               Decorate 242(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 245(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
index a777678..b86cd22 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out
@@ -1263,7 +1263,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 399
 
                               Capability Shader
@@ -1334,7 +1334,7 @@
                               Name 395  "g_tTexcdi4"
                               Name 398  "g_tTexcdu4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 30($Global) 0 Offset 0
@@ -1347,11 +1347,11 @@
                               MemberDecorate 30($Global) 7 Offset 80
                               Decorate 30($Global) Block
                               Decorate 32 DescriptorSet 0
-                              Decorate 32 Binding 0
+                              Decorate 32 Binding 5
                               Decorate 47(g_tTex2di4) DescriptorSet 0
-                              Decorate 47(g_tTex2di4) Binding 0
+                              Decorate 47(g_tTex2di4) Binding 3
                               Decorate 63(g_tTex2du4) DescriptorSet 0
-                              Decorate 63(g_tTex2du4) Binding 0
+                              Decorate 63(g_tTex2du4) Binding 4
                               Decorate 363(@entryPointOutput.Color) Location 0
                               Decorate 367(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 370(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
index 2acc975..1fa728a 100644
--- a/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out
@@ -1255,7 +1255,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 389
 
                               Capability Shader
@@ -1323,7 +1323,7 @@
                               Name 385  "g_tTexcdi4a"
                               Name 388  "g_tTexcdu4a"
                               Decorate 16(g_tTex2df4a) DescriptorSet 0
-                              Decorate 16(g_tTex2df4a) Binding 0
+                              Decorate 16(g_tTex2df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               MemberDecorate 30($Global) 0 Offset 0
@@ -1336,11 +1336,11 @@
                               MemberDecorate 30($Global) 7 Offset 80
                               Decorate 30($Global) Block
                               Decorate 32 DescriptorSet 0
-                              Decorate 32 Binding 0
+                              Decorate 32 Binding 4
                               Decorate 47(g_tTex2di4a) DescriptorSet 0
-                              Decorate 47(g_tTex2di4a) Binding 0
+                              Decorate 47(g_tTex2di4a) Binding 2
                               Decorate 63(g_tTex2du4a) DescriptorSet 0
-                              Decorate 63(g_tTex2du4a) Binding 0
+                              Decorate 63(g_tTex2du4a) Binding 3
                               Decorate 363(@entryPointOutput.Color) Location 0
                               Decorate 367(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 370(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out b/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
index 8ad84cd..8f45abc 100644
--- a/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out
@@ -456,7 +456,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 164
 
                               Capability Shader
@@ -507,7 +507,7 @@
                               Name 160  "g_tTexcdi4"
                               Name 163  "g_tTexcdu4"
                               Decorate 16(g_tTex2df4) DescriptorSet 0
-                              Decorate 16(g_tTex2df4) Binding 0
+                              Decorate 16(g_tTex2df4) Binding 2
                               Decorate 20(g_sSampCmp) DescriptorSet 0
                               Decorate 20(g_sSampCmp) Binding 0
                               MemberDecorate 26($Global) 0 Offset 0
@@ -516,11 +516,11 @@
                               MemberDecorate 26($Global) 3 Offset 32
                               Decorate 26($Global) Block
                               Decorate 28 DescriptorSet 0
-                              Decorate 28 Binding 0
+                              Decorate 28 Binding 5
                               Decorate 44(g_tTex2di4) DescriptorSet 0
-                              Decorate 44(g_tTex2di4) Binding 0
+                              Decorate 44(g_tTex2di4) Binding 3
                               Decorate 60(g_tTex2du4) DescriptorSet 0
-                              Decorate 60(g_tTex2du4) Binding 0
+                              Decorate 60(g_tTex2du4) Binding 4
                               Decorate 129(@entryPointOutput.Color) Location 0
                               Decorate 133(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 138(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.frag.out b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
index cf406ed..ba02359 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.frag.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.frag.out
@@ -2318,7 +2318,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 550
 
                               Capability Shader
@@ -2425,57 +2425,57 @@
                               Decorate 17(g_tTex1df4) DescriptorSet 0
                               Decorate 17(g_tTex1df4) Binding 0
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 1
                               Decorate 48(g_tTex1du4) DescriptorSet 0
-                              Decorate 48(g_tTex1du4) Binding 0
+                              Decorate 48(g_tTex1du4) Binding 2
                               Decorate 63(g_tTex1df4a) DescriptorSet 0
-                              Decorate 63(g_tTex1df4a) Binding 0
+                              Decorate 63(g_tTex1df4a) Binding 12
                               Decorate 85(g_tTex1di4a) DescriptorSet 0
-                              Decorate 85(g_tTex1di4a) Binding 0
+                              Decorate 85(g_tTex1di4a) Binding 13
                               Decorate 104(g_tTex1du4a) DescriptorSet 0
-                              Decorate 104(g_tTex1du4a) Binding 0
+                              Decorate 104(g_tTex1du4a) Binding 14
                               Decorate 123(g_tTex2df4) DescriptorSet 0
-                              Decorate 123(g_tTex2df4) Binding 0
+                              Decorate 123(g_tTex2df4) Binding 3
                               Decorate 143(g_tTex2di4) DescriptorSet 0
-                              Decorate 143(g_tTex2di4) Binding 0
+                              Decorate 143(g_tTex2di4) Binding 4
                               Decorate 162(g_tTex2du4) DescriptorSet 0
-                              Decorate 162(g_tTex2du4) Binding 0
+                              Decorate 162(g_tTex2du4) Binding 5
                               Decorate 183(g_tTex2df4a) DescriptorSet 0
-                              Decorate 183(g_tTex2df4a) Binding 0
+                              Decorate 183(g_tTex2df4a) Binding 15
                               Decorate 207(g_tTex2di4a) DescriptorSet 0
-                              Decorate 207(g_tTex2di4a) Binding 0
+                              Decorate 207(g_tTex2di4a) Binding 16
                               Decorate 230(g_tTex2du4a) DescriptorSet 0
-                              Decorate 230(g_tTex2du4a) Binding 0
+                              Decorate 230(g_tTex2du4a) Binding 17
                               Decorate 253(g_tTex3df4) DescriptorSet 0
-                              Decorate 253(g_tTex3df4) Binding 0
+                              Decorate 253(g_tTex3df4) Binding 6
                               Decorate 277(g_tTex3di4) DescriptorSet 0
-                              Decorate 277(g_tTex3di4) Binding 0
+                              Decorate 277(g_tTex3di4) Binding 7
                               Decorate 300(g_tTex3du4) DescriptorSet 0
-                              Decorate 300(g_tTex3du4) Binding 0
+                              Decorate 300(g_tTex3du4) Binding 8
                               Decorate 323(g_tTexcdf4) DescriptorSet 0
-                              Decorate 323(g_tTexcdf4) Binding 0
+                              Decorate 323(g_tTexcdf4) Binding 9
                               Decorate 342(g_tTexcdi4) DescriptorSet 0
-                              Decorate 342(g_tTexcdi4) Binding 0
+                              Decorate 342(g_tTexcdi4) Binding 10
                               Decorate 361(g_tTexcdu4) DescriptorSet 0
-                              Decorate 361(g_tTexcdu4) Binding 0
+                              Decorate 361(g_tTexcdu4) Binding 11
                               Decorate 380(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 380(g_tTexcdf4a) Binding 0
+                              Decorate 380(g_tTexcdf4a) Binding 18
                               Decorate 403(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 403(g_tTexcdi4a) Binding 0
+                              Decorate 403(g_tTexcdi4a) Binding 19
                               Decorate 426(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 426(g_tTexcdu4a) Binding 0
+                              Decorate 426(g_tTexcdu4a) Binding 20
                               Decorate 449(g_tTex2dmsf4) DescriptorSet 0
-                              Decorate 449(g_tTex2dmsf4) Binding 0
+                              Decorate 449(g_tTex2dmsf4) Binding 21
                               Decorate 462(g_tTex2dmsi4) DescriptorSet 0
-                              Decorate 462(g_tTex2dmsi4) Binding 0
+                              Decorate 462(g_tTex2dmsi4) Binding 22
                               Decorate 474(g_tTex2dmsu4) DescriptorSet 0
-                              Decorate 474(g_tTex2dmsu4) Binding 0
+                              Decorate 474(g_tTex2dmsu4) Binding 23
                               Decorate 486(g_tTex2dmsf4a) DescriptorSet 0
-                              Decorate 486(g_tTex2dmsf4a) Binding 0
+                              Decorate 486(g_tTex2dmsf4a) Binding 24
                               Decorate 500(g_tTex2dmsi4a) DescriptorSet 0
-                              Decorate 500(g_tTex2dmsi4a) Binding 0
+                              Decorate 500(g_tTex2dmsi4a) Binding 25
                               Decorate 514(g_tTex2dmsu4a) DescriptorSet 0
-                              Decorate 514(g_tTex2dmsu4a) Binding 0
+                              Decorate 514(g_tTex2dmsu4a) Binding 26
                               Decorate 540(@entryPointOutput.Color) Location 0
                               Decorate 544(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 549(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.getdimensions.dx10.vert.out b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
index 51368b6..d681f7d 100644
--- a/Test/baseResults/hlsl.getdimensions.dx10.vert.out
+++ b/Test/baseResults/hlsl.getdimensions.dx10.vert.out
@@ -116,7 +116,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 48
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out b/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
index d096c38..1cce0cc 100644
--- a/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
+++ b/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out
@@ -718,7 +718,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 232
 
                               Capability Shader
@@ -794,39 +794,39 @@
                               Decorate 17(g_tTex1df4) DescriptorSet 0
                               Decorate 17(g_tTex1df4) Binding 0
                               Decorate 26(g_tTex1di4) DescriptorSet 0
-                              Decorate 26(g_tTex1di4) Binding 0
+                              Decorate 26(g_tTex1di4) Binding 1
                               Decorate 33(g_tTex1du4) DescriptorSet 0
-                              Decorate 33(g_tTex1du4) Binding 0
+                              Decorate 33(g_tTex1du4) Binding 2
                               Decorate 40(g_tBuffF) DescriptorSet 0
-                              Decorate 40(g_tBuffF) Binding 0
+                              Decorate 40(g_tBuffF) Binding 15
                               Decorate 47(g_tBuffI) DescriptorSet 0
-                              Decorate 47(g_tBuffI) Binding 0
+                              Decorate 47(g_tBuffI) Binding 16
                               Decorate 54(g_tBuffU) DescriptorSet 0
-                              Decorate 54(g_tBuffU) Binding 0
+                              Decorate 54(g_tBuffU) Binding 17
                               Decorate 63(g_tTex1df4a) DescriptorSet 0
-                              Decorate 63(g_tTex1df4a) Binding 0
+                              Decorate 63(g_tTex1df4a) Binding 9
                               Decorate 76(g_tTex1di4a) DescriptorSet 0
-                              Decorate 76(g_tTex1di4a) Binding 0
+                              Decorate 76(g_tTex1di4a) Binding 10
                               Decorate 86(g_tTex1du4a) DescriptorSet 0
-                              Decorate 86(g_tTex1du4a) Binding 0
+                              Decorate 86(g_tTex1du4a) Binding 11
                               Decorate 96(g_tTex2df4) DescriptorSet 0
-                              Decorate 96(g_tTex2df4) Binding 0
+                              Decorate 96(g_tTex2df4) Binding 3
                               Decorate 107(g_tTex2di4) DescriptorSet 0
-                              Decorate 107(g_tTex2di4) Binding 0
+                              Decorate 107(g_tTex2di4) Binding 4
                               Decorate 117(g_tTex2du4) DescriptorSet 0
-                              Decorate 117(g_tTex2du4) Binding 0
+                              Decorate 117(g_tTex2du4) Binding 5
                               Decorate 129(g_tTex2df4a) DescriptorSet 0
-                              Decorate 129(g_tTex2df4a) Binding 0
+                              Decorate 129(g_tTex2df4a) Binding 12
                               Decorate 142(g_tTex2di4a) DescriptorSet 0
-                              Decorate 142(g_tTex2di4a) Binding 0
+                              Decorate 142(g_tTex2di4a) Binding 13
                               Decorate 154(g_tTex2du4a) DescriptorSet 0
-                              Decorate 154(g_tTex2du4a) Binding 0
+                              Decorate 154(g_tTex2du4a) Binding 14
                               Decorate 166(g_tTex3df4) DescriptorSet 0
-                              Decorate 166(g_tTex3df4) Binding 0
+                              Decorate 166(g_tTex3df4) Binding 6
                               Decorate 179(g_tTex3di4) DescriptorSet 0
-                              Decorate 179(g_tTex3di4) Binding 0
+                              Decorate 179(g_tTex3di4) Binding 7
                               Decorate 191(g_tTex3du4) DescriptorSet 0
-                              Decorate 191(g_tTex3du4) Binding 0
+                              Decorate 191(g_tTex3du4) Binding 8
                               Decorate 216(@entryPointOutput.Color) Location 0
                               Decorate 220(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 225(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
index 7c46c8e..5c49931 100644
--- a/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
+++ b/Test/baseResults/hlsl.getsampleposition.dx10.frag.out
@@ -580,7 +580,7 @@
 0:?     'sample' (layout( location=0) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 198
 
                               Capability Shader
@@ -620,9 +620,9 @@
                               Name 192  "@entryPointOutput.Depth"
                               Name 197  "g_sSamp"
                               Decorate 23(g_tTex2dmsf4) DescriptorSet 0
-                              Decorate 23(g_tTex2dmsf4) Binding 0
+                              Decorate 23(g_tTex2dmsf4) Binding 1
                               Decorate 131(g_tTex2dmsf4a) DescriptorSet 0
-                              Decorate 131(g_tTex2dmsf4a) Binding 0
+                              Decorate 131(g_tTex2dmsf4a) Binding 2
                               Decorate 181(sample) Flat
                               Decorate 181(sample) Location 0
                               Decorate 188(@entryPointOutput.Color) Location 0
diff --git a/Test/baseResults/hlsl.global-const-init.frag.out b/Test/baseResults/hlsl.global-const-init.frag.out
index 828c0c5..26895bb 100644
--- a/Test/baseResults/hlsl.global-const-init.frag.out
+++ b/Test/baseResults/hlsl.global-const-init.frag.out
@@ -102,7 +102,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.groupid.comp.out b/Test/baseResults/hlsl.groupid.comp.out
index 65804b7..362f4b4 100644
--- a/Test/baseResults/hlsl.groupid.comp.out
+++ b/Test/baseResults/hlsl.groupid.comp.out
@@ -82,7 +82,7 @@
 0:?     'vGroupId' ( in 3-component vector of uint WorkGroupID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.gs-hs-mix.tesc.out b/Test/baseResults/hlsl.gs-hs-mix.tesc.out
index ffa96b1..72070ed 100644
--- a/Test/baseResults/hlsl.gs-hs-mix.tesc.out
+++ b/Test/baseResults/hlsl.gs-hs-mix.tesc.out
@@ -135,19 +135,93 @@
 0:61  Function Definition: HSMain( ( temp void)
 0:61    Function Parameters: 
 0:?     Sequence
-0:61      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      Sequence
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                0 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              0 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              0 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                1 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                1 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                2 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                2 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
 0:61      move second child to first child ( temp uint)
 0:?         'id' ( temp uint)
 0:?         'id' ( in uint InvocationID)
-0:61      move second child to first child ( temp structure{ temp 3-component vector of float PositionWS})
-0:61        indirect index (layout( location=0) out structure{ temp 3-component vector of float PositionWS})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
-0:?           'id' ( in uint InvocationID)
-0:61        Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
-0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?           'id' ( temp uint)
+0:61      Sequence
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.PositionWS' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'id' ( in uint InvocationID)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'id' ( temp uint)
+0:61            Constant:
+0:61              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -207,13 +281,31 @@
 0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
 0:?                 Constant:
 0:?                   1 (const int)
-0:?             move second child to first child ( temp 3-element array of 3-component vector of float)
-0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
-0:?                 '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[0]' (layout( location=1) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
 0:?                 Constant:
 0:?                   0 (const int)
-0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
-0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[1]' (layout( location=2) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[2]' (layout( location=3) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
 0:?                 Constant:
 0:?                   2 (const int)
 0:84  Function Definition: GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41; ( temp void)
@@ -388,12 +480,15 @@
 0:118        0.000000
 0:?   Linker Objects
 0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
-0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     '@entryPointOutput.PositionWS' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:?     'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'id' ( in uint InvocationID)
 0:?     '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?     '@patchConstantOutput.NormalWS[0]' (layout( location=1) patch out 3-component vector of float)
+0:?     '@patchConstantOutput.NormalWS[1]' (layout( location=2) patch out 3-component vector of float)
+0:?     '@patchConstantOutput.NormalWS[2]' (layout( location=3) patch out 3-component vector of float)
 
 
 Linked tessellation control stage:
@@ -535,19 +630,93 @@
 0:61  Function Definition: HSMain( ( temp void)
 0:61    Function Parameters: 
 0:?     Sequence
-0:61      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?         'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?         'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61      Sequence
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                0 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              0 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                0 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              0 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                1 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                1 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              1 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                2 (const int)
+0:61            Constant:
+0:61              0 (const int)
+0:61          direct index (layout( location=0) in 3-component vector of float)
+0:?             'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          NormalWS: direct index for structure ( temp 3-component vector of float)
+0:61            direct index ( temp structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:61              Constant:
+0:61                2 (const int)
+0:61            Constant:
+0:61              1 (const int)
+0:61          direct index (layout( location=1) in 3-component vector of float)
+0:?             'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
+0:61            Constant:
+0:61              2 (const int)
 0:61      move second child to first child ( temp uint)
 0:?         'id' ( temp uint)
 0:?         'id' ( in uint InvocationID)
-0:61      move second child to first child ( temp structure{ temp 3-component vector of float PositionWS})
-0:61        indirect index (layout( location=0) out structure{ temp 3-component vector of float PositionWS})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
-0:?           'id' ( in uint InvocationID)
-0:61        Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
-0:?           'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
-0:?           'id' ( temp uint)
+0:61      Sequence
+0:61        move second child to first child ( temp 3-component vector of float)
+0:61          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.PositionWS' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'id' ( in uint InvocationID)
+0:61          PositionWS: direct index for structure ( temp 3-component vector of float)
+0:61            Function Call: @HSMain(struct-HSInput-vf3-vf31[3];u1; ( temp structure{ temp 3-component vector of float PositionWS})
+0:?               'patch' ( temp 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?               'id' ( temp uint)
+0:61            Constant:
+0:61              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -607,13 +776,31 @@
 0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
 0:?                 Constant:
 0:?                   1 (const int)
-0:?             move second child to first child ( temp 3-element array of 3-component vector of float)
-0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
-0:?                 '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[0]' (layout( location=1) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
 0:?                 Constant:
 0:?                   0 (const int)
-0:?               NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
-0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[1]' (layout( location=2) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp 3-component vector of float)
+0:?               '@patchConstantOutput.NormalWS[2]' (layout( location=3) patch out 3-component vector of float)
+0:?               direct index ( temp 3-component vector of float)
+0:?                 NormalWS: direct index for structure ( temp 3-element array of 3-component vector of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float EdgeTessFactor,  temp float InsideTessFactor,  temp 3-element array of 3-component vector of float NormalWS})
+0:?                   Constant:
+0:?                     2 (const int)
 0:?                 Constant:
 0:?                   2 (const int)
 0:84  Function Definition: GSMain(struct-GSVertexInput-vf3-vf31[3];struct-GSVertexOutput-vf41; ( temp void)
@@ -788,21 +975,24 @@
 0:118        0.000000
 0:?   Linker Objects
 0:?     'anon@0' (layout( binding=0 row_major std140) uniform block{layout( row_major std140) uniform 4X4 matrix of float model_view_matrix, layout( row_major std140) uniform 4X4 matrix of float proj_matrix, layout( row_major std140) uniform 4X4 matrix of float model_view_proj_matrix, layout( row_major std140) uniform 3X3 matrix of float normal_matrix, layout( row_major std140) uniform 3-component vector of float color, layout( row_major std140) uniform 3-component vector of float view_dir, layout( row_major std140) uniform 3-component vector of float tess_factor})
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float PositionWS})
-0:?     'patch' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float PositionWS,  temp 3-component vector of float NormalWS})
+0:?     '@entryPointOutput.PositionWS' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'patch.PositionWS' (layout( location=0) in 3-element array of 3-component vector of float)
+0:?     'patch.NormalWS' (layout( location=1) in 3-element array of 3-component vector of float)
 0:?     'id' ( in uint InvocationID)
 0:?     '@patchConstantOutput.EdgeTessFactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.InsideTessFactor' ( patch out 2-element array of float TessLevelInner)
-0:?     '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS})
+0:?     '@patchConstantOutput.NormalWS[0]' (layout( location=1) patch out 3-component vector of float)
+0:?     '@patchConstantOutput.NormalWS[1]' (layout( location=2) patch out 3-component vector of float)
+0:?     '@patchConstantOutput.NormalWS[2]' (layout( location=3) patch out 3-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 216
+// Generated by (magic number): 8000a
+// Id's are bound by 236
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "HSMain" 97 101 105 126 139 145
+                              EntryPoint TessellationControl 4  "HSMain" 97 102 120 123 145 158 162 165 168
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -846,26 +1036,27 @@
                               Name 56  "result"
                               Name 87  "output"
                               Name 95  "patch"
-                              Name 97  "patch"
-                              Name 99  "id"
-                              Name 101  "id"
-                              Name 105  "@entryPointOutput"
-                              Name 107  "param"
-                              Name 109  "param"
-                              Name 120  "@patchConstantResult"
-                              Name 121  "param"
-                              Name 126  "@patchConstantOutput.EdgeTessFactor"
-                              Name 139  "@patchConstantOutput.InsideTessFactor"
-                              Name 143  "HSTrianglePatchConstant"
-                              MemberName 143(HSTrianglePatchConstant) 0  "NormalWS"
-                              Name 145  "@patchConstantOutput"
-                              Name 151  "P0"
-                              Name 154  "P1"
-                              Name 157  "P2"
-                              Name 174  "Q0"
-                              Name 184  "Q1"
-                              Name 193  "Q2"
-                              Name 202  "vertex"
+                              Name 97  "patch.PositionWS"
+                              Name 102  "patch.NormalWS"
+                              Name 118  "id"
+                              Name 120  "id"
+                              Name 123  "@entryPointOutput.PositionWS"
+                              Name 125  "param"
+                              Name 127  "param"
+                              Name 139  "@patchConstantResult"
+                              Name 140  "param"
+                              Name 145  "@patchConstantOutput.EdgeTessFactor"
+                              Name 158  "@patchConstantOutput.InsideTessFactor"
+                              Name 162  "@patchConstantOutput.NormalWS[0]"
+                              Name 165  "@patchConstantOutput.NormalWS[1]"
+                              Name 168  "@patchConstantOutput.NormalWS[2]"
+                              Name 171  "P0"
+                              Name 174  "P1"
+                              Name 177  "P2"
+                              Name 194  "Q0"
+                              Name 204  "Q1"
+                              Name 213  "Q2"
+                              Name 222  "vertex"
                               MemberDecorate 42(UniformBlock0) 0 RowMajor
                               MemberDecorate 42(UniformBlock0) 0 Offset 0
                               MemberDecorate 42(UniformBlock0) 0 MatrixStride 16
@@ -884,16 +1075,20 @@
                               Decorate 42(UniformBlock0) Block
                               Decorate 44 DescriptorSet 0
                               Decorate 44 Binding 0
-                              Decorate 97(patch) Location 0
-                              Decorate 101(id) BuiltIn InvocationId
-                              Decorate 105(@entryPointOutput) Location 0
-                              Decorate 126(@patchConstantOutput.EdgeTessFactor) Patch
-                              Decorate 126(@patchConstantOutput.EdgeTessFactor) BuiltIn TessLevelOuter
-                              Decorate 139(@patchConstantOutput.InsideTessFactor) Patch
-                              Decorate 139(@patchConstantOutput.InsideTessFactor) BuiltIn TessLevelInner
-                              MemberDecorate 143(HSTrianglePatchConstant) 0 Patch
-                              Decorate 145(@patchConstantOutput) Patch
-                              Decorate 145(@patchConstantOutput) Location 1
+                              Decorate 97(patch.PositionWS) Location 0
+                              Decorate 102(patch.NormalWS) Location 1
+                              Decorate 120(id) BuiltIn InvocationId
+                              Decorate 123(@entryPointOutput.PositionWS) Location 0
+                              Decorate 145(@patchConstantOutput.EdgeTessFactor) Patch
+                              Decorate 145(@patchConstantOutput.EdgeTessFactor) BuiltIn TessLevelOuter
+                              Decorate 158(@patchConstantOutput.InsideTessFactor) Patch
+                              Decorate 158(@patchConstantOutput.InsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 162(@patchConstantOutput.NormalWS[0]) Patch
+                              Decorate 162(@patchConstantOutput.NormalWS[0]) Location 1
+                              Decorate 165(@patchConstantOutput.NormalWS[1]) Patch
+                              Decorate 165(@patchConstantOutput.NormalWS[1]) Location 2
+                              Decorate 168(@patchConstantOutput.NormalWS[2]) Patch
+                              Decorate 168(@patchConstantOutput.NormalWS[2]) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -937,84 +1132,111 @@
               67:     45(int) Constant 2
               68:      9(int) Constant 2
               86:             TypePointer Function 21(HSOutput)
-              96:             TypePointer Input 11
-       97(patch):     96(ptr) Variable Input
-             100:             TypePointer Input 9(int)
-         101(id):    100(ptr) Variable Input
-             103:             TypeArray 21(HSOutput) 10
-             104:             TypePointer Output 103
-105(@entryPointOutput):    104(ptr) Variable Output
-             112:             TypePointer Output 21(HSOutput)
-             114:      9(int) Constant 4
-             116:             TypeBool
-             124:             TypeArray 6(float) 114
-             125:             TypePointer Output 124
-126(@patchConstantOutput.EdgeTessFactor):    125(ptr) Variable Output
-             129:             TypePointer Output 6(float)
-             137:             TypeArray 6(float) 68
-             138:             TypePointer Output 137
-139(@patchConstantOutput.InsideTessFactor):    138(ptr) Variable Output
-143(HSTrianglePatchConstant):             TypeStruct 14
-             144:             TypePointer Output 143(HSTrianglePatchConstant)
-145(@patchConstantOutput):    144(ptr) Variable Output
-             146:             TypePointer Function 14
-             149:             TypePointer Output 14
-             160:    6(float) Constant 981668463
-             173:             TypePointer Function 30(fvec4)
-             180:             TypePointer Uniform 40
-             205:    6(float) Constant 0
+              96:             TypePointer Input 14
+97(patch.PositionWS):     96(ptr) Variable Input
+              98:             TypePointer Input 7(fvec3)
+102(patch.NormalWS):     96(ptr) Variable Input
+             119:             TypePointer Input 9(int)
+         120(id):    119(ptr) Variable Input
+             122:             TypePointer Output 14
+123(@entryPointOutput.PositionWS):    122(ptr) Variable Output
+             131:             TypePointer Output 7(fvec3)
+             133:      9(int) Constant 4
+             135:             TypeBool
+             143:             TypeArray 6(float) 133
+             144:             TypePointer Output 143
+145(@patchConstantOutput.EdgeTessFactor):    144(ptr) Variable Output
+             148:             TypePointer Output 6(float)
+             156:             TypeArray 6(float) 68
+             157:             TypePointer Output 156
+158(@patchConstantOutput.InsideTessFactor):    157(ptr) Variable Output
+162(@patchConstantOutput.NormalWS[0]):    131(ptr) Variable Output
+165(@patchConstantOutput.NormalWS[1]):    131(ptr) Variable Output
+168(@patchConstantOutput.NormalWS[2]):    131(ptr) Variable Output
+             180:    6(float) Constant 981668463
+             193:             TypePointer Function 30(fvec4)
+             200:             TypePointer Uniform 40
+             225:    6(float) Constant 0
        4(HSMain):           2 Function None 3
                5:             Label
        95(patch):     12(ptr) Variable Function
-          99(id):     20(ptr) Variable Function
-      107(param):     12(ptr) Variable Function
-      109(param):     20(ptr) Variable Function
-120(@patchConstantResult):     55(ptr) Variable Function
-      121(param):     12(ptr) Variable Function
-              98:          11 Load 97(patch)
-                              Store 95(patch) 98
-             102:      9(int) Load 101(id)
-                              Store 99(id) 102
-             106:      9(int) Load 101(id)
-             108:          11 Load 95(patch)
-                              Store 107(param) 108
-             110:      9(int) Load 99(id)
-                              Store 109(param) 110
-             111:21(HSOutput) FunctionCall 25(@HSMain(struct-HSInput-vf3-vf31[3];u1;) 107(param) 109(param)
-             113:    112(ptr) AccessChain 105(@entryPointOutput) 106
-                              Store 113 111
-                              ControlBarrier 68 114 58
-             115:      9(int) Load 101(id)
-             117:   116(bool) IEqual 115 57
-                              SelectionMerge 119 None
-                              BranchConditional 117 118 119
-             118:               Label
-             122:          11   Load 95(patch)
-                                Store 121(param) 122
-             123:15(HSTrianglePatchConstant)   FunctionCall 18(HSPatchConstant(struct-HSInput-vf3-vf31[3];) 121(param)
-                                Store 120(@patchConstantResult) 123
-             127:     50(ptr)   AccessChain 120(@patchConstantResult) 57 57
-             128:    6(float)   Load 127
-             130:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 57
-                                Store 130 128
-             131:     50(ptr)   AccessChain 120(@patchConstantResult) 57 62
-             132:    6(float)   Load 131
-             133:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 62
-                                Store 133 132
-             134:     50(ptr)   AccessChain 120(@patchConstantResult) 57 67
-             135:    6(float)   Load 134
-             136:    129(ptr)   AccessChain 126(@patchConstantOutput.EdgeTessFactor) 67
-                                Store 136 135
-             140:     50(ptr)   AccessChain 120(@patchConstantResult) 62
-             141:    6(float)   Load 140
-             142:    129(ptr)   AccessChain 139(@patchConstantOutput.InsideTessFactor) 57
-                                Store 142 141
-             147:    146(ptr)   AccessChain 120(@patchConstantResult) 67
-             148:          14   Load 147
-             150:    149(ptr)   AccessChain 145(@patchConstantOutput) 57
-                                Store 150 148
-                                Branch 119
-             119:             Label
+         118(id):     20(ptr) Variable Function
+      125(param):     12(ptr) Variable Function
+      127(param):     20(ptr) Variable Function
+139(@patchConstantResult):     55(ptr) Variable Function
+      140(param):     12(ptr) Variable Function
+              99:     98(ptr) AccessChain 97(patch.PositionWS) 57
+             100:    7(fvec3) Load 99
+             101:     38(ptr) AccessChain 95(patch) 57 57
+                              Store 101 100
+             103:     98(ptr) AccessChain 102(patch.NormalWS) 57
+             104:    7(fvec3) Load 103
+             105:     38(ptr) AccessChain 95(patch) 57 62
+                              Store 105 104
+             106:     98(ptr) AccessChain 97(patch.PositionWS) 62
+             107:    7(fvec3) Load 106
+             108:     38(ptr) AccessChain 95(patch) 62 57
+                              Store 108 107
+             109:     98(ptr) AccessChain 102(patch.NormalWS) 62
+             110:    7(fvec3) Load 109
+             111:     38(ptr) AccessChain 95(patch) 62 62
+                              Store 111 110
+             112:     98(ptr) AccessChain 97(patch.PositionWS) 67
+             113:    7(fvec3) Load 112
+             114:     38(ptr) AccessChain 95(patch) 67 57
+                              Store 114 113
+             115:     98(ptr) AccessChain 102(patch.NormalWS) 67
+             116:    7(fvec3) Load 115
+             117:     38(ptr) AccessChain 95(patch) 67 62
+                              Store 117 116
+             121:      9(int) Load 120(id)
+                              Store 118(id) 121
+             124:      9(int) Load 120(id)
+             126:          11 Load 95(patch)
+                              Store 125(param) 126
+             128:      9(int) Load 118(id)
+                              Store 127(param) 128
+             129:21(HSOutput) FunctionCall 25(@HSMain(struct-HSInput-vf3-vf31[3];u1;) 125(param) 127(param)
+             130:    7(fvec3) CompositeExtract 129 0
+             132:    131(ptr) AccessChain 123(@entryPointOutput.PositionWS) 124
+                              Store 132 130
+                              ControlBarrier 68 133 58
+             134:      9(int) Load 120(id)
+             136:   135(bool) IEqual 134 57
+                              SelectionMerge 138 None
+                              BranchConditional 136 137 138
+             137:               Label
+             141:          11   Load 95(patch)
+                                Store 140(param) 141
+             142:15(HSTrianglePatchConstant)   FunctionCall 18(HSPatchConstant(struct-HSInput-vf3-vf31[3];) 140(param)
+                                Store 139(@patchConstantResult) 142
+             146:     50(ptr)   AccessChain 139(@patchConstantResult) 57 57
+             147:    6(float)   Load 146
+             149:    148(ptr)   AccessChain 145(@patchConstantOutput.EdgeTessFactor) 57
+                                Store 149 147
+             150:     50(ptr)   AccessChain 139(@patchConstantResult) 57 62
+             151:    6(float)   Load 150
+             152:    148(ptr)   AccessChain 145(@patchConstantOutput.EdgeTessFactor) 62
+                                Store 152 151
+             153:     50(ptr)   AccessChain 139(@patchConstantResult) 57 67
+             154:    6(float)   Load 153
+             155:    148(ptr)   AccessChain 145(@patchConstantOutput.EdgeTessFactor) 67
+                                Store 155 154
+             159:     50(ptr)   AccessChain 139(@patchConstantResult) 62
+             160:    6(float)   Load 159
+             161:    148(ptr)   AccessChain 158(@patchConstantOutput.InsideTessFactor) 57
+                                Store 161 160
+             163:     38(ptr)   AccessChain 139(@patchConstantResult) 67 57
+             164:    7(fvec3)   Load 163
+                                Store 162(@patchConstantOutput.NormalWS[0]) 164
+             166:     38(ptr)   AccessChain 139(@patchConstantResult) 67 62
+             167:    7(fvec3)   Load 166
+                                Store 165(@patchConstantOutput.NormalWS[1]) 167
+             169:     38(ptr)   AccessChain 139(@patchConstantResult) 67 67
+             170:    7(fvec3)   Load 169
+                                Store 168(@patchConstantOutput.NormalWS[2]) 170
+                                Branch 138
+             138:             Label
                               Return
                               FunctionEnd
 18(HSPatchConstant(struct-HSInput-vf3-vf31[3];):15(HSTrianglePatchConstant) Function None 16
@@ -1076,81 +1298,81 @@
        34(input):     29(ptr) FunctionParameter
       35(output):     32(ptr) FunctionParameter
               37:             Label
-         151(P0):     38(ptr) Variable Function
-         154(P1):     38(ptr) Variable Function
-         157(P2):     38(ptr) Variable Function
-         174(Q0):    173(ptr) Variable Function
-         184(Q1):    173(ptr) Variable Function
-         193(Q2):    173(ptr) Variable Function
-     202(vertex):     32(ptr) Variable Function
-             152:     38(ptr) AccessChain 34(input) 57 57
-             153:    7(fvec3) Load 152
-                              Store 151(P0) 153
-             155:     38(ptr) AccessChain 34(input) 62 57
-             156:    7(fvec3) Load 155
-                              Store 154(P1) 156
-             158:     38(ptr) AccessChain 34(input) 67 57
-             159:    7(fvec3) Load 158
-                              Store 157(P2) 159
-             161:     50(ptr) AccessChain 151(P0) 68
-             162:    6(float) Load 161
-             163:    6(float) FAdd 162 160
-             164:     50(ptr) AccessChain 151(P0) 68
-                              Store 164 163
-             165:     50(ptr) AccessChain 154(P1) 68
-             166:    6(float) Load 165
-             167:    6(float) FAdd 166 160
-             168:     50(ptr) AccessChain 154(P1) 68
-                              Store 168 167
-             169:     50(ptr) AccessChain 157(P2) 68
-             170:    6(float) Load 169
-             171:    6(float) FAdd 170 160
-             172:     50(ptr) AccessChain 157(P2) 68
-                              Store 172 171
-             175:    7(fvec3) Load 151(P0)
-             176:    6(float) CompositeExtract 175 0
-             177:    6(float) CompositeExtract 175 1
-             178:    6(float) CompositeExtract 175 2
-             179:   30(fvec4) CompositeConstruct 176 177 178 54
-             181:    180(ptr) AccessChain 44 62
-             182:          40 Load 181
-             183:   30(fvec4) VectorTimesMatrix 179 182
-                              Store 174(Q0) 183
-             185:    7(fvec3) Load 154(P1)
-             186:    6(float) CompositeExtract 185 0
-             187:    6(float) CompositeExtract 185 1
-             188:    6(float) CompositeExtract 185 2
-             189:   30(fvec4) CompositeConstruct 186 187 188 54
-             190:    180(ptr) AccessChain 44 62
-             191:          40 Load 190
-             192:   30(fvec4) VectorTimesMatrix 189 191
-                              Store 184(Q1) 192
-             194:    7(fvec3) Load 157(P2)
-             195:    6(float) CompositeExtract 194 0
-             196:    6(float) CompositeExtract 194 1
-             197:    6(float) CompositeExtract 194 2
-             198:   30(fvec4) CompositeConstruct 195 196 197 54
-             199:    180(ptr) AccessChain 44 62
-             200:          40 Load 199
-             201:   30(fvec4) VectorTimesMatrix 198 200
-                              Store 193(Q2) 201
-             203:   30(fvec4) Load 174(Q0)
-             204:    173(ptr) AccessChain 202(vertex) 57
-                              Store 204 203
-             206:   30(fvec4) Load 184(Q1)
-             207:    173(ptr) AccessChain 202(vertex) 57
-                              Store 207 206
-             208:   30(fvec4) Load 184(Q1)
-             209:    173(ptr) AccessChain 202(vertex) 57
-                              Store 209 208
-             210:   30(fvec4) Load 193(Q2)
-             211:    173(ptr) AccessChain 202(vertex) 57
-                              Store 211 210
-             212:   30(fvec4) Load 193(Q2)
-             213:    173(ptr) AccessChain 202(vertex) 57
-                              Store 213 212
-             214:   30(fvec4) Load 174(Q0)
-             215:    173(ptr) AccessChain 202(vertex) 57
-                              Store 215 214
+         171(P0):     38(ptr) Variable Function
+         174(P1):     38(ptr) Variable Function
+         177(P2):     38(ptr) Variable Function
+         194(Q0):    193(ptr) Variable Function
+         204(Q1):    193(ptr) Variable Function
+         213(Q2):    193(ptr) Variable Function
+     222(vertex):     32(ptr) Variable Function
+             172:     38(ptr) AccessChain 34(input) 57 57
+             173:    7(fvec3) Load 172
+                              Store 171(P0) 173
+             175:     38(ptr) AccessChain 34(input) 62 57
+             176:    7(fvec3) Load 175
+                              Store 174(P1) 176
+             178:     38(ptr) AccessChain 34(input) 67 57
+             179:    7(fvec3) Load 178
+                              Store 177(P2) 179
+             181:     50(ptr) AccessChain 171(P0) 68
+             182:    6(float) Load 181
+             183:    6(float) FAdd 182 180
+             184:     50(ptr) AccessChain 171(P0) 68
+                              Store 184 183
+             185:     50(ptr) AccessChain 174(P1) 68
+             186:    6(float) Load 185
+             187:    6(float) FAdd 186 180
+             188:     50(ptr) AccessChain 174(P1) 68
+                              Store 188 187
+             189:     50(ptr) AccessChain 177(P2) 68
+             190:    6(float) Load 189
+             191:    6(float) FAdd 190 180
+             192:     50(ptr) AccessChain 177(P2) 68
+                              Store 192 191
+             195:    7(fvec3) Load 171(P0)
+             196:    6(float) CompositeExtract 195 0
+             197:    6(float) CompositeExtract 195 1
+             198:    6(float) CompositeExtract 195 2
+             199:   30(fvec4) CompositeConstruct 196 197 198 54
+             201:    200(ptr) AccessChain 44 62
+             202:          40 Load 201
+             203:   30(fvec4) VectorTimesMatrix 199 202
+                              Store 194(Q0) 203
+             205:    7(fvec3) Load 174(P1)
+             206:    6(float) CompositeExtract 205 0
+             207:    6(float) CompositeExtract 205 1
+             208:    6(float) CompositeExtract 205 2
+             209:   30(fvec4) CompositeConstruct 206 207 208 54
+             210:    200(ptr) AccessChain 44 62
+             211:          40 Load 210
+             212:   30(fvec4) VectorTimesMatrix 209 211
+                              Store 204(Q1) 212
+             214:    7(fvec3) Load 177(P2)
+             215:    6(float) CompositeExtract 214 0
+             216:    6(float) CompositeExtract 214 1
+             217:    6(float) CompositeExtract 214 2
+             218:   30(fvec4) CompositeConstruct 215 216 217 54
+             219:    200(ptr) AccessChain 44 62
+             220:          40 Load 219
+             221:   30(fvec4) VectorTimesMatrix 218 220
+                              Store 213(Q2) 221
+             223:   30(fvec4) Load 194(Q0)
+             224:    193(ptr) AccessChain 222(vertex) 57
+                              Store 224 223
+             226:   30(fvec4) Load 204(Q1)
+             227:    193(ptr) AccessChain 222(vertex) 57
+                              Store 227 226
+             228:   30(fvec4) Load 204(Q1)
+             229:    193(ptr) AccessChain 222(vertex) 57
+                              Store 229 228
+             230:   30(fvec4) Load 213(Q2)
+             231:    193(ptr) AccessChain 222(vertex) 57
+                              Store 231 230
+             232:   30(fvec4) Load 213(Q2)
+             233:    193(ptr) AccessChain 222(vertex) 57
+                              Store 233 232
+             234:   30(fvec4) Load 194(Q0)
+             235:    193(ptr) AccessChain 222(vertex) 57
+                              Store 235 234
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hlslOffset.vert.out b/Test/baseResults/hlsl.hlslOffset.vert.out
index 099318c..09545c8 100644
--- a/Test/baseResults/hlsl.hlslOffset.vert.out
+++ b/Test/baseResults/hlsl.hlslOffset.vert.out
@@ -26,7 +26,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float m0, layout( row_major std140) uniform 3-component vector of float m4, layout( row_major std140) uniform float m16, layout( row_major std140 offset=20) uniform 3-component vector of float m20, layout( row_major std140 offset=36) uniform 3-component vector of float m36, layout( row_major std140 offset=56) uniform 2-component vector of float m56, layout( row_major std140) uniform float m64, layout( row_major std140) uniform 2-component vector of float m68, layout( row_major std140) uniform float m76, layout( row_major std140) uniform float m80, layout( row_major std140) uniform 1-element array of 2-component vector of float m96})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.hull.1.tesc.out b/Test/baseResults/hlsl.hull.1.tesc.out
index ca4417d..cba0f8b 100644
--- a/Test/baseResults/hlsl.hull.1.tesc.out
+++ b/Test/baseResults/hlsl.hull.1.tesc.out
@@ -25,19 +25,69 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
 0:26      move second child to first child ( temp uint)
 0:?         'm_cpid' ( temp uint)
 0:?         'm_cpid' ( in uint InvocationID)
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'm_cpid' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'm_cpid' ( temp uint)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'm_cpid' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?               'm_cpid' ( temp uint)
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -103,8 +153,8 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'm_cpid' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
@@ -139,19 +189,69 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
 0:26      move second child to first child ( temp uint)
 0:?         'm_cpid' ( temp uint)
 0:?         'm_cpid' ( in uint InvocationID)
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'm_cpid' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'm_cpid' ( temp uint)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'm_cpid' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4];u1; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?               'm_cpid' ( temp uint)
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -217,20 +317,20 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'm_cpid' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 89
+// Generated by (magic number): 8000a
+// Id's are bound by 104
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 40 44 48 65 71
+                              EntryPoint TessellationControl 4  "main" 41 60 63 81 87
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 Isolines
                               ExecutionMode 4 SpacingEqual
@@ -249,23 +349,23 @@
                               Name 24  "pid"
                               Name 28  "output"
                               Name 38  "ip"
-                              Name 40  "ip"
-                              Name 42  "m_cpid"
-                              Name 44  "m_cpid"
-                              Name 48  "@entryPointOutput"
-                              Name 50  "param"
-                              Name 52  "param"
-                              Name 64  "@patchConstantResult"
-                              Name 65  "pid"
-                              Name 66  "param"
-                              Name 71  "@patchConstantOutput.edges"
-                              Name 81  "output"
-                              Decorate 40(ip) Location 0
-                              Decorate 44(m_cpid) BuiltIn InvocationId
-                              Decorate 48(@entryPointOutput) Location 0
-                              Decorate 65(pid) BuiltIn PrimitiveId
-                              Decorate 71(@patchConstantOutput.edges) Patch
-                              Decorate 71(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+                              Name 41  "ip.cpoint"
+                              Name 58  "m_cpid"
+                              Name 60  "m_cpid"
+                              Name 63  "@entryPointOutput.cpoint"
+                              Name 65  "param"
+                              Name 67  "param"
+                              Name 80  "@patchConstantResult"
+                              Name 81  "pid"
+                              Name 82  "param"
+                              Name 87  "@patchConstantOutput.edges"
+                              Name 96  "output"
+                              Decorate 41(ip.cpoint) Location 0
+                              Decorate 60(m_cpid) BuiltIn InvocationId
+                              Decorate 63(@entryPointOutput.cpoint) Location 0
+                              Decorate 81(pid) BuiltIn PrimitiveId
+                              Decorate 87(@patchConstantOutput.edges) Patch
+                              Decorate 87(@patchConstantOutput.edges) BuiltIn TessLevelOuter
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -286,66 +386,84 @@
               29:             TypeInt 32 1
               30:     29(int) Constant 0
               31:             TypePointer Function 7(fvec3)
-              39:             TypePointer Input 11
-          40(ip):     39(ptr) Variable Input
-              43:             TypePointer Input 9(int)
-      44(m_cpid):     43(ptr) Variable Input
-              46:             TypeArray 14(HS_OUT) 10
-              47:             TypePointer Output 46
-48(@entryPointOutput):     47(ptr) Variable Output
-              55:             TypePointer Output 14(HS_OUT)
-              57:      9(int) Constant 0
-              59:             TypeBool
-              63:             TypePointer Function 22(HS_CONSTANT_OUT)
-         65(pid):     43(ptr) Variable Input
-              69:             TypeArray 6(float) 10
-              70:             TypePointer Output 69
-71(@patchConstantOutput.edges):     70(ptr) Variable Output
-              72:             TypePointer Function 6(float)
-              75:             TypePointer Output 6(float)
-              77:     29(int) Constant 1
-              82:    6(float) Constant 1073741824
-              84:    6(float) Constant 1090519040
+              39:             TypeArray 7(fvec3) 10
+              40:             TypePointer Input 39
+   41(ip.cpoint):     40(ptr) Variable Input
+              42:             TypePointer Input 7(fvec3)
+              46:     29(int) Constant 1
+              50:     29(int) Constant 2
+              54:     29(int) Constant 3
+              59:             TypePointer Input 9(int)
+      60(m_cpid):     59(ptr) Variable Input
+              62:             TypePointer Output 39
+63(@entryPointOutput.cpoint):     62(ptr) Variable Output
+              71:             TypePointer Output 7(fvec3)
+              73:      9(int) Constant 0
+              75:             TypeBool
+              79:             TypePointer Function 22(HS_CONSTANT_OUT)
+         81(pid):     59(ptr) Variable Input
+              85:             TypeArray 6(float) 10
+              86:             TypePointer Output 85
+87(@patchConstantOutput.edges):     86(ptr) Variable Output
+              88:             TypePointer Function 6(float)
+              91:             TypePointer Output 6(float)
+              97:    6(float) Constant 1073741824
+              99:    6(float) Constant 1090519040
          4(main):           2 Function None 3
                5:             Label
           38(ip):     12(ptr) Variable Function
-      42(m_cpid):     13(ptr) Variable Function
-       50(param):     12(ptr) Variable Function
-       52(param):     13(ptr) Variable Function
-64(@patchConstantResult):     63(ptr) Variable Function
-       66(param):     13(ptr) Variable Function
-              41:          11 Load 40(ip)
-                              Store 38(ip) 41
-              45:      9(int) Load 44(m_cpid)
-                              Store 42(m_cpid) 45
-              49:      9(int) Load 44(m_cpid)
-              51:          11 Load 38(ip)
-                              Store 50(param) 51
-              53:      9(int) Load 42(m_cpid)
-                              Store 52(param) 53
-              54:  14(HS_OUT) FunctionCall 18(@main(struct-VS_OUT-vf31[4];u1;) 50(param) 52(param)
-              56:     55(ptr) AccessChain 48(@entryPointOutput) 49
-                              Store 56 54
-                              ControlBarrier 20 10 57
-              58:      9(int) Load 44(m_cpid)
-              60:    59(bool) IEqual 58 30
-                              SelectionMerge 62 None
-                              BranchConditional 60 61 62
-              61:               Label
-              67:      9(int)   Load 65(pid)
-                                Store 66(param) 67
-              68:22(HS_CONSTANT_OUT)   FunctionCall 25(PCF(u1;) 66(param)
-                                Store 64(@patchConstantResult) 68
-              73:     72(ptr)   AccessChain 64(@patchConstantResult) 30 30
-              74:    6(float)   Load 73
-              76:     75(ptr)   AccessChain 71(@patchConstantOutput.edges) 30
-                                Store 76 74
-              78:     72(ptr)   AccessChain 64(@patchConstantResult) 30 77
-              79:    6(float)   Load 78
-              80:     75(ptr)   AccessChain 71(@patchConstantOutput.edges) 77
-                                Store 80 79
-                                Branch 62
-              62:             Label
+      58(m_cpid):     13(ptr) Variable Function
+       65(param):     12(ptr) Variable Function
+       67(param):     13(ptr) Variable Function
+80(@patchConstantResult):     79(ptr) Variable Function
+       82(param):     13(ptr) Variable Function
+              43:     42(ptr) AccessChain 41(ip.cpoint) 30
+              44:    7(fvec3) Load 43
+              45:     31(ptr) AccessChain 38(ip) 30 30
+                              Store 45 44
+              47:     42(ptr) AccessChain 41(ip.cpoint) 46
+              48:    7(fvec3) Load 47
+              49:     31(ptr) AccessChain 38(ip) 46 30
+                              Store 49 48
+              51:     42(ptr) AccessChain 41(ip.cpoint) 50
+              52:    7(fvec3) Load 51
+              53:     31(ptr) AccessChain 38(ip) 50 30
+                              Store 53 52
+              55:     42(ptr) AccessChain 41(ip.cpoint) 54
+              56:    7(fvec3) Load 55
+              57:     31(ptr) AccessChain 38(ip) 54 30
+                              Store 57 56
+              61:      9(int) Load 60(m_cpid)
+                              Store 58(m_cpid) 61
+              64:      9(int) Load 60(m_cpid)
+              66:          11 Load 38(ip)
+                              Store 65(param) 66
+              68:      9(int) Load 58(m_cpid)
+                              Store 67(param) 68
+              69:  14(HS_OUT) FunctionCall 18(@main(struct-VS_OUT-vf31[4];u1;) 65(param) 67(param)
+              70:    7(fvec3) CompositeExtract 69 0
+              72:     71(ptr) AccessChain 63(@entryPointOutput.cpoint) 64
+                              Store 72 70
+                              ControlBarrier 20 10 73
+              74:      9(int) Load 60(m_cpid)
+              76:    75(bool) IEqual 74 30
+                              SelectionMerge 78 None
+                              BranchConditional 76 77 78
+              77:               Label
+              83:      9(int)   Load 81(pid)
+                                Store 82(param) 83
+              84:22(HS_CONSTANT_OUT)   FunctionCall 25(PCF(u1;) 82(param)
+                                Store 80(@patchConstantResult) 84
+              89:     88(ptr)   AccessChain 80(@patchConstantResult) 30 30
+              90:    6(float)   Load 89
+              92:     91(ptr)   AccessChain 87(@patchConstantOutput.edges) 30
+                                Store 92 90
+              93:     88(ptr)   AccessChain 80(@patchConstantResult) 30 46
+              94:    6(float)   Load 93
+              95:     91(ptr)   AccessChain 87(@patchConstantOutput.edges) 46
+                                Store 95 94
+                                Branch 78
+              78:             Label
                               Return
                               FunctionEnd
 18(@main(struct-VS_OUT-vf31[4];u1;):  14(HS_OUT) Function None 15
@@ -363,11 +481,11 @@
      25(PCF(u1;):22(HS_CONSTANT_OUT) Function None 23
          24(pid):     13(ptr) FunctionParameter
               26:             Label
-      81(output):     63(ptr) Variable Function
-              83:     72(ptr) AccessChain 81(output) 30 30
-                              Store 83 82
-              85:     72(ptr) AccessChain 81(output) 30 77
-                              Store 85 84
-              86:22(HS_CONSTANT_OUT) Load 81(output)
-                              ReturnValue 86
+      96(output):     79(ptr) Variable Function
+              98:     88(ptr) AccessChain 96(output) 30 30
+                              Store 98 97
+             100:     88(ptr) AccessChain 96(output) 30 46
+                              Store 100 99
+             101:22(HS_CONSTANT_OUT) Load 96(output)
+                              ReturnValue 101
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.2.tesc.out b/Test/baseResults/hlsl.hull.2.tesc.out
index 70fc4f1..4e8a50c 100644
--- a/Test/baseResults/hlsl.hull.2.tesc.out
+++ b/Test/baseResults/hlsl.hull.2.tesc.out
@@ -24,15 +24,65 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -100,8 +150,8 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
@@ -136,15 +186,65 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -212,21 +312,21 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 91
+// Generated by (magic number): 8000a
+// Id's are bound by 106
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 42 46 48 63 65 73
+                              EntryPoint TessellationControl 4  "main" 43 61 63 79 81 89
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 Isolines
                               ExecutionMode 4 SpacingEqual
@@ -245,24 +345,24 @@
                               Name 26  "pos"
                               Name 30  "output"
                               Name 40  "ip"
-                              Name 42  "ip"
-                              Name 46  "@entryPointOutput"
-                              Name 48  "InvocationId"
-                              Name 50  "param"
-                              Name 62  "@patchConstantResult"
-                              Name 63  "pid"
-                              Name 65  "pos"
-                              Name 66  "param"
-                              Name 68  "param"
-                              Name 73  "@patchConstantOutput.edges"
-                              Name 83  "output"
-                              Decorate 42(ip) Location 0
-                              Decorate 46(@entryPointOutput) Location 0
-                              Decorate 48(InvocationId) BuiltIn InvocationId
-                              Decorate 63(pid) BuiltIn PrimitiveId
-                              Decorate 65(pos) BuiltIn Position
-                              Decorate 73(@patchConstantOutput.edges) Patch
-                              Decorate 73(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+                              Name 43  "ip.cpoint"
+                              Name 61  "@entryPointOutput.cpoint"
+                              Name 63  "InvocationId"
+                              Name 65  "param"
+                              Name 78  "@patchConstantResult"
+                              Name 79  "pid"
+                              Name 81  "pos"
+                              Name 82  "param"
+                              Name 84  "param"
+                              Name 89  "@patchConstantOutput.edges"
+                              Name 98  "output"
+                              Decorate 43(ip.cpoint) Location 0
+                              Decorate 61(@entryPointOutput.cpoint) Location 0
+                              Decorate 63(InvocationId) BuiltIn InvocationId
+                              Decorate 79(pid) BuiltIn PrimitiveId
+                              Decorate 81(pos) BuiltIn Position
+                              Decorate 89(@patchConstantOutput.edges) Patch
+                              Decorate 89(@patchConstantOutput.edges) BuiltIn TessLevelOuter
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -285,65 +385,83 @@
               31:             TypeInt 32 1
               32:     31(int) Constant 0
               33:             TypePointer Function 7(fvec3)
-              41:             TypePointer Input 11
-          42(ip):     41(ptr) Variable Input
-              44:             TypeArray 13(HS_OUT) 10
-              45:             TypePointer Output 44
-46(@entryPointOutput):     45(ptr) Variable Output
-              47:             TypePointer Input 9(int)
-48(InvocationId):     47(ptr) Variable Input
-              53:             TypePointer Output 13(HS_OUT)
-              55:      9(int) Constant 0
-              57:             TypeBool
-              61:             TypePointer Function 23(HS_CONSTANT_OUT)
-         63(pid):     47(ptr) Variable Input
-              64:             TypePointer Input 19(fvec4)
-         65(pos):     64(ptr) Variable Input
-              71:             TypeArray 6(float) 10
-              72:             TypePointer Output 71
-73(@patchConstantOutput.edges):     72(ptr) Variable Output
-              74:             TypePointer Function 6(float)
-              77:             TypePointer Output 6(float)
-              79:     31(int) Constant 1
-              84:    6(float) Constant 1073741824
-              86:    6(float) Constant 1090519040
+              41:             TypeArray 7(fvec3) 10
+              42:             TypePointer Input 41
+   43(ip.cpoint):     42(ptr) Variable Input
+              44:             TypePointer Input 7(fvec3)
+              48:     31(int) Constant 1
+              52:     31(int) Constant 2
+              56:     31(int) Constant 3
+              60:             TypePointer Output 41
+61(@entryPointOutput.cpoint):     60(ptr) Variable Output
+              62:             TypePointer Input 9(int)
+63(InvocationId):     62(ptr) Variable Input
+              69:             TypePointer Output 7(fvec3)
+              71:      9(int) Constant 0
+              73:             TypeBool
+              77:             TypePointer Function 23(HS_CONSTANT_OUT)
+         79(pid):     62(ptr) Variable Input
+              80:             TypePointer Input 19(fvec4)
+         81(pos):     80(ptr) Variable Input
+              87:             TypeArray 6(float) 10
+              88:             TypePointer Output 87
+89(@patchConstantOutput.edges):     88(ptr) Variable Output
+              90:             TypePointer Function 6(float)
+              93:             TypePointer Output 6(float)
+              99:    6(float) Constant 1073741824
+             101:    6(float) Constant 1090519040
          4(main):           2 Function None 3
                5:             Label
           40(ip):     12(ptr) Variable Function
-       50(param):     12(ptr) Variable Function
-62(@patchConstantResult):     61(ptr) Variable Function
-       66(param):     18(ptr) Variable Function
-       68(param):     20(ptr) Variable Function
-              43:          11 Load 42(ip)
-                              Store 40(ip) 43
-              49:      9(int) Load 48(InvocationId)
-              51:          11 Load 40(ip)
-                              Store 50(param) 51
-              52:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 50(param)
-              54:     53(ptr) AccessChain 46(@entryPointOutput) 49
-                              Store 54 52
-                              ControlBarrier 21 10 55
-              56:      9(int) Load 48(InvocationId)
-              58:    57(bool) IEqual 56 32
-                              SelectionMerge 60 None
-                              BranchConditional 58 59 60
-              59:               Label
-              67:      9(int)   Load 63(pid)
-                                Store 66(param) 67
-              69:   19(fvec4)   Load 65(pos)
-                                Store 68(param) 69
-              70:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 66(param) 68(param)
-                                Store 62(@patchConstantResult) 70
-              75:     74(ptr)   AccessChain 62(@patchConstantResult) 32 32
-              76:    6(float)   Load 75
-              78:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 32
-                                Store 78 76
-              80:     74(ptr)   AccessChain 62(@patchConstantResult) 32 79
-              81:    6(float)   Load 80
-              82:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 79
-                                Store 82 81
-                                Branch 60
-              60:             Label
+       65(param):     12(ptr) Variable Function
+78(@patchConstantResult):     77(ptr) Variable Function
+       82(param):     18(ptr) Variable Function
+       84(param):     20(ptr) Variable Function
+              45:     44(ptr) AccessChain 43(ip.cpoint) 32
+              46:    7(fvec3) Load 45
+              47:     33(ptr) AccessChain 40(ip) 32 32
+                              Store 47 46
+              49:     44(ptr) AccessChain 43(ip.cpoint) 48
+              50:    7(fvec3) Load 49
+              51:     33(ptr) AccessChain 40(ip) 48 32
+                              Store 51 50
+              53:     44(ptr) AccessChain 43(ip.cpoint) 52
+              54:    7(fvec3) Load 53
+              55:     33(ptr) AccessChain 40(ip) 52 32
+                              Store 55 54
+              57:     44(ptr) AccessChain 43(ip.cpoint) 56
+              58:    7(fvec3) Load 57
+              59:     33(ptr) AccessChain 40(ip) 56 32
+                              Store 59 58
+              64:      9(int) Load 63(InvocationId)
+              66:          11 Load 40(ip)
+                              Store 65(param) 66
+              67:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 65(param)
+              68:    7(fvec3) CompositeExtract 67 0
+              70:     69(ptr) AccessChain 61(@entryPointOutput.cpoint) 64
+                              Store 70 68
+                              ControlBarrier 21 10 71
+              72:      9(int) Load 63(InvocationId)
+              74:    73(bool) IEqual 72 32
+                              SelectionMerge 76 None
+                              BranchConditional 74 75 76
+              75:               Label
+              83:      9(int)   Load 79(pid)
+                                Store 82(param) 83
+              85:   19(fvec4)   Load 81(pos)
+                                Store 84(param) 85
+              86:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 82(param) 84(param)
+                                Store 78(@patchConstantResult) 86
+              91:     90(ptr)   AccessChain 78(@patchConstantResult) 32 32
+              92:    6(float)   Load 91
+              94:     93(ptr)   AccessChain 89(@patchConstantOutput.edges) 32
+                                Store 94 92
+              95:     90(ptr)   AccessChain 78(@patchConstantResult) 32 48
+              96:    6(float)   Load 95
+              97:     93(ptr)   AccessChain 89(@patchConstantOutput.edges) 48
+                                Store 97 96
+                                Branch 76
+              76:             Label
                               Return
                               FunctionEnd
 16(@main(struct-VS_OUT-vf31[4];):  13(HS_OUT) Function None 14
@@ -361,11 +479,11 @@
          25(pid):     18(ptr) FunctionParameter
          26(pos):     20(ptr) FunctionParameter
               28:             Label
-      83(output):     61(ptr) Variable Function
-              85:     74(ptr) AccessChain 83(output) 32 32
-                              Store 85 84
-              87:     74(ptr) AccessChain 83(output) 32 79
-                              Store 87 86
-              88:23(HS_CONSTANT_OUT) Load 83(output)
-                              ReturnValue 88
+      98(output):     77(ptr) Variable Function
+             100:     90(ptr) AccessChain 98(output) 32 32
+                              Store 100 99
+             102:     90(ptr) AccessChain 98(output) 32 48
+                              Store 102 101
+             103:23(HS_CONSTANT_OUT) Load 98(output)
+                              ReturnValue 103
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.3.tesc.out b/Test/baseResults/hlsl.hull.3.tesc.out
index fba7fac..f40a79e 100644
--- a/Test/baseResults/hlsl.hull.3.tesc.out
+++ b/Test/baseResults/hlsl.hull.3.tesc.out
@@ -24,15 +24,65 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -100,8 +150,8 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
@@ -136,15 +186,65 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                3 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
+0:26            Constant:
+0:26              3 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[4]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 4-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -212,21 +312,21 @@
 0:38      Branch: Return with expression
 0:38        'output' ( temp structure{ temp 2-element array of float edges})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 4-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 4-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 4-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 4-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 0:?     'pid' ( in uint PrimitiveID)
 0:?     'pos' ( in 4-component vector of float Position)
 0:?     '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 91
+// Generated by (magic number): 8000a
+// Id's are bound by 106
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 42 46 48 63 65 73
+                              EntryPoint TessellationControl 4  "main" 43 61 63 79 81 89
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingEqual
@@ -246,24 +346,24 @@
                               Name 26  "pos"
                               Name 30  "output"
                               Name 40  "ip"
-                              Name 42  "ip"
-                              Name 46  "@entryPointOutput"
-                              Name 48  "InvocationId"
-                              Name 50  "param"
-                              Name 62  "@patchConstantResult"
-                              Name 63  "pid"
-                              Name 65  "pos"
-                              Name 66  "param"
-                              Name 68  "param"
-                              Name 73  "@patchConstantOutput.edges"
-                              Name 83  "output"
-                              Decorate 42(ip) Location 0
-                              Decorate 46(@entryPointOutput) Location 0
-                              Decorate 48(InvocationId) BuiltIn InvocationId
-                              Decorate 63(pid) BuiltIn PrimitiveId
-                              Decorate 65(pos) BuiltIn Position
-                              Decorate 73(@patchConstantOutput.edges) Patch
-                              Decorate 73(@patchConstantOutput.edges) BuiltIn TessLevelOuter
+                              Name 43  "ip.cpoint"
+                              Name 61  "@entryPointOutput.cpoint"
+                              Name 63  "InvocationId"
+                              Name 65  "param"
+                              Name 78  "@patchConstantResult"
+                              Name 79  "pid"
+                              Name 81  "pos"
+                              Name 82  "param"
+                              Name 84  "param"
+                              Name 89  "@patchConstantOutput.edges"
+                              Name 98  "output"
+                              Decorate 43(ip.cpoint) Location 0
+                              Decorate 61(@entryPointOutput.cpoint) Location 0
+                              Decorate 63(InvocationId) BuiltIn InvocationId
+                              Decorate 79(pid) BuiltIn PrimitiveId
+                              Decorate 81(pos) BuiltIn Position
+                              Decorate 89(@patchConstantOutput.edges) Patch
+                              Decorate 89(@patchConstantOutput.edges) BuiltIn TessLevelOuter
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -286,65 +386,83 @@
               31:             TypeInt 32 1
               32:     31(int) Constant 0
               33:             TypePointer Function 7(fvec3)
-              41:             TypePointer Input 11
-          42(ip):     41(ptr) Variable Input
-              44:             TypeArray 13(HS_OUT) 10
-              45:             TypePointer Output 44
-46(@entryPointOutput):     45(ptr) Variable Output
-              47:             TypePointer Input 9(int)
-48(InvocationId):     47(ptr) Variable Input
-              53:             TypePointer Output 13(HS_OUT)
-              55:      9(int) Constant 0
-              57:             TypeBool
-              61:             TypePointer Function 23(HS_CONSTANT_OUT)
-         63(pid):     47(ptr) Variable Input
-              64:             TypePointer Input 19(fvec4)
-         65(pos):     64(ptr) Variable Input
-              71:             TypeArray 6(float) 10
-              72:             TypePointer Output 71
-73(@patchConstantOutput.edges):     72(ptr) Variable Output
-              74:             TypePointer Function 6(float)
-              77:             TypePointer Output 6(float)
-              79:     31(int) Constant 1
-              84:    6(float) Constant 1073741824
-              86:    6(float) Constant 1090519040
+              41:             TypeArray 7(fvec3) 10
+              42:             TypePointer Input 41
+   43(ip.cpoint):     42(ptr) Variable Input
+              44:             TypePointer Input 7(fvec3)
+              48:     31(int) Constant 1
+              52:     31(int) Constant 2
+              56:     31(int) Constant 3
+              60:             TypePointer Output 41
+61(@entryPointOutput.cpoint):     60(ptr) Variable Output
+              62:             TypePointer Input 9(int)
+63(InvocationId):     62(ptr) Variable Input
+              69:             TypePointer Output 7(fvec3)
+              71:      9(int) Constant 0
+              73:             TypeBool
+              77:             TypePointer Function 23(HS_CONSTANT_OUT)
+         79(pid):     62(ptr) Variable Input
+              80:             TypePointer Input 19(fvec4)
+         81(pos):     80(ptr) Variable Input
+              87:             TypeArray 6(float) 10
+              88:             TypePointer Output 87
+89(@patchConstantOutput.edges):     88(ptr) Variable Output
+              90:             TypePointer Function 6(float)
+              93:             TypePointer Output 6(float)
+              99:    6(float) Constant 1073741824
+             101:    6(float) Constant 1090519040
          4(main):           2 Function None 3
                5:             Label
           40(ip):     12(ptr) Variable Function
-       50(param):     12(ptr) Variable Function
-62(@patchConstantResult):     61(ptr) Variable Function
-       66(param):     18(ptr) Variable Function
-       68(param):     20(ptr) Variable Function
-              43:          11 Load 42(ip)
-                              Store 40(ip) 43
-              49:      9(int) Load 48(InvocationId)
-              51:          11 Load 40(ip)
-                              Store 50(param) 51
-              52:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 50(param)
-              54:     53(ptr) AccessChain 46(@entryPointOutput) 49
-                              Store 54 52
-                              ControlBarrier 21 10 55
-              56:      9(int) Load 48(InvocationId)
-              58:    57(bool) IEqual 56 32
-                              SelectionMerge 60 None
-                              BranchConditional 58 59 60
-              59:               Label
-              67:      9(int)   Load 63(pid)
-                                Store 66(param) 67
-              69:   19(fvec4)   Load 65(pos)
-                                Store 68(param) 69
-              70:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 66(param) 68(param)
-                                Store 62(@patchConstantResult) 70
-              75:     74(ptr)   AccessChain 62(@patchConstantResult) 32 32
-              76:    6(float)   Load 75
-              78:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 32
-                                Store 78 76
-              80:     74(ptr)   AccessChain 62(@patchConstantResult) 32 79
-              81:    6(float)   Load 80
-              82:     77(ptr)   AccessChain 73(@patchConstantOutput.edges) 79
-                                Store 82 81
-                                Branch 60
-              60:             Label
+       65(param):     12(ptr) Variable Function
+78(@patchConstantResult):     77(ptr) Variable Function
+       82(param):     18(ptr) Variable Function
+       84(param):     20(ptr) Variable Function
+              45:     44(ptr) AccessChain 43(ip.cpoint) 32
+              46:    7(fvec3) Load 45
+              47:     33(ptr) AccessChain 40(ip) 32 32
+                              Store 47 46
+              49:     44(ptr) AccessChain 43(ip.cpoint) 48
+              50:    7(fvec3) Load 49
+              51:     33(ptr) AccessChain 40(ip) 48 32
+                              Store 51 50
+              53:     44(ptr) AccessChain 43(ip.cpoint) 52
+              54:    7(fvec3) Load 53
+              55:     33(ptr) AccessChain 40(ip) 52 32
+                              Store 55 54
+              57:     44(ptr) AccessChain 43(ip.cpoint) 56
+              58:    7(fvec3) Load 57
+              59:     33(ptr) AccessChain 40(ip) 56 32
+                              Store 59 58
+              64:      9(int) Load 63(InvocationId)
+              66:          11 Load 40(ip)
+                              Store 65(param) 66
+              67:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[4];) 65(param)
+              68:    7(fvec3) CompositeExtract 67 0
+              70:     69(ptr) AccessChain 61(@entryPointOutput.cpoint) 64
+                              Store 70 68
+                              ControlBarrier 21 10 71
+              72:      9(int) Load 63(InvocationId)
+              74:    73(bool) IEqual 72 32
+                              SelectionMerge 76 None
+                              BranchConditional 74 75 76
+              75:               Label
+              83:      9(int)   Load 79(pid)
+                                Store 82(param) 83
+              85:   19(fvec4)   Load 81(pos)
+                                Store 84(param) 85
+              86:23(HS_CONSTANT_OUT)   FunctionCall 27(PCF(u1;vf4;) 82(param) 84(param)
+                                Store 78(@patchConstantResult) 86
+              91:     90(ptr)   AccessChain 78(@patchConstantResult) 32 32
+              92:    6(float)   Load 91
+              94:     93(ptr)   AccessChain 89(@patchConstantOutput.edges) 32
+                                Store 94 92
+              95:     90(ptr)   AccessChain 78(@patchConstantResult) 32 48
+              96:    6(float)   Load 95
+              97:     93(ptr)   AccessChain 89(@patchConstantOutput.edges) 48
+                                Store 97 96
+                                Branch 76
+              76:             Label
                               Return
                               FunctionEnd
 16(@main(struct-VS_OUT-vf31[4];):  13(HS_OUT) Function None 14
@@ -362,11 +480,11 @@
          25(pid):     18(ptr) FunctionParameter
          26(pos):     20(ptr) FunctionParameter
               28:             Label
-      83(output):     61(ptr) Variable Function
-              85:     74(ptr) AccessChain 83(output) 32 32
-                              Store 85 84
-              87:     74(ptr) AccessChain 83(output) 32 79
-                              Store 87 86
-              88:23(HS_CONSTANT_OUT) Load 83(output)
-                              ReturnValue 88
+      98(output):     77(ptr) Variable Function
+             100:     90(ptr) AccessChain 98(output) 32 32
+                              Store 100 99
+             102:     90(ptr) AccessChain 98(output) 32 48
+                              Store 102 101
+             103:23(HS_CONSTANT_OUT) Load 98(output)
+                              ReturnValue 103
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.4.tesc.out b/Test/baseResults/hlsl.hull.4.tesc.out
index 253bdc6..aa766ed 100644
--- a/Test/baseResults/hlsl.hull.4.tesc.out
+++ b/Test/baseResults/hlsl.hull.4.tesc.out
@@ -93,11 +93,8 @@
 0:39                0 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                0 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
 0:39              0 (const int)
 0:39        move second child to first child ( temp 4-component vector of float)
@@ -120,13 +117,10 @@
 0:39                1 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                1 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
-0:39              0 (const int)
+0:39              1 (const int)
 0:39        move second child to first child ( temp 4-component vector of float)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
@@ -147,13 +141,10 @@
 0:39                2 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                2 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
-0:39              0 (const int)
+0:39              2 (const int)
 0:39      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
@@ -230,7 +221,7 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
 0:?     'I.m_Position' ( in 3-element array of 4-component vector of float Position)
-0:?     'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:?     'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
@@ -333,11 +324,8 @@
 0:39                0 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                0 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
 0:39              0 (const int)
 0:39        move second child to first child ( temp 4-component vector of float)
@@ -360,13 +348,10 @@
 0:39                1 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                1 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
-0:39              0 (const int)
+0:39              1 (const int)
 0:39        move second child to first child ( temp 4-component vector of float)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            direct index ( temp structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
@@ -387,13 +372,10 @@
 0:39                2 (const int)
 0:39            Constant:
 0:39              1 (const int)
-0:39          m_Normal: direct index for structure ( temp 4-component vector of float)
-0:39            direct index (layout( location=0) in structure{ temp 4-component vector of float m_Normal})
-0:39              'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
-0:39              Constant:
-0:39                2 (const int)
+0:39          direct index (layout( location=0) in 4-component vector of float)
+0:?             'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:39            Constant:
-0:39              0 (const int)
+0:39              2 (const int)
 0:39      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
@@ -470,19 +452,19 @@
 0:?   Linker Objects
 0:?     '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
 0:?     'I.m_Position' ( in 3-element array of 4-component vector of float Position)
-0:?     'I' (layout( location=0) in 3-element array of structure{ temp 4-component vector of float m_Normal})
+0:?     'I.m_Normal' (layout( location=0) in 3-element array of 4-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.fTessFactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 127
+// Generated by (magic number): 8000a
+// Id's are bound by 124
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 56 64 83 86 110 123
+                              EntryPoint TessellationControl 4  "main" 56 61 80 83 107 120
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -506,26 +488,24 @@
                               Name 45  "output"
                               Name 53  "I"
                               Name 56  "I.m_Position"
-                              Name 61  "HS_Input"
-                              MemberName 61(HS_Input) 0  "m_Normal"
-                              Name 64  "I"
-                              Name 81  "cpid"
-                              Name 83  "cpid"
-                              Name 86  "@entryPointOutput.m_Position"
-                              Name 88  "param"
-                              Name 90  "param"
-                              Name 104  "@patchConstantResult"
-                              Name 105  "param"
-                              Name 110  "@patchConstantOutput.fTessFactor"
-                              Name 123  "@patchConstantOutput.fInsideTessFactor"
+                              Name 61  "I.m_Normal"
+                              Name 78  "cpid"
+                              Name 80  "cpid"
+                              Name 83  "@entryPointOutput.m_Position"
+                              Name 85  "param"
+                              Name 87  "param"
+                              Name 101  "@patchConstantResult"
+                              Name 102  "param"
+                              Name 107  "@patchConstantOutput.fTessFactor"
+                              Name 120  "@patchConstantOutput.fInsideTessFactor"
                               Decorate 56(I.m_Position) BuiltIn Position
-                              Decorate 64(I) Location 0
-                              Decorate 83(cpid) BuiltIn InvocationId
-                              Decorate 86(@entryPointOutput.m_Position) BuiltIn Position
-                              Decorate 110(@patchConstantOutput.fTessFactor) Patch
-                              Decorate 110(@patchConstantOutput.fTessFactor) BuiltIn TessLevelOuter
-                              Decorate 123(@patchConstantOutput.fInsideTessFactor) Patch
-                              Decorate 123(@patchConstantOutput.fInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 61(I.m_Normal) Location 0
+                              Decorate 80(cpid) BuiltIn InvocationId
+                              Decorate 83(@entryPointOutput.m_Position) BuiltIn Position
+                              Decorate 107(@patchConstantOutput.fTessFactor) Patch
+                              Decorate 107(@patchConstantOutput.fTessFactor) BuiltIn TessLevelOuter
+                              Decorate 120(@patchConstantOutput.fInsideTessFactor) Patch
+                              Decorate 120(@patchConstantOutput.fInsideTessFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -557,98 +537,95 @@
               55:             TypePointer Input 54
 56(I.m_Position):     55(ptr) Variable Input
               57:             TypePointer Input 7(fvec4)
-    61(HS_Input):             TypeStruct 7(fvec4)
-              62:             TypeArray 61(HS_Input) 10
-              63:             TypePointer Input 62
-           64(I):     63(ptr) Variable Input
-              74:     31(int) Constant 2
-              82:             TypePointer Input 9(int)
-        83(cpid):     82(ptr) Variable Input
-              85:             TypePointer Output 54
-86(@entryPointOutput.m_Position):     85(ptr) Variable Output
-              94:             TypePointer Output 7(fvec4)
-              96:      9(int) Constant 2
-              97:      9(int) Constant 4
-              98:      9(int) Constant 0
-             100:             TypeBool
-             108:             TypeArray 6(float) 97
-             109:             TypePointer Output 108
-110(@patchConstantOutput.fTessFactor):    109(ptr) Variable Output
-             113:             TypePointer Output 6(float)
-             121:             TypeArray 6(float) 96
-             122:             TypePointer Output 121
-123(@patchConstantOutput.fInsideTessFactor):    122(ptr) Variable Output
+  61(I.m_Normal):     55(ptr) Variable Input
+              71:     31(int) Constant 2
+              79:             TypePointer Input 9(int)
+        80(cpid):     79(ptr) Variable Input
+              82:             TypePointer Output 54
+83(@entryPointOutput.m_Position):     82(ptr) Variable Output
+              91:             TypePointer Output 7(fvec4)
+              93:      9(int) Constant 2
+              94:      9(int) Constant 4
+              95:      9(int) Constant 0
+              97:             TypeBool
+             105:             TypeArray 6(float) 94
+             106:             TypePointer Output 105
+107(@patchConstantOutput.fTessFactor):    106(ptr) Variable Output
+             110:             TypePointer Output 6(float)
+             118:             TypeArray 6(float) 93
+             119:             TypePointer Output 118
+120(@patchConstantOutput.fInsideTessFactor):    119(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            53(I):     12(ptr) Variable Function
-        81(cpid):     19(ptr) Variable Function
-       88(param):     12(ptr) Variable Function
-       90(param):     19(ptr) Variable Function
-104(@patchConstantResult):     26(ptr) Variable Function
-      105(param):     12(ptr) Variable Function
+        78(cpid):     19(ptr) Variable Function
+       85(param):     12(ptr) Variable Function
+       87(param):     19(ptr) Variable Function
+101(@patchConstantResult):     26(ptr) Variable Function
+      102(param):     12(ptr) Variable Function
               58:     57(ptr) AccessChain 56(I.m_Position) 33
               59:    7(fvec4) Load 58
               60:     48(ptr) AccessChain 53(I) 33 33
                               Store 60 59
-              65:     57(ptr) AccessChain 64(I) 33 33
+              62:     57(ptr) AccessChain 61(I.m_Normal) 33
+              63:    7(fvec4) Load 62
+              64:     48(ptr) AccessChain 53(I) 33 32
+                              Store 64 63
+              65:     57(ptr) AccessChain 56(I.m_Position) 32
               66:    7(fvec4) Load 65
-              67:     48(ptr) AccessChain 53(I) 33 32
+              67:     48(ptr) AccessChain 53(I) 32 33
                               Store 67 66
-              68:     57(ptr) AccessChain 56(I.m_Position) 32
+              68:     57(ptr) AccessChain 61(I.m_Normal) 32
               69:    7(fvec4) Load 68
-              70:     48(ptr) AccessChain 53(I) 32 33
+              70:     48(ptr) AccessChain 53(I) 32 32
                               Store 70 69
-              71:     57(ptr) AccessChain 64(I) 32 33
-              72:    7(fvec4) Load 71
-              73:     48(ptr) AccessChain 53(I) 32 32
-                              Store 73 72
-              75:     57(ptr) AccessChain 56(I.m_Position) 74
+              72:     57(ptr) AccessChain 56(I.m_Position) 71
+              73:    7(fvec4) Load 72
+              74:     48(ptr) AccessChain 53(I) 71 33
+                              Store 74 73
+              75:     57(ptr) AccessChain 61(I.m_Normal) 71
               76:    7(fvec4) Load 75
-              77:     48(ptr) AccessChain 53(I) 74 33
+              77:     48(ptr) AccessChain 53(I) 71 32
                               Store 77 76
-              78:     57(ptr) AccessChain 64(I) 74 33
-              79:    7(fvec4) Load 78
-              80:     48(ptr) AccessChain 53(I) 74 32
-                              Store 80 79
-              84:      9(int) Load 83(cpid)
-                              Store 81(cpid) 84
-              87:      9(int) Load 83(cpid)
-              89:          11 Load 53(I)
-                              Store 88(param) 89
-              91:      9(int) Load 81(cpid)
-                              Store 90(param) 91
-              92:20(HS_Main_Output) FunctionCall 24(@main(struct-HS_Input-vf4-vf41[3];u1;) 88(param) 90(param)
-              93:    7(fvec4) CompositeExtract 92 0
-              95:     94(ptr) AccessChain 86(@entryPointOutput.m_Position) 87
-                              Store 95 93
-                              ControlBarrier 96 97 98
-              99:      9(int) Load 83(cpid)
-             101:   100(bool) IEqual 99 33
-                              SelectionMerge 103 None
-                              BranchConditional 101 102 103
-             102:               Label
-             106:          11   Load 53(I)
-                                Store 105(param) 106
-             107:14(HS_Output)   FunctionCall 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];) 105(param)
-                                Store 104(@patchConstantResult) 107
-             111:     34(ptr)   AccessChain 104(@patchConstantResult) 33 33
-             112:    6(float)   Load 111
-             114:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 33
-                                Store 114 112
-             115:     34(ptr)   AccessChain 104(@patchConstantResult) 33 32
+              81:      9(int) Load 80(cpid)
+                              Store 78(cpid) 81
+              84:      9(int) Load 80(cpid)
+              86:          11 Load 53(I)
+                              Store 85(param) 86
+              88:      9(int) Load 78(cpid)
+                              Store 87(param) 88
+              89:20(HS_Main_Output) FunctionCall 24(@main(struct-HS_Input-vf4-vf41[3];u1;) 85(param) 87(param)
+              90:    7(fvec4) CompositeExtract 89 0
+              92:     91(ptr) AccessChain 83(@entryPointOutput.m_Position) 84
+                              Store 92 90
+                              ControlBarrier 93 94 95
+              96:      9(int) Load 80(cpid)
+              98:    97(bool) IEqual 96 33
+                              SelectionMerge 100 None
+                              BranchConditional 98 99 100
+              99:               Label
+             103:          11   Load 53(I)
+                                Store 102(param) 103
+             104:14(HS_Output)   FunctionCall 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];) 102(param)
+                                Store 101(@patchConstantResult) 104
+             108:     34(ptr)   AccessChain 101(@patchConstantResult) 33 33
+             109:    6(float)   Load 108
+             111:    110(ptr)   AccessChain 107(@patchConstantOutput.fTessFactor) 33
+                                Store 111 109
+             112:     34(ptr)   AccessChain 101(@patchConstantResult) 33 32
+             113:    6(float)   Load 112
+             114:    110(ptr)   AccessChain 107(@patchConstantOutput.fTessFactor) 32
+                                Store 114 113
+             115:     34(ptr)   AccessChain 101(@patchConstantResult) 33 71
              116:    6(float)   Load 115
-             117:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 32
+             117:    110(ptr)   AccessChain 107(@patchConstantOutput.fTessFactor) 71
                                 Store 117 116
-             118:     34(ptr)   AccessChain 104(@patchConstantResult) 33 74
-             119:    6(float)   Load 118
-             120:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 74
-                                Store 120 119
-             124:     34(ptr)   AccessChain 104(@patchConstantResult) 32
-             125:    6(float)   Load 124
-             126:    113(ptr)   AccessChain 123(@patchConstantOutput.fInsideTessFactor) 33
-                                Store 126 125
-                                Branch 103
-             103:             Label
+             121:     34(ptr)   AccessChain 101(@patchConstantResult) 32
+             122:    6(float)   Load 121
+             123:    110(ptr)   AccessChain 120(@patchConstantOutput.fInsideTessFactor) 33
+                                Store 123 122
+                                Branch 100
+             100:             Label
                               Return
                               FunctionEnd
 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];):14(HS_Output) Function None 15
diff --git a/Test/baseResults/hlsl.hull.6.tesc.out b/Test/baseResults/hlsl.hull.6.tesc.out
new file mode 100644
index 0000000..efb6e5b
--- /dev/null
+++ b/Test/baseResults/hlsl.hull.6.tesc.out
@@ -0,0 +1,679 @@
+hlsl.hull.6.tesc
+Shader version: 500
+vertices = 1
+vertex spacing = fractional_even_spacing
+triangle order = ccw
+0:? Sequence
+0:17  Function Definition: ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2]; ( temp structure{ temp 4-element array of float Edges})
+0:17    Function Parameters: 
+0:17      'p' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:17      'BlockID' ( in uint)
+0:17      'Inside' ( out 2-element array of float)
+0:?     Sequence
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          Edges: direct index for structure ( temp 4-element array of float)
+0:19            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:19            Constant:
+0:19              0 (const int)
+0:19          Constant:
+0:19            0 (const int)
+0:19        Constant:
+0:19          2.500000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          Edges: direct index for structure ( temp 4-element array of float)
+0:20            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:20        Constant:
+0:20          4.250000
+0:21      move second child to first child ( temp float)
+0:21        direct index ( temp float)
+0:21          Edges: direct index for structure ( temp 4-element array of float)
+0:21            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:21            Constant:
+0:21              0 (const int)
+0:21          Constant:
+0:21            2 (const int)
+0:21        Constant:
+0:21          5.750000
+0:22      move second child to first child ( temp float)
+0:22        direct index ( temp float)
+0:22          Edges: direct index for structure ( temp 4-element array of float)
+0:22            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:22            Constant:
+0:22              0 (const int)
+0:22          Constant:
+0:22            3 (const int)
+0:22        Constant:
+0:22          7.500000
+0:24      move second child to first child ( temp float)
+0:24        direct index ( temp float)
+0:24          'Inside' ( out 2-element array of float)
+0:24          Constant:
+0:24            0 (const int)
+0:24        Constant:
+0:24          6.750000
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          'Inside' ( out 2-element array of float)
+0:25          Constant:
+0:25            1 (const int)
+0:25        Constant:
+0:25          7.250000
+0:27      Branch: Return with expression
+0:27        'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:42  Function Definition: @main(struct-VSOutput-vf4-vf31[1];u1; ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42    Function Parameters: 
+0:42      'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42      'uCPID' ( in uint)
+0:?     Sequence
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        Position: direct index for structure ( temp 4-component vector of float)
+0:44          'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:44          Constant:
+0:44            0 (const int)
+0:44        f4Position: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:44            'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:44            'uCPID' ( in uint)
+0:44          Constant:
+0:44            0 (const int)
+0:45      move second child to first child ( temp 3-component vector of float)
+0:45        Color: direct index for structure ( temp 3-component vector of float)
+0:45          'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:45          Constant:
+0:45            1 (const int)
+0:45        f3Color: direct index for structure ( temp 3-component vector of float)
+0:45          indirect index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:45            'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:45            'uCPID' ( in uint)
+0:45          Constant:
+0:45            1 (const int)
+0:46      Branch: Return with expression
+0:46        'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42  Function Definition: main( ( temp void)
+0:42    Function Parameters: 
+0:?     Sequence
+0:42      Sequence
+0:42        move second child to first child ( temp 4-component vector of float)
+0:42          f4Position: direct index for structure ( temp 4-component vector of float)
+0:42            direct index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42              Constant:
+0:42                0 (const int)
+0:42            Constant:
+0:42              0 (const int)
+0:42          direct index ( in 4-component vector of float Position)
+0:?             'inputPatch.f4Position' ( in 1-element array of 4-component vector of float Position)
+0:42            Constant:
+0:42              0 (const int)
+0:42        move second child to first child ( temp 3-component vector of float)
+0:42          f3Color: direct index for structure ( temp 3-component vector of float)
+0:42            direct index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42              Constant:
+0:42                0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          direct index (layout( location=0) in 3-component vector of float)
+0:?             'inputPatch.f3Color' (layout( location=0) in 1-element array of 3-component vector of float)
+0:42            Constant:
+0:42              0 (const int)
+0:42      move second child to first child ( temp uint)
+0:?         'uCPID' ( temp uint)
+0:?         'uCPID' ( in uint InvocationID)
+0:42      Sequence
+0:42        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42          Function Call: @main(struct-VSOutput-vf4-vf31[1];u1; ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:?             'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?             'uCPID' ( temp uint)
+0:42        move second child to first child ( temp 4-component vector of float)
+0:42          indirect index (layout( location=0) out 4-component vector of float)
+0:?             '@entryPointOutput.Position' (layout( location=0) out 1-element array of 4-component vector of float)
+0:?             'uCPID' ( in uint InvocationID)
+0:42          Position: direct index for structure ( temp 4-component vector of float)
+0:42            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42            Constant:
+0:42              0 (const int)
+0:42        move second child to first child ( temp 3-component vector of float)
+0:42          indirect index (layout( location=1) out 3-component vector of float)
+0:?             '@entryPointOutput.Color' (layout( location=1) out 1-element array of 3-component vector of float)
+0:?             'uCPID' ( in uint InvocationID)
+0:42          Color: direct index for structure ( temp 3-component vector of float)
+0:42            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42            Constant:
+0:42              1 (const int)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'uCPID' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 4-element array of float Edges})
+0:?             '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?             Function Call: ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2]; ( temp structure{ temp 4-element array of float Edges})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'BlockID' ( in uint PrimitiveID)
+0:?               'Inside' ( patch out 2-element array of float TessLevelInner)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   3 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' (layout( location=0) out 1-element array of 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=1) out 1-element array of 3-component vector of float)
+0:?     'inputPatch.f4Position' ( in 1-element array of 4-component vector of float Position)
+0:?     'inputPatch.f3Color' (layout( location=0) in 1-element array of 3-component vector of float)
+0:?     'uCPID' ( in uint InvocationID)
+0:?     'BlockID' ( in uint PrimitiveID)
+0:?     'Inside' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+
+
+Linked tessellation control stage:
+
+
+Shader version: 500
+vertices = 1
+vertex spacing = fractional_even_spacing
+triangle order = ccw
+0:? Sequence
+0:17  Function Definition: ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2]; ( temp structure{ temp 4-element array of float Edges})
+0:17    Function Parameters: 
+0:17      'p' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:17      'BlockID' ( in uint)
+0:17      'Inside' ( out 2-element array of float)
+0:?     Sequence
+0:19      move second child to first child ( temp float)
+0:19        direct index ( temp float)
+0:19          Edges: direct index for structure ( temp 4-element array of float)
+0:19            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:19            Constant:
+0:19              0 (const int)
+0:19          Constant:
+0:19            0 (const int)
+0:19        Constant:
+0:19          2.500000
+0:20      move second child to first child ( temp float)
+0:20        direct index ( temp float)
+0:20          Edges: direct index for structure ( temp 4-element array of float)
+0:20            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:20            Constant:
+0:20              0 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:20        Constant:
+0:20          4.250000
+0:21      move second child to first child ( temp float)
+0:21        direct index ( temp float)
+0:21          Edges: direct index for structure ( temp 4-element array of float)
+0:21            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:21            Constant:
+0:21              0 (const int)
+0:21          Constant:
+0:21            2 (const int)
+0:21        Constant:
+0:21          5.750000
+0:22      move second child to first child ( temp float)
+0:22        direct index ( temp float)
+0:22          Edges: direct index for structure ( temp 4-element array of float)
+0:22            'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:22            Constant:
+0:22              0 (const int)
+0:22          Constant:
+0:22            3 (const int)
+0:22        Constant:
+0:22          7.500000
+0:24      move second child to first child ( temp float)
+0:24        direct index ( temp float)
+0:24          'Inside' ( out 2-element array of float)
+0:24          Constant:
+0:24            0 (const int)
+0:24        Constant:
+0:24          6.750000
+0:25      move second child to first child ( temp float)
+0:25        direct index ( temp float)
+0:25          'Inside' ( out 2-element array of float)
+0:25          Constant:
+0:25            1 (const int)
+0:25        Constant:
+0:25          7.250000
+0:27      Branch: Return with expression
+0:27        'Factors' ( temp structure{ temp 4-element array of float Edges})
+0:42  Function Definition: @main(struct-VSOutput-vf4-vf31[1];u1; ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42    Function Parameters: 
+0:42      'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42      'uCPID' ( in uint)
+0:?     Sequence
+0:44      move second child to first child ( temp 4-component vector of float)
+0:44        Position: direct index for structure ( temp 4-component vector of float)
+0:44          'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:44          Constant:
+0:44            0 (const int)
+0:44        f4Position: direct index for structure ( temp 4-component vector of float)
+0:44          indirect index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:44            'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:44            'uCPID' ( in uint)
+0:44          Constant:
+0:44            0 (const int)
+0:45      move second child to first child ( temp 3-component vector of float)
+0:45        Color: direct index for structure ( temp 3-component vector of float)
+0:45          'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:45          Constant:
+0:45            1 (const int)
+0:45        f3Color: direct index for structure ( temp 3-component vector of float)
+0:45          indirect index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:45            'inputPatch' ( in 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:45            'uCPID' ( in uint)
+0:45          Constant:
+0:45            1 (const int)
+0:46      Branch: Return with expression
+0:46        'Out' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42  Function Definition: main( ( temp void)
+0:42    Function Parameters: 
+0:?     Sequence
+0:42      Sequence
+0:42        move second child to first child ( temp 4-component vector of float)
+0:42          f4Position: direct index for structure ( temp 4-component vector of float)
+0:42            direct index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42              Constant:
+0:42                0 (const int)
+0:42            Constant:
+0:42              0 (const int)
+0:42          direct index ( in 4-component vector of float Position)
+0:?             'inputPatch.f4Position' ( in 1-element array of 4-component vector of float Position)
+0:42            Constant:
+0:42              0 (const int)
+0:42        move second child to first child ( temp 3-component vector of float)
+0:42          f3Color: direct index for structure ( temp 3-component vector of float)
+0:42            direct index ( temp structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:42              Constant:
+0:42                0 (const int)
+0:42            Constant:
+0:42              1 (const int)
+0:42          direct index (layout( location=0) in 3-component vector of float)
+0:?             'inputPatch.f3Color' (layout( location=0) in 1-element array of 3-component vector of float)
+0:42            Constant:
+0:42              0 (const int)
+0:42      move second child to first child ( temp uint)
+0:?         'uCPID' ( temp uint)
+0:?         'uCPID' ( in uint InvocationID)
+0:42      Sequence
+0:42        move second child to first child ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42          'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42          Function Call: @main(struct-VSOutput-vf4-vf31[1];u1; ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:?             'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?             'uCPID' ( temp uint)
+0:42        move second child to first child ( temp 4-component vector of float)
+0:42          indirect index (layout( location=0) out 4-component vector of float)
+0:?             '@entryPointOutput.Position' (layout( location=0) out 1-element array of 4-component vector of float)
+0:?             'uCPID' ( in uint InvocationID)
+0:42          Position: direct index for structure ( temp 4-component vector of float)
+0:42            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42            Constant:
+0:42              0 (const int)
+0:42        move second child to first child ( temp 3-component vector of float)
+0:42          indirect index (layout( location=1) out 3-component vector of float)
+0:?             '@entryPointOutput.Color' (layout( location=1) out 1-element array of 3-component vector of float)
+0:?             'uCPID' ( in uint InvocationID)
+0:42          Color: direct index for structure ( temp 3-component vector of float)
+0:42            'flattenTemp' ( temp structure{ temp 4-component vector of float Position,  temp 3-component vector of float Color})
+0:42            Constant:
+0:42              1 (const int)
+0:?       Barrier ( temp void)
+0:?       Test condition and select ( temp void)
+0:?         Condition
+0:?         Compare Equal ( temp bool)
+0:?           'uCPID' ( in uint InvocationID)
+0:?           Constant:
+0:?             0 (const int)
+0:?         true case
+0:?         Sequence
+0:?           move second child to first child ( temp structure{ temp 4-element array of float Edges})
+0:?             '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?             Function Call: ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2]; ( temp structure{ temp 4-element array of float Edges})
+0:?               'inputPatch' ( temp 1-element array of structure{ temp 4-component vector of float f4Position,  temp 3-component vector of float f3Color})
+0:?               'BlockID' ( in uint PrimitiveID)
+0:?               'Inside' ( patch out 2-element array of float TessLevelInner)
+0:?           Sequence
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   0 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   1 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   2 (const int)
+0:?             move second child to first child ( temp float)
+0:?               direct index ( patch out float TessLevelOuter)
+0:?                 '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+0:?                 Constant:
+0:?                   3 (const int)
+0:?               direct index ( temp float)
+0:?                 Edges: direct index for structure ( temp 4-element array of float)
+0:?                   '@patchConstantResult' ( temp structure{ temp 4-element array of float Edges})
+0:?                   Constant:
+0:?                     0 (const int)
+0:?                 Constant:
+0:?                   3 (const int)
+0:?   Linker Objects
+0:?     '@entryPointOutput.Position' (layout( location=0) out 1-element array of 4-component vector of float)
+0:?     '@entryPointOutput.Color' (layout( location=1) out 1-element array of 3-component vector of float)
+0:?     'inputPatch.f4Position' ( in 1-element array of 4-component vector of float Position)
+0:?     'inputPatch.f3Color' (layout( location=0) in 1-element array of 3-component vector of float)
+0:?     'uCPID' ( in uint InvocationID)
+0:?     'BlockID' ( in uint PrimitiveID)
+0:?     'Inside' ( patch out 2-element array of float TessLevelInner)
+0:?     '@patchConstantOutput.Edges' ( patch out 4-element array of float TessLevelOuter)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 142
+
+                              Capability Tessellation
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 74 81 88 97 104 117 119 128
+                              ExecutionMode 4 OutputVertices 1
+                              ExecutionMode 4 Quads
+                              ExecutionMode 4 SpacingFractionalEven
+                              ExecutionMode 4 VertexOrderCcw
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "VSOutput"
+                              MemberName 9(VSOutput) 0  "f4Position"
+                              MemberName 9(VSOutput) 1  "f3Color"
+                              Name 20  "HS_CONSTANT_DATA_OUTPUT"
+                              MemberName 20(HS_CONSTANT_DATA_OUTPUT) 0  "Edges"
+                              Name 25  "ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2];"
+                              Name 22  "p"
+                              Name 23  "BlockID"
+                              Name 24  "Inside"
+                              Name 27  "HSOutput"
+                              MemberName 27(HSOutput) 0  "Position"
+                              MemberName 27(HSOutput) 1  "Color"
+                              Name 31  "@main(struct-VSOutput-vf4-vf31[1];u1;"
+                              Name 29  "inputPatch"
+                              Name 30  "uCPID"
+                              Name 34  "Factors"
+                              Name 57  "Out"
+                              Name 71  "inputPatch"
+                              Name 74  "inputPatch.f4Position"
+                              Name 81  "inputPatch.f3Color"
+                              Name 86  "uCPID"
+                              Name 88  "uCPID"
+                              Name 90  "flattenTemp"
+                              Name 91  "param"
+                              Name 93  "param"
+                              Name 97  "@entryPointOutput.Position"
+                              Name 104  "@entryPointOutput.Color"
+                              Name 116  "@patchConstantResult"
+                              Name 117  "BlockID"
+                              Name 119  "Inside"
+                              Name 120  "param"
+                              Name 122  "param"
+                              Name 124  "param"
+                              Name 128  "@patchConstantOutput.Edges"
+                              Decorate 74(inputPatch.f4Position) BuiltIn Position
+                              Decorate 81(inputPatch.f3Color) Location 0
+                              Decorate 88(uCPID) BuiltIn InvocationId
+                              Decorate 97(@entryPointOutput.Position) Location 0
+                              Decorate 104(@entryPointOutput.Color) Location 1
+                              Decorate 117(BlockID) BuiltIn PrimitiveId
+                              Decorate 119(Inside) Patch
+                              Decorate 119(Inside) BuiltIn TessLevelInner
+                              Decorate 128(@patchConstantOutput.Edges) Patch
+                              Decorate 128(@patchConstantOutput.Edges) BuiltIn TessLevelOuter
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeVector 6(float) 3
+     9(VSOutput):             TypeStruct 7(fvec4) 8(fvec3)
+              10:             TypeInt 32 0
+              11:     10(int) Constant 1
+              12:             TypeArray 9(VSOutput) 11
+              13:             TypePointer Function 12
+              14:             TypePointer Function 10(int)
+              15:     10(int) Constant 2
+              16:             TypeArray 6(float) 15
+              17:             TypePointer Function 16
+              18:     10(int) Constant 4
+              19:             TypeArray 6(float) 18
+20(HS_CONSTANT_DATA_OUTPUT):             TypeStruct 19
+              21:             TypeFunction 20(HS_CONSTANT_DATA_OUTPUT) 13(ptr) 14(ptr) 17(ptr)
+    27(HSOutput):             TypeStruct 7(fvec4) 8(fvec3)
+              28:             TypeFunction 27(HSOutput) 13(ptr) 14(ptr)
+              33:             TypePointer Function 20(HS_CONSTANT_DATA_OUTPUT)
+              35:             TypeInt 32 1
+              36:     35(int) Constant 0
+              37:    6(float) Constant 1075838976
+              38:             TypePointer Function 6(float)
+              40:     35(int) Constant 1
+              41:    6(float) Constant 1082654720
+              43:     35(int) Constant 2
+              44:    6(float) Constant 1085800448
+              46:     35(int) Constant 3
+              47:    6(float) Constant 1089470464
+              49:    6(float) Constant 1087897600
+              51:    6(float) Constant 1088946176
+              56:             TypePointer Function 27(HSOutput)
+              59:             TypePointer Function 7(fvec4)
+              64:             TypePointer Function 8(fvec3)
+              72:             TypeArray 7(fvec4) 11
+              73:             TypePointer Input 72
+74(inputPatch.f4Position):     73(ptr) Variable Input
+              75:             TypePointer Input 7(fvec4)
+              79:             TypeArray 8(fvec3) 11
+              80:             TypePointer Input 79
+81(inputPatch.f3Color):     80(ptr) Variable Input
+              82:             TypePointer Input 8(fvec3)
+              87:             TypePointer Input 10(int)
+       88(uCPID):     87(ptr) Variable Input
+              96:             TypePointer Output 72
+97(@entryPointOutput.Position):     96(ptr) Variable Output
+             101:             TypePointer Output 7(fvec4)
+             103:             TypePointer Output 79
+104(@entryPointOutput.Color):    103(ptr) Variable Output
+             108:             TypePointer Output 8(fvec3)
+             110:     10(int) Constant 0
+             112:             TypeBool
+    117(BlockID):     87(ptr) Variable Input
+             118:             TypePointer Output 16
+     119(Inside):    118(ptr) Variable Output
+             127:             TypePointer Output 19
+128(@patchConstantOutput.Edges):    127(ptr) Variable Output
+             131:             TypePointer Output 6(float)
+         4(main):           2 Function None 3
+               5:             Label
+  71(inputPatch):     13(ptr) Variable Function
+       86(uCPID):     14(ptr) Variable Function
+ 90(flattenTemp):     56(ptr) Variable Function
+       91(param):     13(ptr) Variable Function
+       93(param):     14(ptr) Variable Function
+116(@patchConstantResult):     33(ptr) Variable Function
+      120(param):     13(ptr) Variable Function
+      122(param):     14(ptr) Variable Function
+      124(param):     17(ptr) Variable Function
+              76:     75(ptr) AccessChain 74(inputPatch.f4Position) 36
+              77:    7(fvec4) Load 76
+              78:     59(ptr) AccessChain 71(inputPatch) 36 36
+                              Store 78 77
+              83:     82(ptr) AccessChain 81(inputPatch.f3Color) 36
+              84:    8(fvec3) Load 83
+              85:     64(ptr) AccessChain 71(inputPatch) 36 40
+                              Store 85 84
+              89:     10(int) Load 88(uCPID)
+                              Store 86(uCPID) 89
+              92:          12 Load 71(inputPatch)
+                              Store 91(param) 92
+              94:     10(int) Load 86(uCPID)
+                              Store 93(param) 94
+              95:27(HSOutput) FunctionCall 31(@main(struct-VSOutput-vf4-vf31[1];u1;) 91(param) 93(param)
+                              Store 90(flattenTemp) 95
+              98:     10(int) Load 88(uCPID)
+              99:     59(ptr) AccessChain 90(flattenTemp) 36
+             100:    7(fvec4) Load 99
+             102:    101(ptr) AccessChain 97(@entryPointOutput.Position) 98
+                              Store 102 100
+             105:     10(int) Load 88(uCPID)
+             106:     64(ptr) AccessChain 90(flattenTemp) 40
+             107:    8(fvec3) Load 106
+             109:    108(ptr) AccessChain 104(@entryPointOutput.Color) 105
+                              Store 109 107
+                              ControlBarrier 15 18 110
+             111:     10(int) Load 88(uCPID)
+             113:   112(bool) IEqual 111 36
+                              SelectionMerge 115 None
+                              BranchConditional 113 114 115
+             114:               Label
+             121:          12   Load 71(inputPatch)
+                                Store 120(param) 121
+             123:     10(int)   Load 117(BlockID)
+                                Store 122(param) 123
+             125:20(HS_CONSTANT_DATA_OUTPUT)   FunctionCall 25(ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2];) 120(param) 122(param) 124(param)
+             126:          16   Load 124(param)
+                                Store 119(Inside) 126
+                                Store 116(@patchConstantResult) 125
+             129:     38(ptr)   AccessChain 116(@patchConstantResult) 36 36
+             130:    6(float)   Load 129
+             132:    131(ptr)   AccessChain 128(@patchConstantOutput.Edges) 36
+                                Store 132 130
+             133:     38(ptr)   AccessChain 116(@patchConstantResult) 36 40
+             134:    6(float)   Load 133
+             135:    131(ptr)   AccessChain 128(@patchConstantOutput.Edges) 40
+                                Store 135 134
+             136:     38(ptr)   AccessChain 116(@patchConstantResult) 36 43
+             137:    6(float)   Load 136
+             138:    131(ptr)   AccessChain 128(@patchConstantOutput.Edges) 43
+                                Store 138 137
+             139:     38(ptr)   AccessChain 116(@patchConstantResult) 36 46
+             140:    6(float)   Load 139
+             141:    131(ptr)   AccessChain 128(@patchConstantOutput.Edges) 46
+                                Store 141 140
+                                Branch 115
+             115:             Label
+                              Return
+                              FunctionEnd
+25(ConstantHS(struct-VSOutput-vf4-vf31[1];u1;f1[2];):20(HS_CONSTANT_DATA_OUTPUT) Function None 21
+           22(p):     13(ptr) FunctionParameter
+     23(BlockID):     14(ptr) FunctionParameter
+      24(Inside):     17(ptr) FunctionParameter
+              26:             Label
+     34(Factors):     33(ptr) Variable Function
+              39:     38(ptr) AccessChain 34(Factors) 36 36
+                              Store 39 37
+              42:     38(ptr) AccessChain 34(Factors) 36 40
+                              Store 42 41
+              45:     38(ptr) AccessChain 34(Factors) 36 43
+                              Store 45 44
+              48:     38(ptr) AccessChain 34(Factors) 36 46
+                              Store 48 47
+              50:     38(ptr) AccessChain 24(Inside) 36
+                              Store 50 49
+              52:     38(ptr) AccessChain 24(Inside) 40
+                              Store 52 51
+              53:20(HS_CONSTANT_DATA_OUTPUT) Load 34(Factors)
+                              ReturnValue 53
+                              FunctionEnd
+31(@main(struct-VSOutput-vf4-vf31[1];u1;):27(HSOutput) Function None 28
+  29(inputPatch):     13(ptr) FunctionParameter
+       30(uCPID):     14(ptr) FunctionParameter
+              32:             Label
+         57(Out):     56(ptr) Variable Function
+              58:     10(int) Load 30(uCPID)
+              60:     59(ptr) AccessChain 29(inputPatch) 58 36
+              61:    7(fvec4) Load 60
+              62:     59(ptr) AccessChain 57(Out) 36
+                              Store 62 61
+              63:     10(int) Load 30(uCPID)
+              65:     64(ptr) AccessChain 29(inputPatch) 63 40
+              66:    8(fvec3) Load 65
+              67:     64(ptr) AccessChain 57(Out) 40
+                              Store 67 66
+              68:27(HSOutput) Load 57(Out)
+                              ReturnValue 68
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out b/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
index 2bf3c7c..70881e9 100644
--- a/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
+++ b/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out
@@ -22,19 +22,57 @@
 0:27  Function Definition: main( ( temp void)
 0:27    Function Parameters: 
 0:?     Sequence
-0:27      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:27      Sequence
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                0 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              0 (const int)
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                1 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              1 (const int)
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                2 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              2 (const int)
 0:27      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
-0:27      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:27        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( in uint InvocationID)
-0:27        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
-0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( temp uint)
+0:27      Sequence
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'cpid' ( in uint InvocationID)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:?               'cpid' ( temp uint)
+0:27            Constant:
+0:27              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -189,8 +227,8 @@
 0:42      Branch: Return with expression
 0:42        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?     '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
@@ -222,19 +260,57 @@
 0:27  Function Definition: main( ( temp void)
 0:27    Function Parameters: 
 0:?     Sequence
-0:27      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:27      Sequence
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                0 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              0 (const int)
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                1 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              1 (const int)
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:27              Constant:
+0:27                2 (const int)
+0:27            Constant:
+0:27              0 (const int)
+0:27          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:27            Constant:
+0:27              2 (const int)
 0:27      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
-0:27      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:27        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( in uint InvocationID)
-0:27        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
-0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( temp uint)
+0:27      Sequence
+0:27        move second child to first child ( temp 3-component vector of float)
+0:27          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'cpid' ( in uint InvocationID)
+0:27          val: direct index for structure ( temp 3-component vector of float)
+0:27            Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:?               'cpid' ( temp uint)
+0:27            Constant:
+0:27              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -389,20 +465,20 @@
 0:42      Branch: Return with expression
 0:42        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?     '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 124
+// Generated by (magic number): 8000a
+// Id's are bound by 135
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 41 45 48 94 108
+                              EntryPoint TessellationControl 4  "main" 42 57 60 105 119
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -423,33 +499,33 @@
                               Name 24  "pcf_out"
                               Name 28  "o"
                               Name 39  "i"
-                              Name 41  "i"
-                              Name 43  "cpid"
-                              Name 45  "cpid"
-                              Name 48  "@entryPointOutput"
-                              Name 50  "param"
-                              Name 52  "param"
-                              Name 66  "pcf_out"
-                              Name 67  "i"
-                              Name 68  "param"
-                              Name 70  "param"
-                              Name 74  "i"
-                              Name 76  "param"
-                              Name 78  "param"
-                              Name 82  "i"
+                              Name 42  "i.val"
+                              Name 55  "cpid"
+                              Name 57  "cpid"
+                              Name 60  "@entryPointOutput.val"
+                              Name 62  "param"
+                              Name 64  "param"
+                              Name 79  "pcf_out"
+                              Name 80  "i"
+                              Name 81  "param"
                               Name 83  "param"
-                              Name 85  "param"
-                              Name 89  "@patchConstantResult"
-                              Name 94  "@patchConstantOutput.tfactor"
-                              Name 108  "@patchConstantOutput.flInFactor"
-                              Name 112  "o"
-                              Decorate 41(i) Location 0
-                              Decorate 45(cpid) BuiltIn InvocationId
-                              Decorate 48(@entryPointOutput) Location 0
-                              Decorate 94(@patchConstantOutput.tfactor) Patch
-                              Decorate 94(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
-                              Decorate 108(@patchConstantOutput.flInFactor) Patch
-                              Decorate 108(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
+                              Name 86  "i"
+                              Name 88  "param"
+                              Name 90  "param"
+                              Name 93  "i"
+                              Name 94  "param"
+                              Name 96  "param"
+                              Name 100  "@patchConstantResult"
+                              Name 105  "@patchConstantOutput.tfactor"
+                              Name 119  "@patchConstantOutput.flInFactor"
+                              Name 123  "o"
+                              Decorate 42(i.val) Location 0
+                              Decorate 57(cpid) BuiltIn InvocationId
+                              Decorate 60(@entryPointOutput.val) Location 0
+                              Decorate 105(@patchConstantOutput.tfactor) Patch
+                              Decorate 105(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
+                              Decorate 119(@patchConstantOutput.flInFactor) Patch
+                              Decorate 119(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -470,105 +546,118 @@
               29:             TypeInt 32 1
               30:     29(int) Constant 0
               34:             TypePointer Function 7(fvec3)
-              40:             TypePointer Input 11
-           41(i):     40(ptr) Variable Input
-              44:             TypePointer Input 9(int)
-        45(cpid):     44(ptr) Variable Input
-              47:             TypePointer Output 20
-48(@entryPointOutput):     47(ptr) Variable Output
-              55:             TypePointer Output 14(hs_out_t)
-              57:      9(int) Constant 2
-              58:      9(int) Constant 4
-              59:      9(int) Constant 0
-              61:             TypeBool
-              65:             TypePointer Function 20
-              73:     29(int) Constant 1
-              75:      9(int) Constant 1
-              81:     29(int) Constant 2
-              88:             TypePointer Function 22(hs_pcf_t)
-              92:             TypeArray 6(float) 58
-              93:             TypePointer Output 92
-94(@patchConstantOutput.tfactor):     93(ptr) Variable Output
-              95:             TypePointer Function 6(float)
-              98:             TypePointer Output 6(float)
-             106:             TypeArray 6(float) 57
-             107:             TypePointer Output 106
-108(@patchConstantOutput.flInFactor):    107(ptr) Variable Output
-             119:    6(float) Constant 1082130432
+              40:             TypeArray 7(fvec3) 10
+              41:             TypePointer Input 40
+       42(i.val):     41(ptr) Variable Input
+              43:             TypePointer Input 7(fvec3)
+              47:     29(int) Constant 1
+              51:     29(int) Constant 2
+              56:             TypePointer Input 9(int)
+        57(cpid):     56(ptr) Variable Input
+              59:             TypePointer Output 40
+60(@entryPointOutput.val):     59(ptr) Variable Output
+              68:             TypePointer Output 7(fvec3)
+              70:      9(int) Constant 2
+              71:      9(int) Constant 4
+              72:      9(int) Constant 0
+              74:             TypeBool
+              78:             TypePointer Function 20
+              87:      9(int) Constant 1
+              99:             TypePointer Function 22(hs_pcf_t)
+             103:             TypeArray 6(float) 71
+             104:             TypePointer Output 103
+105(@patchConstantOutput.tfactor):    104(ptr) Variable Output
+             106:             TypePointer Function 6(float)
+             109:             TypePointer Output 6(float)
+             117:             TypeArray 6(float) 70
+             118:             TypePointer Output 117
+119(@patchConstantOutput.flInFactor):    118(ptr) Variable Output
+             130:    6(float) Constant 1082130432
          4(main):           2 Function None 3
                5:             Label
            39(i):     12(ptr) Variable Function
-        43(cpid):     13(ptr) Variable Function
-       50(param):     12(ptr) Variable Function
-       52(param):     13(ptr) Variable Function
-     66(pcf_out):     65(ptr) Variable Function
-           67(i):     12(ptr) Variable Function
-       68(param):     12(ptr) Variable Function
-       70(param):     13(ptr) Variable Function
-           74(i):     12(ptr) Variable Function
-       76(param):     12(ptr) Variable Function
-       78(param):     13(ptr) Variable Function
-           82(i):     12(ptr) Variable Function
-       83(param):     12(ptr) Variable Function
-       85(param):     13(ptr) Variable Function
-89(@patchConstantResult):     88(ptr) Variable Function
-              42:          11 Load 41(i)
-                              Store 39(i) 42
-              46:      9(int) Load 45(cpid)
-                              Store 43(cpid) 46
-              49:      9(int) Load 45(cpid)
-              51:          11 Load 39(i)
-                              Store 50(param) 51
-              53:      9(int) Load 43(cpid)
-                              Store 52(param) 53
-              54:14(hs_out_t) FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 50(param) 52(param)
-              56:     55(ptr) AccessChain 48(@entryPointOutput) 49
-                              Store 56 54
-                              ControlBarrier 57 58 59
-              60:      9(int) Load 45(cpid)
-              62:    61(bool) IEqual 60 30
-                              SelectionMerge 64 None
-                              BranchConditional 62 63 64
-              63:               Label
-              69:          11   Load 67(i)
-                                Store 68(param) 69
-                                Store 70(param) 59
-              71:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 68(param) 70(param)
-              72:     27(ptr)   AccessChain 66(pcf_out) 30
-                                Store 72 71
-              77:          11   Load 74(i)
-                                Store 76(param) 77
-                                Store 78(param) 75
-              79:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 76(param) 78(param)
-              80:     27(ptr)   AccessChain 66(pcf_out) 73
-                                Store 80 79
-              84:          11   Load 82(i)
-                                Store 83(param) 84
-                                Store 85(param) 57
-              86:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 83(param) 85(param)
-              87:     27(ptr)   AccessChain 66(pcf_out) 81
-                                Store 87 86
-              90:          20   Load 66(pcf_out)
-              91:22(hs_pcf_t)   FunctionCall 25(PCF(struct-hs_out_t-vf31[3];) 90
-                                Store 89(@patchConstantResult) 91
-              96:     95(ptr)   AccessChain 89(@patchConstantResult) 30 30
-              97:    6(float)   Load 96
-              99:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 30
-                                Store 99 97
-             100:     95(ptr)   AccessChain 89(@patchConstantResult) 30 73
-             101:    6(float)   Load 100
-             102:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 73
-                                Store 102 101
-             103:     95(ptr)   AccessChain 89(@patchConstantResult) 30 81
-             104:    6(float)   Load 103
-             105:     98(ptr)   AccessChain 94(@patchConstantOutput.tfactor) 81
-                                Store 105 104
-             109:     95(ptr)   AccessChain 89(@patchConstantResult) 73
-             110:    6(float)   Load 109
-             111:     98(ptr)   AccessChain 108(@patchConstantOutput.flInFactor) 30
-                                Store 111 110
-                                Branch 64
-              64:             Label
+        55(cpid):     13(ptr) Variable Function
+       62(param):     12(ptr) Variable Function
+       64(param):     13(ptr) Variable Function
+     79(pcf_out):     78(ptr) Variable Function
+           80(i):     12(ptr) Variable Function
+       81(param):     12(ptr) Variable Function
+       83(param):     13(ptr) Variable Function
+           86(i):     12(ptr) Variable Function
+       88(param):     12(ptr) Variable Function
+       90(param):     13(ptr) Variable Function
+           93(i):     12(ptr) Variable Function
+       94(param):     12(ptr) Variable Function
+       96(param):     13(ptr) Variable Function
+100(@patchConstantResult):     99(ptr) Variable Function
+              44:     43(ptr) AccessChain 42(i.val) 30
+              45:    7(fvec3) Load 44
+              46:     34(ptr) AccessChain 39(i) 30 30
+                              Store 46 45
+              48:     43(ptr) AccessChain 42(i.val) 47
+              49:    7(fvec3) Load 48
+              50:     34(ptr) AccessChain 39(i) 47 30
+                              Store 50 49
+              52:     43(ptr) AccessChain 42(i.val) 51
+              53:    7(fvec3) Load 52
+              54:     34(ptr) AccessChain 39(i) 51 30
+                              Store 54 53
+              58:      9(int) Load 57(cpid)
+                              Store 55(cpid) 58
+              61:      9(int) Load 57(cpid)
+              63:          11 Load 39(i)
+                              Store 62(param) 63
+              65:      9(int) Load 55(cpid)
+                              Store 64(param) 65
+              66:14(hs_out_t) FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 62(param) 64(param)
+              67:    7(fvec3) CompositeExtract 66 0
+              69:     68(ptr) AccessChain 60(@entryPointOutput.val) 61
+                              Store 69 67
+                              ControlBarrier 70 71 72
+              73:      9(int) Load 57(cpid)
+              75:    74(bool) IEqual 73 30
+                              SelectionMerge 77 None
+                              BranchConditional 75 76 77
+              76:               Label
+              82:          11   Load 80(i)
+                                Store 81(param) 82
+                                Store 83(param) 72
+              84:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 81(param) 83(param)
+              85:     27(ptr)   AccessChain 79(pcf_out) 30
+                                Store 85 84
+              89:          11   Load 86(i)
+                                Store 88(param) 89
+                                Store 90(param) 87
+              91:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 88(param) 90(param)
+              92:     27(ptr)   AccessChain 79(pcf_out) 47
+                                Store 92 91
+              95:          11   Load 93(i)
+                                Store 94(param) 95
+                                Store 96(param) 70
+              97:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 94(param) 96(param)
+              98:     27(ptr)   AccessChain 79(pcf_out) 51
+                                Store 98 97
+             101:          20   Load 79(pcf_out)
+             102:22(hs_pcf_t)   FunctionCall 25(PCF(struct-hs_out_t-vf31[3];) 101
+                                Store 100(@patchConstantResult) 102
+             107:    106(ptr)   AccessChain 100(@patchConstantResult) 30 30
+             108:    6(float)   Load 107
+             110:    109(ptr)   AccessChain 105(@patchConstantOutput.tfactor) 30
+                                Store 110 108
+             111:    106(ptr)   AccessChain 100(@patchConstantResult) 30 47
+             112:    6(float)   Load 111
+             113:    109(ptr)   AccessChain 105(@patchConstantOutput.tfactor) 47
+                                Store 113 112
+             114:    106(ptr)   AccessChain 100(@patchConstantResult) 30 51
+             115:    6(float)   Load 114
+             116:    109(ptr)   AccessChain 105(@patchConstantOutput.tfactor) 51
+                                Store 116 115
+             120:    106(ptr)   AccessChain 100(@patchConstantResult) 47
+             121:    6(float)   Load 120
+             122:    109(ptr)   AccessChain 119(@patchConstantOutput.flInFactor) 30
+                                Store 122 121
+                                Branch 77
+              77:             Label
                               Return
                               FunctionEnd
 18(@main(struct-hs_in_t-vf31[3];u1;):14(hs_out_t) Function None 15
@@ -587,18 +676,18 @@
 25(PCF(struct-hs_out_t-vf31[3];):22(hs_pcf_t) Function None 23
      24(pcf_out):          20 FunctionParameter
               26:             Label
-          112(o):     88(ptr) Variable Function
-             113:    6(float) CompositeExtract 24(pcf_out) 0 0 0
-             114:     95(ptr) AccessChain 112(o) 30 30
-                              Store 114 113
-             115:    6(float) CompositeExtract 24(pcf_out) 1 0 0
-             116:     95(ptr) AccessChain 112(o) 30 73
-                              Store 116 115
-             117:    6(float) CompositeExtract 24(pcf_out) 2 0 0
-             118:     95(ptr) AccessChain 112(o) 30 81
-                              Store 118 117
-             120:     95(ptr) AccessChain 112(o) 73
-                              Store 120 119
-             121:22(hs_pcf_t) Load 112(o)
-                              ReturnValue 121
+          123(o):     99(ptr) Variable Function
+             124:    6(float) CompositeExtract 24(pcf_out) 0 0 0
+             125:    106(ptr) AccessChain 123(o) 30 30
+                              Store 125 124
+             126:    6(float) CompositeExtract 24(pcf_out) 1 0 0
+             127:    106(ptr) AccessChain 123(o) 30 47
+                              Store 127 126
+             128:    6(float) CompositeExtract 24(pcf_out) 2 0 0
+             129:    106(ptr) AccessChain 123(o) 30 51
+                              Store 129 128
+             131:    106(ptr) AccessChain 123(o) 47
+                              Store 131 130
+             132:22(hs_pcf_t) Load 123(o)
+                              ReturnValue 132
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out b/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
index 62e48f7..d59e163 100644
--- a/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
+++ b/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
@@ -29,19 +29,57 @@
 0:28  Function Definition: main( ( temp void)
 0:28    Function Parameters: 
 0:?     Sequence
-0:28      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:28      Sequence
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              0 (const int)
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              1 (const int)
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                2 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              2 (const int)
 0:28      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
-0:28      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:28        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( in uint InvocationID)
-0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
-0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( temp uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'cpid' ( in uint InvocationID)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:?               'cpid' ( temp uint)
+0:28            Constant:
+0:28              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -198,8 +236,8 @@
 0:46      Branch: Return with expression
 0:46        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?     '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
@@ -238,19 +276,57 @@
 0:28  Function Definition: main( ( temp void)
 0:28    Function Parameters: 
 0:?     Sequence
-0:28      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:28      Sequence
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                0 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              0 (const int)
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                1 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              1 (const int)
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            direct index ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:28              Constant:
+0:28                2 (const int)
+0:28            Constant:
+0:28              0 (const int)
+0:28          direct index (layout( location=0) in 3-component vector of float)
+0:?             'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
+0:28            Constant:
+0:28              2 (const int)
 0:28      move second child to first child ( temp uint)
 0:?         'cpid' ( temp uint)
 0:?         'cpid' ( in uint InvocationID)
-0:28      move second child to first child ( temp structure{ temp 3-component vector of float val})
-0:28        indirect index (layout( location=0) out structure{ temp 3-component vector of float val})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( in uint InvocationID)
-0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
-0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
-0:?           'cpid' ( temp uint)
+0:28      Sequence
+0:28        move second child to first child ( temp 3-component vector of float)
+0:28          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'cpid' ( in uint InvocationID)
+0:28          val: direct index for structure ( temp 3-component vector of float)
+0:28            Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val})
+0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val})
+0:?               'cpid' ( temp uint)
+0:28            Constant:
+0:28              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -407,20 +483,20 @@
 0:46      Branch: Return with expression
 0:46        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor})
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val})
-0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val})
+0:?     '@entryPointOutput.val' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'i.val' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'cpid' ( in uint InvocationID)
 0:?     '@patchConstantOutput.tfactor' ( patch out 4-element array of float TessLevelOuter)
 0:?     '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 126
+// Generated by (magic number): 8000a
+// Id's are bound by 137
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 42 46 49 96 110
+                              EntryPoint TessellationControl 4  "main" 43 58 61 107 121
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -442,33 +518,33 @@
                               Name 25  "pcf_in"
                               Name 31  "o"
                               Name 40  "i"
-                              Name 42  "i"
-                              Name 44  "cpid"
-                              Name 46  "cpid"
-                              Name 49  "@entryPointOutput"
-                              Name 51  "param"
-                              Name 53  "param"
-                              Name 67  "pcf_out"
-                              Name 68  "i"
-                              Name 69  "param"
-                              Name 71  "param"
-                              Name 75  "i"
-                              Name 77  "param"
-                              Name 79  "param"
-                              Name 83  "i"
+                              Name 43  "i.val"
+                              Name 56  "cpid"
+                              Name 58  "cpid"
+                              Name 61  "@entryPointOutput.val"
+                              Name 63  "param"
+                              Name 65  "param"
+                              Name 80  "pcf_out"
+                              Name 81  "i"
+                              Name 82  "param"
                               Name 84  "param"
-                              Name 86  "param"
-                              Name 90  "@patchConstantResult"
-                              Name 96  "@patchConstantOutput.tfactor"
-                              Name 110  "@patchConstantOutput.flInFactor"
-                              Name 114  "o"
-                              Decorate 42(i) Location 0
-                              Decorate 46(cpid) BuiltIn InvocationId
-                              Decorate 49(@entryPointOutput) Location 0
-                              Decorate 96(@patchConstantOutput.tfactor) Patch
-                              Decorate 96(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
-                              Decorate 110(@patchConstantOutput.flInFactor) Patch
-                              Decorate 110(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
+                              Name 87  "i"
+                              Name 89  "param"
+                              Name 91  "param"
+                              Name 94  "i"
+                              Name 95  "param"
+                              Name 97  "param"
+                              Name 101  "@patchConstantResult"
+                              Name 107  "@patchConstantOutput.tfactor"
+                              Name 121  "@patchConstantOutput.flInFactor"
+                              Name 125  "o"
+                              Decorate 43(i.val) Location 0
+                              Decorate 58(cpid) BuiltIn InvocationId
+                              Decorate 61(@entryPointOutput.val) Location 0
+                              Decorate 107(@patchConstantOutput.tfactor) Patch
+                              Decorate 107(@patchConstantOutput.tfactor) BuiltIn TessLevelOuter
+                              Decorate 121(@patchConstantOutput.flInFactor) Patch
+                              Decorate 121(@patchConstantOutput.flInFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -489,106 +565,119 @@
               29:     28(int) Constant 0
               30:             TypePointer Function 14(hs_out_t)
               35:             TypePointer Function 7(fvec3)
-              41:             TypePointer Input 11
-           42(i):     41(ptr) Variable Input
-              45:             TypePointer Input 9(int)
-        46(cpid):     45(ptr) Variable Input
-              48:             TypePointer Output 20
-49(@entryPointOutput):     48(ptr) Variable Output
-              56:             TypePointer Output 14(hs_out_t)
-              58:      9(int) Constant 2
-              59:      9(int) Constant 4
-              60:      9(int) Constant 0
-              62:             TypeBool
-              66:             TypePointer Function 20
-              74:     28(int) Constant 1
-              76:      9(int) Constant 1
-              82:     28(int) Constant 2
-              89:             TypePointer Function 22(hs_pcf_t)
-              94:             TypeArray 6(float) 59
-              95:             TypePointer Output 94
-96(@patchConstantOutput.tfactor):     95(ptr) Variable Output
-              97:             TypePointer Function 6(float)
-             100:             TypePointer Output 6(float)
-             108:             TypeArray 6(float) 58
-             109:             TypePointer Output 108
-110(@patchConstantOutput.flInFactor):    109(ptr) Variable Output
-             121:    6(float) Constant 1082130432
+              41:             TypeArray 7(fvec3) 10
+              42:             TypePointer Input 41
+       43(i.val):     42(ptr) Variable Input
+              44:             TypePointer Input 7(fvec3)
+              48:     28(int) Constant 1
+              52:     28(int) Constant 2
+              57:             TypePointer Input 9(int)
+        58(cpid):     57(ptr) Variable Input
+              60:             TypePointer Output 41
+61(@entryPointOutput.val):     60(ptr) Variable Output
+              69:             TypePointer Output 7(fvec3)
+              71:      9(int) Constant 2
+              72:      9(int) Constant 4
+              73:      9(int) Constant 0
+              75:             TypeBool
+              79:             TypePointer Function 20
+              88:      9(int) Constant 1
+             100:             TypePointer Function 22(hs_pcf_t)
+             105:             TypeArray 6(float) 72
+             106:             TypePointer Output 105
+107(@patchConstantOutput.tfactor):    106(ptr) Variable Output
+             108:             TypePointer Function 6(float)
+             111:             TypePointer Output 6(float)
+             119:             TypeArray 6(float) 71
+             120:             TypePointer Output 119
+121(@patchConstantOutput.flInFactor):    120(ptr) Variable Output
+             132:    6(float) Constant 1082130432
          4(main):           2 Function None 3
                5:             Label
            40(i):     12(ptr) Variable Function
-        44(cpid):     13(ptr) Variable Function
-       51(param):     12(ptr) Variable Function
-       53(param):     13(ptr) Variable Function
-     67(pcf_out):     66(ptr) Variable Function
-           68(i):     12(ptr) Variable Function
-       69(param):     12(ptr) Variable Function
-       71(param):     13(ptr) Variable Function
-           75(i):     12(ptr) Variable Function
-       77(param):     12(ptr) Variable Function
-       79(param):     13(ptr) Variable Function
-           83(i):     12(ptr) Variable Function
-       84(param):     12(ptr) Variable Function
-       86(param):     13(ptr) Variable Function
-90(@patchConstantResult):     89(ptr) Variable Function
-              43:          11 Load 42(i)
-                              Store 40(i) 43
-              47:      9(int) Load 46(cpid)
-                              Store 44(cpid) 47
-              50:      9(int) Load 46(cpid)
-              52:          11 Load 40(i)
-                              Store 51(param) 52
-              54:      9(int) Load 44(cpid)
-                              Store 53(param) 54
-              55:14(hs_out_t) FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 51(param) 53(param)
-              57:     56(ptr) AccessChain 49(@entryPointOutput) 50
-                              Store 57 55
-                              ControlBarrier 58 59 60
-              61:      9(int) Load 46(cpid)
-              63:    62(bool) IEqual 61 29
-                              SelectionMerge 65 None
-                              BranchConditional 63 64 65
-              64:               Label
-              70:          11   Load 68(i)
-                                Store 69(param) 70
-                                Store 71(param) 60
-              72:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 69(param) 71(param)
-              73:     30(ptr)   AccessChain 67(pcf_out) 29
-                                Store 73 72
-              78:          11   Load 75(i)
-                                Store 77(param) 78
-                                Store 79(param) 76
-              80:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 77(param) 79(param)
-              81:     30(ptr)   AccessChain 67(pcf_out) 74
-                                Store 81 80
-              85:          11   Load 83(i)
-                                Store 84(param) 85
-                                Store 86(param) 58
-              87:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 84(param) 86(param)
-              88:     30(ptr)   AccessChain 67(pcf_out) 82
-                                Store 88 87
-              91:          20   Load 67(pcf_out)
-              92:          11   Load 40(i)
-              93:22(hs_pcf_t)   FunctionCall 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];) 91 92
-                                Store 90(@patchConstantResult) 93
-              98:     97(ptr)   AccessChain 90(@patchConstantResult) 29 29
-              99:    6(float)   Load 98
-             101:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 29
-                                Store 101 99
-             102:     97(ptr)   AccessChain 90(@patchConstantResult) 29 74
-             103:    6(float)   Load 102
-             104:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 74
-                                Store 104 103
-             105:     97(ptr)   AccessChain 90(@patchConstantResult) 29 82
-             106:    6(float)   Load 105
-             107:    100(ptr)   AccessChain 96(@patchConstantOutput.tfactor) 82
-                                Store 107 106
-             111:     97(ptr)   AccessChain 90(@patchConstantResult) 74
-             112:    6(float)   Load 111
-             113:    100(ptr)   AccessChain 110(@patchConstantOutput.flInFactor) 29
-                                Store 113 112
-                                Branch 65
-              65:             Label
+        56(cpid):     13(ptr) Variable Function
+       63(param):     12(ptr) Variable Function
+       65(param):     13(ptr) Variable Function
+     80(pcf_out):     79(ptr) Variable Function
+           81(i):     12(ptr) Variable Function
+       82(param):     12(ptr) Variable Function
+       84(param):     13(ptr) Variable Function
+           87(i):     12(ptr) Variable Function
+       89(param):     12(ptr) Variable Function
+       91(param):     13(ptr) Variable Function
+           94(i):     12(ptr) Variable Function
+       95(param):     12(ptr) Variable Function
+       97(param):     13(ptr) Variable Function
+101(@patchConstantResult):    100(ptr) Variable Function
+              45:     44(ptr) AccessChain 43(i.val) 29
+              46:    7(fvec3) Load 45
+              47:     35(ptr) AccessChain 40(i) 29 29
+                              Store 47 46
+              49:     44(ptr) AccessChain 43(i.val) 48
+              50:    7(fvec3) Load 49
+              51:     35(ptr) AccessChain 40(i) 48 29
+                              Store 51 50
+              53:     44(ptr) AccessChain 43(i.val) 52
+              54:    7(fvec3) Load 53
+              55:     35(ptr) AccessChain 40(i) 52 29
+                              Store 55 54
+              59:      9(int) Load 58(cpid)
+                              Store 56(cpid) 59
+              62:      9(int) Load 58(cpid)
+              64:          11 Load 40(i)
+                              Store 63(param) 64
+              66:      9(int) Load 56(cpid)
+                              Store 65(param) 66
+              67:14(hs_out_t) FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 63(param) 65(param)
+              68:    7(fvec3) CompositeExtract 67 0
+              70:     69(ptr) AccessChain 61(@entryPointOutput.val) 62
+                              Store 70 68
+                              ControlBarrier 71 72 73
+              74:      9(int) Load 58(cpid)
+              76:    75(bool) IEqual 74 29
+                              SelectionMerge 78 None
+                              BranchConditional 76 77 78
+              77:               Label
+              83:          11   Load 81(i)
+                                Store 82(param) 83
+                                Store 84(param) 73
+              85:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 82(param) 84(param)
+              86:     30(ptr)   AccessChain 80(pcf_out) 29
+                                Store 86 85
+              90:          11   Load 87(i)
+                                Store 89(param) 90
+                                Store 91(param) 88
+              92:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 89(param) 91(param)
+              93:     30(ptr)   AccessChain 80(pcf_out) 48
+                                Store 93 92
+              96:          11   Load 94(i)
+                                Store 95(param) 96
+                                Store 97(param) 71
+              98:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 95(param) 97(param)
+              99:     30(ptr)   AccessChain 80(pcf_out) 52
+                                Store 99 98
+             102:          20   Load 80(pcf_out)
+             103:          11   Load 40(i)
+             104:22(hs_pcf_t)   FunctionCall 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];) 102 103
+                                Store 101(@patchConstantResult) 104
+             109:    108(ptr)   AccessChain 101(@patchConstantResult) 29 29
+             110:    6(float)   Load 109
+             112:    111(ptr)   AccessChain 107(@patchConstantOutput.tfactor) 29
+                                Store 112 110
+             113:    108(ptr)   AccessChain 101(@patchConstantResult) 29 48
+             114:    6(float)   Load 113
+             115:    111(ptr)   AccessChain 107(@patchConstantOutput.tfactor) 48
+                                Store 115 114
+             116:    108(ptr)   AccessChain 101(@patchConstantResult) 29 52
+             117:    6(float)   Load 116
+             118:    111(ptr)   AccessChain 107(@patchConstantOutput.tfactor) 52
+                                Store 118 117
+             122:    108(ptr)   AccessChain 101(@patchConstantResult) 48
+             123:    6(float)   Load 122
+             124:    111(ptr)   AccessChain 121(@patchConstantOutput.flInFactor) 29
+                                Store 124 123
+                                Branch 78
+              78:             Label
                               Return
                               FunctionEnd
 18(@main(struct-hs_in_t-vf31[3];u1;):14(hs_out_t) Function None 15
@@ -608,18 +697,18 @@
      24(pcf_out):          20 FunctionParameter
       25(pcf_in):          11 FunctionParameter
               27:             Label
-          114(o):     89(ptr) Variable Function
-             115:    6(float) CompositeExtract 24(pcf_out) 0 0 0
-             116:     97(ptr) AccessChain 114(o) 29 29
-                              Store 116 115
-             117:    6(float) CompositeExtract 24(pcf_out) 1 0 0
-             118:     97(ptr) AccessChain 114(o) 29 74
-                              Store 118 117
-             119:    6(float) CompositeExtract 24(pcf_out) 2 0 0
-             120:     97(ptr) AccessChain 114(o) 29 82
-                              Store 120 119
-             122:     97(ptr) AccessChain 114(o) 74
-                              Store 122 121
-             123:22(hs_pcf_t) Load 114(o)
-                              ReturnValue 123
+          125(o):    100(ptr) Variable Function
+             126:    6(float) CompositeExtract 24(pcf_out) 0 0 0
+             127:    108(ptr) AccessChain 125(o) 29 29
+                              Store 127 126
+             128:    6(float) CompositeExtract 24(pcf_out) 1 0 0
+             129:    108(ptr) AccessChain 125(o) 29 48
+                              Store 129 128
+             130:    6(float) CompositeExtract 24(pcf_out) 2 0 0
+             131:    108(ptr) AccessChain 125(o) 29 52
+                              Store 131 130
+             133:    108(ptr) AccessChain 125(o) 48
+                              Store 133 132
+             134:22(hs_pcf_t) Load 125(o)
+                              ReturnValue 134
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.hull.void.tesc.out b/Test/baseResults/hlsl.hull.void.tesc.out
index 7c006db..2249360 100644
--- a/Test/baseResults/hlsl.hull.void.tesc.out
+++ b/Test/baseResults/hlsl.hull.void.tesc.out
@@ -25,15 +25,53 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -47,8 +85,8 @@
 0:33  Function Definition: PCF( ( temp void)
 0:33    Function Parameters: 
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 
 
@@ -81,15 +119,53 @@
 0:26  Function Definition: main( ( temp void)
 0:26    Function Parameters: 
 0:?     Sequence
-0:26      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?         'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
-0:26      move second child to first child ( temp structure{ temp 3-component vector of float cpoint})
-0:26        indirect index (layout( location=0) out structure{ temp 3-component vector of float cpoint})
-0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?           'InvocationId' ( in uint InvocationID)
-0:26        Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
-0:?           'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                0 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              0 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                1 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              1 (const int)
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            direct index ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26              Constant:
+0:26                2 (const int)
+0:26            Constant:
+0:26              0 (const int)
+0:26          direct index (layout( location=0) in 3-component vector of float)
+0:?             'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
+0:26            Constant:
+0:26              2 (const int)
+0:26      Sequence
+0:26        move second child to first child ( temp 3-component vector of float)
+0:26          indirect index (layout( location=0) out 3-component vector of float)
+0:?             '@entryPointOutput.cpoint' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?             'InvocationId' ( in uint InvocationID)
+0:26          cpoint: direct index for structure ( temp 3-component vector of float)
+0:26            Function Call: @main(struct-VS_OUT-vf31[3]; ( temp structure{ temp 3-component vector of float cpoint})
+0:?               'ip' ( temp 3-element array of structure{ temp 3-component vector of float cpoint})
+0:26            Constant:
+0:26              0 (const int)
 0:?       Barrier ( temp void)
 0:?       Test condition and select ( temp void)
 0:?         Condition
@@ -103,18 +179,18 @@
 0:33  Function Definition: PCF( ( temp void)
 0:33    Function Parameters: 
 0:?   Linker Objects
-0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float cpoint})
-0:?     'ip' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float cpoint})
+0:?     '@entryPointOutput.cpoint' (layout( location=0) out 3-element array of 3-component vector of float)
+0:?     'ip.cpoint' (layout( location=0) in 3-element array of 3-component vector of float)
 0:?     'InvocationId' ( in uint InvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 55
+// Generated by (magic number): 8000a
+// Id's are bound by 67
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 33 37 39
+                              EntryPoint TessellationControl 4  "main" 34 48 50
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalEven
@@ -130,13 +206,13 @@
                               Name 18  "PCF("
                               Name 21  "output"
                               Name 31  "ip"
-                              Name 33  "ip"
-                              Name 37  "@entryPointOutput"
-                              Name 39  "InvocationId"
-                              Name 41  "param"
-                              Decorate 33(ip) Location 0
-                              Decorate 37(@entryPointOutput) Location 0
-                              Decorate 39(InvocationId) BuiltIn InvocationId
+                              Name 34  "ip.cpoint"
+                              Name 48  "@entryPointOutput.cpoint"
+                              Name 50  "InvocationId"
+                              Name 52  "param"
+                              Decorate 34(ip.cpoint) Location 0
+                              Decorate 48(@entryPointOutput.cpoint) Location 0
+                              Decorate 50(InvocationId) BuiltIn InvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -152,39 +228,53 @@
               22:             TypeInt 32 1
               23:     22(int) Constant 0
               24:             TypePointer Function 7(fvec3)
-              32:             TypePointer Input 11
-          33(ip):     32(ptr) Variable Input
-              35:             TypeArray 13(HS_OUT) 10
-              36:             TypePointer Output 35
-37(@entryPointOutput):     36(ptr) Variable Output
-              38:             TypePointer Input 9(int)
-39(InvocationId):     38(ptr) Variable Input
-              44:             TypePointer Output 13(HS_OUT)
-              46:      9(int) Constant 2
-              47:      9(int) Constant 4
-              48:      9(int) Constant 0
-              50:             TypeBool
+              32:             TypeArray 7(fvec3) 10
+              33:             TypePointer Input 32
+   34(ip.cpoint):     33(ptr) Variable Input
+              35:             TypePointer Input 7(fvec3)
+              39:     22(int) Constant 1
+              43:     22(int) Constant 2
+              47:             TypePointer Output 32
+48(@entryPointOutput.cpoint):     47(ptr) Variable Output
+              49:             TypePointer Input 9(int)
+50(InvocationId):     49(ptr) Variable Input
+              56:             TypePointer Output 7(fvec3)
+              58:      9(int) Constant 2
+              59:      9(int) Constant 4
+              60:      9(int) Constant 0
+              62:             TypeBool
          4(main):           2 Function None 3
                5:             Label
           31(ip):     12(ptr) Variable Function
-       41(param):     12(ptr) Variable Function
-              34:          11 Load 33(ip)
-                              Store 31(ip) 34
-              40:      9(int) Load 39(InvocationId)
-              42:          11 Load 31(ip)
-                              Store 41(param) 42
-              43:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[3];) 41(param)
-              45:     44(ptr) AccessChain 37(@entryPointOutput) 40
-                              Store 45 43
-                              ControlBarrier 46 47 48
-              49:      9(int) Load 39(InvocationId)
-              51:    50(bool) IEqual 49 23
-                              SelectionMerge 53 None
-                              BranchConditional 51 52 53
-              52:               Label
-              54:           2   FunctionCall 18(PCF()
-                                Branch 53
-              53:             Label
+       52(param):     12(ptr) Variable Function
+              36:     35(ptr) AccessChain 34(ip.cpoint) 23
+              37:    7(fvec3) Load 36
+              38:     24(ptr) AccessChain 31(ip) 23 23
+                              Store 38 37
+              40:     35(ptr) AccessChain 34(ip.cpoint) 39
+              41:    7(fvec3) Load 40
+              42:     24(ptr) AccessChain 31(ip) 39 23
+                              Store 42 41
+              44:     35(ptr) AccessChain 34(ip.cpoint) 43
+              45:    7(fvec3) Load 44
+              46:     24(ptr) AccessChain 31(ip) 43 23
+                              Store 46 45
+              51:      9(int) Load 50(InvocationId)
+              53:          11 Load 31(ip)
+                              Store 52(param) 53
+              54:  13(HS_OUT) FunctionCall 16(@main(struct-VS_OUT-vf31[3];) 52(param)
+              55:    7(fvec3) CompositeExtract 54 0
+              57:     56(ptr) AccessChain 48(@entryPointOutput.cpoint) 51
+                              Store 57 55
+                              ControlBarrier 58 59 60
+              61:      9(int) Load 50(InvocationId)
+              63:    62(bool) IEqual 61 23
+                              SelectionMerge 65 None
+                              BranchConditional 63 64 65
+              64:               Label
+              66:           2   FunctionCall 18(PCF()
+                                Branch 65
+              65:             Label
                               Return
                               FunctionEnd
 16(@main(struct-VS_OUT-vf31[3];):  13(HS_OUT) Function None 14
diff --git a/Test/baseResults/hlsl.identifier.sample.frag.out b/Test/baseResults/hlsl.identifier.sample.frag.out
index ddc4c51..7ba029d 100644
--- a/Test/baseResults/hlsl.identifier.sample.frag.out
+++ b/Test/baseResults/hlsl.identifier.sample.frag.out
@@ -86,7 +86,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.if.frag.out b/Test/baseResults/hlsl.if.frag.out
index 6b6de9c..e77c7ac 100644
--- a/Test/baseResults/hlsl.if.frag.out
+++ b/Test/baseResults/hlsl.if.frag.out
@@ -240,7 +240,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 117
 
                               Capability Shader
@@ -390,7 +390,7 @@
               85:     81(ptr) AccessChain 16(input) 84
               86:    6(float) Load 85
                               Store 82(ii) 86
-              88:    21(bool) FOrdNotEqual 86 87
+              88:    21(bool) FUnordNotEqual 86 87
                               SelectionMerge 90 None
                               BranchConditional 88 89 90
               89:               Label
diff --git a/Test/baseResults/hlsl.imagefetch-subvec4.comp.out b/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
index 304f24b..a12c59f 100644
--- a/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
+++ b/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
@@ -72,7 +72,7 @@
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.implicitBool.frag.out b/Test/baseResults/hlsl.implicitBool.frag.out
index 8b5dcde..98e3dc0 100644
--- a/Test/baseResults/hlsl.implicitBool.frag.out
+++ b/Test/baseResults/hlsl.implicitBool.frag.out
@@ -332,7 +332,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 139
 
                               Capability Shader
@@ -420,7 +420,7 @@
               28:             Label
               36:     35(ptr) AccessChain 18 34
               37:    6(float) Load 36
-              39:    23(bool) FOrdNotEqual 37 38
+              39:    23(bool) FUnordNotEqual 37 38
                               SelectionMerge 41 None
                               BranchConditional 39 40 41
               40:               Label
@@ -431,7 +431,7 @@
               41:             Label
               47:     35(ptr) AccessChain 18 46
               48:    6(float) Load 47
-              49:    23(bool) FOrdNotEqual 48 38
+              49:    23(bool) FUnordNotEqual 48 38
                               SelectionMerge 51 None
                               BranchConditional 49 50 51
               50:               Label
@@ -456,11 +456,11 @@
               70:    23(bool) INotEqual 69 25
               71:     35(ptr) AccessChain 18 34
               72:    6(float) Load 71
-              73:    23(bool) FOrdNotEqual 72 38
+              73:    23(bool) FUnordNotEqual 72 38
               74:    23(bool) LogicalAnd 70 73
               75:     35(ptr) AccessChain 18 46
               76:    6(float) Load 75
-              77:    23(bool) FOrdNotEqual 76 38
+              77:    23(bool) FUnordNotEqual 76 38
               78:    23(bool) LogicalOr 74 77
                               SelectionMerge 80 None
                               BranchConditional 78 79 80
@@ -479,7 +479,7 @@
                               Branch 94
               94:             Label
               95:    6(float) Load 87(f)
-              96:    23(bool) FOrdNotEqual 95 38
+              96:    23(bool) FUnordNotEqual 95 38
                               BranchConditional 96 91 92
               91:               Label
               97:    6(float)   Load 87(f)
@@ -524,7 +524,7 @@
              113:             Label
              121:     35(ptr) AccessChain 18 34
              122:    6(float) Load 121
-             123:    23(bool) FOrdNotEqual 122 38
+             123:    23(bool) FUnordNotEqual 122 38
              126:    6(float) Select 123 124 125
                               Store 120(g) 126
              127:    6(float) Load 120(g)
diff --git a/Test/baseResults/hlsl.include.vert.out b/Test/baseResults/hlsl.include.vert.out
index 4a814ae..f46658d 100644
--- a/Test/baseResults/hlsl.include.vert.out
+++ b/Test/baseResults/hlsl.include.vert.out
@@ -1,6 +1,6 @@
 ../Test/hlsl.include.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.inf.vert.out b/Test/baseResults/hlsl.inf.vert.out
index 02326b3..bb9a184 100644
--- a/Test/baseResults/hlsl.inf.vert.out
+++ b/Test/baseResults/hlsl.inf.vert.out
@@ -112,7 +112,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.init.frag.out b/Test/baseResults/hlsl.init.frag.out
index 2139adb..97caf9a 100644
--- a/Test/baseResults/hlsl.init.frag.out
+++ b/Test/baseResults/hlsl.init.frag.out
@@ -331,7 +331,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float a, layout( row_major std140) uniform float b, layout( row_major std140) uniform float c})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 110
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.init2.frag.out b/Test/baseResults/hlsl.init2.frag.out
index 0ba8bd2..9654e2b 100644
--- a/Test/baseResults/hlsl.init2.frag.out
+++ b/Test/baseResults/hlsl.init2.frag.out
@@ -358,7 +358,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 112
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.inoutquals.frag.out b/Test/baseResults/hlsl.inoutquals.frag.out
index 2ffa3c5..57baeef 100644
--- a/Test/baseResults/hlsl.inoutquals.frag.out
+++ b/Test/baseResults/hlsl.inoutquals.frag.out
@@ -214,7 +214,7 @@
 0:?     'sampleMask' ( out 1-element array of int SampleMaskIn)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 92
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.inoutquals.negative.frag.out b/Test/baseResults/hlsl.inoutquals.negative.frag.out
new file mode 100644
index 0000000..933e6a6
--- /dev/null
+++ b/Test/baseResults/hlsl.inoutquals.negative.frag.out
@@ -0,0 +1,43 @@
+hlsl.inoutquals.negative.frag
+ERROR: 0:1: 'invalid1' : in/out qualifiers are only valid on parameters 
+ERROR: 0:2: 'invalid2' : in/out qualifiers are only valid on parameters 
+ERROR: 0:3: 'invalid3' : in/out qualifiers are only valid on parameters 
+ERROR: 0:4: 'invalid4' : in/out qualifiers are only valid on parameters 
+ERROR: 4 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:6  Function Definition: @main( ( temp void)
+0:6    Function Parameters: 
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'invalid1' ( in float)
+0:?     'invalid2' ( inout float)
+0:?     'invalid3' ( inout float)
+0:?     'invalid4' ( out float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:6  Function Definition: @main( ( temp void)
+0:6    Function Parameters: 
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'invalid1' ( in float)
+0:?     'invalid2' ( inout float)
+0:?     'invalid3' ( inout float)
+0:?     'invalid4' ( out float)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.int.dot.frag.out b/Test/baseResults/hlsl.int.dot.frag.out
index 7ea22a1..3272cb4 100644
--- a/Test/baseResults/hlsl.int.dot.frag.out
+++ b/Test/baseResults/hlsl.int.dot.frag.out
@@ -224,7 +224,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.frag.out b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
index 9fb9cc5..6067ad0 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.frag.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.frag.out
@@ -190,7 +190,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 98
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsic.frexp.vert.out b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
index 7069ece..a7cfd2a 100644
--- a/Test/baseResults/hlsl.intrinsic.frexp.vert.out
+++ b/Test/baseResults/hlsl.intrinsic.frexp.vert.out
@@ -113,7 +113,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.barriers.comp.out b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
index a078978..9017d41 100644
--- a/Test/baseResults/hlsl.intrinsics.barriers.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.barriers.comp.out
@@ -52,7 +52,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.comp.out b/Test/baseResults/hlsl.intrinsics.comp.out
index 761a3b3..5b7e227 100644
--- a/Test/baseResults/hlsl.intrinsics.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.comp.out
@@ -717,7 +717,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 265
 
                               Capability Shader
@@ -903,7 +903,7 @@
               17:             Label
       72(out_u1):      9(ptr) Variable Function
               60:    6(float) Load 11(inF0)
-              63:    61(bool) FOrdNotEqual 60 62
+              63:    61(bool) FUnordNotEqual 60 62
               64:    61(bool) All 63
               68:      8(int) Load 67(gs_ub)
               71:      8(int) AtomicIAdd 66(gs_ua) 69 70 68
@@ -960,7 +960,7 @@
               35:             Label
      115(out_u2):     27(ptr) Variable Function
              105:   24(fvec2) Load 29(inF0)
-             108:  106(bvec2) FOrdNotEqual 105 107
+             108:  106(bvec2) FUnordNotEqual 105 107
              109:    61(bool) All 108
              113:   26(ivec2) Load 112(gs_ub2)
              114:   26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 113
@@ -1010,7 +1010,7 @@
               47:             Label
      159(out_u3):     39(ptr) Variable Function
              149:   36(fvec3) Load 41(inF0)
-             152:  150(bvec3) FOrdNotEqual 149 151
+             152:  150(bvec3) FUnordNotEqual 149 151
              153:    61(bool) All 152
              157:   38(ivec3) Load 156(gs_ub3)
              158:   38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 157
@@ -1060,7 +1060,7 @@
               59:             Label
      202(out_u4):     51(ptr) Variable Function
              192:   48(fvec4) Load 53(inF0)
-             195:  193(bvec4) FOrdNotEqual 192 194
+             195:  193(bvec4) FUnordNotEqual 192 194
              196:    61(bool) All 195
              200:   50(ivec4) Load 199(gs_ub4)
              201:   50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 200
diff --git a/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
index 4832241..b0eeaa9 100644
--- a/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out
@@ -74,7 +74,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.double.frag.out b/Test/baseResults/hlsl.intrinsics.double.frag.out
index 472f31b..8444e20 100644
--- a/Test/baseResults/hlsl.intrinsics.double.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.double.frag.out
@@ -164,7 +164,7 @@
 0:?     'inU1b' (layout( location=9) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 90
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
index 0260b93..502ad0f 100644
--- a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
@@ -155,7 +155,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 80
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.f1632.frag.out b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
index 5277c5c..90a4b98 100644
--- a/Test/baseResults/hlsl.intrinsics.f1632.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.f1632.frag.out
@@ -270,7 +270,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 106
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.f3216.frag.out b/Test/baseResults/hlsl.intrinsics.f3216.frag.out
index 77826b3..ddf9a70 100644
--- a/Test/baseResults/hlsl.intrinsics.f3216.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.f3216.frag.out
@@ -270,7 +270,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 106
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.frag.out b/Test/baseResults/hlsl.intrinsics.frag.out
index dca823b..c1d0a47 100644
--- a/Test/baseResults/hlsl.intrinsics.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.frag.out
@@ -5659,7 +5659,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1839
 
                               Capability Shader
@@ -6389,7 +6389,7 @@
        341(r060):      7(ptr) Variable Function
        344(r061):      7(ptr) Variable Function
              140:    6(float) Load 13(inF0)
-             142:   137(bool) FOrdNotEqual 140 141
+             142:   137(bool) FUnordNotEqual 140 141
              143:   137(bool) All 142
                               Store 139(r000) 143
              145:    6(float) Load 13(inF0)
@@ -6399,7 +6399,7 @@
              149:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 148
                               Store 147(r002) 149
              151:    6(float) Load 13(inF0)
-             152:   137(bool) FOrdNotEqual 151 141
+             152:   137(bool) FUnordNotEqual 151 141
              153:   137(bool) Any 152
                               Store 150(r003) 153
              155:    6(float) Load 13(inF0)
@@ -6674,7 +6674,7 @@
        583(r065):     27(ptr) Variable Function
        586(r066):     27(ptr) Variable Function
              352:   26(fvec2) Load 31(inF0)
-             355:  353(bvec2) FOrdNotEqual 352 354
+             355:  353(bvec2) FUnordNotEqual 352 354
              356:   137(bool) All 355
                               Store 351(r000) 356
              358:   26(fvec2) Load 31(inF0)
@@ -6684,7 +6684,7 @@
              362:   26(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 361
                               Store 360(r002) 362
              364:   26(fvec2) Load 31(inF0)
-             365:  353(bvec2) FOrdNotEqual 364 354
+             365:  353(bvec2) FUnordNotEqual 364 354
              366:   137(bool) Any 365
                               Store 363(r003) 366
              368:   26(fvec2) Load 31(inF0)
@@ -6976,7 +6976,7 @@
        831(r066):     39(ptr) Variable Function
        834(r067):     39(ptr) Variable Function
              593:   38(fvec3) Load 43(inF0)
-             596:  594(bvec3) FOrdNotEqual 593 595
+             596:  594(bvec3) FUnordNotEqual 593 595
              597:   137(bool) All 596
                               Store 592(r000) 597
              599:   38(fvec3) Load 43(inF0)
@@ -6986,7 +6986,7 @@
              603:   38(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 602
                               Store 601(r002) 603
              605:   38(fvec3) Load 43(inF0)
-             606:  594(bvec3) FOrdNotEqual 605 595
+             606:  594(bvec3) FUnordNotEqual 605 595
              607:   137(bool) Any 606
                               Store 604(r003) 607
              609:   38(fvec3) Load 43(inF0)
@@ -7286,7 +7286,7 @@
       1080(r066):     51(ptr) Variable Function
       1083(r067):     51(ptr) Variable Function
              842:   50(fvec4) Load 55(inF0)
-             845:  843(bvec4) FOrdNotEqual 842 844
+             845:  843(bvec4) FUnordNotEqual 842 844
              846:   137(bool) All 845
                               Store 841(r000) 846
              848:   50(fvec4) Load 55(inF0)
@@ -7296,7 +7296,7 @@
              852:   50(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 851
                               Store 850(r002) 852
              854:   50(fvec4) Load 55(inF0)
-             855:  843(bvec4) FOrdNotEqual 854 844
+             855:  843(bvec4) FUnordNotEqual 854 844
              856:   137(bool) Any 855
                               Store 853(r003) 856
              858:   50(fvec4) Load 55(inF0)
@@ -7578,7 +7578,7 @@
       1257(r044):     63(ptr) Variable Function
       1262(r046):     63(ptr) Variable Function
             1091:          62 Load 65(inF0)
-            1093:        1092 FOrdNotEqual 1091 141
+            1093:        1092 FUnordNotEqual 1091 141
             1094:   137(bool) All 1093
                               Store 1090(r000) 1094
             1096:          62 Load 65(inF0)
@@ -7587,7 +7587,7 @@
             1098:          62 Load 65(inF0)
             1099:          62 ExtInst 1(GLSL.std.450) 17(Acos) 1098
             1101:          62 Load 65(inF0)
-            1102:        1092 FOrdNotEqual 1101 141
+            1102:        1092 FUnordNotEqual 1101 141
             1103:   137(bool) Any 1102
                               Store 1100(r003) 1103
             1105:          62 Load 65(inF0)
@@ -7807,7 +7807,7 @@
       1439(r044):     71(ptr) Variable Function
       1444(r046):     71(ptr) Variable Function
             1270:          70 Load 73(inF0)
-            1272:        1271 FOrdNotEqual 1270 141
+            1272:        1271 FUnordNotEqual 1270 141
             1273:   137(bool) All 1272
                               Store 1269(r000) 1273
             1275:          70 Load 73(inF0)
@@ -7816,7 +7816,7 @@
             1277:          70 Load 73(inF0)
             1278:          70 ExtInst 1(GLSL.std.450) 17(Acos) 1277
             1280:          70 Load 73(inF0)
-            1281:        1271 FOrdNotEqual 1280 141
+            1281:        1271 FUnordNotEqual 1280 141
             1282:   137(bool) Any 1281
                               Store 1279(r003) 1282
             1284:          70 Load 73(inF0)
@@ -8039,7 +8039,7 @@
       1624(r044):     79(ptr) Variable Function
       1629(r046):     79(ptr) Variable Function
             1452:          78 Load 81(inF0)
-            1454:        1453 FOrdNotEqual 1452 141
+            1454:        1453 FUnordNotEqual 1452 141
             1455:   137(bool) All 1454
                               Store 1451(r000) 1455
             1457:          78 Load 81(inF0)
@@ -8048,7 +8048,7 @@
             1459:          78 Load 81(inF0)
             1460:          78 ExtInst 1(GLSL.std.450) 17(Acos) 1459
             1462:          78 Load 81(inF0)
-            1463:        1453 FOrdNotEqual 1462 141
+            1463:        1453 FUnordNotEqual 1462 141
             1464:   137(bool) Any 1463
                               Store 1461(r003) 1464
             1466:          78 Load 81(inF0)
diff --git a/Test/baseResults/hlsl.intrinsics.lit.frag.out b/Test/baseResults/hlsl.intrinsics.lit.frag.out
index 9a8cb29..ef5759e 100644
--- a/Test/baseResults/hlsl.intrinsics.lit.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.lit.frag.out
@@ -118,7 +118,7 @@
 0:?     'm' (layout( location=2) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 48
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.negative.comp.out b/Test/baseResults/hlsl.intrinsics.negative.comp.out
index 920038f..c6fcdf0 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.comp.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.comp.out
@@ -180,7 +180,7 @@
 0:?     'inI0' (layout( location=3) in 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 99
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.negative.vert.out b/Test/baseResults/hlsl.intrinsics.negative.vert.out
index 3b1bac8..0f74c7e 100644
--- a/Test/baseResults/hlsl.intrinsics.negative.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.negative.vert.out
@@ -308,7 +308,7 @@
 0:?     'inI0' (layout( location=3) in 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 155
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.promote.down.frag.out b/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
index 2171698..b17c7e6 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.down.frag.out
@@ -104,7 +104,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.intrinsics.promote.frag.out b/Test/baseResults/hlsl.intrinsics.promote.frag.out
index 41b1c68..18fd037 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.frag.out
@@ -888,7 +888,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 322
 
                               Capability Shader
@@ -966,9 +966,9 @@
                               Decorate 21 DescriptorSet 0
                               Decorate 21 Binding 0
                               Decorate 258(g_tTexbfs) DescriptorSet 0
-                              Decorate 258(g_tTexbfs) Binding 0
+                              Decorate 258(g_tTexbfs) Binding 1
                               Decorate 277(g_tTex1df4) DescriptorSet 0
-                              Decorate 277(g_tTex1df4) Binding 0
+                              Decorate 277(g_tTex1df4) Binding 2
                               Decorate 319(@entryPointOutput.color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out b/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
index 143fa72..1abed4c 100644
--- a/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
+++ b/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
@@ -204,7 +204,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 80
 
                               Capability Shader
@@ -258,7 +258,7 @@
                               Decorate 19 DescriptorSet 0
                               Decorate 19 Binding 0
                               Decorate 31(g_tTex1df4) DescriptorSet 0
-                              Decorate 31(g_tTex1df4) Binding 0
+                              Decorate 31(g_tTex1df4) Binding 1
                               Decorate 74(@entryPointOutput.color) Location 0
                               Decorate 79(g_tTexbfs) DescriptorSet 0
                               Decorate 79(g_tTexbfs) Binding 0
diff --git a/Test/baseResults/hlsl.intrinsics.vert.out b/Test/baseResults/hlsl.intrinsics.vert.out
index 28e8e41..384f693 100644
--- a/Test/baseResults/hlsl.intrinsics.vert.out
+++ b/Test/baseResults/hlsl.intrinsics.vert.out
@@ -2780,7 +2780,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1225
 
                               Capability Shader
@@ -3004,14 +3004,14 @@
         15(inU1):      9(ptr) FunctionParameter
               17:             Label
              131:    6(float) Load 11(inF0)
-             134:   132(bool) FOrdNotEqual 131 133
+             134:   132(bool) FUnordNotEqual 131 133
              135:   132(bool) All 134
              136:    6(float) Load 11(inF0)
              137:    6(float) ExtInst 1(GLSL.std.450) 4(FAbs) 136
              138:    6(float) Load 11(inF0)
              139:    6(float) ExtInst 1(GLSL.std.450) 17(Acos) 138
              140:    6(float) Load 11(inF0)
-             141:   132(bool) FOrdNotEqual 140 133
+             141:   132(bool) FUnordNotEqual 140 133
              142:   132(bool) Any 141
              143:    6(float) Load 11(inF0)
              144:    6(float) ExtInst 1(GLSL.std.450) 16(Asin) 143
@@ -3132,14 +3132,14 @@
         33(inU1):     27(ptr) FunctionParameter
               35:             Label
              252:   24(fvec2) Load 29(inF0)
-             255:  253(bvec2) FOrdNotEqual 252 254
+             255:  253(bvec2) FUnordNotEqual 252 254
              256:   132(bool) All 255
              257:   24(fvec2) Load 29(inF0)
              258:   24(fvec2) ExtInst 1(GLSL.std.450) 4(FAbs) 257
              259:   24(fvec2) Load 29(inF0)
              260:   24(fvec2) ExtInst 1(GLSL.std.450) 17(Acos) 259
              261:   24(fvec2) Load 29(inF0)
-             262:  253(bvec2) FOrdNotEqual 261 254
+             262:  253(bvec2) FUnordNotEqual 261 254
              263:   132(bool) Any 262
              264:   24(fvec2) Load 29(inF0)
              265:   24(fvec2) ExtInst 1(GLSL.std.450) 16(Asin) 264
@@ -3275,14 +3275,14 @@
         45(inU1):     39(ptr) FunctionParameter
               47:             Label
              395:   36(fvec3) Load 41(inF0)
-             398:  396(bvec3) FOrdNotEqual 395 397
+             398:  396(bvec3) FUnordNotEqual 395 397
              399:   132(bool) All 398
              400:   36(fvec3) Load 41(inF0)
              401:   36(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 400
              402:   36(fvec3) Load 41(inF0)
              403:   36(fvec3) ExtInst 1(GLSL.std.450) 17(Acos) 402
              404:   36(fvec3) Load 41(inF0)
-             405:  396(bvec3) FOrdNotEqual 404 397
+             405:  396(bvec3) FUnordNotEqual 404 397
              406:   132(bool) Any 405
              407:   36(fvec3) Load 41(inF0)
              408:   36(fvec3) ExtInst 1(GLSL.std.450) 16(Asin) 407
@@ -3421,14 +3421,14 @@
         57(inU1):     51(ptr) FunctionParameter
               59:             Label
              540:   48(fvec4) Load 53(inF0)
-             543:  541(bvec4) FOrdNotEqual 540 542
+             543:  541(bvec4) FUnordNotEqual 540 542
              544:   132(bool) All 543
              545:   48(fvec4) Load 53(inF0)
              546:   48(fvec4) ExtInst 1(GLSL.std.450) 4(FAbs) 545
              547:   48(fvec4) Load 53(inF0)
              548:   48(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 547
              549:   48(fvec4) Load 53(inF0)
-             550:  541(bvec4) FOrdNotEqual 549 542
+             550:  541(bvec4) FUnordNotEqual 549 542
              551:   132(bool) Any 550
              552:   48(fvec4) Load 53(inF0)
              553:   48(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 552
@@ -3572,14 +3572,14 @@
         65(inF2):     61(ptr) FunctionParameter
               67:             Label
              695:          60 Load 63(inF0)
-             697:         696 FOrdNotEqual 695 133
+             697:         696 FUnordNotEqual 695 133
              698:   132(bool) All 697
              699:          60 Load 63(inF0)
              700:          60 ExtInst 1(GLSL.std.450) 4(FAbs) 699
              701:          60 Load 63(inF0)
              702:          60 ExtInst 1(GLSL.std.450) 17(Acos) 701
              703:          60 Load 63(inF0)
-             704:         696 FOrdNotEqual 703 133
+             704:         696 FUnordNotEqual 703 133
              705:   132(bool) Any 704
              706:          60 Load 63(inF0)
              707:          60 ExtInst 1(GLSL.std.450) 16(Asin) 706
@@ -3691,14 +3691,14 @@
         73(inF2):     69(ptr) FunctionParameter
               75:             Label
              810:          68 Load 71(inF0)
-             812:         811 FOrdNotEqual 810 133
+             812:         811 FUnordNotEqual 810 133
              813:   132(bool) All 812
              814:          68 Load 71(inF0)
              815:          68 ExtInst 1(GLSL.std.450) 4(FAbs) 814
              816:          68 Load 71(inF0)
              817:          68 ExtInst 1(GLSL.std.450) 17(Acos) 816
              818:          68 Load 71(inF0)
-             819:         811 FOrdNotEqual 818 133
+             819:         811 FUnordNotEqual 818 133
              820:   132(bool) Any 819
              821:          68 Load 71(inF0)
              822:          68 ExtInst 1(GLSL.std.450) 16(Asin) 821
@@ -3813,14 +3813,14 @@
         81(inF2):     77(ptr) FunctionParameter
               83:             Label
              928:          76 Load 79(inF0)
-             930:         929 FOrdNotEqual 928 133
+             930:         929 FUnordNotEqual 928 133
              931:   132(bool) All 930
              932:          76 Load 79(inF0)
              933:          76 ExtInst 1(GLSL.std.450) 4(FAbs) 932
              934:          76 Load 79(inF0)
              935:          76 ExtInst 1(GLSL.std.450) 17(Acos) 934
              936:          76 Load 79(inF0)
-             937:         929 FOrdNotEqual 936 133
+             937:         929 FUnordNotEqual 936 133
              938:   132(bool) Any 937
              939:          76 Load 79(inF0)
              940:          76 ExtInst 1(GLSL.std.450) 16(Asin) 939
diff --git a/Test/baseResults/hlsl.isfinite.frag.out b/Test/baseResults/hlsl.isfinite.frag.out
index a68bd1b..430ff06 100644
--- a/Test/baseResults/hlsl.isfinite.frag.out
+++ b/Test/baseResults/hlsl.isfinite.frag.out
@@ -172,7 +172,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 85
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.layout.frag.out b/Test/baseResults/hlsl.layout.frag.out
index 1e4f171..9007e93 100644
--- a/Test/baseResults/hlsl.layout.frag.out
+++ b/Test/baseResults/hlsl.layout.frag.out
@@ -88,7 +88,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.layoutOverride.vert.out b/Test/baseResults/hlsl.layoutOverride.vert.out
index cc09653..83fa628 100644
--- a/Test/baseResults/hlsl.layoutOverride.vert.out
+++ b/Test/baseResults/hlsl.layoutOverride.vert.out
@@ -52,7 +52,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.load.2dms.dx10.frag.out b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
index 9597762..02365b8 100644
--- a/Test/baseResults/hlsl.load.2dms.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
@@ -357,8 +357,9 @@
 0:?     '@entryPointOutput.Depth' ( out float FragDepth)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 130
 
                               Capability Shader
@@ -396,7 +397,7 @@
                               Name 124  "@entryPointOutput.Depth"
                               Name 129  "g_sSamp"
                               Decorate 14(g_tTex2dmsf4) DescriptorSet 0
-                              Decorate 14(g_tTex2dmsf4) Binding 0
+                              Decorate 14(g_tTex2dmsf4) Binding 1
                               MemberDecorate 20($Global) 0 Offset 0
                               MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
@@ -407,17 +408,17 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 7
                               Decorate 31(g_tTex2dmsi4) DescriptorSet 0
-                              Decorate 31(g_tTex2dmsi4) Binding 0
+                              Decorate 31(g_tTex2dmsi4) Binding 2
                               Decorate 39(g_tTex2dmsu4) DescriptorSet 0
-                              Decorate 39(g_tTex2dmsu4) Binding 0
+                              Decorate 39(g_tTex2dmsu4) Binding 3
                               Decorate 66(g_tTex2dmsf4a) DescriptorSet 0
-                              Decorate 66(g_tTex2dmsf4a) Binding 0
+                              Decorate 66(g_tTex2dmsf4a) Binding 4
                               Decorate 75(g_tTex2dmsi4a) DescriptorSet 0
-                              Decorate 75(g_tTex2dmsi4a) Binding 0
+                              Decorate 75(g_tTex2dmsi4a) Binding 5
                               Decorate 82(g_tTex2dmsu4a) DescriptorSet 0
-                              Decorate 82(g_tTex2dmsu4a) Binding 0
+                              Decorate 82(g_tTex2dmsu4a) Binding 6
                               Decorate 120(@entryPointOutput.Color) Location 0
                               Decorate 124(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 129(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.array.dx10.frag.out b/Test/baseResults/hlsl.load.array.dx10.frag.out
index f26d7df..0440779 100644
--- a/Test/baseResults/hlsl.load.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.array.dx10.frag.out
@@ -388,7 +388,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 159
 
                               Capability Shader
@@ -442,7 +442,7 @@
                               Name 155  "g_tTexcdi4a"
                               Name 158  "g_tTexcdu4a"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
-                              Decorate 14(g_tTex1df4a) Binding 0
+                              Decorate 14(g_tTex1df4a) Binding 1
                               MemberDecorate 20($Global) 0 Offset 0
                               MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
@@ -453,17 +453,17 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 7
                               Decorate 36(g_tTex1di4a) DescriptorSet 0
-                              Decorate 36(g_tTex1di4a) Binding 0
+                              Decorate 36(g_tTex1di4a) Binding 2
                               Decorate 46(g_tTex1du4a) DescriptorSet 0
-                              Decorate 46(g_tTex1du4a) Binding 0
+                              Decorate 46(g_tTex1du4a) Binding 3
                               Decorate 57(g_tTex2df4a) DescriptorSet 0
-                              Decorate 57(g_tTex2df4a) Binding 0
+                              Decorate 57(g_tTex2df4a) Binding 4
                               Decorate 70(g_tTex2di4a) DescriptorSet 0
-                              Decorate 70(g_tTex2di4a) Binding 0
+                              Decorate 70(g_tTex2di4a) Binding 5
                               Decorate 80(g_tTex2du4a) DescriptorSet 0
-                              Decorate 80(g_tTex2du4a) Binding 0
+                              Decorate 80(g_tTex2du4a) Binding 6
                               Decorate 104(@entryPointOutput.Color) Location 0
                               Decorate 108(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 113(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.basic.dx10.frag.out b/Test/baseResults/hlsl.load.basic.dx10.frag.out
index 895a109..2aef83d 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.frag.out
@@ -490,7 +490,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 179
 
                               Capability Shader
@@ -555,23 +555,23 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 9
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 1
                               Decorate 44(g_tTex1du4) DescriptorSet 0
-                              Decorate 44(g_tTex1du4) Binding 0
+                              Decorate 44(g_tTex1du4) Binding 2
                               Decorate 54(g_tTex2df4) DescriptorSet 0
-                              Decorate 54(g_tTex2df4) Binding 0
+                              Decorate 54(g_tTex2df4) Binding 3
                               Decorate 67(g_tTex2di4) DescriptorSet 0
-                              Decorate 67(g_tTex2di4) Binding 0
+                              Decorate 67(g_tTex2di4) Binding 4
                               Decorate 77(g_tTex2du4) DescriptorSet 0
-                              Decorate 77(g_tTex2du4) Binding 0
+                              Decorate 77(g_tTex2du4) Binding 5
                               Decorate 87(g_tTex3df4) DescriptorSet 0
-                              Decorate 87(g_tTex3df4) Binding 0
+                              Decorate 87(g_tTex3df4) Binding 6
                               Decorate 100(g_tTex3di4) DescriptorSet 0
-                              Decorate 100(g_tTex3di4) Binding 0
+                              Decorate 100(g_tTex3di4) Binding 7
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              Decorate 110(g_tTex3du4) Binding 0
+                              Decorate 110(g_tTex3du4) Binding 8
                               Decorate 133(@entryPointOutput.Color) Location 0
                               Decorate 137(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 142(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.basic.dx10.vert.out b/Test/baseResults/hlsl.load.basic.dx10.vert.out
index 99a57a7..a110532 100644
--- a/Test/baseResults/hlsl.load.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.load.basic.dx10.vert.out
@@ -452,7 +452,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 171
 
                               Capability Shader
@@ -512,23 +512,23 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 9
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 1
                               Decorate 44(g_tTex1du4) DescriptorSet 0
-                              Decorate 44(g_tTex1du4) Binding 0
+                              Decorate 44(g_tTex1du4) Binding 2
                               Decorate 54(g_tTex2df4) DescriptorSet 0
-                              Decorate 54(g_tTex2df4) Binding 0
+                              Decorate 54(g_tTex2df4) Binding 3
                               Decorate 67(g_tTex2di4) DescriptorSet 0
-                              Decorate 67(g_tTex2di4) Binding 0
+                              Decorate 67(g_tTex2di4) Binding 4
                               Decorate 77(g_tTex2du4) DescriptorSet 0
-                              Decorate 77(g_tTex2du4) Binding 0
+                              Decorate 77(g_tTex2du4) Binding 5
                               Decorate 87(g_tTex3df4) DescriptorSet 0
-                              Decorate 87(g_tTex3df4) Binding 0
+                              Decorate 87(g_tTex3df4) Binding 6
                               Decorate 100(g_tTex3di4) DescriptorSet 0
-                              Decorate 100(g_tTex3di4) Binding 0
+                              Decorate 100(g_tTex3di4) Binding 7
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              Decorate 110(g_tTex3du4) Binding 0
+                              Decorate 110(g_tTex3du4) Binding 8
                               Decorate 129(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 134(g_sSamp) DescriptorSet 0
                               Decorate 134(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.load.buffer.dx10.frag.out b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
index 2255cf5..299bde1 100644
--- a/Test/baseResults/hlsl.load.buffer.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.buffer.dx10.frag.out
@@ -166,7 +166,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Shader
@@ -204,7 +204,7 @@
                               Name 68  "@entryPointOutput.Depth"
                               Name 71  "g_tTexbf4_test"
                               Decorate 16(g_tTexbf4) DescriptorSet 0
-                              Decorate 16(g_tTexbf4) Binding 0
+                              Decorate 16(g_tTexbf4) Binding 1
                               MemberDecorate 22($Global) 0 Offset 0
                               MemberDecorate 22($Global) 1 Offset 8
                               MemberDecorate 22($Global) 2 Offset 16
@@ -215,11 +215,11 @@
                               MemberDecorate 22($Global) 7 Offset 80
                               Decorate 22($Global) Block
                               Decorate 24 DescriptorSet 0
-                              Decorate 24 Binding 0
+                              Decorate 24 Binding 4
                               Decorate 34(g_tTexbi4) DescriptorSet 0
-                              Decorate 34(g_tTexbi4) Binding 0
+                              Decorate 34(g_tTexbi4) Binding 2
                               Decorate 45(g_tTexbu4) DescriptorSet 0
-                              Decorate 45(g_tTexbu4) Binding 0
+                              Decorate 45(g_tTexbu4) Binding 3
                               Decorate 64(@entryPointOutput.Color) Location 0
                               Decorate 68(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 71(g_tTexbf4_test) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out b/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
index 08a1c56..f7a530c 100644
--- a/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out
@@ -172,7 +172,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 75
 
                               Capability Shader
@@ -210,7 +210,7 @@
                               Name 71  "@entryPointOutput.Depth"
                               Name 74  "g_tTexbfs_test"
                               Decorate 16(g_tTexbfs) DescriptorSet 0
-                              Decorate 16(g_tTexbfs) Binding 0
+                              Decorate 16(g_tTexbfs) Binding 1
                               MemberDecorate 22($Global) 0 Offset 0
                               MemberDecorate 22($Global) 1 Offset 8
                               MemberDecorate 22($Global) 2 Offset 16
@@ -221,11 +221,11 @@
                               MemberDecorate 22($Global) 7 Offset 80
                               Decorate 22($Global) Block
                               Decorate 24 DescriptorSet 0
-                              Decorate 24 Binding 0
+                              Decorate 24 Binding 4
                               Decorate 35(g_tTexbis) DescriptorSet 0
-                              Decorate 35(g_tTexbis) Binding 0
+                              Decorate 35(g_tTexbis) Binding 2
                               Decorate 46(g_tTexbus) DescriptorSet 0
-                              Decorate 46(g_tTexbus) Binding 0
+                              Decorate 46(g_tTexbus) Binding 3
                               Decorate 67(@entryPointOutput.Color) Location 0
                               Decorate 71(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 74(g_tTexbfs_test) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.offset.dx10.frag.out b/Test/baseResults/hlsl.load.offset.dx10.frag.out
index ebf1bd3..135b4af 100644
--- a/Test/baseResults/hlsl.load.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offset.dx10.frag.out
@@ -561,8 +561,9 @@
 0:?     '@entryPointOutput.Depth' ( out float FragDepth)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 201
 
                               Capability Shader
@@ -628,23 +629,23 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 9
                               Decorate 38(g_tTex1di4) DescriptorSet 0
-                              Decorate 38(g_tTex1di4) Binding 0
+                              Decorate 38(g_tTex1di4) Binding 1
                               Decorate 49(g_tTex1du4) DescriptorSet 0
-                              Decorate 49(g_tTex1du4) Binding 0
+                              Decorate 49(g_tTex1du4) Binding 2
                               Decorate 61(g_tTex2df4) DescriptorSet 0
-                              Decorate 61(g_tTex2df4) Binding 0
+                              Decorate 61(g_tTex2df4) Binding 3
                               Decorate 78(g_tTex2di4) DescriptorSet 0
-                              Decorate 78(g_tTex2di4) Binding 0
+                              Decorate 78(g_tTex2di4) Binding 4
                               Decorate 90(g_tTex2du4) DescriptorSet 0
-                              Decorate 90(g_tTex2du4) Binding 0
+                              Decorate 90(g_tTex2du4) Binding 5
                               Decorate 102(g_tTex3df4) DescriptorSet 0
-                              Decorate 102(g_tTex3df4) Binding 0
+                              Decorate 102(g_tTex3df4) Binding 6
                               Decorate 118(g_tTex3di4) DescriptorSet 0
-                              Decorate 118(g_tTex3di4) Binding 0
+                              Decorate 118(g_tTex3di4) Binding 7
                               Decorate 130(g_tTex3du4) DescriptorSet 0
-                              Decorate 130(g_tTex3du4) Binding 0
+                              Decorate 130(g_tTex3du4) Binding 8
                               Decorate 155(@entryPointOutput.Color) Location 0
                               Decorate 159(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 164(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
index 297c737..24aa368 100644
--- a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
@@ -435,8 +435,9 @@
 0:?     '@entryPointOutput.Depth' ( out float FragDepth)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 174
 
                               Capability Shader
@@ -491,7 +492,7 @@
                               Name 170  "g_tTexcdi4a"
                               Name 173  "g_tTexcdu4a"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
-                              Decorate 14(g_tTex1df4a) Binding 0
+                              Decorate 14(g_tTex1df4a) Binding 1
                               MemberDecorate 20($Global) 0 Offset 0
                               MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
@@ -502,17 +503,17 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 7
                               Decorate 39(g_tTex1di4a) DescriptorSet 0
-                              Decorate 39(g_tTex1di4a) Binding 0
+                              Decorate 39(g_tTex1di4a) Binding 2
                               Decorate 51(g_tTex1du4a) DescriptorSet 0
-                              Decorate 51(g_tTex1du4a) Binding 0
+                              Decorate 51(g_tTex1du4a) Binding 3
                               Decorate 64(g_tTex2df4a) DescriptorSet 0
-                              Decorate 64(g_tTex2df4a) Binding 0
+                              Decorate 64(g_tTex2df4a) Binding 4
                               Decorate 81(g_tTex2di4a) DescriptorSet 0
-                              Decorate 81(g_tTex2di4a) Binding 0
+                              Decorate 81(g_tTex2di4a) Binding 5
                               Decorate 93(g_tTex2du4a) DescriptorSet 0
-                              Decorate 93(g_tTex2du4a) Binding 0
+                              Decorate 93(g_tTex2du4a) Binding 6
                               Decorate 119(@entryPointOutput.Color) Location 0
                               Decorate 123(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 128(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out b/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
index 7ad197c..73a854b 100644
--- a/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out
@@ -110,7 +110,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 57
 
                               Capability Shader
@@ -151,11 +151,11 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 3
                               Decorate 31(g_tBuffU) DescriptorSet 0
-                              Decorate 31(g_tBuffU) Binding 0
+                              Decorate 31(g_tBuffU) Binding 2
                               Decorate 39(g_tBuffI) DescriptorSet 0
-                              Decorate 39(g_tBuffI) Binding 0
+                              Decorate 39(g_tBuffI) Binding 1
                               Decorate 54(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out b/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
index 77344ac..db105d7 100644
--- a/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out
@@ -208,7 +208,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 119
 
                               Capability Shader
@@ -255,7 +255,7 @@
                               Name 115  "g_tTex3di4"
                               Name 118  "g_tTex3du4"
                               Decorate 14(g_tTex1df4a) DescriptorSet 0
-                              Decorate 14(g_tTex1df4a) Binding 0
+                              Decorate 14(g_tTex1df4a) Binding 1
                               MemberDecorate 20($Global) 0 Offset 0
                               MemberDecorate 20($Global) 1 Offset 8
                               MemberDecorate 20($Global) 2 Offset 16
@@ -266,17 +266,17 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 7
                               Decorate 30(g_tTex1di4a) DescriptorSet 0
-                              Decorate 30(g_tTex1di4a) Binding 0
+                              Decorate 30(g_tTex1di4a) Binding 2
                               Decorate 38(g_tTex1du4a) DescriptorSet 0
-                              Decorate 38(g_tTex1du4a) Binding 0
+                              Decorate 38(g_tTex1du4a) Binding 3
                               Decorate 46(g_tTex2df4a) DescriptorSet 0
-                              Decorate 46(g_tTex2df4a) Binding 0
+                              Decorate 46(g_tTex2df4a) Binding 4
                               Decorate 55(g_tTex2di4a) DescriptorSet 0
-                              Decorate 55(g_tTex2di4a) Binding 0
+                              Decorate 55(g_tTex2di4a) Binding 5
                               Decorate 62(g_tTex2du4a) DescriptorSet 0
-                              Decorate 62(g_tTex2du4a) Binding 0
+                              Decorate 62(g_tTex2du4a) Binding 6
                               Decorate 82(@entryPointOutput.Color) Location 0
                               Decorate 86(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 91(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out b/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
index bf9ea2d..c063e0c 100644
--- a/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out
@@ -244,7 +244,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 132
 
                               Capability Shader
@@ -302,23 +302,23 @@
                               MemberDecorate 20($Global) 7 Offset 80
                               Decorate 20($Global) Block
                               Decorate 22 DescriptorSet 0
-                              Decorate 22 Binding 0
+                              Decorate 22 Binding 9
                               Decorate 30(g_tTex1di4) DescriptorSet 0
-                              Decorate 30(g_tTex1di4) Binding 0
+                              Decorate 30(g_tTex1di4) Binding 1
                               Decorate 38(g_tTex1du4) DescriptorSet 0
-                              Decorate 38(g_tTex1du4) Binding 0
+                              Decorate 38(g_tTex1du4) Binding 2
                               Decorate 46(g_tTex2df4) DescriptorSet 0
-                              Decorate 46(g_tTex2df4) Binding 0
+                              Decorate 46(g_tTex2df4) Binding 3
                               Decorate 55(g_tTex2di4) DescriptorSet 0
-                              Decorate 55(g_tTex2di4) Binding 0
+                              Decorate 55(g_tTex2di4) Binding 4
                               Decorate 62(g_tTex2du4) DescriptorSet 0
-                              Decorate 62(g_tTex2du4) Binding 0
+                              Decorate 62(g_tTex2du4) Binding 5
                               Decorate 69(g_tTex3df4) DescriptorSet 0
-                              Decorate 69(g_tTex3df4) Binding 0
+                              Decorate 69(g_tTex3df4) Binding 6
                               Decorate 78(g_tTex3di4) DescriptorSet 0
-                              Decorate 78(g_tTex3di4) Binding 0
+                              Decorate 78(g_tTex3di4) Binding 7
                               Decorate 85(g_tTex3du4) DescriptorSet 0
-                              Decorate 85(g_tTex3du4) Binding 0
+                              Decorate 85(g_tTex3du4) Binding 8
                               Decorate 104(@entryPointOutput.Color) Location 0
                               Decorate 108(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 113(g_sSamp) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.logical.binary.frag.out b/Test/baseResults/hlsl.logical.binary.frag.out
index 1df3966..d66eb7c 100644
--- a/Test/baseResults/hlsl.logical.binary.frag.out
+++ b/Test/baseResults/hlsl.logical.binary.frag.out
@@ -124,7 +124,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 56
 
                               Capability Shader
@@ -193,7 +193,7 @@
               24:    21(bool) INotEqual 20 23
               27:     26(ptr) AccessChain 16 25
               28:    6(float) Load 27
-              30:    21(bool) FOrdNotEqual 28 29
+              30:    21(bool) FUnordNotEqual 28 29
               31:    21(bool) LogicalAnd 24 30
                               SelectionMerge 33 None
                               BranchConditional 31 32 33
@@ -205,7 +205,7 @@
               36:    21(bool) INotEqual 35 23
               37:     26(ptr) AccessChain 16 25
               38:    6(float) Load 37
-              39:    21(bool) FOrdNotEqual 38 29
+              39:    21(bool) FUnordNotEqual 38 29
               40:    21(bool) LogicalOr 36 39
                               SelectionMerge 42 None
                               BranchConditional 40 41 42
diff --git a/Test/baseResults/hlsl.logical.binary.vec.frag.out b/Test/baseResults/hlsl.logical.binary.vec.frag.out
index bc469dc..20f87b8 100644
--- a/Test/baseResults/hlsl.logical.binary.vec.frag.out
+++ b/Test/baseResults/hlsl.logical.binary.vec.frag.out
@@ -254,7 +254,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 115
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.logical.unary.frag.out b/Test/baseResults/hlsl.logical.unary.frag.out
index 57247c6..711625d 100644
--- a/Test/baseResults/hlsl.logical.unary.frag.out
+++ b/Test/baseResults/hlsl.logical.unary.frag.out
@@ -184,7 +184,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
@@ -266,11 +266,11 @@
               34:   30(bvec4) LogicalNot 33
               37:     36(ptr) AccessChain 16 35
               38:    6(float) Load 37
-              40:    21(bool) FOrdNotEqual 38 39
+              40:    21(bool) FUnordNotEqual 38 39
               41:    21(bool) LogicalNot 40
               44:     43(ptr) AccessChain 16 42
               45:    7(fvec4) Load 44
-              47:   30(bvec4) FOrdNotEqual 45 46
+              47:   30(bvec4) FUnordNotEqual 45 46
               48:   30(bvec4) LogicalNot 47
               49:     18(ptr) AccessChain 16 17
               50:     12(int) Load 49
@@ -282,7 +282,7 @@
               53:             Label
               54:     36(ptr) AccessChain 16 35
               55:    6(float) Load 54
-              56:    21(bool) FOrdNotEqual 55 39
+              56:    21(bool) FUnordNotEqual 55 39
                               SelectionMerge 58 None
                               BranchConditional 56 57 58
               57:               Label
@@ -299,7 +299,7 @@
               64:             Label
               65:     36(ptr) AccessChain 16 35
               66:    6(float) Load 65
-              67:    21(bool) FOrdNotEqual 66 39
+              67:    21(bool) FUnordNotEqual 66 39
               68:    21(bool) LogicalNot 67
                               SelectionMerge 70 None
                               BranchConditional 68 69 70
diff --git a/Test/baseResults/hlsl.logicalConvert.frag.out b/Test/baseResults/hlsl.logicalConvert.frag.out
index 4757f33..44e1961 100644
--- a/Test/baseResults/hlsl.logicalConvert.frag.out
+++ b/Test/baseResults/hlsl.logicalConvert.frag.out
@@ -254,7 +254,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.loopattr.frag.out b/Test/baseResults/hlsl.loopattr.frag.out
index c6130f7..ea37109 100644
--- a/Test/baseResults/hlsl.loopattr.frag.out
+++ b/Test/baseResults/hlsl.loopattr.frag.out
@@ -136,7 +136,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matNx1.frag.out b/Test/baseResults/hlsl.matNx1.frag.out
index 1d92d5f..48a7180 100644
--- a/Test/baseResults/hlsl.matNx1.frag.out
+++ b/Test/baseResults/hlsl.matNx1.frag.out
@@ -153,7 +153,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 77
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matType.bool.frag.out b/Test/baseResults/hlsl.matType.bool.frag.out
index 1362ee7..47bbaf1 100644
--- a/Test/baseResults/hlsl.matType.bool.frag.out
+++ b/Test/baseResults/hlsl.matType.bool.frag.out
@@ -233,7 +233,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 130
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matType.frag.out b/Test/baseResults/hlsl.matType.frag.out
index ed08983..1117df1 100644
--- a/Test/baseResults/hlsl.matType.frag.out
+++ b/Test/baseResults/hlsl.matType.frag.out
@@ -32,7 +32,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matType.int.frag.out b/Test/baseResults/hlsl.matType.int.frag.out
index ad0c314..d567c17 100644
--- a/Test/baseResults/hlsl.matType.int.frag.out
+++ b/Test/baseResults/hlsl.matType.int.frag.out
@@ -399,7 +399,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 232
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matpack-1.frag.out b/Test/baseResults/hlsl.matpack-1.frag.out
index 829d0b1..c480f78 100644
--- a/Test/baseResults/hlsl.matpack-1.frag.out
+++ b/Test/baseResults/hlsl.matpack-1.frag.out
@@ -100,7 +100,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matpack-pragma-global.frag.out b/Test/baseResults/hlsl.matpack-pragma-global.frag.out
new file mode 100644
index 0000000..2feef9e
--- /dev/null
+++ b/Test/baseResults/hlsl.matpack-pragma-global.frag.out
@@ -0,0 +1,102 @@
+hlsl.matpack-pragma-global.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        direct index ( temp 4-component vector of float)
+0:7          g_GlobalMat1: direct index for structure ( uniform 4X4 matrix of float)
+0:7            'anon@0' (layout( column_major std140) uniform block{ uniform 4X4 matrix of float g_GlobalMat1})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          Constant:
+0:7            0 (const int)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform 4X4 matrix of float g_GlobalMat1})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        direct index ( temp 4-component vector of float)
+0:7          g_GlobalMat1: direct index for structure ( uniform 4X4 matrix of float)
+0:7            'anon@0' (layout( column_major std140) uniform block{ uniform 4X4 matrix of float g_GlobalMat1})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          Constant:
+0:7            0 (const int)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform 4X4 matrix of float g_GlobalMat1})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 23
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "$Global"
+                              MemberName 12($Global) 0  "g_GlobalMat1"
+                              Name 14  ""
+                              Name 23  "@entryPointOutput"
+                              MemberDecorate 12($Global) 0 ColMajor
+                              MemberDecorate 12($Global) 0 Offset 0
+                              MemberDecorate 12($Global) 0 MatrixStride 16
+                              Decorate 12($Global) Block
+                              Decorate 14 DescriptorSet 0
+                              Decorate 14 Binding 0
+                              Decorate 23(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeMatrix 7(fvec4) 4
+     12($Global):             TypeStruct 11
+              13:             TypePointer Uniform 12($Global)
+              14:     13(ptr) Variable Uniform
+              15:             TypeInt 32 1
+              16:     15(int) Constant 0
+              17:             TypePointer Uniform 7(fvec4)
+              22:             TypePointer Output 7(fvec4)
+23(@entryPointOutput):     22(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              24:    7(fvec4) FunctionCall 9(@main()
+                              Store 23(@entryPointOutput) 24
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              18:     17(ptr) AccessChain 14 16 16
+              19:    7(fvec4) Load 18
+                              ReturnValue 19
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.matpack-pragma.frag.out b/Test/baseResults/hlsl.matpack-pragma.frag.out
index a5e351e..bd5ca50 100644
--- a/Test/baseResults/hlsl.matpack-pragma.frag.out
+++ b/Test/baseResults/hlsl.matpack-pragma.frag.out
@@ -170,7 +170,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matrixSwizzle.vert.out b/Test/baseResults/hlsl.matrixSwizzle.vert.out
index 7bc0c17..4082cb2 100644
--- a/Test/baseResults/hlsl.matrixSwizzle.vert.out
+++ b/Test/baseResults/hlsl.matrixSwizzle.vert.out
@@ -677,7 +677,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 118
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.matrixindex.frag.out b/Test/baseResults/hlsl.matrixindex.frag.out
index 1e5fbb9..fa7a8c0 100644
--- a/Test/baseResults/hlsl.matrixindex.frag.out
+++ b/Test/baseResults/hlsl.matrixindex.frag.out
@@ -272,7 +272,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 83
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.max.frag.out b/Test/baseResults/hlsl.max.frag.out
index 14cd8bf..7a0c5d2 100644
--- a/Test/baseResults/hlsl.max.frag.out
+++ b/Test/baseResults/hlsl.max.frag.out
@@ -66,7 +66,7 @@
 0:?     'input2' (layout( location=1) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.memberFunCall.frag.out b/Test/baseResults/hlsl.memberFunCall.frag.out
index 83dc86f..2886f8f 100644
--- a/Test/baseResults/hlsl.memberFunCall.frag.out
+++ b/Test/baseResults/hlsl.memberFunCall.frag.out
@@ -152,7 +152,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 73
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.mintypes.frag.out b/Test/baseResults/hlsl.mintypes.frag.out
index 2ce899b..013f8d4 100644
--- a/Test/baseResults/hlsl.mintypes.frag.out
+++ b/Test/baseResults/hlsl.mintypes.frag.out
@@ -98,7 +98,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.mip.operator.frag.out b/Test/baseResults/hlsl.mip.operator.frag.out
index 4123d23..82b000f 100644
--- a/Test/baseResults/hlsl.mip.operator.frag.out
+++ b/Test/baseResults/hlsl.mip.operator.frag.out
@@ -128,7 +128,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 61
 
                               Capability Shader
@@ -143,7 +143,7 @@
                               Name 25  "g_tTex2df4a"
                               Name 59  "@entryPointOutput"
                               Decorate 13(g_tTex2df4) DescriptorSet 0
-                              Decorate 13(g_tTex2df4) Binding 0
+                              Decorate 13(g_tTex2df4) Binding 1
                               Decorate 25(g_tTex2df4a) DescriptorSet 0
                               Decorate 25(g_tTex2df4a) Binding 0
                               Decorate 59(@entryPointOutput) Location 0
diff --git a/Test/baseResults/hlsl.mul-truncate.frag.out b/Test/baseResults/hlsl.mul-truncate.frag.out
index c337ed4..25e7b2e 100644
--- a/Test/baseResults/hlsl.mul-truncate.frag.out
+++ b/Test/baseResults/hlsl.mul-truncate.frag.out
@@ -383,7 +383,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 190
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.multiDescriptorSet.frag.out b/Test/baseResults/hlsl.multiDescriptorSet.frag.out
index fa48092..cfe3ea8 100644
--- a/Test/baseResults/hlsl.multiDescriptorSet.frag.out
+++ b/Test/baseResults/hlsl.multiDescriptorSet.frag.out
@@ -1,6 +1,6 @@
 hlsl.multiDescriptorSet.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 92
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.multiEntry.vert.out b/Test/baseResults/hlsl.multiEntry.vert.out
index d641512..fcb9f18 100644
--- a/Test/baseResults/hlsl.multiEntry.vert.out
+++ b/Test/baseResults/hlsl.multiEntry.vert.out
@@ -70,7 +70,7 @@
 0:?     'Index' ( in uint VertexIndex)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 41
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.multiReturn.frag.out b/Test/baseResults/hlsl.multiReturn.frag.out
index 54b5107..9379863 100644
--- a/Test/baseResults/hlsl.multiReturn.frag.out
+++ b/Test/baseResults/hlsl.multiReturn.frag.out
@@ -48,7 +48,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{ temp float f,  temp 3-component vector of float v,  temp 3X3 matrix of float m} s})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.namespace.frag.out b/Test/baseResults/hlsl.namespace.frag.out
index 9431f66..5346c44 100644
--- a/Test/baseResults/hlsl.namespace.frag.out
+++ b/Test/baseResults/hlsl.namespace.frag.out
@@ -103,7 +103,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.noSemantic.functionality1.comp.out b/Test/baseResults/hlsl.noSemantic.functionality1.comp.out
index fc51e9c..3531a34 100644
--- a/Test/baseResults/hlsl.noSemantic.functionality1.comp.out
+++ b/Test/baseResults/hlsl.noSemantic.functionality1.comp.out
@@ -1,6 +1,6 @@
 hlsl.noSemantic.functionality1.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.nonint-index.frag.out b/Test/baseResults/hlsl.nonint-index.frag.out
index 0b6bdbc..897f8bc 100644
--- a/Test/baseResults/hlsl.nonint-index.frag.out
+++ b/Test/baseResults/hlsl.nonint-index.frag.out
@@ -88,7 +88,7 @@
 0:?     'input' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out b/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
index 268e563..59b251a 100644
--- a/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
+++ b/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out
@@ -268,7 +268,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 111
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.numericsuffixes.frag.out b/Test/baseResults/hlsl.numericsuffixes.frag.out
index b433266..1725d3f 100644
--- a/Test/baseResults/hlsl.numericsuffixes.frag.out
+++ b/Test/baseResults/hlsl.numericsuffixes.frag.out
@@ -192,7 +192,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.numthreads.comp.out b/Test/baseResults/hlsl.numthreads.comp.out
index 95cf29f..c8676e3 100644
--- a/Test/baseResults/hlsl.numthreads.comp.out
+++ b/Test/baseResults/hlsl.numthreads.comp.out
@@ -44,7 +44,7 @@
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.opaque-type-bug.frag.out b/Test/baseResults/hlsl.opaque-type-bug.frag.out
index 4ac7a91..738fa4f 100644
--- a/Test/baseResults/hlsl.opaque-type-bug.frag.out
+++ b/Test/baseResults/hlsl.opaque-type-bug.frag.out
@@ -58,7 +58,7 @@
 0:?     'MyTexture' (layout( binding=0) uniform texture2D)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.overload.frag.out b/Test/baseResults/hlsl.overload.frag.out
index d93c305..3428d80 100644
--- a/Test/baseResults/hlsl.overload.frag.out
+++ b/Test/baseResults/hlsl.overload.frag.out
@@ -734,7 +734,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 520
 
                               Capability Shader
@@ -1457,7 +1457,7 @@
                               Store 330(param) 331
              332:           2 FunctionCall 68(foo3(b1;) 330(param)
              333:6(float64_t) Load 155(d)
-             335:     8(bool) FOrdNotEqual 333 334
+             335:     8(bool) FUnordNotEqual 333 334
                               Store 336(param) 335
              337:           2 FunctionCall 68(foo3(b1;) 336(param)
              338:     15(int) Load 167(u)
@@ -1469,7 +1469,7 @@
                               Store 345(param) 344
              346:           2 FunctionCall 68(foo3(b1;) 345(param)
              347:   29(float) Load 179(f)
-             349:     8(bool) FOrdNotEqual 347 348
+             349:     8(bool) FUnordNotEqual 347 348
                               Store 350(param) 349
              351:           2 FunctionCall 68(foo3(b1;) 350(param)
              352:     8(bool) Load 156(b)
diff --git a/Test/baseResults/hlsl.params.default.frag.out b/Test/baseResults/hlsl.params.default.frag.out
index 5d054bf..a28ddc4 100644
--- a/Test/baseResults/hlsl.params.default.frag.out
+++ b/Test/baseResults/hlsl.params.default.frag.out
@@ -376,7 +376,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 178
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.partialFlattenLocal.vert.out b/Test/baseResults/hlsl.partialFlattenLocal.vert.out
index c3ed3a2..754c86c 100644
--- a/Test/baseResults/hlsl.partialFlattenLocal.vert.out
+++ b/Test/baseResults/hlsl.partialFlattenLocal.vert.out
@@ -237,7 +237,7 @@
 0:?     'pos' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 90
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.partialFlattenMixed.vert.out b/Test/baseResults/hlsl.partialFlattenMixed.vert.out
index 520a0fb..c9fcc6f 100644
--- a/Test/baseResults/hlsl.partialFlattenMixed.vert.out
+++ b/Test/baseResults/hlsl.partialFlattenMixed.vert.out
@@ -91,7 +91,7 @@
 0:?     'pos' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
@@ -116,7 +116,7 @@
                               Decorate 24(tex[0]) DescriptorSet 0
                               Decorate 24(tex[0]) Binding 0
                               Decorate 28(tex[1]) DescriptorSet 0
-                              Decorate 28(tex[1]) Binding 0
+                              Decorate 28(tex[1]) Binding 1
                               Decorate 36(pos) Location 0
                               Decorate 39(@entryPointOutput) BuiltIn Position
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.partialInit.frag.out b/Test/baseResults/hlsl.partialInit.frag.out
index 551c579..4686566 100644
--- a/Test/baseResults/hlsl.partialInit.frag.out
+++ b/Test/baseResults/hlsl.partialInit.frag.out
@@ -400,7 +400,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 104
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.pp.line.frag.out b/Test/baseResults/hlsl.pp.line.frag.out
index 0416cf4..a8479f5 100644
--- a/Test/baseResults/hlsl.pp.line.frag.out
+++ b/Test/baseResults/hlsl.pp.line.frag.out
@@ -120,7 +120,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.pp.line2.frag.out b/Test/baseResults/hlsl.pp.line2.frag.out
index 338884a..9ccf05c 100644
--- a/Test/baseResults/hlsl.pp.line2.frag.out
+++ b/Test/baseResults/hlsl.pp.line2.frag.out
@@ -1,6 +1,6 @@
 hlsl.pp.line2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 80
 
                               Capability Shader
@@ -88,7 +88,7 @@
                               Decorate 49(g_tColor) DescriptorSet 0
                               Decorate 49(g_tColor) Binding 0
                               Decorate 56(g_sAniso) DescriptorSet 0
-                              Decorate 56(g_sAniso) Binding 0
+                              Decorate 56(g_sAniso) Binding 1
                               Decorate 71(i.vTextureCoords) Location 0
                               Decorate 75(@entryPointOutput.vColor) Location 0
                3:             TypeVoid
diff --git a/Test/baseResults/hlsl.pp.line3.frag.out b/Test/baseResults/hlsl.pp.line3.frag.out
index e94547c..d19c516 100644
--- a/Test/baseResults/hlsl.pp.line3.frag.out
+++ b/Test/baseResults/hlsl.pp.line3.frag.out
@@ -1,6 +1,6 @@
 hlsl.pp.line3.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.pp.line4.frag.out b/Test/baseResults/hlsl.pp.line4.frag.out
index 1ddb98b..2244588 100644
--- a/Test/baseResults/hlsl.pp.line4.frag.out
+++ b/Test/baseResults/hlsl.pp.line4.frag.out
@@ -1,7 +1,7 @@
 hlsl.pp.line4.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 115
+// Generated by (magic number): 8000a
+// Id's are bound by 116
 
                               Capability Shader
                2:             ExtInstImport  "GLSL.std.450"
@@ -79,7 +79,7 @@
                               Decorate 48(g_tColor) DescriptorSet 0
                               Decorate 48(g_tColor) Binding 0
                               Decorate 55(g_sAniso) DescriptorSet 0
-                              Decorate 55(g_sAniso) Binding 0
+                              Decorate 55(g_sAniso) Binding 1
                               Decorate 70(i.vTextureCoords) Location 0
                               Decorate 74(@entryPointOutput.vColor) Location 0
                3:             TypeVoid
@@ -117,30 +117,30 @@
                               Line 17 25 0
               71:    8(fvec2) Load 70(i.vTextureCoords)
                               Line 17 29 0
-              82:     24(ptr) AccessChain 21 23
-              83:     18(int) Load 82
-              84:    27(bool) INotEqual 83 28
-                              SelectionMerge 85 None
-                              BranchConditional 84 86 87
+              83:     24(ptr) AccessChain 21 23
+              84:     18(int) Load 83
+              85:    27(bool) INotEqual 84 28
+                              SelectionMerge 92 None
+                              BranchConditional 85 86 89
               86:               Label
                                 Line 32 1 0
-              88:     24(ptr)   AccessChain 21 35
-              89:     18(int)   Load 88
-                                Branch 85
-              87:               Label
+              87:     24(ptr)   AccessChain 21 35
+              88:     18(int)   Load 87
+                                Branch 92
+              89:               Label
                                 Line 17 32 0
               90:     24(ptr)   AccessChain 21 39
               91:     18(int)   Load 90
-                                Branch 85
-              85:             Label
-             114:     18(int) Phi 89 86 91 87
+                                Branch 92
+              92:             Label
+             115:     18(int) Phi 88 86 91 89
                               Line 17 33 0
-              93:     50(ptr) AccessChain 48(g_tColor) 114
-              94:          44 Load 93
-              95:          53 Load 55(g_sAniso)
-              96:          57 SampledImage 94 95
-              99:   11(fvec4) ImageSampleImplicitLod 96 71
+              94:     50(ptr) AccessChain 48(g_tColor) 115
+              95:          44 Load 94
+              96:          53 Load 55(g_sAniso)
+              97:          57 SampledImage 95 96
+             100:   11(fvec4) ImageSampleImplicitLod 97 71
                               Line 17 25 0
-                              Store 74(@entryPointOutput.vColor) 99
+                              Store 74(@entryPointOutput.vColor) 100
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.pp.vert.out b/Test/baseResults/hlsl.pp.vert.out
index 5d4e943..5478101 100644
--- a/Test/baseResults/hlsl.pp.vert.out
+++ b/Test/baseResults/hlsl.pp.vert.out
@@ -26,7 +26,7 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int goodGlobal1,  uniform int goodGlobal2})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 13
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.precedence.frag.out b/Test/baseResults/hlsl.precedence.frag.out
index b51be0d..85fe187 100644
--- a/Test/baseResults/hlsl.precedence.frag.out
+++ b/Test/baseResults/hlsl.precedence.frag.out
@@ -148,7 +148,7 @@
 0:?     'a4' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.precedence2.frag.out b/Test/baseResults/hlsl.precedence2.frag.out
index 7dd21a6..f231b35 100644
--- a/Test/baseResults/hlsl.precedence2.frag.out
+++ b/Test/baseResults/hlsl.precedence2.frag.out
@@ -114,7 +114,7 @@
 0:?     'a4' (layout( location=3) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 56
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.precise.frag.out b/Test/baseResults/hlsl.precise.frag.out
index 84b2648..39e3578 100644
--- a/Test/baseResults/hlsl.precise.frag.out
+++ b/Test/baseResults/hlsl.precise.frag.out
@@ -76,7 +76,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.preprocessor.frag.out b/Test/baseResults/hlsl.preprocessor.frag.out
index 11ec1ad..754d0d8 100644
--- a/Test/baseResults/hlsl.preprocessor.frag.out
+++ b/Test/baseResults/hlsl.preprocessor.frag.out
@@ -94,7 +94,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
@@ -116,7 +116,7 @@
                               Decorate 16(test_texture) DescriptorSet 0
                               Decorate 16(test_texture) Binding 0
                               Decorate 20(test_texture_ss) DescriptorSet 0
-                              Decorate 20(test_texture_ss) Binding 0
+                              Decorate 20(test_texture_ss) Binding 1
                               Decorate 33(input) Location 0
                               Decorate 36(@entryPointOutput) Location 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.printf.comp.out b/Test/baseResults/hlsl.printf.comp.out
new file mode 100644
index 0000000..ea31c35
--- /dev/null
+++ b/Test/baseResults/hlsl.printf.comp.out
@@ -0,0 +1,178 @@
+hlsl.printf.comp
+Shader version: 500
+local_size = (1, 1, 1)
+0:? Sequence
+0:4  Function Definition: @main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      Debug printf ( temp void)
+0:5        Constant:
+0:5          "first string"
+0:6      Debug printf ( temp void)
+0:6        Constant:
+0:6          "please print this message."
+0:7      Debug printf ( temp void)
+0:7        Constant:
+0:7          "Variables are: %d %d %.2f"
+0:7        Constant:
+0:7          1 (const uint)
+0:7        Constant:
+0:7          2 (const uint)
+0:7        Constant:
+0:7          1.500000
+0:8      Debug printf ( temp void)
+0:8        Constant:
+0:8          "Integers are: %d %d %d"
+0:8        Constant:
+0:8          1 (const int)
+0:8        Constant:
+0:8          2 (const int)
+0:8        Constant:
+0:8          3 (const int)
+0:9      Debug printf ( temp void)
+0:9        Constant:
+0:9          "More: %d %d %d %d %d %d %d %d %d %d"
+0:9        Constant:
+0:9          1 (const int)
+0:9        Constant:
+0:9          2 (const int)
+0:9        Constant:
+0:9          3 (const int)
+0:9        Constant:
+0:9          4 (const int)
+0:9        Constant:
+0:9          5 (const int)
+0:9        Constant:
+0:9          6 (const int)
+0:9        Constant:
+0:9          7 (const int)
+0:9        Constant:
+0:9          8 (const int)
+0:9        Constant:
+0:9          9 (const int)
+0:9        Constant:
+0:9          10 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'first' ( const string)
+0:?       "first string"
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (1, 1, 1)
+0:? Sequence
+0:4  Function Definition: @main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:5      Debug printf ( temp void)
+0:5        Constant:
+0:5          "first string"
+0:6      Debug printf ( temp void)
+0:6        Constant:
+0:6          "please print this message."
+0:7      Debug printf ( temp void)
+0:7        Constant:
+0:7          "Variables are: %d %d %.2f"
+0:7        Constant:
+0:7          1 (const uint)
+0:7        Constant:
+0:7          2 (const uint)
+0:7        Constant:
+0:7          1.500000
+0:8      Debug printf ( temp void)
+0:8        Constant:
+0:8          "Integers are: %d %d %d"
+0:8        Constant:
+0:8          1 (const int)
+0:8        Constant:
+0:8          2 (const int)
+0:8        Constant:
+0:8          3 (const int)
+0:9      Debug printf ( temp void)
+0:9        Constant:
+0:9          "More: %d %d %d %d %d %d %d %d %d %d"
+0:9        Constant:
+0:9          1 (const int)
+0:9        Constant:
+0:9          2 (const int)
+0:9        Constant:
+0:9          3 (const int)
+0:9        Constant:
+0:9          4 (const int)
+0:9        Constant:
+0:9          5 (const int)
+0:9        Constant:
+0:9          6 (const int)
+0:9        Constant:
+0:9          7 (const int)
+0:9        Constant:
+0:9          8 (const int)
+0:9        Constant:
+0:9          9 (const int)
+0:9        Constant:
+0:9          10 (const int)
+0:4  Function Definition: main( ( temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      Function Call: @main( ( temp void)
+0:?   Linker Objects
+0:?     'first' ( const string)
+0:?       "first string"
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 36
+
+                              Capability Shader
+                              Extension  "SPV_KHR_non_semantic_info"
+               1:             ExtInstImport  "GLSL.std.450"
+               9:             ExtInstImport  "NonSemantic.DebugPrintf"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+               8:             String  "first string"
+              11:             String  "please print this message."
+              13:             String  "Variables are: %d %d %.2f"
+              20:             String  "Integers are: %d %d %d"
+              26:             String  "More: %d %d %d %d %d %d %d %d %d %d"
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 6  "@main("
+               2:             TypeVoid
+               3:             TypeFunction 2
+              14:             TypeInt 32 0
+              15:     14(int) Constant 1
+              16:     14(int) Constant 2
+              17:             TypeFloat 32
+              18:   17(float) Constant 1069547520
+              21:             TypeInt 32 1
+              22:     21(int) Constant 1
+              23:     21(int) Constant 2
+              24:     21(int) Constant 3
+              27:     21(int) Constant 4
+              28:     21(int) Constant 5
+              29:     21(int) Constant 6
+              30:     21(int) Constant 7
+              31:     21(int) Constant 8
+              32:     21(int) Constant 9
+              33:     21(int) Constant 10
+         4(main):           2 Function None 3
+               5:             Label
+              35:           2 FunctionCall 6(@main()
+                              Return
+                              FunctionEnd
+       6(@main():           2 Function None 3
+               7:             Label
+              10:           2 ExtInst 9(NonSemantic.DebugPrintf) 1(DebugPrintf) 8
+              12:           2 ExtInst 9(NonSemantic.DebugPrintf) 1(DebugPrintf) 11
+              19:           2 ExtInst 9(NonSemantic.DebugPrintf) 1(DebugPrintf) 13 15 16 18
+              25:           2 ExtInst 9(NonSemantic.DebugPrintf) 1(DebugPrintf) 20 22 23 24
+              34:           2 ExtInst 9(NonSemantic.DebugPrintf) 1(DebugPrintf) 26 22 23 24 27 28 29 30 31 32 33
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.promote.atomic.frag.out b/Test/baseResults/hlsl.promote.atomic.frag.out
index 4d56fba..f4197ef 100644
--- a/Test/baseResults/hlsl.promote.atomic.frag.out
+++ b/Test/baseResults/hlsl.promote.atomic.frag.out
@@ -64,7 +64,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.promote.binary.frag.out b/Test/baseResults/hlsl.promote.binary.frag.out
index f63fc3e..a0007c3 100644
--- a/Test/baseResults/hlsl.promote.binary.frag.out
+++ b/Test/baseResults/hlsl.promote.binary.frag.out
@@ -172,7 +172,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 83
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.promote.vec1.frag.out b/Test/baseResults/hlsl.promote.vec1.frag.out
index a6ad7ca..8ea55d0 100644
--- a/Test/baseResults/hlsl.promote.vec1.frag.out
+++ b/Test/baseResults/hlsl.promote.vec1.frag.out
@@ -80,7 +80,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.promotions.frag.out b/Test/baseResults/hlsl.promotions.frag.out
index 0a17395..91ed472 100644
--- a/Test/baseResults/hlsl.promotions.frag.out
+++ b/Test/baseResults/hlsl.promotions.frag.out
@@ -1582,7 +1582,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 596
 
                               Capability Shader
@@ -1979,11 +1979,11 @@
               89:             Label
              251:    182(ptr) AccessChain 113 181
              252:    7(fvec3) Load 251
-             253:   28(bvec3) FOrdNotEqual 252 142
+             253:   28(bvec3) FUnordNotEqual 252 142
                               Store 87(p) 253
              254:    182(ptr) AccessChain 113 181
              255:    7(fvec3) Load 254
-             256:   28(bvec3) FOrdNotEqual 255 142
+             256:   28(bvec3) FUnordNotEqual 255 142
                               ReturnValue 256
                               FunctionEnd
 91(Fn_R_B3D(vb3;):   28(bvec3) Function None 80
@@ -1991,11 +1991,11 @@
               92:             Label
              259:    152(ptr) AccessChain 113 151
              260: 35(f64vec3) Load 259
-             263:   28(bvec3) FOrdNotEqual 260 262
+             263:   28(bvec3) FUnordNotEqual 260 262
                               Store 90(p) 263
              264:    152(ptr) AccessChain 113 151
              265: 35(f64vec3) Load 264
-             266:   28(bvec3) FOrdNotEqual 265 262
+             266:   28(bvec3) FUnordNotEqual 265 262
                               ReturnValue 266
                               FunctionEnd
 95(Fn_R_D3I(vd3;): 35(f64vec3) Function None 93
@@ -2135,11 +2135,11 @@
                               Store 360(r31) 363
              365:    182(ptr) AccessChain 113 181
              366:    7(fvec3) Load 365
-             367:   28(bvec3) FOrdNotEqual 366 142
+             367:   28(bvec3) FUnordNotEqual 366 142
                               Store 364(r32) 367
              369:    152(ptr) AccessChain 113 151
              370: 35(f64vec3) Load 369
-             371:   28(bvec3) FOrdNotEqual 370 262
+             371:   28(bvec3) FUnordNotEqual 370 262
                               Store 368(r33) 371
              373:    115(ptr) AccessChain 113 114
              374:   14(ivec3) Load 373
diff --git a/Test/baseResults/hlsl.reflection.binding.frag.out b/Test/baseResults/hlsl.reflection.binding.frag.out
index a13e575..e559dd3 100644
--- a/Test/baseResults/hlsl.reflection.binding.frag.out
+++ b/Test/baseResults/hlsl.reflection.binding.frag.out
@@ -12,8 +12,8 @@
 c2_c: offset 20, type 1406, size 1, index 1, binding -1, stages 16
 
 Uniform block reflection:
-cbuff1: offset -1, type ffffffff, size 24, index -1, binding 2, stages 16, numMembers 3
-cbuff2: offset -1, type ffffffff, size 24, index -1, binding 3, stages 16, numMembers 3
+cbuff1: offset -1, type ffffffff, size 24, index 0, binding 2, stages 16, numMembers 3
+cbuff2: offset -1, type ffffffff, size 24, index 1, binding 3, stages 16, numMembers 3
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/hlsl.reflection.vert.out b/Test/baseResults/hlsl.reflection.vert.out
index 535c7fb..796784b 100644
--- a/Test/baseResults/hlsl.reflection.vert.out
+++ b/Test/baseResults/hlsl.reflection.vert.out
@@ -1,5 +1,9 @@
 hlsl.reflection.vert
 Uniform reflection:
+anonDeadMember2: offset 64, type 8b52, size 1, index 0, binding -1, stages 1
+ufDead4: offset 28, type 1406, size 1, index 1, binding -1, stages 1
+anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
+uf1: offset 16, type 1406, size 1, index 1, binding -1, stages 1
 anonMember3: offset 80, type 8b52, size 1, index 0, binding -1, stages 1
 s.a: offset 0, type 1404, size 1, index 1, binding -1, stages 1
 m23: offset 16, type 8b67, size 1, index 0, binding -1, stages 1
@@ -54,18 +58,17 @@
 deepD[1].d2.d1[3].va: offset 2904, type 8b50, size 3, index 1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 304
 deepD[1].d2.d1[3].b: offset 2928, type 8b56, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
 deepD[1].v3: offset 2944, type 8b54, size 1, index 1, binding -1, stages 1, topLevelArrayStride 304
+ufDead3: offset 24, type 1406, size 1, index 1, binding -1, stages 1
 foo1: offset 0, type 1406, size 1, index 4, binding -1, stages 1
 foo2: offset 0, type 1406, size 1, index 5, binding -1, stages 1
-anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
-uf1: offset 16, type 1406, size 1, index 1, binding -1, stages 1
 
 Uniform block reflection:
-nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 1, numMembers 9
-$Global: offset -1, type ffffffff, size 3088, index -1, binding -1, stages 1, numMembers 106
-c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1, stages 1, numMembers 5
-nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 1, numMembers 4
-abl: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
+nameless: offset -1, type ffffffff, size 496, index 0, binding -1, stages 1, numMembers 9
+$Global: offset -1, type ffffffff, size 3088, index 1, binding -1, stages 1, numMembers 106
+c_nameless: offset -1, type ffffffff, size 96, index 2, binding -1, stages 1, numMembers 5
+nested: offset -1, type ffffffff, size 32, index 3, binding -1, stages 1, numMembers 4
+abl: offset -1, type ffffffff, size 4, index 4, binding -1, stages 1, numMembers 1
+abl2: offset -1, type ffffffff, size 4, index 5, binding -1, stages 1, numMembers 1
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/hlsl.round.dx10.frag.out b/Test/baseResults/hlsl.round.dx10.frag.out
new file mode 100644
index 0000000..be72dc5
--- /dev/null
+++ b/Test/baseResults/hlsl.round.dx10.frag.out
@@ -0,0 +1,60 @@
+hlsl.round.dx10.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        roundEven ( temp 4-component vector of float)
+0:3          'input' ( in 4-component vector of float)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+WARNING: Linking fragment stage: Entry point not found
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        roundEven ( temp 4-component vector of float)
+0:3          'input' ( in 4-component vector of float)
+0:?   Linker Objects
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 17
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "PixelShaderFunction(vf4;"
+                              Name 10  "input"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+               9:             TypeFunction 7(fvec4) 8(ptr)
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
+11(PixelShaderFunction(vf4;):    7(fvec4) Function None 9
+       10(input):      8(ptr) FunctionParameter
+              12:             Label
+              13:    7(fvec4) Load 10(input)
+              14:    7(fvec4) ExtInst 1(GLSL.std.450) 2(RoundEven) 13
+                              ReturnValue 14
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.round.dx9.frag.out b/Test/baseResults/hlsl.round.dx9.frag.out
new file mode 100644
index 0000000..9333c7d
--- /dev/null
+++ b/Test/baseResults/hlsl.round.dx9.frag.out
@@ -0,0 +1,70 @@
+hlsl.round.dx9.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        round ( temp 4-component vector of float)
+0:3          'input' ( in 4-component vector of float)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+WARNING: Linking fragment stage: Entry point not found
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunction(vf4; ( temp 4-component vector of float)
+0:2    Function Parameters: 
+0:2      'input' ( in 4-component vector of float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        round ( temp 4-component vector of float)
+0:3          'input' ( in 4-component vector of float)
+0:?   Linker Objects
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 18
+
+                              Capability Shader
+               2:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 5  "main"
+                              ExecutionMode 5 OriginUpperLeft
+               1:             String  ""
+                              Source HLSL 500 1  "// OpModuleProcessed auto-map-locations
+// OpModuleProcessed auto-map-bindings
+// OpModuleProcessed entry-point main
+// OpModuleProcessed client vulkan100
+// OpModuleProcessed target-env vulkan1.0
+// OpModuleProcessed keep-uncalled
+// OpModuleProcessed hlsl-offsets
+#line 1
+"
+                              Name 5  "main"
+                              Name 12  "PixelShaderFunction(vf4;"
+                              Name 11  "input"
+               3:             TypeVoid
+               4:             TypeFunction 3
+               7:             TypeFloat 32
+               8:             TypeVector 7(float) 4
+               9:             TypePointer Function 8(fvec4)
+              10:             TypeFunction 8(fvec4) 9(ptr)
+         5(main):           3 Function None 4
+               6:             Label
+                              Return
+                              FunctionEnd
+12(PixelShaderFunction(vf4;):    8(fvec4) Function None 10
+       11(input):      9(ptr) FunctionParameter
+              13:             Label
+                              Line 1 3 0
+              14:    8(fvec4) Load 11(input)
+              15:    8(fvec4) ExtInst 2(GLSL.std.450) 1(Round) 14
+                              ReturnValue 15
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.rw.atomics.frag.out b/Test/baseResults/hlsl.rw.atomics.frag.out
index 77b140b..06bc317 100644
--- a/Test/baseResults/hlsl.rw.atomics.frag.out
+++ b/Test/baseResults/hlsl.rw.atomics.frag.out
@@ -3946,7 +3946,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1147
 
                               Capability Shader
@@ -4010,25 +4010,25 @@
                               MemberDecorate 21($Global) 9 Offset 64
                               Decorate 21($Global) Block
                               Decorate 23 DescriptorSet 0
-                              Decorate 23 Binding 0
+                              Decorate 23 Binding 10
                               Decorate 121(g_tTex1du1) DescriptorSet 0
-                              Decorate 121(g_tTex1du1) Binding 0
+                              Decorate 121(g_tTex1du1) Binding 1
                               Decorate 217(g_tTex2di1) DescriptorSet 0
-                              Decorate 217(g_tTex2di1) Binding 0
+                              Decorate 217(g_tTex2di1) Binding 2
                               Decorate 308(g_tTex2du1) DescriptorSet 0
-                              Decorate 308(g_tTex2du1) Binding 0
+                              Decorate 308(g_tTex2du1) Binding 3
                               Decorate 399(g_tTex3di1) DescriptorSet 0
-                              Decorate 399(g_tTex3di1) Binding 0
+                              Decorate 399(g_tTex3di1) Binding 4
                               Decorate 490(g_tTex3du1) DescriptorSet 0
-                              Decorate 490(g_tTex3du1) Binding 0
+                              Decorate 490(g_tTex3du1) Binding 5
                               Decorate 581(g_tTex1di1a) DescriptorSet 0
-                              Decorate 581(g_tTex1di1a) Binding 0
+                              Decorate 581(g_tTex1di1a) Binding 6
                               Decorate 670(g_tTex1du1a) DescriptorSet 0
-                              Decorate 670(g_tTex1du1a) Binding 0
+                              Decorate 670(g_tTex1du1a) Binding 7
                               Decorate 931(g_tBuffI) DescriptorSet 0
-                              Decorate 931(g_tBuffI) Binding 0
+                              Decorate 931(g_tBuffI) Binding 8
                               Decorate 1020(g_tBuffU) DescriptorSet 0
-                              Decorate 1020(g_tBuffU) Binding 0
+                              Decorate 1020(g_tBuffU) Binding 9
                               Decorate 1117(@entryPointOutput.Color) Location 0
                               Decorate 1122(g_sSamp) DescriptorSet 0
                               Decorate 1122(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.rw.bracket.frag.out b/Test/baseResults/hlsl.rw.bracket.frag.out
index 70f8bbe..7068825 100644
--- a/Test/baseResults/hlsl.rw.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.bracket.frag.out
@@ -1744,7 +1744,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 607
 
                               Capability Shader
@@ -1893,25 +1893,25 @@
                               MemberDecorate 63($Global) 10 Offset 128
                               Decorate 63($Global) Block
                               Decorate 65 DescriptorSet 0
-                              Decorate 65 Binding 0
+                              Decorate 65 Binding 9
                               Decorate 75(g_tTex1df4) DescriptorSet 0
                               Decorate 75(g_tTex1df4) Binding 0
                               Decorate 89(g_tTex1di4) DescriptorSet 0
-                              Decorate 89(g_tTex1di4) Binding 0
+                              Decorate 89(g_tTex1di4) Binding 1
                               Decorate 97(g_tTex1du4) DescriptorSet 0
-                              Decorate 97(g_tTex1du4) Binding 0
+                              Decorate 97(g_tTex1du4) Binding 2
                               Decorate 105(g_tTex2df4) DescriptorSet 0
-                              Decorate 105(g_tTex2df4) Binding 0
+                              Decorate 105(g_tTex2df4) Binding 3
                               Decorate 115(g_tTex2di4) DescriptorSet 0
-                              Decorate 115(g_tTex2di4) Binding 0
+                              Decorate 115(g_tTex2di4) Binding 4
                               Decorate 123(g_tTex2du4) DescriptorSet 0
-                              Decorate 123(g_tTex2du4) Binding 0
+                              Decorate 123(g_tTex2du4) Binding 5
                               Decorate 131(g_tTex3df4) DescriptorSet 0
-                              Decorate 131(g_tTex3df4) Binding 0
+                              Decorate 131(g_tTex3df4) Binding 6
                               Decorate 141(g_tTex3di4) DescriptorSet 0
-                              Decorate 141(g_tTex3di4) Binding 0
+                              Decorate 141(g_tTex3di4) Binding 7
                               Decorate 149(g_tTex3du4) DescriptorSet 0
-                              Decorate 149(g_tTex3du4) Binding 0
+                              Decorate 149(g_tTex3du4) Binding 8
                               Decorate 583(@entryPointOutput.Color) Location 0
                               Decorate 588(g_sSamp) DescriptorSet 0
                               Decorate 588(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.rw.register.frag.out b/Test/baseResults/hlsl.rw.register.frag.out
index 6004512..7bcecc9 100644
--- a/Test/baseResults/hlsl.rw.register.frag.out
+++ b/Test/baseResults/hlsl.rw.register.frag.out
@@ -97,8 +97,9 @@
 0:?     'g_tBuf1du1' (layout( binding=3 r32ui) uniform uimageBuffer)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
index a8e33dd..0614677 100644
--- a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
@@ -1689,8 +1689,9 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform float uf1,  uniform int ui1,  uniform uint uu1})
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 571
 
                               Capability Shader
@@ -1839,25 +1840,25 @@
                               MemberDecorate 59($Global) 10 Offset 104
                               Decorate 59($Global) Block
                               Decorate 61 DescriptorSet 0
-                              Decorate 61 Binding 0
+                              Decorate 61 Binding 10
                               Decorate 70(g_tTex1df1) DescriptorSet 0
-                              Decorate 70(g_tTex1df1) Binding 0
+                              Decorate 70(g_tTex1df1) Binding 1
                               Decorate 83(g_tTex1di1) DescriptorSet 0
-                              Decorate 83(g_tTex1di1) Binding 0
+                              Decorate 83(g_tTex1di1) Binding 2
                               Decorate 91(g_tTex1du1) DescriptorSet 0
-                              Decorate 91(g_tTex1du1) Binding 0
+                              Decorate 91(g_tTex1du1) Binding 3
                               Decorate 99(g_tTex2df1) DescriptorSet 0
-                              Decorate 99(g_tTex2df1) Binding 0
+                              Decorate 99(g_tTex2df1) Binding 4
                               Decorate 109(g_tTex2di1) DescriptorSet 0
-                              Decorate 109(g_tTex2di1) Binding 0
+                              Decorate 109(g_tTex2di1) Binding 5
                               Decorate 117(g_tTex2du1) DescriptorSet 0
-                              Decorate 117(g_tTex2du1) Binding 0
+                              Decorate 117(g_tTex2du1) Binding 6
                               Decorate 125(g_tTex3df1) DescriptorSet 0
-                              Decorate 125(g_tTex3df1) Binding 0
+                              Decorate 125(g_tTex3df1) Binding 7
                               Decorate 135(g_tTex3di1) DescriptorSet 0
-                              Decorate 135(g_tTex3di1) Binding 0
+                              Decorate 135(g_tTex3di1) Binding 8
                               Decorate 143(g_tTex3du1) DescriptorSet 0
-                              Decorate 143(g_tTex3du1) Binding 0
+                              Decorate 143(g_tTex3du1) Binding 9
                               Decorate 547(@entryPointOutput.Color) Location 0
                               Decorate 552(g_sSamp) DescriptorSet 0
                               Decorate 552(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.rw.swizzle.frag.out b/Test/baseResults/hlsl.rw.swizzle.frag.out
index 267d733..71a9e6c 100644
--- a/Test/baseResults/hlsl.rw.swizzle.frag.out
+++ b/Test/baseResults/hlsl.rw.swizzle.frag.out
@@ -202,7 +202,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 63
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
index 06c24e7..68e40de 100644
--- a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
@@ -1707,8 +1707,9 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 2-component vector of float uf2,  uniform 2-component vector of int ui2,  uniform 2-component vector of uint uu2})
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 605
 
                               Capability Shader
@@ -1858,25 +1859,25 @@
                               MemberDecorate 64($Global) 10 Offset 112
                               Decorate 64($Global) Block
                               Decorate 66 DescriptorSet 0
-                              Decorate 66 Binding 0
+                              Decorate 66 Binding 10
                               Decorate 76(g_tTex1df2) DescriptorSet 0
-                              Decorate 76(g_tTex1df2) Binding 0
+                              Decorate 76(g_tTex1df2) Binding 1
                               Decorate 90(g_tTex1di2) DescriptorSet 0
-                              Decorate 90(g_tTex1di2) Binding 0
+                              Decorate 90(g_tTex1di2) Binding 2
                               Decorate 98(g_tTex1du2) DescriptorSet 0
-                              Decorate 98(g_tTex1du2) Binding 0
+                              Decorate 98(g_tTex1du2) Binding 3
                               Decorate 106(g_tTex2df2) DescriptorSet 0
-                              Decorate 106(g_tTex2df2) Binding 0
+                              Decorate 106(g_tTex2df2) Binding 4
                               Decorate 114(g_tTex2di2) DescriptorSet 0
-                              Decorate 114(g_tTex2di2) Binding 0
+                              Decorate 114(g_tTex2di2) Binding 5
                               Decorate 122(g_tTex2du2) DescriptorSet 0
-                              Decorate 122(g_tTex2du2) Binding 0
+                              Decorate 122(g_tTex2du2) Binding 6
                               Decorate 130(g_tTex3df2) DescriptorSet 0
-                              Decorate 130(g_tTex3df2) Binding 0
+                              Decorate 130(g_tTex3df2) Binding 7
                               Decorate 140(g_tTex3di2) DescriptorSet 0
-                              Decorate 140(g_tTex3di2) Binding 0
+                              Decorate 140(g_tTex3di2) Binding 8
                               Decorate 148(g_tTex3du2) DescriptorSet 0
-                              Decorate 148(g_tTex3du2) Binding 0
+                              Decorate 148(g_tTex3du2) Binding 9
                               Decorate 581(@entryPointOutput.Color) Location 0
                               Decorate 586(g_sSamp) DescriptorSet 0
                               Decorate 586(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.sample.array.dx10.frag.out b/Test/baseResults/hlsl.sample.array.dx10.frag.out
index 2d00531..6ecbcf3 100644
--- a/Test/baseResults/hlsl.sample.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.array.dx10.frag.out
@@ -322,7 +322,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 146
 
                               Capability Shader
@@ -368,21 +368,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 2
                               Decorate 49(g_tTex1du4) DescriptorSet 0
-                              Decorate 49(g_tTex1du4) Binding 0
+                              Decorate 49(g_tTex1du4) Binding 3
                               Decorate 60(g_tTex2df4) DescriptorSet 0
-                              Decorate 60(g_tTex2df4) Binding 0
+                              Decorate 60(g_tTex2df4) Binding 4
                               Decorate 71(g_tTex2di4) DescriptorSet 0
-                              Decorate 71(g_tTex2di4) Binding 0
+                              Decorate 71(g_tTex2di4) Binding 5
                               Decorate 82(g_tTex2du4) DescriptorSet 0
-                              Decorate 82(g_tTex2du4) Binding 0
+                              Decorate 82(g_tTex2du4) Binding 6
                               Decorate 94(g_tTexcdf4) DescriptorSet 0
-                              Decorate 94(g_tTexcdf4) Binding 0
+                              Decorate 94(g_tTexcdf4) Binding 7
                               Decorate 104(g_tTexcdi4) DescriptorSet 0
-                              Decorate 104(g_tTexcdi4) Binding 0
+                              Decorate 104(g_tTexcdi4) Binding 8
                               Decorate 114(g_tTexcdu4) DescriptorSet 0
-                              Decorate 114(g_tTexcdu4) Binding 0
+                              Decorate 114(g_tTexcdu4) Binding 9
                               Decorate 138(@entryPointOutput.Color) Location 0
                               Decorate 142(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 145(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.sample.basic.dx10.frag.out b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
index 1760902..9d06667 100644
--- a/Test/baseResults/hlsl.sample.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.basic.dx10.frag.out
@@ -550,7 +550,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 198
 
                               Capability Shader
@@ -617,27 +617,27 @@
                               Decorate 49(g_sSamp) DescriptorSet 0
                               Decorate 49(g_sSamp) Binding 0
                               Decorate 60(g_tTex1di4) DescriptorSet 0
-                              Decorate 60(g_tTex1di4) Binding 0
+                              Decorate 60(g_tTex1di4) Binding 2
                               Decorate 73(g_tTex1du4) DescriptorSet 0
-                              Decorate 73(g_tTex1du4) Binding 0
+                              Decorate 73(g_tTex1du4) Binding 3
                               Decorate 83(g_tTex2df4) DescriptorSet 0
-                              Decorate 83(g_tTex2df4) Binding 0
+                              Decorate 83(g_tTex2df4) Binding 4
                               Decorate 94(g_tTex2di4) DescriptorSet 0
-                              Decorate 94(g_tTex2di4) Binding 0
+                              Decorate 94(g_tTex2di4) Binding 5
                               Decorate 105(g_tTex2du4) DescriptorSet 0
-                              Decorate 105(g_tTex2du4) Binding 0
+                              Decorate 105(g_tTex2du4) Binding 6
                               Decorate 117(g_tTex3df4) DescriptorSet 0
-                              Decorate 117(g_tTex3df4) Binding 0
+                              Decorate 117(g_tTex3df4) Binding 7
                               Decorate 128(g_tTex3di4) DescriptorSet 0
-                              Decorate 128(g_tTex3di4) Binding 0
+                              Decorate 128(g_tTex3di4) Binding 8
                               Decorate 138(g_tTex3du4) DescriptorSet 0
-                              Decorate 138(g_tTex3du4) Binding 0
+                              Decorate 138(g_tTex3du4) Binding 9
                               Decorate 151(g_tTexcdf4) DescriptorSet 0
-                              Decorate 151(g_tTexcdf4) Binding 0
+                              Decorate 151(g_tTexcdf4) Binding 10
                               Decorate 160(g_tTexcdi4) DescriptorSet 0
-                              Decorate 160(g_tTexcdi4) Binding 0
+                              Decorate 160(g_tTexcdi4) Binding 11
                               Decorate 169(g_tTexcdu4) DescriptorSet 0
-                              Decorate 169(g_tTexcdu4) Binding 0
+                              Decorate 169(g_tTexcdu4) Binding 12
                               Decorate 188(@entryPointOutput.Color) Location 0
                               Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 195(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.sample.dx9.frag.out b/Test/baseResults/hlsl.sample.dx9.frag.out
index ce6d546..5f2aecd 100644
--- a/Test/baseResults/hlsl.sample.dx9.frag.out
+++ b/Test/baseResults/hlsl.sample.dx9.frag.out
@@ -378,7 +378,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 135
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.sample.dx9.vert.out b/Test/baseResults/hlsl.sample.dx9.vert.out
index 2b29c0c..0b47bff 100644
--- a/Test/baseResults/hlsl.sample.dx9.vert.out
+++ b/Test/baseResults/hlsl.sample.dx9.vert.out
@@ -154,7 +154,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 64
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.sample.offset.dx10.frag.out b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
index b641ad2..fc91699 100644
--- a/Test/baseResults/hlsl.sample.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offset.dx10.frag.out
@@ -364,7 +364,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 161
 
                               Capability Shader
@@ -412,21 +412,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4) DescriptorSet 0
-                              Decorate 33(g_tTex1di4) Binding 0
+                              Decorate 33(g_tTex1di4) Binding 2
                               Decorate 46(g_tTex1du4) DescriptorSet 0
-                              Decorate 46(g_tTex1du4) Binding 0
+                              Decorate 46(g_tTex1du4) Binding 3
                               Decorate 56(g_tTex2df4) DescriptorSet 0
-                              Decorate 56(g_tTex2df4) Binding 0
+                              Decorate 56(g_tTex2df4) Binding 4
                               Decorate 70(g_tTex2di4) DescriptorSet 0
-                              Decorate 70(g_tTex2di4) Binding 0
+                              Decorate 70(g_tTex2di4) Binding 5
                               Decorate 82(g_tTex2du4) DescriptorSet 0
-                              Decorate 82(g_tTex2du4) Binding 0
+                              Decorate 82(g_tTex2du4) Binding 6
                               Decorate 96(g_tTex3df4) DescriptorSet 0
-                              Decorate 96(g_tTex3df4) Binding 0
+                              Decorate 96(g_tTex3df4) Binding 7
                               Decorate 109(g_tTex3di4) DescriptorSet 0
-                              Decorate 109(g_tTex3di4) Binding 0
+                              Decorate 109(g_tTex3di4) Binding 8
                               Decorate 120(g_tTex3du4) DescriptorSet 0
-                              Decorate 120(g_tTex3du4) Binding 0
+                              Decorate 120(g_tTex3du4) Binding 9
                               Decorate 144(@entryPointOutput.Color) Location 0
                               Decorate 148(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 151(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
index 54dc467..4d53975 100644
--- a/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out
@@ -274,7 +274,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 118
 
                               Capability Shader
@@ -313,15 +313,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex1di4) DescriptorSet 0
-                              Decorate 36(g_tTex1di4) Binding 0
+                              Decorate 36(g_tTex1di4) Binding 2
                               Decorate 51(g_tTex1du4) DescriptorSet 0
-                              Decorate 51(g_tTex1du4) Binding 0
+                              Decorate 51(g_tTex1du4) Binding 3
                               Decorate 63(g_tTex2df4) DescriptorSet 0
-                              Decorate 63(g_tTex2df4) Binding 0
+                              Decorate 63(g_tTex2df4) Binding 4
                               Decorate 76(g_tTex2di4) DescriptorSet 0
-                              Decorate 76(g_tTex2di4) Binding 0
+                              Decorate 76(g_tTex2di4) Binding 5
                               Decorate 87(g_tTex2du4) DescriptorSet 0
-                              Decorate 87(g_tTex2du4) Binding 0
+                              Decorate 87(g_tTex2du4) Binding 6
                               Decorate 110(@entryPointOutput.Color) Location 0
                               Decorate 114(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 117(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out b/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
index 8aa0e7f..8754a03 100644
--- a/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
+++ b/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out
@@ -154,7 +154,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Shader
@@ -180,15 +180,15 @@
                               Name 59  "psout"
                               Name 69  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
-                              Decorate 16(g_tTex1df1) Binding 0
+                              Decorate 16(g_tTex1df1) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 30(g_tTex1df2) DescriptorSet 0
-                              Decorate 30(g_tTex1df2) Binding 0
+                              Decorate 30(g_tTex1df2) Binding 2
                               Decorate 42(g_tTex1df3) DescriptorSet 0
-                              Decorate 42(g_tTex1df3) Binding 0
+                              Decorate 42(g_tTex1df3) Binding 3
                               Decorate 53(g_tTex1df4) DescriptorSet 0
-                              Decorate 53(g_tTex1df4) Binding 0
+                              Decorate 53(g_tTex1df4) Binding 4
                               Decorate 69(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
index aec493d..7990196 100644
--- a/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.array.dx10.frag.out
@@ -358,7 +358,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 146
 
                               Capability Shader
@@ -404,21 +404,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex1di4) DescriptorSet 0
-                              Decorate 36(g_tTex1di4) Binding 0
+                              Decorate 36(g_tTex1di4) Binding 2
                               Decorate 50(g_tTex1du4) DescriptorSet 0
-                              Decorate 50(g_tTex1du4) Binding 0
+                              Decorate 50(g_tTex1du4) Binding 3
                               Decorate 61(g_tTex2df4) DescriptorSet 0
-                              Decorate 61(g_tTex2df4) Binding 0
+                              Decorate 61(g_tTex2df4) Binding 4
                               Decorate 72(g_tTex2di4) DescriptorSet 0
-                              Decorate 72(g_tTex2di4) Binding 0
+                              Decorate 72(g_tTex2di4) Binding 5
                               Decorate 82(g_tTex2du4) DescriptorSet 0
-                              Decorate 82(g_tTex2du4) Binding 0
+                              Decorate 82(g_tTex2du4) Binding 6
                               Decorate 94(g_tTexcdf4) DescriptorSet 0
-                              Decorate 94(g_tTexcdf4) Binding 0
+                              Decorate 94(g_tTexcdf4) Binding 7
                               Decorate 104(g_tTexcdi4) DescriptorSet 0
-                              Decorate 104(g_tTexcdi4) Binding 0
+                              Decorate 104(g_tTexcdi4) Binding 8
                               Decorate 114(g_tTexcdu4) DescriptorSet 0
-                              Decorate 114(g_tTexcdu4) Binding 0
+                              Decorate 114(g_tTexcdu4) Binding 9
                               Decorate 138(@entryPointOutput.Color) Location 0
                               Decorate 142(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 145(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
index 9a29c6d..b318306 100644
--- a/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out
@@ -424,7 +424,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 170
 
                               Capability Shader
@@ -475,27 +475,27 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4) DescriptorSet 0
-                              Decorate 33(g_tTex1di4) Binding 0
+                              Decorate 33(g_tTex1di4) Binding 2
                               Decorate 46(g_tTex1du4) DescriptorSet 0
-                              Decorate 46(g_tTex1du4) Binding 0
+                              Decorate 46(g_tTex1du4) Binding 3
                               Decorate 56(g_tTex2df4) DescriptorSet 0
-                              Decorate 56(g_tTex2df4) Binding 0
+                              Decorate 56(g_tTex2df4) Binding 4
                               Decorate 67(g_tTex2di4) DescriptorSet 0
-                              Decorate 67(g_tTex2di4) Binding 0
+                              Decorate 67(g_tTex2di4) Binding 5
                               Decorate 78(g_tTex2du4) DescriptorSet 0
-                              Decorate 78(g_tTex2du4) Binding 0
+                              Decorate 78(g_tTex2du4) Binding 6
                               Decorate 89(g_tTex3df4) DescriptorSet 0
-                              Decorate 89(g_tTex3df4) Binding 0
+                              Decorate 89(g_tTex3df4) Binding 7
                               Decorate 100(g_tTex3di4) DescriptorSet 0
-                              Decorate 100(g_tTex3di4) Binding 0
+                              Decorate 100(g_tTex3di4) Binding 8
                               Decorate 110(g_tTex3du4) DescriptorSet 0
-                              Decorate 110(g_tTex3du4) Binding 0
+                              Decorate 110(g_tTex3du4) Binding 9
                               Decorate 123(g_tTexcdf4) DescriptorSet 0
-                              Decorate 123(g_tTexcdf4) Binding 0
+                              Decorate 123(g_tTexcdf4) Binding 10
                               Decorate 132(g_tTexcdi4) DescriptorSet 0
-                              Decorate 132(g_tTexcdi4) Binding 0
+                              Decorate 132(g_tTexcdi4) Binding 11
                               Decorate 141(g_tTexcdu4) DescriptorSet 0
-                              Decorate 141(g_tTexcdu4) Binding 0
+                              Decorate 141(g_tTexcdu4) Binding 12
                               Decorate 162(@entryPointOutput.Color) Location 0
                               Decorate 166(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 169(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
index fb78b6c..0e073ee 100644
--- a/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out
@@ -401,7 +401,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 161
 
                               Capability Shader
@@ -449,21 +449,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 34(g_tTex1di4) DescriptorSet 0
-                              Decorate 34(g_tTex1di4) Binding 0
+                              Decorate 34(g_tTex1di4) Binding 2
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 3
                               Decorate 57(g_tTex2df4) DescriptorSet 0
-                              Decorate 57(g_tTex2df4) Binding 0
+                              Decorate 57(g_tTex2df4) Binding 4
                               Decorate 71(g_tTex2di4) DescriptorSet 0
-                              Decorate 71(g_tTex2di4) Binding 0
+                              Decorate 71(g_tTex2di4) Binding 5
                               Decorate 83(g_tTex2du4) DescriptorSet 0
-                              Decorate 83(g_tTex2du4) Binding 0
+                              Decorate 83(g_tTex2du4) Binding 6
                               Decorate 96(g_tTex3df4) DescriptorSet 0
-                              Decorate 96(g_tTex3df4) Binding 0
+                              Decorate 96(g_tTex3df4) Binding 7
                               Decorate 109(g_tTex3di4) DescriptorSet 0
-                              Decorate 109(g_tTex3di4) Binding 0
+                              Decorate 109(g_tTex3di4) Binding 8
                               Decorate 120(g_tTex3du4) DescriptorSet 0
-                              Decorate 120(g_tTex3du4) Binding 0
+                              Decorate 120(g_tTex3du4) Binding 9
                               Decorate 144(@entryPointOutput.Color) Location 0
                               Decorate 148(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 151(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
index 8b7bd37..6225c45 100644
--- a/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out
@@ -299,7 +299,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 118
 
                               Capability Shader
@@ -338,15 +338,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 37(g_tTex1di4) DescriptorSet 0
-                              Decorate 37(g_tTex1di4) Binding 0
+                              Decorate 37(g_tTex1di4) Binding 2
                               Decorate 52(g_tTex1du4) DescriptorSet 0
-                              Decorate 52(g_tTex1du4) Binding 0
+                              Decorate 52(g_tTex1du4) Binding 3
                               Decorate 64(g_tTex2df4) DescriptorSet 0
-                              Decorate 64(g_tTex2df4) Binding 0
+                              Decorate 64(g_tTex2df4) Binding 4
                               Decorate 77(g_tTex2di4) DescriptorSet 0
-                              Decorate 77(g_tTex2di4) Binding 0
+                              Decorate 77(g_tTex2di4) Binding 5
                               Decorate 87(g_tTex2du4) DescriptorSet 0
-                              Decorate 87(g_tTex2du4) Binding 0
+                              Decorate 87(g_tTex2du4) Binding 6
                               Decorate 110(@entryPointOutput.Color) Location 0
                               Decorate 114(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 117(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
index 8d0ff46..b1c1d6d 100644
--- a/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out
@@ -399,7 +399,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 209
 
                               Capability Shader
@@ -452,25 +452,25 @@
                               Name 205  "g_tTexcdi4"
                               Name 208  "g_tTexcdu4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
-                              Decorate 16(g_tTex1df4a) Binding 0
+                              Decorate 16(g_tTex1df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 39(g_tTex1di4a) DescriptorSet 0
-                              Decorate 39(g_tTex1di4a) Binding 0
+                              Decorate 39(g_tTex1di4a) Binding 2
                               Decorate 53(g_tTex1du4a) DescriptorSet 0
-                              Decorate 53(g_tTex1du4a) Binding 0
+                              Decorate 53(g_tTex1du4a) Binding 3
                               Decorate 66(g_tTex2df4a) DescriptorSet 0
-                              Decorate 66(g_tTex2df4a) Binding 0
+                              Decorate 66(g_tTex2df4a) Binding 4
                               Decorate 82(g_tTex2di4a) DescriptorSet 0
-                              Decorate 82(g_tTex2di4a) Binding 0
+                              Decorate 82(g_tTex2di4a) Binding 5
                               Decorate 96(g_tTex2du4a) DescriptorSet 0
-                              Decorate 96(g_tTex2du4a) Binding 0
+                              Decorate 96(g_tTex2du4a) Binding 6
                               Decorate 110(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 110(g_tTexcdf4a) Binding 0
+                              Decorate 110(g_tTexcdf4a) Binding 7
                               Decorate 126(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 126(g_tTexcdi4a) Binding 0
+                              Decorate 126(g_tTexcdi4a) Binding 8
                               Decorate 140(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 140(g_tTexcdu4a) Binding 0
+                              Decorate 140(g_tTexcdu4a) Binding 9
                               Decorate 166(@entryPointOutput.Color) Location 0
                               Decorate 170(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 175(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
index c44f16b..e3d5b93 100644
--- a/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out
@@ -381,7 +381,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 198
 
                               Capability Shader
@@ -438,21 +438,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 34(g_tTex1di4) DescriptorSet 0
-                              Decorate 34(g_tTex1di4) Binding 0
+                              Decorate 34(g_tTex1di4) Binding 1
                               Decorate 46(g_tTex1du4) DescriptorSet 0
-                              Decorate 46(g_tTex1du4) Binding 0
+                              Decorate 46(g_tTex1du4) Binding 2
                               Decorate 57(g_tTex2df4) DescriptorSet 0
-                              Decorate 57(g_tTex2df4) Binding 0
+                              Decorate 57(g_tTex2df4) Binding 3
                               Decorate 73(g_tTex2di4) DescriptorSet 0
-                              Decorate 73(g_tTex2di4) Binding 0
+                              Decorate 73(g_tTex2di4) Binding 4
                               Decorate 86(g_tTex2du4) DescriptorSet 0
-                              Decorate 86(g_tTex2du4) Binding 0
+                              Decorate 86(g_tTex2du4) Binding 5
                               Decorate 99(g_tTexcdf4) DescriptorSet 0
-                              Decorate 99(g_tTexcdf4) Binding 0
+                              Decorate 99(g_tTexcdf4) Binding 6
                               Decorate 115(g_tTexcdi4) DescriptorSet 0
-                              Decorate 115(g_tTexcdi4) Binding 0
+                              Decorate 115(g_tTexcdi4) Binding 7
                               Decorate 129(g_tTexcdu4) DescriptorSet 0
-                              Decorate 129(g_tTexcdu4) Binding 0
+                              Decorate 129(g_tTexcdu4) Binding 8
                               Decorate 155(@entryPointOutput.Color) Location 0
                               Decorate 159(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 164(g_tTex3df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmp.dualmode.frag.out b/Test/baseResults/hlsl.samplecmp.dualmode.frag.out
index fd5dd3e..6859f6d 100644
--- a/Test/baseResults/hlsl.samplecmp.dualmode.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.dualmode.frag.out
@@ -85,7 +85,7 @@
 0:?     'g_tTex' (layout( binding=3) uniform texture1D)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
index ca0fb8c..aaa2b74 100644
--- a/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out
@@ -327,7 +327,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 167
 
                               Capability Shader
@@ -381,15 +381,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 1
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 2
                               Decorate 58(g_tTex2df4) DescriptorSet 0
-                              Decorate 58(g_tTex2df4) Binding 0
+                              Decorate 58(g_tTex2df4) Binding 3
                               Decorate 77(g_tTex2di4) DescriptorSet 0
-                              Decorate 77(g_tTex2di4) Binding 0
+                              Decorate 77(g_tTex2di4) Binding 4
                               Decorate 90(g_tTex2du4) DescriptorSet 0
-                              Decorate 90(g_tTex2du4) Binding 0
+                              Decorate 90(g_tTex2du4) Binding 5
                               Decorate 115(@entryPointOutput.Color) Location 0
                               Decorate 119(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 124(g_tTex3df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
index 3d0b8fd..501f4c0 100644
--- a/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out
@@ -339,7 +339,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 178
 
                               Capability Shader
@@ -389,19 +389,19 @@
                               Name 174  "g_tTexcdi4a"
                               Name 177  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
-                              Decorate 16(g_tTex1df4a) Binding 0
+                              Decorate 16(g_tTex1df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 40(g_tTex1di4a) DescriptorSet 0
-                              Decorate 40(g_tTex1di4a) Binding 0
+                              Decorate 40(g_tTex1di4a) Binding 2
                               Decorate 54(g_tTex1du4a) DescriptorSet 0
-                              Decorate 54(g_tTex1du4a) Binding 0
+                              Decorate 54(g_tTex1du4a) Binding 3
                               Decorate 67(g_tTex2df4a) DescriptorSet 0
-                              Decorate 67(g_tTex2df4a) Binding 0
+                              Decorate 67(g_tTex2df4a) Binding 4
                               Decorate 86(g_tTex2di4a) DescriptorSet 0
-                              Decorate 86(g_tTex2di4a) Binding 0
+                              Decorate 86(g_tTex2di4a) Binding 5
                               Decorate 100(g_tTex2du4a) DescriptorSet 0
-                              Decorate 100(g_tTex2du4a) Binding 0
+                              Decorate 100(g_tTex2du4a) Binding 6
                               Decorate 126(@entryPointOutput.Color) Location 0
                               Decorate 130(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 135(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
index ce13388..ecfeb1b 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out
@@ -435,7 +435,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 210
 
                               Capability Shader
@@ -488,25 +488,25 @@
                               Name 206  "g_tTexcdi4"
                               Name 209  "g_tTexcdu4"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
-                              Decorate 16(g_tTex1df4a) Binding 0
+                              Decorate 16(g_tTex1df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 40(g_tTex1di4a) DescriptorSet 0
-                              Decorate 40(g_tTex1di4a) Binding 0
+                              Decorate 40(g_tTex1di4a) Binding 2
                               Decorate 54(g_tTex1du4a) DescriptorSet 0
-                              Decorate 54(g_tTex1du4a) Binding 0
+                              Decorate 54(g_tTex1du4a) Binding 3
                               Decorate 67(g_tTex2df4a) DescriptorSet 0
-                              Decorate 67(g_tTex2df4a) Binding 0
+                              Decorate 67(g_tTex2df4a) Binding 4
                               Decorate 83(g_tTex2di4a) DescriptorSet 0
-                              Decorate 83(g_tTex2di4a) Binding 0
+                              Decorate 83(g_tTex2di4a) Binding 5
                               Decorate 97(g_tTex2du4a) DescriptorSet 0
-                              Decorate 97(g_tTex2du4a) Binding 0
+                              Decorate 97(g_tTex2du4a) Binding 6
                               Decorate 111(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 111(g_tTexcdf4a) Binding 0
+                              Decorate 111(g_tTexcdf4a) Binding 7
                               Decorate 127(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 127(g_tTexcdi4a) Binding 0
+                              Decorate 127(g_tTexcdi4a) Binding 8
                               Decorate 141(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 141(g_tTexcdu4a) Binding 0
+                              Decorate 141(g_tTexcdu4a) Binding 9
                               Decorate 167(@entryPointOutput.Color) Location 0
                               Decorate 171(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 176(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
index 4bf15ec..c852c9f 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out
@@ -417,7 +417,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 199
 
                               Capability Shader
@@ -474,21 +474,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 1
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 2
                               Decorate 58(g_tTex2df4) DescriptorSet 0
-                              Decorate 58(g_tTex2df4) Binding 0
+                              Decorate 58(g_tTex2df4) Binding 3
                               Decorate 74(g_tTex2di4) DescriptorSet 0
-                              Decorate 74(g_tTex2di4) Binding 0
+                              Decorate 74(g_tTex2di4) Binding 4
                               Decorate 87(g_tTex2du4) DescriptorSet 0
-                              Decorate 87(g_tTex2du4) Binding 0
+                              Decorate 87(g_tTex2du4) Binding 5
                               Decorate 100(g_tTexcdf4) DescriptorSet 0
-                              Decorate 100(g_tTexcdf4) Binding 0
+                              Decorate 100(g_tTexcdf4) Binding 6
                               Decorate 116(g_tTexcdi4) DescriptorSet 0
-                              Decorate 116(g_tTexcdi4) Binding 0
+                              Decorate 116(g_tTexcdi4) Binding 7
                               Decorate 130(g_tTexcdu4) DescriptorSet 0
-                              Decorate 130(g_tTexcdu4) Binding 0
+                              Decorate 130(g_tTexcdu4) Binding 8
                               Decorate 156(@entryPointOutput.Color) Location 0
                               Decorate 160(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 165(g_tTex3df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
index b85daf0..95c5c61 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out
@@ -351,7 +351,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 168
 
                               Capability Shader
@@ -405,15 +405,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex1di4) DescriptorSet 0
-                              Decorate 36(g_tTex1di4) Binding 0
+                              Decorate 36(g_tTex1di4) Binding 1
                               Decorate 48(g_tTex1du4) DescriptorSet 0
-                              Decorate 48(g_tTex1du4) Binding 0
+                              Decorate 48(g_tTex1du4) Binding 2
                               Decorate 59(g_tTex2df4) DescriptorSet 0
-                              Decorate 59(g_tTex2df4) Binding 0
+                              Decorate 59(g_tTex2df4) Binding 3
                               Decorate 78(g_tTex2di4) DescriptorSet 0
-                              Decorate 78(g_tTex2di4) Binding 0
+                              Decorate 78(g_tTex2di4) Binding 4
                               Decorate 91(g_tTex2du4) DescriptorSet 0
-                              Decorate 91(g_tTex2du4) Binding 0
+                              Decorate 91(g_tTex2du4) Binding 5
                               Decorate 116(@entryPointOutput.Color) Location 0
                               Decorate 120(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 125(g_tTex3df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
index 6f460d0..89a7bba 100644
--- a/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out
@@ -363,7 +363,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 179
 
                               Capability Shader
@@ -413,19 +413,19 @@
                               Name 175  "g_tTexcdi4a"
                               Name 178  "g_tTexcdu4a"
                               Decorate 16(g_tTex1df4a) DescriptorSet 0
-                              Decorate 16(g_tTex1df4a) Binding 0
+                              Decorate 16(g_tTex1df4a) Binding 1
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 41(g_tTex1di4a) DescriptorSet 0
-                              Decorate 41(g_tTex1di4a) Binding 0
+                              Decorate 41(g_tTex1di4a) Binding 2
                               Decorate 55(g_tTex1du4a) DescriptorSet 0
-                              Decorate 55(g_tTex1du4a) Binding 0
+                              Decorate 55(g_tTex1du4a) Binding 3
                               Decorate 68(g_tTex2df4a) DescriptorSet 0
-                              Decorate 68(g_tTex2df4a) Binding 0
+                              Decorate 68(g_tTex2df4a) Binding 4
                               Decorate 87(g_tTex2di4a) DescriptorSet 0
-                              Decorate 87(g_tTex2di4a) Binding 0
+                              Decorate 87(g_tTex2di4a) Binding 5
                               Decorate 101(g_tTex2du4a) DescriptorSet 0
-                              Decorate 101(g_tTex2du4a) Binding 0
+                              Decorate 101(g_tTex2du4a) Binding 6
                               Decorate 127(@entryPointOutput.Color) Location 0
                               Decorate 131(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 136(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
index b2922a1..8daeb7f 100644
--- a/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out
@@ -430,7 +430,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 140
 
                               Capability Shader
@@ -476,21 +476,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 37(g_tTex1di4) DescriptorSet 0
-                              Decorate 37(g_tTex1di4) Binding 0
+                              Decorate 37(g_tTex1di4) Binding 2
                               Decorate 49(g_tTex1du4) DescriptorSet 0
-                              Decorate 49(g_tTex1du4) Binding 0
+                              Decorate 49(g_tTex1du4) Binding 3
                               Decorate 58(g_tTex2df4) DescriptorSet 0
-                              Decorate 58(g_tTex2df4) Binding 0
+                              Decorate 58(g_tTex2df4) Binding 4
                               Decorate 71(g_tTex2di4) DescriptorSet 0
-                              Decorate 71(g_tTex2di4) Binding 0
+                              Decorate 71(g_tTex2di4) Binding 5
                               Decorate 80(g_tTex2du4) DescriptorSet 0
-                              Decorate 80(g_tTex2du4) Binding 0
+                              Decorate 80(g_tTex2du4) Binding 6
                               Decorate 89(g_tTexcdf4) DescriptorSet 0
-                              Decorate 89(g_tTexcdf4) Binding 0
+                              Decorate 89(g_tTexcdf4) Binding 7
                               Decorate 102(g_tTexcdi4) DescriptorSet 0
-                              Decorate 102(g_tTexcdi4) Binding 0
+                              Decorate 102(g_tTexcdi4) Binding 8
                               Decorate 111(g_tTexcdu4) DescriptorSet 0
-                              Decorate 111(g_tTexcdu4) Binding 0
+                              Decorate 111(g_tTexcdu4) Binding 9
                               Decorate 132(@entryPointOutput.Color) Location 0
                               Decorate 136(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 139(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
index 161821e..03888b6 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out
@@ -532,7 +532,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 175
 
                               Capability Shader
@@ -583,27 +583,27 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 34(g_tTex1di4) DescriptorSet 0
-                              Decorate 34(g_tTex1di4) Binding 0
+                              Decorate 34(g_tTex1di4) Binding 2
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 3
                               Decorate 57(g_tTex2df4) DescriptorSet 0
-                              Decorate 57(g_tTex2df4) Binding 0
+                              Decorate 57(g_tTex2df4) Binding 4
                               Decorate 69(g_tTex2di4) DescriptorSet 0
-                              Decorate 69(g_tTex2di4) Binding 0
+                              Decorate 69(g_tTex2di4) Binding 5
                               Decorate 80(g_tTex2du4) DescriptorSet 0
-                              Decorate 80(g_tTex2du4) Binding 0
+                              Decorate 80(g_tTex2du4) Binding 6
                               Decorate 92(g_tTex3df4) DescriptorSet 0
-                              Decorate 92(g_tTex3df4) Binding 0
+                              Decorate 92(g_tTex3df4) Binding 7
                               Decorate 105(g_tTex3di4) DescriptorSet 0
-                              Decorate 105(g_tTex3di4) Binding 0
+                              Decorate 105(g_tTex3di4) Binding 8
                               Decorate 115(g_tTex3du4) DescriptorSet 0
-                              Decorate 115(g_tTex3du4) Binding 0
+                              Decorate 115(g_tTex3du4) Binding 9
                               Decorate 128(g_tTexcdf4) DescriptorSet 0
-                              Decorate 128(g_tTexcdf4) Binding 0
+                              Decorate 128(g_tTexcdf4) Binding 10
                               Decorate 137(g_tTexcdi4) DescriptorSet 0
-                              Decorate 137(g_tTexcdi4) Binding 0
+                              Decorate 137(g_tTexcdi4) Binding 11
                               Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) Binding 0
+                              Decorate 146(g_tTexcdu4) Binding 12
                               Decorate 167(@entryPointOutput.Color) Location 0
                               Decorate 171(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 174(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
index b683d98..71da245 100644
--- a/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out
@@ -494,7 +494,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 166
 
                               Capability Shader
@@ -540,27 +540,27 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 34(g_tTex1di4) DescriptorSet 0
-                              Decorate 34(g_tTex1di4) Binding 0
+                              Decorate 34(g_tTex1di4) Binding 2
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 3
                               Decorate 57(g_tTex2df4) DescriptorSet 0
-                              Decorate 57(g_tTex2df4) Binding 0
+                              Decorate 57(g_tTex2df4) Binding 4
                               Decorate 69(g_tTex2di4) DescriptorSet 0
-                              Decorate 69(g_tTex2di4) Binding 0
+                              Decorate 69(g_tTex2di4) Binding 5
                               Decorate 80(g_tTex2du4) DescriptorSet 0
-                              Decorate 80(g_tTex2du4) Binding 0
+                              Decorate 80(g_tTex2du4) Binding 6
                               Decorate 92(g_tTex3df4) DescriptorSet 0
-                              Decorate 92(g_tTex3df4) Binding 0
+                              Decorate 92(g_tTex3df4) Binding 7
                               Decorate 105(g_tTex3di4) DescriptorSet 0
-                              Decorate 105(g_tTex3di4) Binding 0
+                              Decorate 105(g_tTex3di4) Binding 8
                               Decorate 115(g_tTex3du4) DescriptorSet 0
-                              Decorate 115(g_tTex3du4) Binding 0
+                              Decorate 115(g_tTex3du4) Binding 9
                               Decorate 128(g_tTexcdf4) DescriptorSet 0
-                              Decorate 128(g_tTexcdf4) Binding 0
+                              Decorate 128(g_tTexcdf4) Binding 10
                               Decorate 137(g_tTexcdi4) DescriptorSet 0
-                              Decorate 137(g_tTexcdi4) Binding 0
+                              Decorate 137(g_tTexcdi4) Binding 11
                               Decorate 146(g_tTexcdu4) DescriptorSet 0
-                              Decorate 146(g_tTexcdu4) Binding 0
+                              Decorate 146(g_tTexcdu4) Binding 12
                               Decorate 162(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 165(g_tTex1df4a) DescriptorSet 0
                               Decorate 165(g_tTex1df4a) Binding 1
diff --git a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
index 81fbc0b..63192df 100644
--- a/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out
@@ -472,7 +472,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 166
 
                               Capability Shader
@@ -520,21 +520,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 35(g_tTex1di4) DescriptorSet 0
-                              Decorate 35(g_tTex1di4) Binding 0
+                              Decorate 35(g_tTex1di4) Binding 2
                               Decorate 48(g_tTex1du4) DescriptorSet 0
-                              Decorate 48(g_tTex1du4) Binding 0
+                              Decorate 48(g_tTex1du4) Binding 3
                               Decorate 58(g_tTex2df4) DescriptorSet 0
-                              Decorate 58(g_tTex2df4) Binding 0
+                              Decorate 58(g_tTex2df4) Binding 4
                               Decorate 73(g_tTex2di4) DescriptorSet 0
-                              Decorate 73(g_tTex2di4) Binding 0
+                              Decorate 73(g_tTex2di4) Binding 5
                               Decorate 85(g_tTex2du4) DescriptorSet 0
-                              Decorate 85(g_tTex2du4) Binding 0
+                              Decorate 85(g_tTex2du4) Binding 6
                               Decorate 99(g_tTex3df4) DescriptorSet 0
-                              Decorate 99(g_tTex3df4) Binding 0
+                              Decorate 99(g_tTex3df4) Binding 7
                               Decorate 114(g_tTex3di4) DescriptorSet 0
-                              Decorate 114(g_tTex3di4) Binding 0
+                              Decorate 114(g_tTex3di4) Binding 8
                               Decorate 125(g_tTex3du4) DescriptorSet 0
-                              Decorate 125(g_tTex3du4) Binding 0
+                              Decorate 125(g_tTex3du4) Binding 9
                               Decorate 149(@entryPointOutput.Color) Location 0
                               Decorate 153(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 156(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
index 01ca547..fb8513b 100644
--- a/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out
@@ -340,7 +340,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 120
 
                               Capability Shader
@@ -383,15 +383,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 38(g_tTex1di4) DescriptorSet 0
-                              Decorate 38(g_tTex1di4) Binding 0
+                              Decorate 38(g_tTex1di4) Binding 2
                               Decorate 50(g_tTex1du4) DescriptorSet 0
-                              Decorate 50(g_tTex1du4) Binding 0
+                              Decorate 50(g_tTex1du4) Binding 3
                               Decorate 59(g_tTex2df4) DescriptorSet 0
-                              Decorate 59(g_tTex2df4) Binding 0
+                              Decorate 59(g_tTex2df4) Binding 4
                               Decorate 75(g_tTex2di4) DescriptorSet 0
-                              Decorate 75(g_tTex2di4) Binding 0
+                              Decorate 75(g_tTex2di4) Binding 5
                               Decorate 84(g_tTex2du4) DescriptorSet 0
-                              Decorate 84(g_tTex2du4) Binding 0
+                              Decorate 84(g_tTex2du4) Binding 6
                               Decorate 103(@entryPointOutput.Color) Location 0
                               Decorate 107(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 110(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
index a5ff45a..95a1a54 100644
--- a/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out
@@ -358,7 +358,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 147
 
                               Capability Shader
@@ -404,21 +404,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 36(g_tTex1di4a) DescriptorSet 0
-                              Decorate 36(g_tTex1di4a) Binding 0
+                              Decorate 36(g_tTex1di4a) Binding 2
                               Decorate 50(g_tTex1du4a) DescriptorSet 0
-                              Decorate 50(g_tTex1du4a) Binding 0
+                              Decorate 50(g_tTex1du4a) Binding 3
                               Decorate 61(g_tTex2df4a) DescriptorSet 0
-                              Decorate 61(g_tTex2df4a) Binding 0
+                              Decorate 61(g_tTex2df4a) Binding 4
                               Decorate 72(g_tTex2di4a) DescriptorSet 0
-                              Decorate 72(g_tTex2di4a) Binding 0
+                              Decorate 72(g_tTex2di4a) Binding 5
                               Decorate 83(g_tTex2du4a) DescriptorSet 0
-                              Decorate 83(g_tTex2du4a) Binding 0
+                              Decorate 83(g_tTex2du4a) Binding 6
                               Decorate 95(g_tTexcdf4a) DescriptorSet 0
-                              Decorate 95(g_tTexcdf4a) Binding 0
+                              Decorate 95(g_tTexcdf4a) Binding 7
                               Decorate 105(g_tTexcdi4a) DescriptorSet 0
-                              Decorate 105(g_tTexcdi4a) Binding 0
+                              Decorate 105(g_tTexcdi4a) Binding 8
                               Decorate 115(g_tTexcdu4a) DescriptorSet 0
-                              Decorate 115(g_tTexcdu4a) Binding 0
+                              Decorate 115(g_tTexcdu4a) Binding 9
                               Decorate 139(@entryPointOutput.Color) Location 0
                               Decorate 143(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 146(g_tTex1df4) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
index 6b91c17..99e252c 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out
@@ -426,7 +426,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 172
 
                               Capability Shader
@@ -478,27 +478,27 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4) DescriptorSet 0
-                              Decorate 33(g_tTex1di4) Binding 0
+                              Decorate 33(g_tTex1di4) Binding 2
                               Decorate 46(g_tTex1du4) DescriptorSet 0
-                              Decorate 46(g_tTex1du4) Binding 0
+                              Decorate 46(g_tTex1du4) Binding 3
                               Decorate 56(g_tTex2df4) DescriptorSet 0
-                              Decorate 56(g_tTex2df4) Binding 0
+                              Decorate 56(g_tTex2df4) Binding 4
                               Decorate 67(g_tTex2di4) DescriptorSet 0
-                              Decorate 67(g_tTex2di4) Binding 0
+                              Decorate 67(g_tTex2di4) Binding 5
                               Decorate 78(g_tTex2du4) DescriptorSet 0
-                              Decorate 78(g_tTex2du4) Binding 0
+                              Decorate 78(g_tTex2du4) Binding 6
                               Decorate 90(g_tTex3df4) DescriptorSet 0
-                              Decorate 90(g_tTex3df4) Binding 0
+                              Decorate 90(g_tTex3df4) Binding 7
                               Decorate 101(g_tTex3di4) DescriptorSet 0
-                              Decorate 101(g_tTex3di4) Binding 0
+                              Decorate 101(g_tTex3di4) Binding 8
                               Decorate 111(g_tTex3du4) DescriptorSet 0
-                              Decorate 111(g_tTex3du4) Binding 0
+                              Decorate 111(g_tTex3du4) Binding 9
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
-                              Decorate 124(g_tTexcdf4) Binding 0
+                              Decorate 124(g_tTexcdf4) Binding 10
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
-                              Decorate 133(g_tTexcdi4) Binding 0
+                              Decorate 133(g_tTexcdi4) Binding 11
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              Decorate 142(g_tTexcdu4) Binding 0
+                              Decorate 142(g_tTexcdu4) Binding 12
                               Decorate 163(@entryPointOutput.Color) Location 0
                               Decorate 167(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 170(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
index 8f395ed..d4d720b 100644
--- a/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
+++ b/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out
@@ -386,7 +386,7 @@
 0:?     '@entryPointOutput.Pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 162
 
                               Capability Shader
@@ -432,27 +432,27 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 33(g_tTex1di4) DescriptorSet 0
-                              Decorate 33(g_tTex1di4) Binding 0
+                              Decorate 33(g_tTex1di4) Binding 2
                               Decorate 46(g_tTex1du4) DescriptorSet 0
-                              Decorate 46(g_tTex1du4) Binding 0
+                              Decorate 46(g_tTex1du4) Binding 3
                               Decorate 56(g_tTex2df4) DescriptorSet 0
-                              Decorate 56(g_tTex2df4) Binding 0
+                              Decorate 56(g_tTex2df4) Binding 4
                               Decorate 67(g_tTex2di4) DescriptorSet 0
-                              Decorate 67(g_tTex2di4) Binding 0
+                              Decorate 67(g_tTex2di4) Binding 5
                               Decorate 78(g_tTex2du4) DescriptorSet 0
-                              Decorate 78(g_tTex2du4) Binding 0
+                              Decorate 78(g_tTex2du4) Binding 6
                               Decorate 90(g_tTex3df4) DescriptorSet 0
-                              Decorate 90(g_tTex3df4) Binding 0
+                              Decorate 90(g_tTex3df4) Binding 7
                               Decorate 101(g_tTex3di4) DescriptorSet 0
-                              Decorate 101(g_tTex3di4) Binding 0
+                              Decorate 101(g_tTex3di4) Binding 8
                               Decorate 111(g_tTex3du4) DescriptorSet 0
-                              Decorate 111(g_tTex3du4) Binding 0
+                              Decorate 111(g_tTex3du4) Binding 9
                               Decorate 124(g_tTexcdf4) DescriptorSet 0
-                              Decorate 124(g_tTexcdf4) Binding 0
+                              Decorate 124(g_tTexcdf4) Binding 10
                               Decorate 133(g_tTexcdi4) DescriptorSet 0
-                              Decorate 133(g_tTexcdi4) Binding 0
+                              Decorate 133(g_tTexcdi4) Binding 11
                               Decorate 142(g_tTexcdu4) DescriptorSet 0
-                              Decorate 142(g_tTexcdu4) Binding 0
+                              Decorate 142(g_tTexcdu4) Binding 12
                               Decorate 158(@entryPointOutput.Pos) BuiltIn Position
                               Decorate 161(g_tTex1df4a) DescriptorSet 0
                               Decorate 161(g_tTex1df4a) Binding 1
diff --git a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
index 10b48ec..dda4238 100644
--- a/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out
@@ -400,7 +400,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 162
 
                               Capability Shader
@@ -448,21 +448,21 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 34(g_tTex1di4) DescriptorSet 0
-                              Decorate 34(g_tTex1di4) Binding 0
+                              Decorate 34(g_tTex1di4) Binding 2
                               Decorate 47(g_tTex1du4) DescriptorSet 0
-                              Decorate 47(g_tTex1du4) Binding 0
+                              Decorate 47(g_tTex1du4) Binding 3
                               Decorate 57(g_tTex2df4) DescriptorSet 0
-                              Decorate 57(g_tTex2df4) Binding 0
+                              Decorate 57(g_tTex2df4) Binding 4
                               Decorate 71(g_tTex2di4) DescriptorSet 0
-                              Decorate 71(g_tTex2di4) Binding 0
+                              Decorate 71(g_tTex2di4) Binding 5
                               Decorate 83(g_tTex2du4) DescriptorSet 0
-                              Decorate 83(g_tTex2du4) Binding 0
+                              Decorate 83(g_tTex2du4) Binding 6
                               Decorate 97(g_tTex3df4) DescriptorSet 0
-                              Decorate 97(g_tTex3df4) Binding 0
+                              Decorate 97(g_tTex3df4) Binding 7
                               Decorate 110(g_tTex3di4) DescriptorSet 0
-                              Decorate 110(g_tTex3di4) Binding 0
+                              Decorate 110(g_tTex3di4) Binding 8
                               Decorate 121(g_tTex3du4) DescriptorSet 0
-                              Decorate 121(g_tTex3du4) Binding 0
+                              Decorate 121(g_tTex3du4) Binding 9
                               Decorate 145(@entryPointOutput.Color) Location 0
                               Decorate 149(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 152(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
index 5fb25a0..c0c27e4 100644
--- a/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out
@@ -298,7 +298,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 119
 
                               Capability Shader
@@ -337,15 +337,15 @@
                               Decorate 20(g_sSamp) DescriptorSet 0
                               Decorate 20(g_sSamp) Binding 0
                               Decorate 37(g_tTex1di4) DescriptorSet 0
-                              Decorate 37(g_tTex1di4) Binding 0
+                              Decorate 37(g_tTex1di4) Binding 2
                               Decorate 52(g_tTex1du4) DescriptorSet 0
-                              Decorate 52(g_tTex1du4) Binding 0
+                              Decorate 52(g_tTex1du4) Binding 3
                               Decorate 64(g_tTex2df4) DescriptorSet 0
-                              Decorate 64(g_tTex2df4) Binding 0
+                              Decorate 64(g_tTex2df4) Binding 4
                               Decorate 77(g_tTex2di4) DescriptorSet 0
-                              Decorate 77(g_tTex2di4) Binding 0
+                              Decorate 77(g_tTex2di4) Binding 5
                               Decorate 88(g_tTex2du4) DescriptorSet 0
-                              Decorate 88(g_tTex2du4) Binding 0
+                              Decorate 88(g_tTex2du4) Binding 6
                               Decorate 111(@entryPointOutput.Color) Location 0
                               Decorate 115(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 118(g_tTex1df4a) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.scalar-length.frag.out b/Test/baseResults/hlsl.scalar-length.frag.out
index ec80897..c09216a 100644
--- a/Test/baseResults/hlsl.scalar-length.frag.out
+++ b/Test/baseResults/hlsl.scalar-length.frag.out
@@ -64,7 +64,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.scalar2matrix.frag.out b/Test/baseResults/hlsl.scalar2matrix.frag.out
index cb996f6..8a1413f 100644
--- a/Test/baseResults/hlsl.scalar2matrix.frag.out
+++ b/Test/baseResults/hlsl.scalar2matrix.frag.out
@@ -374,7 +374,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 96
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.scalarCast.vert.out b/Test/baseResults/hlsl.scalarCast.vert.out
index 40f0f20..17356f9 100644
--- a/Test/baseResults/hlsl.scalarCast.vert.out
+++ b/Test/baseResults/hlsl.scalarCast.vert.out
@@ -322,7 +322,7 @@
 0:?     '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 120
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.scope.frag.out b/Test/baseResults/hlsl.scope.frag.out
index 882158e..5d73bba 100644
--- a/Test/baseResults/hlsl.scope.frag.out
+++ b/Test/baseResults/hlsl.scope.frag.out
@@ -102,7 +102,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 49
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.self_cast.frag.out b/Test/baseResults/hlsl.self_cast.frag.out
index 6f0e1dd..ad4252b 100644
--- a/Test/baseResults/hlsl.self_cast.frag.out
+++ b/Test/baseResults/hlsl.self_cast.frag.out
@@ -68,7 +68,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.semantic-1.vert.out b/Test/baseResults/hlsl.semantic-1.vert.out
index 96c14a9..e0786f0 100644
--- a/Test/baseResults/hlsl.semantic-1.vert.out
+++ b/Test/baseResults/hlsl.semantic-1.vert.out
@@ -242,7 +242,7 @@
 0:?     'v' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.semantic.geom.out b/Test/baseResults/hlsl.semantic.geom.out
index 29ec235..0aba000 100644
--- a/Test/baseResults/hlsl.semantic.geom.out
+++ b/Test/baseResults/hlsl.semantic.geom.out
@@ -261,7 +261,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 88
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.semantic.vert.out b/Test/baseResults/hlsl.semantic.vert.out
index 144df05..c17969a 100644
--- a/Test/baseResults/hlsl.semantic.vert.out
+++ b/Test/baseResults/hlsl.semantic.vert.out
@@ -209,8 +209,9 @@
 0:?     '@entryPointOutput.clip1' ( out 2-element array of float ClipDistance)
 0:?     '@entryPointOutput.cull1' ( out 2-element array of float CullDistance)
 
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.semicolons.frag.out b/Test/baseResults/hlsl.semicolons.frag.out
index b45f59d..1afcd5b 100644
--- a/Test/baseResults/hlsl.semicolons.frag.out
+++ b/Test/baseResults/hlsl.semicolons.frag.out
@@ -74,7 +74,7 @@
 0:?     '@entryPointOutput.color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.shapeConv.frag.out b/Test/baseResults/hlsl.shapeConv.frag.out
index 8da8d48..d3b17f0 100644
--- a/Test/baseResults/hlsl.shapeConv.frag.out
+++ b/Test/baseResults/hlsl.shapeConv.frag.out
@@ -319,7 +319,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 127
 
                               Capability Shader
@@ -432,7 +432,7 @@
               65:    6(float) Load 12(f)
               66:    7(fvec4) CompositeConstruct 65 65 65 65
               67:    7(fvec4) Load 15(v)
-              68:   62(bvec4) FOrdNotEqual 66 67
+              68:   62(bvec4) FUnordNotEqual 66 67
               69:    41(bool) Any 68
               71:    6(float) Load 70(f1)
               72:    7(fvec4) CompositeConstruct 71 71 71 71
diff --git a/Test/baseResults/hlsl.shapeConvRet.frag.out b/Test/baseResults/hlsl.shapeConvRet.frag.out
index efcbe04..e3e27a2 100644
--- a/Test/baseResults/hlsl.shapeConvRet.frag.out
+++ b/Test/baseResults/hlsl.shapeConvRet.frag.out
@@ -68,7 +68,7 @@
 0:?     'f' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.shift.per-set.frag.out b/Test/baseResults/hlsl.shift.per-set.frag.out
index 60e2ecc..ad0b7e0 100644
--- a/Test/baseResults/hlsl.shift.per-set.frag.out
+++ b/Test/baseResults/hlsl.shift.per-set.frag.out
@@ -219,12 +219,12 @@
 ts6: offset -1, type 8b5f, size 1, index -1, binding 71, stages 16
 
 Uniform block reflection:
-t4: offset -1, type ffffffff, size 0, index -1, binding 21, stages 16, numMembers 1
-t5: offset -1, type ffffffff, size 0, index -1, binding 22, stages 16, numMembers 1
-u5: offset -1, type ffffffff, size 0, index -1, binding 44, stages 16, numMembers 1
-u6: offset -1, type ffffffff, size 0, index -1, binding 34, stages 16, numMembers 1
-cb: offset -1, type ffffffff, size 4, index -1, binding 51, stages 16, numMembers 1
-tb: offset -1, type ffffffff, size 4, index -1, binding 27, stages 16, numMembers 1
+t4: offset -1, type ffffffff, size 16, index 0, binding 21, stages 16, numMembers 1
+t5: offset -1, type ffffffff, size 4, index 1, binding 22, stages 16, numMembers 1
+u5: offset -1, type ffffffff, size 4, index 2, binding 44, stages 16, numMembers 1
+u6: offset -1, type ffffffff, size 4, index 3, binding 34, stages 16, numMembers 1
+cb: offset -1, type ffffffff, size 4, index 4, binding 51, stages 16, numMembers 1
+tb: offset -1, type ffffffff, size 4, index 5, binding 27, stages 16, numMembers 1
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/hlsl.sin.frag.out b/Test/baseResults/hlsl.sin.frag.out
index 3128cec..bf88ce8 100644
--- a/Test/baseResults/hlsl.sin.frag.out
+++ b/Test/baseResults/hlsl.sin.frag.out
@@ -52,7 +52,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.singleArgIntPromo.vert.out b/Test/baseResults/hlsl.singleArgIntPromo.vert.out
old mode 100755
new mode 100644
index 71c1bb2..1da9d5b
--- a/Test/baseResults/hlsl.singleArgIntPromo.vert.out
+++ b/Test/baseResults/hlsl.singleArgIntPromo.vert.out
@@ -194,7 +194,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 75
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.snorm.uav.comp.out b/Test/baseResults/hlsl.snorm.uav.comp.out
index 739d77d..7b8cd41 100644
--- a/Test/baseResults/hlsl.snorm.uav.comp.out
+++ b/Test/baseResults/hlsl.snorm.uav.comp.out
@@ -112,7 +112,7 @@
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
@@ -141,7 +141,7 @@
                               MemberDecorate 25($Global) 0 Offset 0
                               Decorate 25($Global) Block
                               Decorate 27 DescriptorSet 0
-                              Decorate 27 Binding 0
+                              Decorate 27 Binding 2
                               Decorate 34(ResultOutS) DescriptorSet 0
                               Decorate 34(ResultOutS) Binding 1
                               Decorate 39(ResultInU) DescriptorSet 0
diff --git a/Test/baseResults/hlsl.specConstant.frag.out b/Test/baseResults/hlsl.specConstant.frag.out
old mode 100755
new mode 100644
index fdcc2a0..eb62242
--- a/Test/baseResults/hlsl.specConstant.frag.out
+++ b/Test/baseResults/hlsl.specConstant.frag.out
@@ -136,7 +136,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 61
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.staticFuncInit.frag.out b/Test/baseResults/hlsl.staticFuncInit.frag.out
index 04924ed..586dace 100644
--- a/Test/baseResults/hlsl.staticFuncInit.frag.out
+++ b/Test/baseResults/hlsl.staticFuncInit.frag.out
@@ -130,7 +130,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 57
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.staticMemberFunction.frag.out b/Test/baseResults/hlsl.staticMemberFunction.frag.out
index 5ae189d..0d27dba 100644
--- a/Test/baseResults/hlsl.staticMemberFunction.frag.out
+++ b/Test/baseResults/hlsl.staticMemberFunction.frag.out
@@ -118,7 +118,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out b/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out
index f5e004d..e518821 100644
--- a/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out
+++ b/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out
@@ -96,7 +96,7 @@
 0:?     'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.string.frag.out b/Test/baseResults/hlsl.string.frag.out
index 6ee1945..047f413 100644
--- a/Test/baseResults/hlsl.string.frag.out
+++ b/Test/baseResults/hlsl.string.frag.out
@@ -50,7 +50,7 @@
 0:?     'f' (layout( location=0) in float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.stringtoken.frag.out b/Test/baseResults/hlsl.stringtoken.frag.out
index 1b6e0a8..18d32e0 100644
--- a/Test/baseResults/hlsl.stringtoken.frag.out
+++ b/Test/baseResults/hlsl.stringtoken.frag.out
@@ -70,7 +70,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.struct.frag.out b/Test/baseResults/hlsl.struct.frag.out
index a255b36..7330f56 100644
--- a/Test/baseResults/hlsl.struct.frag.out
+++ b/Test/baseResults/hlsl.struct.frag.out
@@ -213,7 +213,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 102
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.struct.split-1.vert.out b/Test/baseResults/hlsl.struct.split-1.vert.out
index 8c25ca2..f204bd5 100644
--- a/Test/baseResults/hlsl.struct.split-1.vert.out
+++ b/Test/baseResults/hlsl.struct.split-1.vert.out
@@ -196,7 +196,7 @@
 0:?     'Pos_loose' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.struct.split.array.geom.out b/Test/baseResults/hlsl.struct.split.array.geom.out
index c489ffb..3d75fb8 100644
--- a/Test/baseResults/hlsl.struct.split.array.geom.out
+++ b/Test/baseResults/hlsl.struct.split.array.geom.out
@@ -160,7 +160,7 @@
 0:?     'OutputStream.VertexID' (layout( location=2) out uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 82
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.struct.split.assign.frag.out b/Test/baseResults/hlsl.struct.split.assign.frag.out
index 3209ab7..c40dbd6 100644
--- a/Test/baseResults/hlsl.struct.split.assign.frag.out
+++ b/Test/baseResults/hlsl.struct.split.assign.frag.out
@@ -209,7 +209,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 66
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.struct.split.call.vert.out b/Test/baseResults/hlsl.struct.split.call.vert.out
index 7c65c06..2570552 100644
--- a/Test/baseResults/hlsl.struct.split.call.vert.out
+++ b/Test/baseResults/hlsl.struct.split.call.vert.out
@@ -214,7 +214,7 @@
 0:?     'vsin.x1_in' (layout( location=2) in int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 77
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.struct.split.nested.geom.out b/Test/baseResults/hlsl.struct.split.nested.geom.out
index 75b5003..642152b 100644
--- a/Test/baseResults/hlsl.struct.split.nested.geom.out
+++ b/Test/baseResults/hlsl.struct.split.nested.geom.out
@@ -148,11 +148,8 @@
 0:24                0 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                0 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp 4-component vector of float)
@@ -175,13 +172,10 @@
 0:24                1 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                1 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
-0:24              0 (const int)
+0:24              1 (const int)
 0:24        move second child to first child ( temp 4-component vector of float)
 0:24          pos: direct index for structure ( temp 4-component vector of float)
 0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
@@ -202,19 +196,16 @@
 0:24                2 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                2 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
-0:24              0 (const int)
+0:24              2 (const int)
 0:24      Function Call: @main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111; ( temp void)
 0:?         'tin' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
 0:?         'ts' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:?   Linker Objects
 0:?     'tin.pos' ( in 3-element array of 4-component vector of float Position)
-0:?     'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
+0:?     'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:?     'ts.pos' ( out 4-component vector of float Position)
 0:?     'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
 0:?     'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
@@ -374,11 +365,8 @@
 0:24                0 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                0 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
 0:24              0 (const int)
 0:24        move second child to first child ( temp 4-component vector of float)
@@ -401,13 +389,10 @@
 0:24                1 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                1 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
-0:24              0 (const int)
+0:24              1 (const int)
 0:24        move second child to first child ( temp 4-component vector of float)
 0:24          pos: direct index for structure ( temp 4-component vector of float)
 0:24            direct index ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
@@ -428,19 +413,16 @@
 0:24                2 (const int)
 0:24            Constant:
 0:24              1 (const int)
-0:24          tc: direct index for structure ( temp 2-component vector of float)
-0:24            direct index (layout( location=0) in structure{ temp 2-component vector of float tc})
-0:24              'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
-0:24              Constant:
-0:24                2 (const int)
+0:24          direct index (layout( location=0) in 2-component vector of float)
+0:?             'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:24            Constant:
-0:24              0 (const int)
+0:24              2 (const int)
 0:24      Function Call: @main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111; ( temp void)
 0:?         'tin' ( temp 3-element array of structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
 0:?         'ts' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:?   Linker Objects
 0:?     'tin.pos' ( in 3-element array of 4-component vector of float Position)
-0:?     'tin' (layout( location=0) in 3-element array of structure{ temp 2-component vector of float tc})
+0:?     'tin.tc' (layout( location=0) in 3-element array of 2-component vector of float)
 0:?     'ts.pos' ( out 4-component vector of float Position)
 0:?     'ts.psIn.tc' (layout( location=0) out 2-component vector of float)
 0:?     'ts.contains_no_builtin_io.m0_array[0]' (layout( location=1) out float)
@@ -448,13 +430,13 @@
 0:?     'ts.contains_no_builtin_io.m1' (layout( location=3) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 100
+// Generated by (magic number): 8000a
+// Id's are bound by 99
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 48 52 56 59 63 69 77
+                              EntryPoint Geometry 4  "main" 48 52 56 59 63 69 76
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -481,19 +463,17 @@
                               Name 63  "ts.contains_no_builtin_io.m1"
                               Name 66  "tin"
                               Name 69  "tin.pos"
-                              Name 74  "PS_IN"
-                              MemberName 74(PS_IN) 0  "tc"
-                              Name 77  "tin"
-                              Name 94  "ts"
-                              Name 95  "param"
-                              Name 97  "param"
+                              Name 76  "tin.tc"
+                              Name 93  "ts"
+                              Name 94  "param"
+                              Name 96  "param"
                               Decorate 48(ts.pos) BuiltIn Position
                               Decorate 52(ts.psIn.tc) Location 0
                               Decorate 56(ts.contains_no_builtin_io.m0_array[0]) Location 1
                               Decorate 59(ts.contains_no_builtin_io.m0_array[1]) Location 2
                               Decorate 63(ts.contains_no_builtin_io.m1) Location 3
                               Decorate 69(tin.pos) BuiltIn Position
-                              Decorate 77(tin) Location 0
+                              Decorate 76(tin.tc) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -540,46 +520,45 @@
               68:             TypePointer Input 67
      69(tin.pos):     68(ptr) Variable Input
               70:             TypePointer Input 7(fvec4)
-       74(PS_IN):             TypeStruct 8(fvec2)
-              75:             TypeArray 74(PS_IN) 11
-              76:             TypePointer Input 75
-         77(tin):     76(ptr) Variable Input
-              78:             TypePointer Input 8(fvec2)
+              74:             TypeArray 8(fvec2) 11
+              75:             TypePointer Input 74
+      76(tin.tc):     75(ptr) Variable Input
+              77:             TypePointer Input 8(fvec2)
          4(main):           2 Function None 3
                5:             Label
          66(tin):     13(ptr) Variable Function
-          94(ts):     19(ptr) Variable Function
-       95(param):     13(ptr) Variable Function
-       97(param):     19(ptr) Variable Function
+          93(ts):     19(ptr) Variable Function
+       94(param):     13(ptr) Variable Function
+       96(param):     19(ptr) Variable Function
               71:     70(ptr) AccessChain 69(tin.pos) 26
               72:    7(fvec4) Load 71
               73:     32(ptr) AccessChain 66(tin) 26 26
                               Store 73 72
-              79:     78(ptr) AccessChain 77(tin) 26 26
-              80:    8(fvec2) Load 79
-              81:     38(ptr) AccessChain 66(tin) 26 34
-                              Store 81 80
-              82:     70(ptr) AccessChain 69(tin.pos) 34
-              83:    7(fvec4) Load 82
-              84:     32(ptr) AccessChain 66(tin) 34 26
-                              Store 84 83
-              85:     78(ptr) AccessChain 77(tin) 34 26
-              86:    8(fvec2) Load 85
-              87:     38(ptr) AccessChain 66(tin) 34 34
-                              Store 87 86
-              88:     70(ptr) AccessChain 69(tin.pos) 44
-              89:    7(fvec4) Load 88
-              90:     32(ptr) AccessChain 66(tin) 44 26
-                              Store 90 89
-              91:     78(ptr) AccessChain 77(tin) 44 26
-              92:    8(fvec2) Load 91
-              93:     38(ptr) AccessChain 66(tin) 44 34
-                              Store 93 92
-              96:          12 Load 66(tin)
-                              Store 95(param) 96
-              98:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 95(param) 97(param)
-              99:  18(GS_OUT) Load 97(param)
-                              Store 94(ts) 99
+              78:     77(ptr) AccessChain 76(tin.tc) 26
+              79:    8(fvec2) Load 78
+              80:     38(ptr) AccessChain 66(tin) 26 34
+                              Store 80 79
+              81:     70(ptr) AccessChain 69(tin.pos) 34
+              82:    7(fvec4) Load 81
+              83:     32(ptr) AccessChain 66(tin) 34 26
+                              Store 83 82
+              84:     77(ptr) AccessChain 76(tin.tc) 34
+              85:    8(fvec2) Load 84
+              86:     38(ptr) AccessChain 66(tin) 34 34
+                              Store 86 85
+              87:     70(ptr) AccessChain 69(tin.pos) 44
+              88:    7(fvec4) Load 87
+              89:     32(ptr) AccessChain 66(tin) 44 26
+                              Store 89 88
+              90:     77(ptr) AccessChain 76(tin.tc) 44
+              91:    8(fvec2) Load 90
+              92:     38(ptr) AccessChain 66(tin) 44 34
+                              Store 92 91
+              95:          12 Load 66(tin)
+                              Store 94(param) 95
+              97:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 94(param) 96(param)
+              98:  18(GS_OUT) Load 96(param)
+                              Store 93(ts) 98
                               Return
                               FunctionEnd
 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;):           2 Function None 20
diff --git a/Test/baseResults/hlsl.struct.split.trivial.geom.out b/Test/baseResults/hlsl.struct.split.trivial.geom.out
index ecb929e..89c02bf 100644
--- a/Test/baseResults/hlsl.struct.split.trivial.geom.out
+++ b/Test/baseResults/hlsl.struct.split.trivial.geom.out
@@ -192,7 +192,7 @@
 0:?     'ts.pos' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 67
 
                               Capability Geometry
diff --git a/Test/baseResults/hlsl.struct.split.trivial.vert.out b/Test/baseResults/hlsl.struct.split.trivial.vert.out
index f516ea0..f1470ab 100644
--- a/Test/baseResults/hlsl.struct.split.trivial.vert.out
+++ b/Test/baseResults/hlsl.struct.split.trivial.vert.out
@@ -98,7 +98,7 @@
 0:?     'Pos_loose' (layout( location=1) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 45
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structIoFourWay.frag.out b/Test/baseResults/hlsl.structIoFourWay.frag.out
index ae47037..fd1a8bb 100644
--- a/Test/baseResults/hlsl.structIoFourWay.frag.out
+++ b/Test/baseResults/hlsl.structIoFourWay.frag.out
@@ -162,7 +162,7 @@
 0:?     't.normal' (layout( location=3) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structStructName.frag.out b/Test/baseResults/hlsl.structStructName.frag.out
index 6e767e4..3fdbca9 100644
--- a/Test/baseResults/hlsl.structStructName.frag.out
+++ b/Test/baseResults/hlsl.structStructName.frag.out
@@ -44,7 +44,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structarray.flatten.frag.out b/Test/baseResults/hlsl.structarray.flatten.frag.out
index b654c32..97e57b1 100644
--- a/Test/baseResults/hlsl.structarray.flatten.frag.out
+++ b/Test/baseResults/hlsl.structarray.flatten.frag.out
@@ -157,7 +157,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 80
 
                               Capability Shader
@@ -199,38 +199,52 @@
                               Name 78  "g_texdata_array2[2].tex"
                               Name 79  "g_texdata_array2[2].nonopaque_thing"
                               Decorate 18(g_texdata.tex) DescriptorSet 0
-                              Decorate 18(g_texdata.tex) Binding 0
+                              Decorate 18(g_texdata.tex) Binding 1
                               Decorate 22(g_texdata.samp) DescriptorSet 0
                               Decorate 22(g_texdata.samp) Binding 0
                               Decorate 28(g_texdata_array[1].tex) DescriptorSet 0
-                              Decorate 28(g_texdata_array[1].tex) Binding 0
+                              Decorate 28(g_texdata_array[1].tex) Binding 3
                               Decorate 30(g_texdata_array[1].samp) DescriptorSet 0
-                              Decorate 30(g_texdata_array[1].samp) Binding 0
+                              Decorate 30(g_texdata_array[1].samp) Binding 2
                               Decorate 40(g_texdata_array2[1].tex) DescriptorSet 0
-                              Decorate 40(g_texdata_array2[1].tex) Binding 0
+                              Decorate 40(g_texdata_array2[1].tex) Binding 5
                               Decorate 45(g_texdata_array2[1].samp) DescriptorSet 0
-                              Decorate 45(g_texdata_array2[1].samp) Binding 0
+                              Decorate 45(g_texdata_array2[1].samp) Binding 4
                               Decorate 59(ps_output.color) Location 0
                               Decorate 62(g_samp) DescriptorSet 0
                               Decorate 62(g_samp) Binding 0
                               Decorate 63(g_tex) DescriptorSet 0
                               Decorate 63(g_tex) Binding 0
+                              Decorate 65(g_texdata.nonopaque_thing) Location 0
+                              Decorate 65(g_texdata.nonopaque_thing) DescriptorSet 0
                               Decorate 66(g_texdata_array[0].samp) DescriptorSet 0
                               Decorate 66(g_texdata_array[0].samp) Binding 0
                               Decorate 67(g_texdata_array[0].tex) DescriptorSet 0
                               Decorate 67(g_texdata_array[0].tex) Binding 0
+                              Decorate 68(g_texdata_array[0].nonopaque_thing) Location 1
+                              Decorate 68(g_texdata_array[0].nonopaque_thing) DescriptorSet 0
+                              Decorate 69(g_texdata_array[1].nonopaque_thing) Location 2
+                              Decorate 69(g_texdata_array[1].nonopaque_thing) DescriptorSet 0
                               Decorate 70(g_texdata_array[2].samp) DescriptorSet 0
                               Decorate 70(g_texdata_array[2].samp) Binding 0
                               Decorate 71(g_texdata_array[2].tex) DescriptorSet 0
                               Decorate 71(g_texdata_array[2].tex) Binding 0
+                              Decorate 72(g_texdata_array[2].nonopaque_thing) Location 3
+                              Decorate 72(g_texdata_array[2].nonopaque_thing) DescriptorSet 0
                               Decorate 73(g_texdata_array2[0].samp) DescriptorSet 0
                               Decorate 73(g_texdata_array2[0].samp) Binding 0
                               Decorate 74(g_texdata_array2[0].tex) DescriptorSet 0
                               Decorate 74(g_texdata_array2[0].tex) Binding 0
+                              Decorate 75(g_texdata_array2[0].nonopaque_thing) Location 4
+                              Decorate 75(g_texdata_array2[0].nonopaque_thing) DescriptorSet 0
+                              Decorate 76(g_texdata_array2[1].nonopaque_thing) Location 5
+                              Decorate 76(g_texdata_array2[1].nonopaque_thing) DescriptorSet 0
                               Decorate 77(g_texdata_array2[2].samp) DescriptorSet 0
                               Decorate 77(g_texdata_array2[2].samp) Binding 0
                               Decorate 78(g_texdata_array2[2].tex) DescriptorSet 0
                               Decorate 78(g_texdata_array2[2].tex) Binding 0
+                              Decorate 79(g_texdata_array2[2].nonopaque_thing) Location 6
+                              Decorate 79(g_texdata_array2[2].nonopaque_thing) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/hlsl.structarray.flatten.geom.out b/Test/baseResults/hlsl.structarray.flatten.geom.out
index 426214b..619dccf 100644
--- a/Test/baseResults/hlsl.structarray.flatten.geom.out
+++ b/Test/baseResults/hlsl.structarray.flatten.geom.out
@@ -70,14 +70,86 @@
 0:16  Function Definition: main( ( temp void)
 0:16    Function Parameters: 
 0:?     Sequence
-0:16      move second child to first child ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?         'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?         'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16      Sequence
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          position: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          direct index (layout( location=0) in 4-component vector of float)
+0:?             'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          color: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16          direct index (layout( location=1) in 4-component vector of float)
+0:?             'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              2 (const int)
+0:16          direct index (layout( location=2) in 2-component vector of float)
+0:?             'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          position: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          direct index (layout( location=0) in 4-component vector of float)
+0:?             'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          color: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16          direct index (layout( location=1) in 4-component vector of float)
+0:?             'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              2 (const int)
+0:16          direct index (layout( location=2) in 2-component vector of float)
+0:?             'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
 0:16      Function Call: @main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21; ( temp void)
 0:?         'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?         'outStream' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?   Linker Objects
-0:?     'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?     'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:?     'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:?     'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
 0:?     'outStream.position' ( out 4-component vector of float Position)
 0:?     'outStream.color' (layout( location=0) out 4-component vector of float)
 0:?     'outStream.uv' (layout( location=1) out 2-component vector of float)
@@ -157,26 +229,98 @@
 0:16  Function Definition: main( ( temp void)
 0:16    Function Parameters: 
 0:?     Sequence
-0:16      move second child to first child ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?         'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
-0:?         'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16      Sequence
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          position: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          direct index (layout( location=0) in 4-component vector of float)
+0:?             'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          color: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16          direct index (layout( location=1) in 4-component vector of float)
+0:?             'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                0 (const int)
+0:16            Constant:
+0:16              2 (const int)
+0:16          direct index (layout( location=2) in 2-component vector of float)
+0:?             'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              0 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          position: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              0 (const int)
+0:16          direct index (layout( location=0) in 4-component vector of float)
+0:?             'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 4-component vector of float)
+0:16          color: direct index for structure ( temp 4-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              1 (const int)
+0:16          direct index (layout( location=1) in 4-component vector of float)
+0:?             'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
+0:16        move second child to first child ( temp 2-component vector of float)
+0:16          uv: direct index for structure ( temp 2-component vector of float)
+0:16            direct index ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?               'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:16              Constant:
+0:16                1 (const int)
+0:16            Constant:
+0:16              2 (const int)
+0:16          direct index (layout( location=2) in 2-component vector of float)
+0:?             'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
+0:16            Constant:
+0:16              1 (const int)
 0:16      Function Call: @main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21; ( temp void)
 0:?         'vin' ( temp 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?         'outStream' ( temp structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
 0:?   Linker Objects
-0:?     'vin' (layout( location=0) in 2-element array of structure{ temp 4-component vector of float position,  temp 4-component vector of float color,  temp 2-component vector of float uv})
+0:?     'vin.position' (layout( location=0) in 2-element array of 4-component vector of float)
+0:?     'vin.color' (layout( location=1) in 2-element array of 4-component vector of float)
+0:?     'vin.uv' (layout( location=2) in 2-element array of 2-component vector of float)
 0:?     'outStream.position' ( out 4-component vector of float Position)
 0:?     'outStream.color' (layout( location=0) out 4-component vector of float)
 0:?     'outStream.uv' (layout( location=1) out 2-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 58
+// Generated by (magic number): 8000a
+// Id's are bound by 82
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 38 41 45 50
+                              EntryPoint Geometry 4  "main" 38 41 45 51 56 62
                               ExecutionMode 4 InputLines
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -199,14 +343,18 @@
                               Name 41  "outStream.color"
                               Name 45  "outStream.uv"
                               Name 48  "vin"
-                              Name 50  "vin"
-                              Name 52  "outStream"
-                              Name 53  "param"
-                              Name 55  "param"
+                              Name 51  "vin.position"
+                              Name 56  "vin.color"
+                              Name 62  "vin.uv"
+                              Name 76  "outStream"
+                              Name 77  "param"
+                              Name 79  "param"
                               Decorate 38(outStream.position) BuiltIn Position
                               Decorate 41(outStream.color) Location 0
                               Decorate 45(outStream.uv) Location 1
-                              Decorate 50(vin) Location 0
+                              Decorate 51(vin.position) Location 0
+                              Decorate 56(vin.color) Location 1
+                              Decorate 62(vin.uv) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -231,21 +379,50 @@
 41(outStream.color):     37(ptr) Variable Output
               44:             TypePointer Output 8(fvec2)
 45(outStream.uv):     44(ptr) Variable Output
-              49:             TypePointer Input 12
-         50(vin):     49(ptr) Variable Input
+              49:             TypeArray 7(fvec4) 11
+              50:             TypePointer Input 49
+51(vin.position):     50(ptr) Variable Input
+              52:             TypePointer Input 7(fvec4)
+   56(vin.color):     50(ptr) Variable Input
+              60:             TypeArray 8(fvec2) 11
+              61:             TypePointer Input 60
+      62(vin.uv):     61(ptr) Variable Input
+              63:             TypePointer Input 8(fvec2)
          4(main):           2 Function None 3
                5:             Label
          48(vin):     13(ptr) Variable Function
-   52(outStream):     15(ptr) Variable Function
-       53(param):     13(ptr) Variable Function
-       55(param):     15(ptr) Variable Function
-              51:          12 Load 50(vin)
-                              Store 48(vin) 51
-              54:          12 Load 48(vin)
-                              Store 53(param) 54
-              56:           2 FunctionCall 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;) 53(param) 55(param)
-              57:   14(PS_IN) Load 55(param)
-                              Store 52(outStream) 57
+   76(outStream):     15(ptr) Variable Function
+       77(param):     13(ptr) Variable Function
+       79(param):     15(ptr) Variable Function
+              53:     52(ptr) AccessChain 51(vin.position) 33
+              54:    7(fvec4) Load 53
+              55:     24(ptr) AccessChain 48(vin) 33 33
+                              Store 55 54
+              57:     52(ptr) AccessChain 56(vin.color) 33
+              58:    7(fvec4) Load 57
+              59:     24(ptr) AccessChain 48(vin) 33 23
+                              Store 59 58
+              64:     63(ptr) AccessChain 62(vin.uv) 33
+              65:    8(fvec2) Load 64
+              66:     29(ptr) AccessChain 48(vin) 33 28
+                              Store 66 65
+              67:     52(ptr) AccessChain 51(vin.position) 23
+              68:    7(fvec4) Load 67
+              69:     24(ptr) AccessChain 48(vin) 23 33
+                              Store 69 68
+              70:     52(ptr) AccessChain 56(vin.color) 23
+              71:    7(fvec4) Load 70
+              72:     24(ptr) AccessChain 48(vin) 23 23
+                              Store 72 71
+              73:     63(ptr) AccessChain 62(vin.uv) 23
+              74:    8(fvec2) Load 73
+              75:     29(ptr) AccessChain 48(vin) 23 28
+                              Store 75 74
+              78:          12 Load 48(vin)
+                              Store 77(param) 78
+              80:           2 FunctionCall 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;) 77(param) 79(param)
+              81:   14(PS_IN) Load 79(param)
+                              Store 76(outStream) 81
                               Return
                               FunctionEnd
 19(@main(struct-VertexData-vf4-vf4-vf21[2];struct-PS_IN-vf4-vf4-vf21;):           2 Function None 16
diff --git a/Test/baseResults/hlsl.structbuffer.append.fn.frag.out b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
index c61b1d8..2ac904e 100644
--- a/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
@@ -151,7 +151,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
@@ -194,7 +194,7 @@
                               Decorate 50(sbuf_a@count) DescriptorSet 0
                               Decorate 50(sbuf_a@count) Binding 0
                               Decorate 51(sbuf_c) DescriptorSet 0
-                              Decorate 51(sbuf_c) Binding 0
+                              Decorate 51(sbuf_c) Binding 1
                               Decorate 52(sbuf_c@count) DescriptorSet 0
                               Decorate 52(sbuf_c@count) Binding 0
                               Decorate 58(pos) Flat
diff --git a/Test/baseResults/hlsl.structbuffer.append.frag.out b/Test/baseResults/hlsl.structbuffer.append.frag.out
index e213b4b..5631624 100644
--- a/Test/baseResults/hlsl.structbuffer.append.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.append.frag.out
@@ -124,7 +124,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 56
 
                               Capability Shader
@@ -157,11 +157,11 @@
                               MemberDecorate 20(sbuf_a@count) 0 Offset 0
                               Decorate 20(sbuf_a@count) BufferBlock
                               Decorate 22(sbuf_a@count) DescriptorSet 0
-                              Decorate 22(sbuf_a@count) Binding 0
+                              Decorate 22(sbuf_a@count) Binding 1
                               Decorate 35(sbuf_c) DescriptorSet 0
-                              Decorate 35(sbuf_c) Binding 0
+                              Decorate 35(sbuf_c) Binding 2
                               Decorate 36(sbuf_c@count) DescriptorSet 0
-                              Decorate 36(sbuf_c@count) Binding 0
+                              Decorate 36(sbuf_c@count) Binding 3
                               Decorate 48(pos) Flat
                               Decorate 48(pos) Location 0
                               Decorate 51(@entryPointOutput) Location 0
diff --git a/Test/baseResults/hlsl.structbuffer.atomics.frag.out b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
index d038fbd..ba874ee 100644
--- a/Test/baseResults/hlsl.structbuffer.atomics.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
@@ -475,7 +475,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 87
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.byte.frag.out b/Test/baseResults/hlsl.structbuffer.byte.frag.out
index e0f1131..40e8d9e 100644
--- a/Test/baseResults/hlsl.structbuffer.byte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.byte.frag.out
@@ -324,7 +324,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 114
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.coherent.frag.out b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
index 34b029b..95a9e67 100644
--- a/Test/baseResults/hlsl.structbuffer.coherent.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
@@ -176,7 +176,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
@@ -208,7 +208,7 @@
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 17(sbuf2) DescriptorSet 0
-                              Decorate 17(sbuf2) Binding 0
+                              Decorate 17(sbuf2) Binding 1
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 1 Offset 12
                               Decorate 29 ArrayStride 16
diff --git a/Test/baseResults/hlsl.structbuffer.floatidx.comp.out b/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
index e1c5466..a7668a7 100644
--- a/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
+++ b/Test/baseResults/hlsl.structbuffer.floatidx.comp.out
@@ -180,7 +180,7 @@
 0:?     'nThreadId' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 85
 
                               Capability Shader
@@ -224,14 +224,14 @@
                               MemberDecorate 26(csb@count) 0 Offset 0
                               Decorate 26(csb@count) BufferBlock
                               Decorate 28(csb@count) DescriptorSet 0
-                              Decorate 28(csb@count) Binding 0
+                              Decorate 28(csb@count) Binding 2
                               Decorate 58(outtx) DescriptorSet 0
                               Decorate 58(outtx) Binding 0
                               Decorate 63 ArrayStride 16
                               MemberDecorate 64(rwsb) 0 Offset 0
                               Decorate 64(rwsb) BufferBlock
                               Decorate 66(rwsb) DescriptorSet 0
-                              Decorate 66(rwsb) Binding 0
+                              Decorate 66(rwsb) Binding 3
                               Decorate 80(nThreadId) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.structbuffer.fn.frag.out b/Test/baseResults/hlsl.structbuffer.fn.frag.out
index 1df5880..bd2a4e6 100644
--- a/Test/baseResults/hlsl.structbuffer.fn.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.fn.frag.out
@@ -139,7 +139,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.fn2.comp.out b/Test/baseResults/hlsl.structbuffer.fn2.comp.out
index d25446b..3409a5f 100644
--- a/Test/baseResults/hlsl.structbuffer.fn2.comp.out
+++ b/Test/baseResults/hlsl.structbuffer.fn2.comp.out
@@ -136,7 +136,7 @@
 0:?     'dispatchId' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 63
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.frag.out b/Test/baseResults/hlsl.structbuffer.frag.out
index 38e915d..5979ff2 100644
--- a/Test/baseResults/hlsl.structbuffer.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.frag.out
@@ -188,7 +188,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 96
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
index 57f387c..23b2125 100644
--- a/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
+++ b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
@@ -1,6 +1,6 @@
 hlsl.structbuffer.incdec.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structbuffer.incdec.frag.out b/Test/baseResults/hlsl.structbuffer.incdec.frag.out
index b9c1630..8ae9767 100644
--- a/Test/baseResults/hlsl.structbuffer.incdec.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.incdec.frag.out
@@ -204,7 +204,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
@@ -238,15 +238,15 @@
                               Decorate 22(sbuf_rw_i) DescriptorSet 0
                               Decorate 22(sbuf_rw_i) Binding 0
                               Decorate 26(sbuf_rw_d) DescriptorSet 0
-                              Decorate 26(sbuf_rw_d) Binding 0
+                              Decorate 26(sbuf_rw_d) Binding 2
                               Decorate 27(sbuf_rw_nocounter) DescriptorSet 0
-                              Decorate 27(sbuf_rw_nocounter) Binding 0
+                              Decorate 27(sbuf_rw_nocounter) Binding 4
                               MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0
                               Decorate 34(sbuf_rw_i@count) BufferBlock
                               Decorate 36(sbuf_rw_i@count) DescriptorSet 0
-                              Decorate 36(sbuf_rw_i@count) Binding 0
+                              Decorate 36(sbuf_rw_i@count) Binding 1
                               Decorate 42(sbuf_rw_d@count) DescriptorSet 0
-                              Decorate 42(sbuf_rw_d@count) Binding 0
+                              Decorate 42(sbuf_rw_d@count) Binding 3
                               Decorate 63(pos) Flat
                               Decorate 63(pos) Location 0
                               Decorate 66(@entryPointOutput) Location 0
diff --git a/Test/baseResults/hlsl.structbuffer.rw.frag.out b/Test/baseResults/hlsl.structbuffer.rw.frag.out
index fbd48a2..d6eb8f3 100644
--- a/Test/baseResults/hlsl.structbuffer.rw.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rw.frag.out
@@ -176,7 +176,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 78
 
                               Capability Shader
@@ -207,7 +207,7 @@
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 17(sbuf2) DescriptorSet 0
-                              Decorate 17(sbuf2) Binding 0
+                              Decorate 17(sbuf2) Binding 1
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 1 Offset 12
                               Decorate 29 ArrayStride 16
diff --git a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
index a061eac..337442d 100644
--- a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
@@ -1004,7 +1004,7 @@
 0:?     'pos' (layout( location=0) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 239
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.structin.vert.out b/Test/baseResults/hlsl.structin.vert.out
index ad9c0d4..85f6346 100644
--- a/Test/baseResults/hlsl.structin.vert.out
+++ b/Test/baseResults/hlsl.structin.vert.out
@@ -340,7 +340,7 @@
 0:?     'e' (layout( location=5) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 94
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.subpass.frag.out b/Test/baseResults/hlsl.subpass.frag.out
index 8d48028..2aca628 100644
--- a/Test/baseResults/hlsl.subpass.frag.out
+++ b/Test/baseResults/hlsl.subpass.frag.out
@@ -430,7 +430,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 204
 
                               Capability Shader
@@ -500,73 +500,73 @@
                               Decorate 27(subpass_i4) Binding 0
                               Decorate 27(subpass_i4) InputAttachmentIndex 2
                               Decorate 36(subpass_u4) DescriptorSet 0
-                              Decorate 36(subpass_u4) Binding 0
+                              Decorate 36(subpass_u4) Binding 2
                               Decorate 36(subpass_u4) InputAttachmentIndex 3
                               Decorate 42(subpass_ms_f4) DescriptorSet 0
-                              Decorate 42(subpass_ms_f4) Binding 0
+                              Decorate 42(subpass_ms_f4) Binding 3
                               Decorate 42(subpass_ms_f4) InputAttachmentIndex 4
                               Decorate 49(subpass_ms_i4) DescriptorSet 0
-                              Decorate 49(subpass_ms_i4) Binding 0
+                              Decorate 49(subpass_ms_i4) Binding 4
                               Decorate 49(subpass_ms_i4) InputAttachmentIndex 5
                               Decorate 55(subpass_ms_u4) DescriptorSet 0
-                              Decorate 55(subpass_ms_u4) Binding 0
+                              Decorate 55(subpass_ms_u4) Binding 5
                               Decorate 55(subpass_ms_u4) InputAttachmentIndex 6
                               Decorate 61(subpass_f3) DescriptorSet 0
-                              Decorate 61(subpass_f3) Binding 0
+                              Decorate 61(subpass_f3) Binding 6
                               Decorate 61(subpass_f3) InputAttachmentIndex 1
                               Decorate 71(subpass_i3) DescriptorSet 0
-                              Decorate 71(subpass_i3) Binding 0
+                              Decorate 71(subpass_i3) Binding 7
                               Decorate 71(subpass_i3) InputAttachmentIndex 2
                               Decorate 81(subpass_u3) DescriptorSet 0
-                              Decorate 81(subpass_u3) Binding 0
+                              Decorate 81(subpass_u3) Binding 8
                               Decorate 81(subpass_u3) InputAttachmentIndex 3
                               Decorate 89(subpass_ms_f3) DescriptorSet 0
-                              Decorate 89(subpass_ms_f3) Binding 0
+                              Decorate 89(subpass_ms_f3) Binding 9
                               Decorate 89(subpass_ms_f3) InputAttachmentIndex 4
                               Decorate 97(subpass_ms_i3) DescriptorSet 0
-                              Decorate 97(subpass_ms_i3) Binding 0
+                              Decorate 97(subpass_ms_i3) Binding 10
                               Decorate 97(subpass_ms_i3) InputAttachmentIndex 5
                               Decorate 105(subpass_ms_u3) DescriptorSet 0
-                              Decorate 105(subpass_ms_u3) Binding 0
+                              Decorate 105(subpass_ms_u3) Binding 11
                               Decorate 105(subpass_ms_u3) InputAttachmentIndex 6
                               Decorate 115(subpass_f2) DescriptorSet 0
-                              Decorate 115(subpass_f2) Binding 0
+                              Decorate 115(subpass_f2) Binding 12
                               Decorate 115(subpass_f2) InputAttachmentIndex 1
                               Decorate 123(subpass_i2) DescriptorSet 0
-                              Decorate 123(subpass_i2) Binding 0
+                              Decorate 123(subpass_i2) Binding 13
                               Decorate 123(subpass_i2) InputAttachmentIndex 2
                               Decorate 132(subpass_u2) DescriptorSet 0
-                              Decorate 132(subpass_u2) Binding 0
+                              Decorate 132(subpass_u2) Binding 14
                               Decorate 132(subpass_u2) InputAttachmentIndex 3
                               Decorate 139(subpass_ms_f2) DescriptorSet 0
-                              Decorate 139(subpass_ms_f2) Binding 0
+                              Decorate 139(subpass_ms_f2) Binding 15
                               Decorate 139(subpass_ms_f2) InputAttachmentIndex 4
                               Decorate 147(subpass_ms_i2) DescriptorSet 0
-                              Decorate 147(subpass_ms_i2) Binding 0
+                              Decorate 147(subpass_ms_i2) Binding 16
                               Decorate 147(subpass_ms_i2) InputAttachmentIndex 5
                               Decorate 154(subpass_ms_u2) DescriptorSet 0
-                              Decorate 154(subpass_ms_u2) Binding 0
+                              Decorate 154(subpass_ms_u2) Binding 17
                               Decorate 154(subpass_ms_u2) InputAttachmentIndex 6
                               Decorate 162(subpass_f) DescriptorSet 0
-                              Decorate 162(subpass_f) Binding 0
+                              Decorate 162(subpass_f) Binding 18
                               Decorate 162(subpass_f) InputAttachmentIndex 1
                               Decorate 168(subpass_i) DescriptorSet 0
-                              Decorate 168(subpass_i) Binding 0
+                              Decorate 168(subpass_i) Binding 19
                               Decorate 168(subpass_i) InputAttachmentIndex 2
                               Decorate 174(subpass_u) DescriptorSet 0
-                              Decorate 174(subpass_u) Binding 0
+                              Decorate 174(subpass_u) Binding 20
                               Decorate 174(subpass_u) InputAttachmentIndex 3
                               Decorate 179(subpass_ms_f) DescriptorSet 0
-                              Decorate 179(subpass_ms_f) Binding 0
+                              Decorate 179(subpass_ms_f) Binding 21
                               Decorate 179(subpass_ms_f) InputAttachmentIndex 4
                               Decorate 184(subpass_ms_i) DescriptorSet 0
-                              Decorate 184(subpass_ms_i) Binding 0
+                              Decorate 184(subpass_ms_i) Binding 22
                               Decorate 184(subpass_ms_i) InputAttachmentIndex 5
                               Decorate 189(subpass_ms_u) DescriptorSet 0
-                              Decorate 189(subpass_ms_u) Binding 0
+                              Decorate 189(subpass_ms_u) Binding 23
                               Decorate 189(subpass_ms_u) InputAttachmentIndex 6
                               Decorate 194(subpass_2) DescriptorSet 0
-                              Decorate 194(subpass_2) Binding 0
+                              Decorate 194(subpass_2) Binding 24
                               Decorate 194(subpass_2) InputAttachmentIndex 7
                               Decorate 202(@entryPointOutput) Location 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.switch.frag.out b/Test/baseResults/hlsl.switch.frag.out
index b94187d..c239640 100644
--- a/Test/baseResults/hlsl.switch.frag.out
+++ b/Test/baseResults/hlsl.switch.frag.out
@@ -296,7 +296,7 @@
 0:?     'd' (layout( location=2) flat in int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 106
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.swizzle.frag.out b/Test/baseResults/hlsl.swizzle.frag.out
index 87ccdc7..28f295d 100644
--- a/Test/baseResults/hlsl.swizzle.frag.out
+++ b/Test/baseResults/hlsl.swizzle.frag.out
@@ -77,7 +77,7 @@
 0:?     'AmbientColor' ( global 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.synthesizeInput.frag.out b/Test/baseResults/hlsl.synthesizeInput.frag.out
index 31f7b7a..2c1ef1d 100644
--- a/Test/baseResults/hlsl.synthesizeInput.frag.out
+++ b/Test/baseResults/hlsl.synthesizeInput.frag.out
@@ -98,7 +98,7 @@
 0:?     'input.no_interp' (layout( location=1) flat in uint)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.target.frag.out b/Test/baseResults/hlsl.target.frag.out
index 0ab23e8..8bfaa2b 100644
--- a/Test/baseResults/hlsl.target.frag.out
+++ b/Test/baseResults/hlsl.target.frag.out
@@ -114,7 +114,7 @@
 0:?     'out2' (layout( location=3) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.targetStruct1.frag.out b/Test/baseResults/hlsl.targetStruct1.frag.out
index 93d787c..6db5eb4 100644
--- a/Test/baseResults/hlsl.targetStruct1.frag.out
+++ b/Test/baseResults/hlsl.targetStruct1.frag.out
@@ -184,7 +184,7 @@
 0:?     'po' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.targetStruct2.frag.out b/Test/baseResults/hlsl.targetStruct2.frag.out
index 0fae66f..051d267 100644
--- a/Test/baseResults/hlsl.targetStruct2.frag.out
+++ b/Test/baseResults/hlsl.targetStruct2.frag.out
@@ -184,7 +184,7 @@
 0:?     'po' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.templatetypes.frag.out b/Test/baseResults/hlsl.templatetypes.frag.out
index 1dcfc46..1ffb263 100644
--- a/Test/baseResults/hlsl.templatetypes.frag.out
+++ b/Test/baseResults/hlsl.templatetypes.frag.out
@@ -508,7 +508,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 153
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.texture.struct.frag.out b/Test/baseResults/hlsl.texture.struct.frag.out
index 7835d32..3d718de 100644
--- a/Test/baseResults/hlsl.texture.struct.frag.out
+++ b/Test/baseResults/hlsl.texture.struct.frag.out
@@ -839,7 +839,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 240
 
                               Capability Shader
@@ -907,17 +907,17 @@
                               Decorate 30(g_sSamp) DescriptorSet 0
                               Decorate 30(g_sSamp) Binding 0
                               Decorate 90(g_tTex2s1) DescriptorSet 0
-                              Decorate 90(g_tTex2s1) Binding 0
+                              Decorate 90(g_tTex2s1) Binding 1
                               Decorate 114(g_tTex2s2) DescriptorSet 0
-                              Decorate 114(g_tTex2s2) Binding 0
+                              Decorate 114(g_tTex2s2) Binding 2
                               Decorate 140(g_tTex2s3) DescriptorSet 0
-                              Decorate 140(g_tTex2s3) Binding 0
+                              Decorate 140(g_tTex2s3) Binding 3
                               Decorate 168(g_tTex2s4) DescriptorSet 0
-                              Decorate 168(g_tTex2s4) Binding 0
+                              Decorate 168(g_tTex2s4) Binding 4
                               Decorate 202(g_tTex2s5) DescriptorSet 0
-                              Decorate 202(g_tTex2s5) Binding 0
+                              Decorate 202(g_tTex2s5) Binding 5
                               Decorate 229(g_tTex2s1a) DescriptorSet 0
-                              Decorate 229(g_tTex2s1a) Binding 0
+                              Decorate 229(g_tTex2s1a) Binding 6
                               Decorate 238(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.texture.subvec4.frag.out b/Test/baseResults/hlsl.texture.subvec4.frag.out
index 01f32da..8ba67cf 100644
--- a/Test/baseResults/hlsl.texture.subvec4.frag.out
+++ b/Test/baseResults/hlsl.texture.subvec4.frag.out
@@ -356,7 +356,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 130
 
                               Capability Shader
@@ -388,21 +388,21 @@
                               Decorate 17(g_tTex2dmsf1) DescriptorSet 0
                               Decorate 17(g_tTex2dmsf1) Binding 0
                               Decorate 33(g_tTex2dmsf2) DescriptorSet 0
-                              Decorate 33(g_tTex2dmsf2) Binding 0
+                              Decorate 33(g_tTex2dmsf2) Binding 1
                               Decorate 43(g_tTex2dmsf3) DescriptorSet 0
-                              Decorate 43(g_tTex2dmsf3) Binding 0
+                              Decorate 43(g_tTex2dmsf3) Binding 2
                               Decorate 53(g_tTex2dmsf4) DescriptorSet 0
-                              Decorate 53(g_tTex2dmsf4) Binding 0
+                              Decorate 53(g_tTex2dmsf4) Binding 3
                               Decorate 88(g_tTex2df1) DescriptorSet 0
-                              Decorate 88(g_tTex2df1) Binding 0
+                              Decorate 88(g_tTex2df1) Binding 4
                               Decorate 92(g_sSamp) DescriptorSet 0
-                              Decorate 92(g_sSamp) Binding 0
+                              Decorate 92(g_sSamp) Binding 8
                               Decorate 101(g_tTex2df2) DescriptorSet 0
-                              Decorate 101(g_tTex2df2) Binding 0
+                              Decorate 101(g_tTex2df2) Binding 5
                               Decorate 109(g_tTex2df3) DescriptorSet 0
-                              Decorate 109(g_tTex2df3) Binding 0
+                              Decorate 109(g_tTex2df3) Binding 6
                               Decorate 118(g_tTex2df4) DescriptorSet 0
-                              Decorate 118(g_tTex2df4) Binding 0
+                              Decorate 118(g_tTex2df4) Binding 7
                               Decorate 128(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.texturebuffer.frag.out b/Test/baseResults/hlsl.texturebuffer.frag.out
index 1aa9dbc..37e19c2 100644
--- a/Test/baseResults/hlsl.texturebuffer.frag.out
+++ b/Test/baseResults/hlsl.texturebuffer.frag.out
@@ -70,7 +70,7 @@
 0:?     'pos' ( in 4-component vector of float FragCoord)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
@@ -107,7 +107,7 @@
                               MemberDecorate 22(tbuf2) 1 Offset 16
                               Decorate 22(tbuf2) BufferBlock
                               Decorate 24 DescriptorSet 0
-                              Decorate 24 Binding 0
+                              Decorate 24 Binding 1
                               Decorate 32(pos) BuiltIn FragCoord
                               Decorate 35(@entryPointOutput) Location 0
                2:             TypeVoid
diff --git a/Test/baseResults/hlsl.this.frag.out b/Test/baseResults/hlsl.this.frag.out
index f32f109..47022ec 100644
--- a/Test/baseResults/hlsl.this.frag.out
+++ b/Test/baseResults/hlsl.this.frag.out
@@ -240,7 +240,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 98
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.tristream-append.geom.out b/Test/baseResults/hlsl.tristream-append.geom.out
index 514ce16..53e8c04 100644
--- a/Test/baseResults/hlsl.tristream-append.geom.out
+++ b/Test/baseResults/hlsl.tristream-append.geom.out
@@ -42,9 +42,34 @@
 0:14  Function Definition: main( ( temp void)
 0:14    Function Parameters: 
 0:?     Sequence
-0:14      move second child to first child ( temp 3-element array of structure{})
-0:?         'input' ( temp 3-element array of structure{})
-0:?         'input' ( in 3-element array of structure{})
+0:14      Sequence
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              0 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              0 (const int)
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              1 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              1 (const int)
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              2 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              2 (const int)
 0:14      Function Call: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
 0:?         'input' ( temp 3-element array of structure{})
 0:?         'TriStream' ( temp structure{})
@@ -97,9 +122,34 @@
 0:14  Function Definition: main( ( temp void)
 0:14    Function Parameters: 
 0:?     Sequence
-0:14      move second child to first child ( temp 3-element array of structure{})
-0:?         'input' ( temp 3-element array of structure{})
-0:?         'input' ( in 3-element array of structure{})
+0:14      Sequence
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              0 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              0 (const int)
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              1 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              1 (const int)
+0:14        move second child to first child ( temp structure{})
+0:14          direct index ( temp structure{})
+0:?             'input' ( temp 3-element array of structure{})
+0:14            Constant:
+0:14              2 (const int)
+0:14          direct index ( in structure{})
+0:?             'input' ( in 3-element array of structure{})
+0:14            Constant:
+0:14              2 (const int)
 0:14      Function Call: @main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1; ( temp void)
 0:?         'input' ( temp 3-element array of structure{})
 0:?         'TriStream' ( temp structure{})
@@ -107,8 +157,8 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 57
+// Generated by (magic number): 8000a
+// Id's are bound by 66
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
@@ -136,9 +186,9 @@
                               Name 44  "param"
                               Name 47  "input"
                               Name 49  "input"
-                              Name 51  "TriStream"
-                              Name 52  "param"
-                              Name 54  "param"
+                              Name 60  "TriStream"
+                              Name 61  "param"
+                              Name 63  "param"
                2:             TypeVoid
                3:             TypeFunction 2
    6(GSPS_INPUT):             TypeStruct
@@ -157,19 +207,30 @@
               40:     25(int) Constant 2
               48:             TypePointer Input 15
        49(input):     48(ptr) Variable Input
+              50:             TypePointer Input 6(GSPS_INPUT)
          4(main):           2 Function None 3
                5:             Label
        47(input):     16(ptr) Variable Function
-   51(TriStream):      7(ptr) Variable Function
-       52(param):     16(ptr) Variable Function
-       54(param):      7(ptr) Variable Function
-              50:          15 Load 49(input)
-                              Store 47(input) 50
-              53:          15 Load 47(input)
-                              Store 52(param) 53
-              55:           2 FunctionCall 20(@main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1;) 52(param) 54(param)
-              56:6(GSPS_INPUT) Load 54(param)
-                              Store 51(TriStream) 56
+   60(TriStream):      7(ptr) Variable Function
+       61(param):     16(ptr) Variable Function
+       63(param):      7(ptr) Variable Function
+              51:     50(ptr) AccessChain 49(input) 26
+              52:6(GSPS_INPUT) Load 51
+              53:      7(ptr) AccessChain 47(input) 26
+                              Store 53 52
+              54:     50(ptr) AccessChain 49(input) 33
+              55:6(GSPS_INPUT) Load 54
+              56:      7(ptr) AccessChain 47(input) 33
+                              Store 56 55
+              57:     50(ptr) AccessChain 49(input) 40
+              58:6(GSPS_INPUT) Load 57
+              59:      7(ptr) AccessChain 47(input) 40
+                              Store 59 58
+              62:          15 Load 47(input)
+                              Store 61(param) 62
+              64:           2 FunctionCall 20(@main(struct-GSPS_INPUT1[3];struct-GSPS_INPUT1;) 61(param) 63(param)
+              65:6(GSPS_INPUT) Load 63(param)
+                              Store 60(TriStream) 65
                               Return
                               FunctionEnd
 11(EmitVertex(struct-GSPS_INPUT1;struct-GSPS_INPUT1;):           2 Function None 8
diff --git a/Test/baseResults/hlsl.tx.bracket.frag.out b/Test/baseResults/hlsl.tx.bracket.frag.out
index 0e8fb5c..424b848 100644
--- a/Test/baseResults/hlsl.tx.bracket.frag.out
+++ b/Test/baseResults/hlsl.tx.bracket.frag.out
@@ -422,7 +422,7 @@
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 188
 
                               Capability Shader
@@ -493,25 +493,25 @@
                               MemberDecorate 45($Global) 7 Offset 80
                               Decorate 45($Global) Block
                               Decorate 47 DescriptorSet 0
-                              Decorate 47 Binding 0
+                              Decorate 47 Binding 9
                               Decorate 57(g_tTex1df4) DescriptorSet 0
                               Decorate 57(g_tTex1df4) Binding 0
                               Decorate 72(g_tTex1di4) DescriptorSet 0
-                              Decorate 72(g_tTex1di4) Binding 0
+                              Decorate 72(g_tTex1di4) Binding 1
                               Decorate 80(g_tTex1du4) DescriptorSet 0
-                              Decorate 80(g_tTex1du4) Binding 0
+                              Decorate 80(g_tTex1du4) Binding 2
                               Decorate 88(g_tTex2df4) DescriptorSet 0
-                              Decorate 88(g_tTex2df4) Binding 0
+                              Decorate 88(g_tTex2df4) Binding 3
                               Decorate 98(g_tTex2di4) DescriptorSet 0
-                              Decorate 98(g_tTex2di4) Binding 0
+                              Decorate 98(g_tTex2di4) Binding 4
                               Decorate 106(g_tTex2du4) DescriptorSet 0
-                              Decorate 106(g_tTex2du4) Binding 0
+                              Decorate 106(g_tTex2du4) Binding 5
                               Decorate 114(g_tTex3df4) DescriptorSet 0
-                              Decorate 114(g_tTex3df4) Binding 0
+                              Decorate 114(g_tTex3df4) Binding 6
                               Decorate 124(g_tTex3di4) DescriptorSet 0
-                              Decorate 124(g_tTex3di4) Binding 0
+                              Decorate 124(g_tTex3di4) Binding 7
                               Decorate 132(g_tTex3du4) DescriptorSet 0
-                              Decorate 132(g_tTex3du4) Binding 0
+                              Decorate 132(g_tTex3du4) Binding 8
                               Decorate 164(@entryPointOutput.Color) Location 0
                               Decorate 169(g_sSamp) DescriptorSet 0
                               Decorate 169(g_sSamp) Binding 0
diff --git a/Test/baseResults/hlsl.tx.overload.frag.out b/Test/baseResults/hlsl.tx.overload.frag.out
index 8556b9e..de8b38b 100644
--- a/Test/baseResults/hlsl.tx.overload.frag.out
+++ b/Test/baseResults/hlsl.tx.overload.frag.out
@@ -134,7 +134,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 73
 
                               Capability Shader
@@ -165,11 +165,11 @@
                               Decorate 45(tf1) DescriptorSet 0
                               Decorate 45(tf1) Binding 0
                               Decorate 49(tf4) DescriptorSet 0
-                              Decorate 49(tf4) Binding 0
+                              Decorate 49(tf4) Binding 1
                               Decorate 56(twf1) DescriptorSet 0
-                              Decorate 56(twf1) Binding 0
+                              Decorate 56(twf1) Binding 2
                               Decorate 63(twf4) DescriptorSet 0
-                              Decorate 63(twf4) Binding 0
+                              Decorate 63(twf4) Binding 3
                               Decorate 71(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/hlsl.type.half.frag.out b/Test/baseResults/hlsl.type.half.frag.out
index 719b139..ec7e46d 100644
--- a/Test/baseResults/hlsl.type.half.frag.out
+++ b/Test/baseResults/hlsl.type.half.frag.out
@@ -164,7 +164,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.type.identifier.frag.out b/Test/baseResults/hlsl.type.identifier.frag.out
index adec4a3..5705fb7 100644
--- a/Test/baseResults/hlsl.type.identifier.frag.out
+++ b/Test/baseResults/hlsl.type.identifier.frag.out
@@ -266,7 +266,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 105
 
                               Capability Shader
@@ -372,9 +372,9 @@
      89(half2x3):     88(ptr) Variable Function
                               Store 19(float) 20
               27:    6(float) Load 19(float)
-              29:    21(bool) FOrdNotEqual 27 28
+              29:    21(bool) FUnordNotEqual 27 28
               30:    6(float) Load 19(float)
-              31:    21(bool) FOrdNotEqual 30 28
+              31:    21(bool) FUnordNotEqual 30 28
               32:          24 CompositeConstruct 29 31
                               Store 26(bool) 32
               38:     37(ptr) AccessChain 26(bool) 36
diff --git a/Test/baseResults/hlsl.type.type.conversion.valid.frag.out b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
index 3e511ff..407caf3 100644
--- a/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
+++ b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
@@ -1364,7 +1364,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 122
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.typeGraphCopy.vert.out b/Test/baseResults/hlsl.typeGraphCopy.vert.out
index 1ca93bb..cedf601 100644
--- a/Test/baseResults/hlsl.typeGraphCopy.vert.out
+++ b/Test/baseResults/hlsl.typeGraphCopy.vert.out
@@ -62,7 +62,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.typedef.frag.out b/Test/baseResults/hlsl.typedef.frag.out
index d4ab66e..d925124 100644
--- a/Test/baseResults/hlsl.typedef.frag.out
+++ b/Test/baseResults/hlsl.typedef.frag.out
@@ -79,7 +79,7 @@
 0:?   Linker Objects
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.void.frag.out b/Test/baseResults/hlsl.void.frag.out
index 99de9d9..f93cca0 100644
--- a/Test/baseResults/hlsl.void.frag.out
+++ b/Test/baseResults/hlsl.void.frag.out
@@ -54,7 +54,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavebroadcast.comp.out b/Test/baseResults/hlsl.wavebroadcast.comp.out
index a9fc9b4..573195d 100644
--- a/Test/baseResults/hlsl.wavebroadcast.comp.out
+++ b/Test/baseResults/hlsl.wavebroadcast.comp.out
@@ -2298,7 +2298,7 @@
 0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 359
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.waveprefix.comp.out b/Test/baseResults/hlsl.waveprefix.comp.out
index 3fc8497..1d79f17 100644
--- a/Test/baseResults/hlsl.waveprefix.comp.out
+++ b/Test/baseResults/hlsl.waveprefix.comp.out
@@ -2322,7 +2322,7 @@
 0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 369
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavequad.comp.out b/Test/baseResults/hlsl.wavequad.comp.out
index e237e15..1647c7d 100644
--- a/Test/baseResults/hlsl.wavequad.comp.out
+++ b/Test/baseResults/hlsl.wavequad.comp.out
@@ -8026,7 +8026,7 @@
 0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1120
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavequery.comp.out b/Test/baseResults/hlsl.wavequery.comp.out
index 09cba4d..dcd11ae 100644
--- a/Test/baseResults/hlsl.wavequery.comp.out
+++ b/Test/baseResults/hlsl.wavequery.comp.out
@@ -60,7 +60,7 @@
 0:?     'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data})
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavequery.frag.out b/Test/baseResults/hlsl.wavequery.frag.out
index 8848a15..59f3050 100644
--- a/Test/baseResults/hlsl.wavequery.frag.out
+++ b/Test/baseResults/hlsl.wavequery.frag.out
@@ -72,7 +72,7 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavereduction.comp.out b/Test/baseResults/hlsl.wavereduction.comp.out
index c31f7f5..a898612 100644
--- a/Test/baseResults/hlsl.wavereduction.comp.out
+++ b/Test/baseResults/hlsl.wavereduction.comp.out
@@ -6186,7 +6186,7 @@
 0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 901
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.wavevote.comp.out b/Test/baseResults/hlsl.wavevote.comp.out
index b5c095d..83140a2 100644
--- a/Test/baseResults/hlsl.wavevote.comp.out
+++ b/Test/baseResults/hlsl.wavevote.comp.out
@@ -204,7 +204,7 @@
 0:?     'dti' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 75
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.whileLoop.frag.out b/Test/baseResults/hlsl.whileLoop.frag.out
index a63d006..23825e8 100644
--- a/Test/baseResults/hlsl.whileLoop.frag.out
+++ b/Test/baseResults/hlsl.whileLoop.frag.out
@@ -96,7 +96,7 @@
 0:?     'input' (layout( location=0) in 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 52
 
                               Capability Shader
@@ -149,7 +149,7 @@
               17:             Label
               18:    7(fvec4) Load 10(input)
               19:    7(fvec4) Load 10(input)
-              22:   21(bvec4) FOrdNotEqual 18 19
+              22:   21(bvec4) FUnordNotEqual 18 19
               23:    20(bool) Any 22
                               BranchConditional 23 14 15
               14:               Label
diff --git a/Test/baseResults/hlsl.y-negate-1.vert.out b/Test/baseResults/hlsl.y-negate-1.vert.out
index 08413d2..aefde04 100644
--- a/Test/baseResults/hlsl.y-negate-1.vert.out
+++ b/Test/baseResults/hlsl.y-negate-1.vert.out
@@ -72,7 +72,7 @@
 0:?     '@entryPointOutput' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.y-negate-2.vert.out b/Test/baseResults/hlsl.y-negate-2.vert.out
index 9e90d3b..4a9ef61 100644
--- a/Test/baseResults/hlsl.y-negate-2.vert.out
+++ b/Test/baseResults/hlsl.y-negate-2.vert.out
@@ -80,7 +80,7 @@
 0:?     'position' ( out 4-component vector of float Position)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 37
 
                               Capability Shader
diff --git a/Test/baseResults/hlsl.y-negate-3.vert.out b/Test/baseResults/hlsl.y-negate-3.vert.out
index 29f63f1..3544910 100644
--- a/Test/baseResults/hlsl.y-negate-3.vert.out
+++ b/Test/baseResults/hlsl.y-negate-3.vert.out
@@ -126,7 +126,7 @@
 0:?     '@entryPointOutput.somethingelse' (layout( location=0) out int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out b/Test/baseResults/link.multiAnonBlocksInvalid.0.0.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.multiAnonBlocksValid.0.0.vert.out b/Test/baseResults/link.multiAnonBlocksValid.0.0.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out b/Test/baseResults/link.multiBlocksInvalid.0.0.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.multiBlocksValid.1.0.vert.out b/Test/baseResults/link.multiBlocksValid.1.0.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.vk.differentPC.0.0.frag.out b/Test/baseResults/link.vk.differentPC.0.0.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.vk.differentPC.1.0.frag.out b/Test/baseResults/link.vk.differentPC.1.0.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.vk.matchingPC.0.0.frag.out b/Test/baseResults/link.vk.matchingPC.0.0.frag.out
old mode 100755
new mode 100644
index 1d6875a..c434b66
--- a/Test/baseResults/link.vk.matchingPC.0.0.frag.out
+++ b/Test/baseResults/link.vk.matchingPC.0.0.frag.out
@@ -90,7 +90,7 @@
 0:?     'uPC' (layout( column_major std430 push_constant) uniform block{layout( column_major std430 offset=0) uniform highp 4-component vector of float color, layout( column_major std430 offset=16) uniform highp 4-component vector of float color2, layout( column_major std430 offset=32) uniform highp float scale})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out b/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
old mode 100755
new mode 100644
index 6440a3b..bdabab1
--- a/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
@@ -173,7 +173,7 @@
 0:?     'P' ( in highp 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 73
 
                               Capability Shader
@@ -211,6 +211,7 @@
                               Name 70  "BufferBlock"
                               MemberName 70(BufferBlock) 0  "p"
                               Name 72  "uBuf"
+                              Decorate 14(oColor) Location 2
                               MemberDecorate 16(ColorBlock) 0 Offset 0
                               MemberDecorate 16(ColorBlock) 1 Offset 16
                               MemberDecorate 16(ColorBlock) 2 Offset 32
@@ -223,6 +224,7 @@
                               Decorate 28(uColorBuf) DescriptorSet 0
                               Decorate 28(uColorBuf) Binding 0
                               Decorate 32(Vertex) Block
+                              Decorate 34(oV) Location 0
                               MemberDecorate 40(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 40(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 40(gl_PerVertex) 2 BuiltIn ClipDistance
@@ -236,6 +238,7 @@
                               Decorate 44(MatrixBlock) Block
                               Decorate 46(uM) DescriptorSet 0
                               Decorate 46(uM) Binding 0
+                              Decorate 65(P) Location 0
                               MemberDecorate 70(BufferBlock) 0 ColMajor
                               MemberDecorate 70(BufferBlock) 0 Offset 0
                               MemberDecorate 70(BufferBlock) 0 MatrixStride 16
diff --git a/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out b/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
old mode 100755
new mode 100644
index 413da7e..c0b33b7
--- a/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
@@ -258,7 +258,7 @@
 0:?     'P' ( in 3-element array of highp 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 101
 
                               Capability Geometry
@@ -304,6 +304,7 @@
                               MemberName 95(BufferBlock) 0  "p"
                               Name 97  "uBuf"
                               Name 100  "P"
+                              Decorate 18(oColor) Location 1
                               MemberDecorate 20(ColorBlock) 0 Offset 0
                               MemberDecorate 20(ColorBlock) 1 Offset 16
                               MemberDecorate 20(ColorBlock) 2 Offset 32
@@ -325,13 +326,16 @@
                               Decorate 50(uM) DescriptorSet 0
                               Decorate 50(uM) Binding 0
                               Decorate 59(Vertex) Block
+                              Decorate 61(oV) Location 0
                               Decorate 64(Vertex) Block
+                              Decorate 68(iV) Location 1
                               MemberDecorate 95(BufferBlock) 0 ColMajor
                               MemberDecorate 95(BufferBlock) 0 Offset 0
                               MemberDecorate 95(BufferBlock) 0 MatrixStride 16
                               Decorate 95(BufferBlock) BufferBlock
                               Decorate 97(uBuf) DescriptorSet 0
                               Decorate 97(uBuf) Binding 1
+                              Decorate 100(P) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/link.vk.pcNamingInvalid.0.0.vert.out b/Test/baseResults/link.vk.pcNamingInvalid.0.0.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out b/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
old mode 100755
new mode 100644
index c9dba15..e1d5c88
--- a/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
+++ b/Test/baseResults/link.vk.pcNamingValid.0.0.vert.out
@@ -108,7 +108,7 @@
 0:?     'P' (layout( location=0) in highp 4-component vector of float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseResults/link1.vk.frag.out b/Test/baseResults/link1.vk.frag.out
index 94debe1..fa1d48e 100644
--- a/Test/baseResults/link1.vk.frag.out
+++ b/Test/baseResults/link1.vk.frag.out
@@ -197,7 +197,7 @@
 0:?     's2D' (layout( binding=1) uniform highp sampler2D)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
diff --git a/Test/baseResults/numeral.frag.out b/Test/baseResults/numeral.frag.out
index b7c0a78..e2a7c64 100644
--- a/Test/baseResults/numeral.frag.out
+++ b/Test/baseResults/numeral.frag.out
@@ -12,7 +12,7 @@
 ERROR: 0:98: '' : numeric literal too big 
 ERROR: 0:101: '' : numeric literal too big 
 ERROR: 0:104: '#' : preprocessor directive cannot be preceded by another token 
-ERROR: 0:104: '' :  syntax error, unexpected $end, expecting COMMA or SEMICOLON
+ERROR: 0:104: '' :  syntax error, unexpected end of file, expecting COMMA or SEMICOLON
 ERROR: 14 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/rayQuery-allOps.comp.out b/Test/baseResults/rayQuery-allOps.comp.out
index 2ac7cd3..bf654f7 100644
--- a/Test/baseResults/rayQuery-allOps.comp.out
+++ b/Test/baseResults/rayQuery-allOps.comp.out
@@ -1,11 +1,11 @@
 rayQuery-allOps.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 258
 
                               Capability Shader
-                              Capability RayQueryProvisionalKHR
-                              Capability RayTraversalPrimitiveCullingProvisionalKHR
+                              Capability RayQueryKHR
+                              Capability RayTraversalPrimitiveCullingKHR
                               Extension  "SPV_KHR_ray_query"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -86,8 +86,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -114,7 +115,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
@@ -223,7 +223,7 @@
              129:           2       FunctionCall 6(doSomething()
                                     Branch 128
              128:                 Label
-             130:     18(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
+             130:     14(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
              131:    66(bool)     UGreaterThan 130 20
                                   SelectionMerge 133 None
                                   BranchConditional 131 132 133
diff --git a/Test/baseResults/rayQuery-allOps.frag.out b/Test/baseResults/rayQuery-allOps.frag.out
index 3160c2b..90ebc4a 100644
--- a/Test/baseResults/rayQuery-allOps.frag.out
+++ b/Test/baseResults/rayQuery-allOps.frag.out
@@ -1,10 +1,10 @@
 rayQuery-allOps.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 257
 
                               Capability Shader
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Extension  "SPV_KHR_ray_query"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -85,8 +85,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -112,7 +113,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
@@ -221,7 +221,7 @@
              129:           2       FunctionCall 6(doSomething()
                                     Branch 128
              128:                 Label
-             130:     18(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
+             130:     14(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
              131:    66(bool)     UGreaterThan 130 20
                                   SelectionMerge 133 None
                                   BranchConditional 131 132 133
diff --git a/Test/baseResults/rayQuery-allOps.rgen.out b/Test/baseResults/rayQuery-allOps.rgen.out
index a61769e..b3a93b0 100644
--- a/Test/baseResults/rayQuery-allOps.rgen.out
+++ b/Test/baseResults/rayQuery-allOps.rgen.out
@@ -1,9 +1,9 @@
 rayQuery-allOps.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 257
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -85,8 +85,9 @@
               35:             TypePointer Function 8(float)
               37:     18(int) Constant 3
               38:    8(float) Constant 1176255488
-              45:             TypeRayQueryProvisionalKHR
-              46:             TypePointer Function 45
+              45:             TypeRayQueryKHR
+              46:             TypePointer Private 45
+    47(rayQuery):     46(ptr) Variable Private
               48:             TypeAccelerationStructureKHR
               49:             TypePointer UniformConstant 48
         50(rtas):     49(ptr) Variable UniformConstant
@@ -112,7 +113,6 @@
          4(main):           2 Function None 3
                5:             Label
          43(ray):     25(ptr) Variable Function
-    47(rayQuery):     46(ptr) Variable Function
 69(candidateType):     68(ptr) Variable Function
      78(_mat4x3):     77(ptr) Variable Function
      83(_mat3x4):     82(ptr) Variable Function
@@ -221,7 +221,7 @@
              129:           2       FunctionCall 6(doSomething()
                                     Branch 128
              128:                 Label
-             130:     18(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
+             130:     14(int)     RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
              131:    66(bool)     UGreaterThan 130 20
                                   SelectionMerge 133 None
                                   BranchConditional 131 132 133
diff --git a/Test/baseResults/rayQuery-global.rgen.out b/Test/baseResults/rayQuery-global.rgen.out
new file mode 100644
index 0000000..7b05173
--- /dev/null
+++ b/Test/baseResults/rayQuery-global.rgen.out
@@ -0,0 +1,76 @@
+rayQuery-global.rgen
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 44
+
+                              Capability RayQueryKHR
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_query"
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main"
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_flags_primitive_culling"
+                              SourceExtension  "GL_EXT_ray_query"
+                              Name 4  "main"
+                              Name 10  "otherWrapper(rq1;"
+                              Name 9  "rq"
+                              Name 13  "wrapper(rq1;"
+                              Name 12  "rq"
+                              Name 17  "rqGlobal"
+                              Name 22  "rq2"
+                              Name 27  "rtas"
+                              Name 40  "rq2"
+                              Decorate 27(rtas) DescriptorSet 0
+                              Decorate 27(rtas) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeRayQueryKHR
+               7:             TypePointer Private 6
+               8:             TypeFunction 2 7(ptr)
+              15:             TypeBool
+    17(rqGlobal):      7(ptr) Variable Private
+         22(rq2):      7(ptr) Variable Private
+              25:             TypeAccelerationStructureKHR
+              26:             TypePointer UniformConstant 25
+        27(rtas):     26(ptr) Variable UniformConstant
+              29:             TypeInt 32 0
+              30:     29(int) Constant 0
+              31:     29(int) Constant 255
+              32:             TypeFloat 32
+              33:             TypeVector 32(float) 3
+              34:   32(float) Constant 0
+              35:   33(fvec3) ConstantComposite 34 34 34
+              36:   32(float) Constant 1065353216
+              37:   33(fvec3) ConstantComposite 36 34 34
+         40(rq2):      7(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+              28:          25 Load 27(rtas)
+                              RayQueryInitializeKHR 17(rqGlobal) 28 30 31 35 34 37 36
+              38:           2 FunctionCall 13(wrapper(rq1;) 17(rqGlobal)
+              39:           2 FunctionCall 10(otherWrapper(rq1;) 17(rqGlobal)
+              41:          25 Load 27(rtas)
+                              RayQueryInitializeKHR 40(rq2) 41 30 31 35 34 37 36
+              42:           2 FunctionCall 13(wrapper(rq1;) 40(rq2)
+              43:           2 FunctionCall 10(otherWrapper(rq1;) 40(rq2)
+                              Return
+                              FunctionEnd
+10(otherWrapper(rq1;):           2 Function None 8
+           9(rq):      7(ptr) FunctionParameter
+              11:             Label
+              16:    15(bool) RayQueryProceedKHR 9(rq)
+              18:    15(bool) RayQueryProceedKHR 17(rqGlobal)
+                              Return
+                              FunctionEnd
+13(wrapper(rq1;):           2 Function None 8
+          12(rq):      7(ptr) FunctionParameter
+              14:             Label
+              19:    15(bool) RayQueryProceedKHR 12(rq)
+              20:    15(bool) RayQueryProceedKHR 17(rqGlobal)
+              21:           2 FunctionCall 10(otherWrapper(rq1;) 12(rq)
+              23:           2 FunctionCall 10(otherWrapper(rq1;) 22(rq2)
+              24:           2 FunctionCall 10(otherWrapper(rq1;) 17(rqGlobal)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/rayQuery-initialization.Error.comp.out b/Test/baseResults/rayQuery-initialization.Error.comp.out
new file mode 100644
index 0000000..6ce7fac
--- /dev/null
+++ b/Test/baseResults/rayQuery-initialization.Error.comp.out
@@ -0,0 +1,6 @@
+rayQuery-initialization.Error.comp
+ERROR: 0:7: '=' : ray queries can only be initialized by using the rayQueryInitializeEXT intrinsic: bar
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/rayQuery-initialize.rgen.out b/Test/baseResults/rayQuery-initialize.rgen.out
index 7824930..f16facd 100644
--- a/Test/baseResults/rayQuery-initialize.rgen.out
+++ b/Test/baseResults/rayQuery-initialize.rgen.out
@@ -1,9 +1,9 @@
 rayQuery-initialize.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 103
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -55,8 +55,8 @@
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeFunction 6(int)
-              10:             TypeRayQueryProvisionalKHR
-              11:             TypePointer Function 10
+              10:             TypeRayQueryKHR
+              11:             TypePointer Private 10
               12:             TypeFloat 32
               13:             TypeVector 12(float) 3
          14(Ray):             TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
@@ -88,12 +88,12 @@
               75:             TypePointer Uniform 74(Rays)
               76:     75(ptr) Variable Uniform
               78:             TypePointer Uniform 72(Ray)
+    89(rayQuery):     11(ptr) Variable Private
               94:      6(int) Constant 32
          4(main):           2 Function None 3
                5:             Label
        69(index):     68(ptr) Variable Function
          71(ray):     15(ptr) Variable Function
-    89(rayQuery):     11(ptr) Variable Function
        90(param):     15(ptr) Variable Function
               70:      6(int) FunctionCall 8(launchIndex()
                               Store 69(index) 70
diff --git a/Test/baseResults/rayQuery-no-cse.rgen.out b/Test/baseResults/rayQuery-no-cse.rgen.out
index c09e348..a44c41f 100644
--- a/Test/baseResults/rayQuery-no-cse.rgen.out
+++ b/Test/baseResults/rayQuery-no-cse.rgen.out
@@ -1,9 +1,9 @@
 rayQuery-no-cse.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 107
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -57,8 +57,8 @@
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeFunction 6(int)
-              10:             TypeRayQueryProvisionalKHR
-              11:             TypePointer Function 10
+              10:             TypeRayQueryKHR
+              11:             TypePointer Private 10
               12:             TypeFloat 32
               13:             TypeVector 12(float) 3
          14(Ray):             TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
@@ -90,14 +90,14 @@
               75:             TypePointer Uniform 74(Rays)
               76:     75(ptr) Variable Uniform
               78:             TypePointer Uniform 72(Ray)
+   89(rayQuery1):     11(ptr) Variable Private
               94:      6(int) Constant 32
+  103(rayQuery2):     11(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
        69(index):     68(ptr) Variable Function
          71(ray):     15(ptr) Variable Function
-   89(rayQuery1):     11(ptr) Variable Function
        90(param):     15(ptr) Variable Function
-  103(rayQuery2):     11(ptr) Variable Function
       104(param):     15(ptr) Variable Function
               70:      6(int) FunctionCall 8(launchIndex()
                               Store 69(index) 70
diff --git a/Test/baseResults/rayQuery-types.comp.out b/Test/baseResults/rayQuery-types.comp.out
new file mode 100644
index 0000000..87a1d68
--- /dev/null
+++ b/Test/baseResults/rayQuery-types.comp.out
@@ -0,0 +1,152 @@
+rayQuery-types.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 86
+
+                              Capability Shader
+                              Capability RayQueryKHR
+                              Extension  "SPV_KHR_ray_query"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 16 8 1
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_query"
+                              Name 4  "main"
+                              Name 8  "rayQuery"
+                              Name 11  "tlas"
+                              Name 25  "rq_proceed"
+                              Name 35  "intersectionType"
+                              Name 41  "rayTMin"
+                              Name 43  "rayFlags"
+                              Name 46  "worldRayOrigin"
+                              Name 48  "worldDirection"
+                              Name 50  "intersectionT"
+                              Name 53  "customIndex"
+                              Name 55  "instanceId"
+                              Name 57  "sbtOffset"
+                              Name 59  "geometryIndex"
+                              Name 61  "primitiveIndex"
+                              Name 65  "barys"
+                              Name 67  "frontface"
+                              Name 69  "aabbOpaque"
+                              Name 71  "objRayDirection"
+                              Name 73  "objRayOrigin"
+                              Name 77  "objToWorld"
+                              Name 79  "worldToObj"
+                              Decorate 11(tlas) DescriptorSet 0
+                              Decorate 11(tlas) Binding 0
+                              Decorate 85 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeRayQueryKHR
+               7:             TypePointer Private 6
+     8(rayQuery):      7(ptr) Variable Private
+               9:             TypeAccelerationStructureKHR
+              10:             TypePointer UniformConstant 9
+        11(tlas):     10(ptr) Variable UniformConstant
+              13:             TypeInt 32 0
+              14:     13(int) Constant 0
+              15:     13(int) Constant 255
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 3
+              18:   16(float) Constant 0
+              19:   17(fvec3) ConstantComposite 18 18 18
+              20:   16(float) Constant 1065353216
+              21:   17(fvec3) ConstantComposite 20 18 18
+              22:   16(float) Constant 1176256512
+              23:             TypeBool
+              24:             TypePointer Function 23(bool)
+              34:             TypePointer Function 13(int)
+              36:    23(bool) ConstantTrue
+              37:             TypeInt 32 1
+              38:     37(int) Constant 1
+              40:             TypePointer Function 16(float)
+              45:             TypePointer Function 17(fvec3)
+              52:             TypePointer Function 37(int)
+              63:             TypeVector 16(float) 2
+              64:             TypePointer Function 63(fvec2)
+              75:             TypeMatrix 17(fvec3) 4
+              76:             TypePointer Function 75
+              81:             TypeVector 13(int) 3
+              82:     13(int) Constant 16
+              83:     13(int) Constant 8
+              84:     13(int) Constant 1
+              85:   81(ivec3) ConstantComposite 82 83 84
+         4(main):           2 Function None 3
+               5:             Label
+  25(rq_proceed):     24(ptr) Variable Function
+35(intersectionType):     34(ptr) Variable Function
+     41(rayTMin):     40(ptr) Variable Function
+    43(rayFlags):     34(ptr) Variable Function
+46(worldRayOrigin):     45(ptr) Variable Function
+48(worldDirection):     45(ptr) Variable Function
+50(intersectionT):     40(ptr) Variable Function
+ 53(customIndex):     52(ptr) Variable Function
+  55(instanceId):     52(ptr) Variable Function
+   57(sbtOffset):     34(ptr) Variable Function
+59(geometryIndex):     52(ptr) Variable Function
+61(primitiveIndex):     52(ptr) Variable Function
+       65(barys):     64(ptr) Variable Function
+   67(frontface):     24(ptr) Variable Function
+  69(aabbOpaque):     24(ptr) Variable Function
+71(objRayDirection):     45(ptr) Variable Function
+73(objRayOrigin):     45(ptr) Variable Function
+  77(objToWorld):     76(ptr) Variable Function
+  79(worldToObj):     76(ptr) Variable Function
+              12:           9 Load 11(tlas)
+                              RayQueryInitializeKHR 8(rayQuery) 12 14 15 19 18 21 22
+              26:    23(bool) RayQueryProceedKHR 8(rayQuery)
+                              Store 25(rq_proceed) 26
+                              Branch 27
+              27:             Label
+                              LoopMerge 29 30 None
+                              Branch 31
+              31:             Label
+              32:    23(bool) Load 25(rq_proceed)
+                              BranchConditional 32 28 29
+              28:               Label
+              33:    23(bool)   RayQueryProceedKHR 8(rayQuery)
+                                Store 25(rq_proceed) 33
+                                Branch 30
+              30:               Label
+                                Branch 27
+              29:             Label
+              39:     13(int) RayQueryGetIntersectionTypeKHR 8(rayQuery) 38
+                              Store 35(intersectionType) 39
+              42:   16(float) RayQueryGetRayTMinKHR 8(rayQuery)
+                              Store 41(rayTMin) 42
+              44:     13(int) RayQueryGetRayFlagsKHR 8(rayQuery)
+                              Store 43(rayFlags) 44
+              47:   17(fvec3) RayQueryGetWorldRayOriginKHR 8(rayQuery)
+                              Store 46(worldRayOrigin) 47
+              49:   17(fvec3) RayQueryGetWorldRayDirectionKHR 8(rayQuery)
+                              Store 48(worldDirection) 49
+              51:   16(float) RayQueryGetIntersectionTKHR 8(rayQuery) 38
+                              Store 50(intersectionT) 51
+              54:     37(int) RayQueryGetIntersectionInstanceCustomIndexKHR 8(rayQuery) 38
+                              Store 53(customIndex) 54
+              56:     37(int) RayQueryGetIntersectionInstanceIdKHR 8(rayQuery) 38
+                              Store 55(instanceId) 56
+              58:     13(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 8(rayQuery) 38
+                              Store 57(sbtOffset) 58
+              60:     37(int) RayQueryGetIntersectionGeometryIndexKHR 8(rayQuery) 38
+                              Store 59(geometryIndex) 60
+              62:     37(int) RayQueryGetIntersectionPrimitiveIndexKHR 8(rayQuery) 38
+                              Store 61(primitiveIndex) 62
+              66:   63(fvec2) RayQueryGetIntersectionBarycentricsKHR 8(rayQuery) 38
+                              Store 65(barys) 66
+              68:    23(bool) RayQueryGetIntersectionFrontFaceKHR 8(rayQuery) 38
+                              Store 67(frontface) 68
+              70:    23(bool) RayQueryGetIntersectionCandidateAABBOpaqueKHR 8(rayQuery)
+                              Store 69(aabbOpaque) 70
+              72:   17(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 8(rayQuery) 38
+                              Store 71(objRayDirection) 72
+              74:   17(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 8(rayQuery) 38
+                              Store 73(objRayOrigin) 74
+              78:          75 RayQueryGetIntersectionObjectToWorldKHR 8(rayQuery) 38
+                              Store 77(objToWorld) 78
+              80:          75 RayQueryGetIntersectionWorldToObjectKHR 8(rayQuery) 38
+                              Store 79(worldToObj) 80
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/rayQuery.rgen.out b/Test/baseResults/rayQuery.rgen.out
index 4658338..80e9916 100644
--- a/Test/baseResults/rayQuery.rgen.out
+++ b/Test/baseResults/rayQuery.rgen.out
@@ -1,9 +1,9 @@
 rayQuery.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
-                              Capability RayQueryProvisionalKHR
+                              Capability RayQueryKHR
                               Capability RayTracingNV
                               Extension  "SPV_KHR_ray_query"
                               Extension  "SPV_NV_ray_tracing"
@@ -28,6 +28,8 @@
                               MemberDecorate 26(block) 0 Offset 0
                               MemberDecorate 26(block) 1 Offset 16
                               Decorate 26(block) BufferBlock
+                              Decorate 28 DescriptorSet 0
+                              Decorate 28 Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -37,8 +39,9 @@
               11:             TypePointer Function 10(float)
               13:   10(float) Constant 0
               15:   10(float) Constant 1148846080
-              16:             TypeRayQueryProvisionalKHR
-              17:             TypePointer Function 16
+              16:             TypeRayQueryKHR
+              17:             TypePointer Private 16
+18(localRayQuery):     17(ptr) Variable Private
               19:             TypeAccelerationStructureKHR
               20:             TypePointer UniformConstant 19
         21(acc0):     20(ptr) Variable UniformConstant
@@ -57,7 +60,6 @@
      8(rayFlags):      7(ptr) Variable Function
         12(tMin):     11(ptr) Variable Function
         14(tMax):     11(ptr) Variable Function
-18(localRayQuery):     17(ptr) Variable Function
                               Store 8(rayFlags) 9
                               Store 12(tMin) 13
                               Store 14(tMax) 15
diff --git a/Test/baseResults/reflection.linked.options.out b/Test/baseResults/reflection.linked.options.out
index af07bbd..a0e45ed 100644
--- a/Test/baseResults/reflection.linked.options.out
+++ b/Test/baseResults/reflection.linked.options.out
@@ -7,7 +7,7 @@
 ubo_block.fsonly_uniform: offset 12, type 1406, size 1, index 0, binding -1, stages 16
 
 Uniform block reflection:
-ubo_block: offset -1, type ffffffff, size 16, index -1, binding 0, stages 17, numMembers 4
+ubo_block: offset -1, type ffffffff, size 16, index 0, binding 0, stages 17, numMembers 4
 
 Buffer variable reflection:
 
@@ -15,6 +15,8 @@
 
 Pipeline input reflection:
 vertin: offset 0, type 1406, size 1, index 0, binding -1, stages 1
+gl_VertexID: offset 0, type 1404, size 1, index 0, binding -1, stages 1
+gl_InstanceID: offset 0, type 1404, size 1, index 0, binding -1, stages 1
 
 Pipeline output reflection:
 fragout: offset 0, type 1406, size 1, index 0, binding -1, stages 16
diff --git a/Test/baseResults/reflection.linked.out b/Test/baseResults/reflection.linked.out
index b1b2b3c..3874218 100644
--- a/Test/baseResults/reflection.linked.out
+++ b/Test/baseResults/reflection.linked.out
@@ -6,7 +6,7 @@
 ubo_block.fsonly_uniform: offset 12, type 1406, size 1, index 0, binding -1, stages 16
 
 Uniform block reflection:
-ubo_block: offset -1, type ffffffff, size 16, index -1, binding 0, stages 17, numMembers 4
+ubo_block: offset -1, type ffffffff, size 16, index 0, binding 0, stages 17, numMembers 4
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/reflection.options.vert.out b/Test/baseResults/reflection.options.vert.out
index 3f4a271..d68bf37 100644
--- a/Test/baseResults/reflection.options.vert.out
+++ b/Test/baseResults/reflection.options.vert.out
@@ -32,7 +32,7 @@
 uniform_multi[3][2][0]: offset -1, type 1406, size 2, index -1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 24
 
 Uniform block reflection:
-UBO: offset -1, type ffffffff, size 192, index -1, binding -1, stages 1, numMembers 7
+UBO: offset -1, type ffffffff, size 192, index 0, binding -1, stages 1, numMembers 7
 
 Buffer variable reflection:
 t[0].v[0].position[0]: offset 0, type 1406, size 3, index 0, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
@@ -51,18 +51,19 @@
 MultipleArrays.vert[0].position[0]: offset 360, type 1406, size 3, index 1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 24
 MultipleArrays.vert[0].normal[0]: offset 372, type 1406, size 3, index 1, binding -1, stages 0, arrayStride 4, topLevelArrayStride 24
 MultipleArrays.f[0]: offset 480, type 1406, size 5, index 1, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
-ArrayedBind[0].a: offset 0, type 1406, size 1, index 4, binding -1, stages 0
-ArrayedBind[0].b: offset 4, type 1406, size 1, index 4, binding -1, stages 1
+ArrayedBind.a: offset 0, type 1406, size 1, index 2, binding -1, stages 0
+ArrayedBind.b: offset 4, type 1406, size 1, index 2, binding -1, stages 1
 
 Buffer block reflection:
-VertexCollection: offset -1, type ffffffff, size 400, index -1, binding -1, stages 1, numMembers 7
-MultipleArrays: offset -1, type ffffffff, size 500, index -1, binding -1, stages 1, numMembers 9
-ArrayedBind[0]: offset -1, type ffffffff, size 8, index -1, binding -1, stages 1, numMembers 2
-ArrayedBind[1]: offset -1, type ffffffff, size 8, index -1, binding -1, stages 1, numMembers 2
-ArrayedBind[2]: offset -1, type ffffffff, size 8, index -1, binding -1, stages 1, numMembers 2
+VertexCollection: offset -1, type ffffffff, size 400, index 0, binding -1, stages 1, numMembers 7
+MultipleArrays: offset -1, type ffffffff, size 500, index 1, binding -1, stages 1, numMembers 9
+ArrayedBind[0]: offset -1, type ffffffff, size 8, index 2, binding -1, stages 1, numMembers 2
+ArrayedBind[1]: offset -1, type ffffffff, size 8, index 3, binding -1, stages 1, numMembers 2
+ArrayedBind[2]: offset -1, type ffffffff, size 8, index 4, binding -1, stages 1, numMembers 2
 
 Pipeline input reflection:
 gl_InstanceID: offset 0, type 1404, size 1, index 0, binding -1, stages 1
+gl_VertexID: offset 0, type 1404, size 1, index 0, binding -1, stages 1
 
 Pipeline output reflection:
 outval.val: offset 0, type 1406, size 1, index 0, binding -1, stages 1
diff --git a/Test/baseResults/reflection.vert.out b/Test/baseResults/reflection.vert.out
index 330733c..84f690f 100644
--- a/Test/baseResults/reflection.vert.out
+++ b/Test/baseResults/reflection.vert.out
@@ -1,26 +1,33 @@
 reflection.vert
 Uniform reflection:
+named.deadMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
+anonDeadMember2: offset 64, type 8b52, size 1, index 1, binding -1, stages 1
+ufDead4: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+anonMember1: offset 0, type 8b51, size 1, index 1, binding -1, stages 1
+uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+named.member3: offset 32, type 8b52, size 1, index 0, binding -1, stages 1
 image_ui2D: offset -1, type 9063, size 1, index -1, binding -1, stages 1
 sampler_2D: offset -1, type 8b5e, size 1, index -1, binding -1, stages 1
 sampler_2DMSArray: offset -1, type 910b, size 1, index -1, binding -1, stages 1
-anonMember3: offset 80, type 8b52, size 1, index 0, binding -1, stages 1
+anonMember3: offset 80, type 8b52, size 1, index 1, binding -1, stages 1
 s.a: offset -1, type 1404, size 1, index -1, binding -1, stages 1
-named.scalar: offset 12, type 1404, size 1, index 1, binding -1, stages 1
-m23: offset 16, type 8b67, size 1, index 0, binding -1, stages 1
-scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1, stages 1
+named.scalar: offset 12, type 1404, size 1, index 0, binding -1, stages 1
+m23: offset 16, type 8b67, size 1, index 1, binding -1, stages 1
+scalarAfterm23: offset 48, type 1404, size 1, index 1, binding -1, stages 1
 c_m23: offset 16, type 8b67, size 1, index 2, binding -1, stages 1
 c_scalarAfterm23: offset 64, type 1404, size 1, index 2, binding -1, stages 1
-scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1, stages 1
-floatArray: offset 112, type 1406, size 5, index 0, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
-scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1, stages 1
-named.memvec2: offset 48, type 8b50, size 1, index 1, binding -1, stages 1
-named.memf1: offset 56, type 1406, size 1, index 1, binding -1, stages 1
-named.memf2: offset 60, type 8b56, size 1, index 1, binding -1, stages 1
-named.memf3: offset 64, type 1404, size 1, index 1, binding -1, stages 1
-named.memvec2a: offset 72, type 8b50, size 1, index 1, binding -1, stages 1
-named.m22: offset 80, type 8b5a, size 7, index 1, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
+scalarBeforeArray: offset 96, type 1404, size 1, index 1, binding -1, stages 1
+floatArray: offset 112, type 1406, size 5, index 1, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
+scalarAfterArray: offset 192, type 1404, size 1, index 1, binding -1, stages 1
+named.memvec2: offset 48, type 8b50, size 1, index 0, binding -1, stages 1
+named.memf1: offset 56, type 1406, size 1, index 0, binding -1, stages 1
+named.memf2: offset 60, type 8b56, size 1, index 0, binding -1, stages 1
+named.memf3: offset 64, type 1404, size 1, index 0, binding -1, stages 1
+named.memvec2a: offset 72, type 8b50, size 1, index 0, binding -1, stages 1
+named.m22: offset 80, type 8b5a, size 7, index 0, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
 dm22: offset -1, type 8b5a, size 4, index -1, binding -1, stages 1, arrayStride 16, topLevelArrayStride 16
-m22: offset 208, type 8b5a, size 3, index 0, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
+m22: offset 208, type 8b5a, size 3, index 1, binding -1, stages 1, arrayStride 32, topLevelArrayStride 32
 nested.foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1, stages 1
 nested.foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1, stages 1
 nested.foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1, stages 1
@@ -82,8 +89,9 @@
 deepA[1].d2.d1[2].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
 deepA[1].d2.d1[3].va: offset -1, type 8b50, size 3, index -1, binding -1, stages 1, arrayStride 8, topLevelArrayStride 176
 deepA[1].d2.d1[3].b: offset -1, type 8b56, size 1, index -1, binding -1, stages 1, topLevelArrayStride 176
-abl.foo: offset 0, type 1406, size 1, index 7, binding -1, stages 1
-abl2.foo: offset 0, type 1406, size 1, index 11, binding -1, stages 1
+ufDead3: offset -1, type 1406, size 1, index -1, binding -1, stages 1
+abl.foo: offset 0, type 1406, size 1, index 4, binding -1, stages 1
+abl2.foo: offset 0, type 1406, size 1, index 8, binding -1, stages 1
 buf1.runtimeArray: offset 4, type 1406, size 4, index 12, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
 buf2.runtimeArray.c: offset 8, type 1406, size 1, index 13, binding -1, stages 1, topLevelArrayStride 12
 buf3.runtimeArray: offset 4, type 1406, size 0, index 14, binding -1, stages 1, arrayStride 4, topLevelArrayStride 4
@@ -135,30 +143,26 @@
 t[4].v[1].normal: offset 324, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
 t[4].v[2].position: offset 336, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
 t[4].v[2].normal: offset 348, type 1406, size 3, index 17, binding -1, stages 1, arrayStride 4, topLevelArrayStride 72
-anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
-uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
-uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
-named.member3: offset 32, type 8b52, size 1, index 1, binding -1, stages 1
 
 Uniform block reflection:
-nameless: offset -1, type ffffffff, size 496, index -1, binding -1, stages 1, numMembers 9
-named: offset -1, type ffffffff, size 304, index -1, binding -1, stages 1, numMembers 10
-c_nameless: offset -1, type ffffffff, size 112, index -1, binding -1, stages 1, numMembers 5
-nested: offset -1, type ffffffff, size 32, index -1, binding -1, stages 1, numMembers 4
-abl[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl2[0]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl2[1]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl2[2]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-abl2[3]: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 1
-buf1: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 2
-buf2: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 4
-buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 2
-buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 1, numMembers 4
-nested2: offset -1, type ffffffff, size 208, index -1, binding -1, stages 1, numMembers 15
-VertexCollection: offset -1, type ffffffff, size 400, index -1, binding -1, stages 1, numMembers 31
+named: offset -1, type ffffffff, size 304, index 0, binding -1, stages 1, numMembers 10
+nameless: offset -1, type ffffffff, size 496, index 1, binding -1, stages 1, numMembers 9
+c_nameless: offset -1, type ffffffff, size 112, index 2, binding -1, stages 1, numMembers 5
+nested: offset -1, type ffffffff, size 32, index 3, binding -1, stages 1, numMembers 4
+abl[0]: offset -1, type ffffffff, size 4, index 4, binding -1, stages 1, numMembers 1
+abl[1]: offset -1, type ffffffff, size 4, index 5, binding -1, stages 1, numMembers 1
+abl[2]: offset -1, type ffffffff, size 4, index 6, binding -1, stages 1, numMembers 1
+abl[3]: offset -1, type ffffffff, size 4, index 7, binding -1, stages 1, numMembers 1
+abl2[0]: offset -1, type ffffffff, size 4, index 8, binding -1, stages 1, numMembers 1
+abl2[1]: offset -1, type ffffffff, size 4, index 9, binding -1, stages 1, numMembers 1
+abl2[2]: offset -1, type ffffffff, size 4, index 10, binding -1, stages 1, numMembers 1
+abl2[3]: offset -1, type ffffffff, size 4, index 11, binding -1, stages 1, numMembers 1
+buf1: offset -1, type ffffffff, size 8, index 12, binding -1, stages 1, numMembers 2
+buf2: offset -1, type ffffffff, size 16, index 13, binding -1, stages 1, numMembers 4
+buf3: offset -1, type ffffffff, size 8, index 14, binding -1, stages 1, numMembers 2
+buf4: offset -1, type ffffffff, size 16, index 15, binding -1, stages 1, numMembers 4
+nested2: offset -1, type ffffffff, size 208, index 16, binding -1, stages 1, numMembers 15
+VertexCollection: offset -1, type ffffffff, size 400, index 17, binding -1, stages 1, numMembers 31
 
 Buffer variable reflection:
 
diff --git a/Test/baseResults/remap.basic.dcefunc.frag.out b/Test/baseResults/remap.basic.dcefunc.frag.out
index e985def..c531eba 100644
--- a/Test/baseResults/remap.basic.dcefunc.frag.out
+++ b/Test/baseResults/remap.basic.dcefunc.frag.out
@@ -1,6 +1,6 @@
 remap.basic.dcefunc.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
@@ -12,6 +12,8 @@
                               Name 4  "main"
                               Name 17  "outf4"
                               Name 19  "inf"
+                              Decorate 17(outf4) Location 0
+                              Decorate 19(inf) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/remap.basic.everything.frag.out b/Test/baseResults/remap.basic.everything.frag.out
index 0f7034a..d483f20 100644
--- a/Test/baseResults/remap.basic.everything.frag.out
+++ b/Test/baseResults/remap.basic.everything.frag.out
@@ -1,6 +1,6 @@
 remap.basic.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24969
 
                               Capability Shader
@@ -8,6 +8,8 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 5663  "main" 4539 3773
                               ExecutionMode 5663 OriginUpperLeft
+                              Decorate 4539 Location 0
+                              Decorate 3773 Location 0
                8:             TypeVoid
             1282:             TypeFunction 8
               13:             TypeFloat 32
diff --git a/Test/baseResults/remap.basic.none.frag.out b/Test/baseResults/remap.basic.none.frag.out
index 44790dd..34f64c8 100644
--- a/Test/baseResults/remap.basic.none.frag.out
+++ b/Test/baseResults/remap.basic.none.frag.out
@@ -1,6 +1,6 @@
 remap.basic.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
@@ -13,6 +13,8 @@
                               Name 9  "dead_fn("
                               Name 17  "outf4"
                               Name 19  "inf"
+                              Decorate 17(outf4) Location 0
+                              Decorate 19(inf) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/remap.basic.strip.frag.out b/Test/baseResults/remap.basic.strip.frag.out
index 05f16ba..f1d7769 100644
--- a/Test/baseResults/remap.basic.strip.frag.out
+++ b/Test/baseResults/remap.basic.strip.frag.out
@@ -1,6 +1,6 @@
 remap.basic.strip.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
@@ -8,6 +8,8 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 17 19
                               ExecutionMode 4 OriginUpperLeft
+                              Decorate 17 Location 0
+                              Decorate 19 Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
index b9ce55e..88c516f 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out
@@ -2,7 +2,7 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24878
 
                               Capability Shader
@@ -17,27 +17,27 @@
                               Decorate 3305 DescriptorSet 0
                               Decorate 3305 Binding 0
                               Decorate 4743 DescriptorSet 0
-                              Decorate 4743 Binding 0
+                              Decorate 4743 Binding 2
                               Decorate 4807 DescriptorSet 0
-                              Decorate 4807 Binding 0
+                              Decorate 4807 Binding 3
                               Decorate 5042 DescriptorSet 0
-                              Decorate 5042 Binding 0
+                              Decorate 5042 Binding 4
                               Decorate 5058 DescriptorSet 0
-                              Decorate 5058 Binding 0
+                              Decorate 5058 Binding 5
                               Decorate 5122 DescriptorSet 0
-                              Decorate 5122 Binding 0
+                              Decorate 5122 Binding 6
                               Decorate 3967 DescriptorSet 0
-                              Decorate 3967 Binding 0
+                              Decorate 3967 Binding 7
                               Decorate 3983 DescriptorSet 0
-                              Decorate 3983 Binding 0
+                              Decorate 3983 Binding 8
                               Decorate 4047 DescriptorSet 0
-                              Decorate 4047 Binding 0
+                              Decorate 4047 Binding 9
                               Decorate 3789 DescriptorSet 0
-                              Decorate 3789 Binding 0
+                              Decorate 3789 Binding 10
                               Decorate 3805 DescriptorSet 0
-                              Decorate 3805 Binding 0
+                              Decorate 3805 Binding 11
                               Decorate 3869 DescriptorSet 0
-                              Decorate 3869 Binding 0
+                              Decorate 3869 Binding 12
                               Decorate 4253 Location 0
                               Decorate 3709 BuiltIn FragDepth
                8:             TypeVoid
diff --git a/Test/baseResults/remap.hlsl.sample.basic.none.frag.out b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
index 71b7de0..465b024 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.none.frag.out
@@ -2,7 +2,7 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 198
 
                               Capability Shader
@@ -69,27 +69,27 @@
                               Decorate 49(g_sSamp) DescriptorSet 0
                               Decorate 49(g_sSamp) Binding 0
                               Decorate 60(g_tTex1di4) DescriptorSet 0
-                              Decorate 60(g_tTex1di4) Binding 0
+                              Decorate 60(g_tTex1di4) Binding 2
                               Decorate 73(g_tTex1du4) DescriptorSet 0
-                              Decorate 73(g_tTex1du4) Binding 0
+                              Decorate 73(g_tTex1du4) Binding 3
                               Decorate 83(g_tTex2df4) DescriptorSet 0
-                              Decorate 83(g_tTex2df4) Binding 0
+                              Decorate 83(g_tTex2df4) Binding 4
                               Decorate 94(g_tTex2di4) DescriptorSet 0
-                              Decorate 94(g_tTex2di4) Binding 0
+                              Decorate 94(g_tTex2di4) Binding 5
                               Decorate 105(g_tTex2du4) DescriptorSet 0
-                              Decorate 105(g_tTex2du4) Binding 0
+                              Decorate 105(g_tTex2du4) Binding 6
                               Decorate 117(g_tTex3df4) DescriptorSet 0
-                              Decorate 117(g_tTex3df4) Binding 0
+                              Decorate 117(g_tTex3df4) Binding 7
                               Decorate 128(g_tTex3di4) DescriptorSet 0
-                              Decorate 128(g_tTex3di4) Binding 0
+                              Decorate 128(g_tTex3di4) Binding 8
                               Decorate 138(g_tTex3du4) DescriptorSet 0
-                              Decorate 138(g_tTex3du4) Binding 0
+                              Decorate 138(g_tTex3du4) Binding 9
                               Decorate 151(g_tTexcdf4) DescriptorSet 0
-                              Decorate 151(g_tTexcdf4) Binding 0
+                              Decorate 151(g_tTexcdf4) Binding 10
                               Decorate 160(g_tTexcdi4) DescriptorSet 0
-                              Decorate 160(g_tTexcdi4) Binding 0
+                              Decorate 160(g_tTexcdi4) Binding 11
                               Decorate 169(g_tTexcdu4) DescriptorSet 0
-                              Decorate 169(g_tTexcdu4) Binding 0
+                              Decorate 169(g_tTexcdu4) Binding 12
                               Decorate 188(@entryPointOutput.Color) Location 0
                               Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth
                               Decorate 195(g_sSamp2d) DescriptorSet 0
diff --git a/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
index c65d237..4fb9218 100644
--- a/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
+++ b/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out
@@ -2,7 +2,7 @@
 WARNING: 0:4: 'immediate sampler state' : unimplemented 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 198
 
                               Capability Shader
@@ -17,27 +17,27 @@
                               Decorate 49 DescriptorSet 0
                               Decorate 49 Binding 0
                               Decorate 60 DescriptorSet 0
-                              Decorate 60 Binding 0
+                              Decorate 60 Binding 2
                               Decorate 73 DescriptorSet 0
-                              Decorate 73 Binding 0
+                              Decorate 73 Binding 3
                               Decorate 83 DescriptorSet 0
-                              Decorate 83 Binding 0
+                              Decorate 83 Binding 4
                               Decorate 94 DescriptorSet 0
-                              Decorate 94 Binding 0
+                              Decorate 94 Binding 5
                               Decorate 105 DescriptorSet 0
-                              Decorate 105 Binding 0
+                              Decorate 105 Binding 6
                               Decorate 117 DescriptorSet 0
-                              Decorate 117 Binding 0
+                              Decorate 117 Binding 7
                               Decorate 128 DescriptorSet 0
-                              Decorate 128 Binding 0
+                              Decorate 128 Binding 8
                               Decorate 138 DescriptorSet 0
-                              Decorate 138 Binding 0
+                              Decorate 138 Binding 9
                               Decorate 151 DescriptorSet 0
-                              Decorate 151 Binding 0
+                              Decorate 151 Binding 10
                               Decorate 160 DescriptorSet 0
-                              Decorate 160 Binding 0
+                              Decorate 160 Binding 11
                               Decorate 169 DescriptorSet 0
-                              Decorate 169 Binding 0
+                              Decorate 169 Binding 12
                               Decorate 188 Location 0
                               Decorate 192 BuiltIn FragDepth
                               Decorate 195 DescriptorSet 0
diff --git a/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
index ea390b5..f1e3535 100644
--- a/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
+++ b/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out
@@ -1,6 +1,6 @@
 remap.hlsl.templatetypes.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24954
 
                               Capability Shader
diff --git a/Test/baseResults/remap.hlsl.templatetypes.none.frag.out b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
index 32b4e7b..226f2c6 100644
--- a/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
+++ b/Test/baseResults/remap.hlsl.templatetypes.none.frag.out
@@ -1,6 +1,6 @@
 remap.hlsl.templatetypes.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 160
 
                               Capability Shader
diff --git a/Test/baseResults/remap.if.everything.frag.out b/Test/baseResults/remap.if.everything.frag.out
index 26cc3dc..3a521be 100644
--- a/Test/baseResults/remap.if.everything.frag.out
+++ b/Test/baseResults/remap.if.everything.frag.out
@@ -1,6 +1,6 @@
 remap.if.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22855
 
                               Capability Shader
@@ -8,6 +8,8 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 5663  "main" 3773 4539
                               ExecutionMode 5663 OriginUpperLeft
+                              Decorate 3773 Location 0
+                              Decorate 4539 Location 0
                8:             TypeVoid
             1282:             TypeFunction 8
               13:             TypeFloat 32
diff --git a/Test/baseResults/remap.if.none.frag.out b/Test/baseResults/remap.if.none.frag.out
index 48e8587..cb2d31b 100644
--- a/Test/baseResults/remap.if.none.frag.out
+++ b/Test/baseResults/remap.if.none.frag.out
@@ -1,6 +1,6 @@
 remap.if.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25
 
                               Capability Shader
@@ -12,6 +12,8 @@
                               Name 4  "main"
                               Name 8  "inf"
                               Name 17  "outf4"
+                              Decorate 8(inf) Location 0
+                              Decorate 17(outf4) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/remap.similar_1a.everything.frag.out b/Test/baseResults/remap.similar_1a.everything.frag.out
index 6d5ce1c..993dc1c 100644
--- a/Test/baseResults/remap.similar_1a.everything.frag.out
+++ b/Test/baseResults/remap.similar_1a.everything.frag.out
@@ -1,6 +1,6 @@
 remap.similar_1a.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24916
 
                               Capability Shader
@@ -9,6 +9,9 @@
                               EntryPoint Fragment 5663  "main" 4201 4539 3773
                               ExecutionMode 5663 OriginUpperLeft
                               Decorate 4201 Flat
+                              Decorate 4201 Location 1
+                              Decorate 4539 Location 0
+                              Decorate 3773 Location 0
                8:             TypeVoid
             1282:             TypeFunction 8
               12:             TypeInt 32 1
diff --git a/Test/baseResults/remap.similar_1a.none.frag.out b/Test/baseResults/remap.similar_1a.none.frag.out
index 457f1be..e46b8e1 100644
--- a/Test/baseResults/remap.similar_1a.none.frag.out
+++ b/Test/baseResults/remap.similar_1a.none.frag.out
@@ -1,6 +1,6 @@
 remap.similar_1a.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 86
 
                               Capability Shader
@@ -23,6 +23,9 @@
                               Name 78  "param"
                               Name 82  "param"
                               Decorate 53(ini4) Flat
+                              Decorate 53(ini4) Location 1
+                              Decorate 73(outf4) Location 0
+                              Decorate 75(inf) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/remap.similar_1b.everything.frag.out b/Test/baseResults/remap.similar_1b.everything.frag.out
index 67425c6..ffe5446 100644
--- a/Test/baseResults/remap.similar_1b.everything.frag.out
+++ b/Test/baseResults/remap.similar_1b.everything.frag.out
@@ -1,6 +1,6 @@
 remap.similar_1b.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24916
 
                               Capability Shader
@@ -9,6 +9,9 @@
                               EntryPoint Fragment 5663  "main" 4201 4539 3773
                               ExecutionMode 5663 OriginUpperLeft
                               Decorate 4201 Flat
+                              Decorate 4201 Location 0
+                              Decorate 4539 Location 0
+                              Decorate 3773 Location 1
                8:             TypeVoid
             1282:             TypeFunction 8
               12:             TypeInt 32 1
diff --git a/Test/baseResults/remap.similar_1b.none.frag.out b/Test/baseResults/remap.similar_1b.none.frag.out
index fe021e0..5f5241c 100644
--- a/Test/baseResults/remap.similar_1b.none.frag.out
+++ b/Test/baseResults/remap.similar_1b.none.frag.out
@@ -1,6 +1,6 @@
 remap.similar_1b.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 91
 
                               Capability Shader
@@ -23,6 +23,9 @@
                               Name 83  "param"
                               Name 87  "param"
                               Decorate 58(ini4) Flat
+                              Decorate 58(ini4) Location 0
+                              Decorate 78(outf4) Location 0
+                              Decorate 80(inf) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/remap.specconst.comp.out b/Test/baseResults/remap.specconst.comp.out
index 80d13b2..2bed3cf 100644
--- a/Test/baseResults/remap.specconst.comp.out
+++ b/Test/baseResults/remap.specconst.comp.out
@@ -1,6 +1,6 @@
 remap.specconst.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 16104
 
                               Capability Shader
diff --git a/Test/baseResults/remap.switch.everything.frag.out b/Test/baseResults/remap.switch.everything.frag.out
index 2362f67..443fe68 100644
--- a/Test/baseResults/remap.switch.everything.frag.out
+++ b/Test/baseResults/remap.switch.everything.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23990
 
                               Capability Shader
diff --git a/Test/baseResults/remap.switch.none.frag.out b/Test/baseResults/remap.switch.none.frag.out
index f8737b9..3347dce 100644
--- a/Test/baseResults/remap.switch.none.frag.out
+++ b/Test/baseResults/remap.switch.none.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 48
 
                               Capability Shader
diff --git a/Test/baseResults/remap.uniformarray.everything.frag.out b/Test/baseResults/remap.uniformarray.everything.frag.out
index 40429f2..bebff93 100644
--- a/Test/baseResults/remap.uniformarray.everything.frag.out
+++ b/Test/baseResults/remap.uniformarray.everything.frag.out
@@ -1,6 +1,6 @@
 remap.uniformarray.everything.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25030
 
                               Capability Shader
@@ -8,6 +8,9 @@
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 5663  "main" 3608 4957 4339 5139
                               ExecutionMode 5663 OriginUpperLeft
+                              Decorate 3608 Location 1
+                              Decorate 4957 Location 0
+                              Decorate 4339 Location 7
                               Decorate 5139 Location 0
                8:             TypeVoid
             1282:             TypeFunction 8
diff --git a/Test/baseResults/remap.uniformarray.none.frag.out b/Test/baseResults/remap.uniformarray.none.frag.out
index 42d55b9..6bd58d2 100644
--- a/Test/baseResults/remap.uniformarray.none.frag.out
+++ b/Test/baseResults/remap.uniformarray.none.frag.out
@@ -1,6 +1,6 @@
 remap.uniformarray.none.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
@@ -16,6 +16,9 @@
                               Name 35  "alpha"
                               Name 47  "gl_FragColor"
                               Name 52  "texSampler2D"
+                              Decorate 14(color) Location 1
+                              Decorate 25(inColor) Location 0
+                              Decorate 35(alpha) Location 7
                               Decorate 47(gl_FragColor) Location 0
                               Decorate 52(texSampler2D) DescriptorSet 0
                               Decorate 52(texSampler2D) Binding 0
diff --git a/Test/baseResults/size b/Test/baseResults/size
index 47364a5..a7b99b9 100644
--- a/Test/baseResults/size
+++ b/Test/baseResults/size
@@ -1 +1 @@
-396288 ../build/install/bin/glslangValidator.exe
+399360 ../build/install/bin/glslangValidator.exe
diff --git a/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out b/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out
index 105bbdb..d512639 100644
--- a/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out
+++ b/Test/baseResults/spv.1.3.8bitstorage-ssbo.vert.out
@@ -1,6 +1,6 @@
 spv.1.3.8bitstorage-ssbo.vert
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out b/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out
index 77c1565..1dce1ea 100644
--- a/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out
+++ b/Test/baseResults/spv.1.3.8bitstorage-ubo.vert.out
@@ -1,6 +1,6 @@
 spv.1.3.8bitstorage-ubo.vert
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.3.coopmat.comp.out b/Test/baseResults/spv.1.3.coopmat.comp.out
index 29d914f..d7a9d5e 100644
--- a/Test/baseResults/spv.1.3.coopmat.comp.out
+++ b/Test/baseResults/spv.1.3.coopmat.comp.out
@@ -1,6 +1,6 @@
 spv.1.3.coopmat.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 52
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.LoopControl.frag.out b/Test/baseResults/spv.1.4.LoopControl.frag.out
index 008ef47..0ffffd6 100644
--- a/Test/baseResults/spv.1.4.LoopControl.frag.out
+++ b/Test/baseResults/spv.1.4.LoopControl.frag.out
@@ -3,7 +3,7 @@
 WARNING: 0:15: 'max_iterations' : expected a single integer argument 
 
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.NonWritable.frag.out b/Test/baseResults/spv.1.4.NonWritable.frag.out
old mode 100755
new mode 100644
index 0207ed2..da3b52c
--- a/Test/baseResults/spv.1.4.NonWritable.frag.out
+++ b/Test/baseResults/spv.1.4.NonWritable.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.NonWritable.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.OpCopyLogical.comp.out b/Test/baseResults/spv.1.4.OpCopyLogical.comp.out
index 53e672f..018fd0a 100644
--- a/Test/baseResults/spv.1.4.OpCopyLogical.comp.out
+++ b/Test/baseResults/spv.1.4.OpCopyLogical.comp.out
@@ -1,6 +1,6 @@
 spv.1.4.OpCopyLogical.comp
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out b/Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
index d7509b1..68f7e52 100644
--- a/Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
+++ b/Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.OpCopyLogical.funcall.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out b/Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
index 2b60625..7dcda62 100644
--- a/Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
+++ b/Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
@@ -1,6 +1,6 @@
 spv.1.4.OpCopyLogicalBool.comp
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 135
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.OpEntryPoint.frag.out b/Test/baseResults/spv.1.4.OpEntryPoint.frag.out
index f06960c..cf5d98a 100644
--- a/Test/baseResults/spv.1.4.OpEntryPoint.frag.out
+++ b/Test/baseResults/spv.1.4.OpEntryPoint.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.OpEntryPoint.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 64
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out b/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out
new file mode 100644
index 0000000..835ab13
--- /dev/null
+++ b/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out
@@ -0,0 +1,72 @@
+spv.1.4.OpEntryPoint.opaqueParams.vert
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 45
+
+                              Capability Shader
+                              Capability ImageQuery
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 41 42 43
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 18  "funOpaque(s21;t21;p1;"
+                              Name 15  "s2D"
+                              Name 16  "t2D"
+                              Name 17  "s"
+                              Name 40  "size"
+                              Name 41  "s2D"
+                              Name 42  "t2D"
+                              Name 43  "s"
+                              Decorate 41(s2D) DescriptorSet 0
+                              Decorate 41(s2D) Binding 0
+                              Decorate 42(t2D) DescriptorSet 0
+                              Decorate 42(t2D) Binding 1
+                              Decorate 43(s) DescriptorSet 0
+                              Decorate 43(s) Binding 3
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D sampled format:Unknown
+               8:             TypeSampledImage 7
+               9:             TypePointer UniformConstant 8
+              10:             TypePointer UniformConstant 7
+              11:             TypeSampler
+              12:             TypePointer UniformConstant 11
+              13:             TypeVector 6(float) 2
+              14:             TypeFunction 13(fvec2) 9(ptr) 10(ptr) 12(ptr)
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              24:             TypeVector 21(int) 2
+              30:    6(float) Constant 1056964608
+              31:   13(fvec2) ConstantComposite 30 30
+              32:             TypeVector 6(float) 4
+              33:    6(float) Constant 0
+              39:             TypePointer Function 13(fvec2)
+         41(s2D):      9(ptr) Variable UniformConstant
+         42(t2D):     10(ptr) Variable UniformConstant
+           43(s):     12(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+        40(size):     39(ptr) Variable Function
+              44:   13(fvec2) FunctionCall 18(funOpaque(s21;t21;p1;) 41(s2D) 42(t2D) 43(s)
+                              Store 40(size) 44
+                              Return
+                              FunctionEnd
+18(funOpaque(s21;t21;p1;):   13(fvec2) Function None 14
+         15(s2D):      9(ptr) FunctionParameter
+         16(t2D):     10(ptr) FunctionParameter
+           17(s):     12(ptr) FunctionParameter
+              19:             Label
+              20:           8 Load 15(s2D)
+              23:           7 Image 20
+              25:   24(ivec2) ImageQuerySizeLod 23 22
+              26:   13(fvec2) ConvertSToF 25
+              27:           7 Load 16(t2D)
+              28:          11 Load 17(s)
+              29:           8 SampledImage 27 28
+              34:   32(fvec4) ImageSampleExplicitLod 29 31 Lod 33
+              35:   13(fvec2) VectorShuffle 34 34 0 1
+              36:   13(fvec2) FMul 26 35
+                              ReturnValue 36
+                              FunctionEnd
diff --git a/Test/baseResults/spv.1.4.OpSelect.frag.out b/Test/baseResults/spv.1.4.OpSelect.frag.out
old mode 100755
new mode 100644
index 6ba00a4..b3a5b4d
--- a/Test/baseResults/spv.1.4.OpSelect.frag.out
+++ b/Test/baseResults/spv.1.4.OpSelect.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.OpSelect.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 98
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.constructComposite.comp.out b/Test/baseResults/spv.1.4.constructComposite.comp.out
index e514286..cbec381 100644
--- a/Test/baseResults/spv.1.4.constructComposite.comp.out
+++ b/Test/baseResults/spv.1.4.constructComposite.comp.out
@@ -1,6 +1,6 @@
 spv.1.4.constructComposite.comp
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.1.4.image.frag.out b/Test/baseResults/spv.1.4.image.frag.out
old mode 100755
new mode 100644
index 98ffdcb..fadde97
--- a/Test/baseResults/spv.1.4.image.frag.out
+++ b/Test/baseResults/spv.1.4.image.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.image.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 104
 
                               Capability Shader
@@ -26,6 +26,7 @@
                               Decorate 26(i2D) DescriptorSet 0
                               Decorate 26(i2D) Binding 1
                               Decorate 30(ic2D) Flat
+                              Decorate 30(ic2D) Location 0
                               Decorate 40(ii2D) DescriptorSet 0
                               Decorate 40(ii2D) Binding 12
                               Decorate 52(ui2D) DescriptorSet 0
@@ -36,7 +37,9 @@
                               Decorate 77(ii2DMS) Binding 13
                               Decorate 89(ui2DMS) DescriptorSet 0
                               Decorate 89(ui2DMS) Binding 13
+                              Decorate 100(fragData) Location 0
                               Decorate 103(value) Flat
+                              Decorate 103(value) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.1.4.sparseTexture.frag.out b/Test/baseResults/spv.1.4.sparseTexture.frag.out
old mode 100755
new mode 100644
index 3b566c7..965f4c8
--- a/Test/baseResults/spv.1.4.sparseTexture.frag.out
+++ b/Test/baseResults/spv.1.4.sparseTexture.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.sparseTexture.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 213
 
                               Capability Shader
@@ -49,19 +49,26 @@
                               Name 212  "offsets"
                               Decorate 29(s2D) DescriptorSet 0
                               Decorate 29(s2D) Binding 0
+                              Decorate 33(c2) Location 0
                               Decorate 46(is2D) DescriptorSet 0
-                              Decorate 46(is2D) Binding 0
+                              Decorate 46(is2D) Binding 1
                               Decorate 63(us2D) DescriptorSet 0
-                              Decorate 63(us2D) Binding 0
+                              Decorate 63(us2D) Binding 2
                               Decorate 149(i2D) DescriptorSet 0
-                              Decorate 149(i2D) Binding 0
+                              Decorate 149(i2D) Binding 3
                               Decorate 152(ic2) Flat
+                              Decorate 152(ic2) Location 3
                               Decorate 162(ii2DMS) DescriptorSet 0
-                              Decorate 162(ii2DMS) Binding 0
+                              Decorate 162(ii2DMS) Binding 4
                               Decorate 177(ui3D) DescriptorSet 0
-                              Decorate 177(ui3D) Binding 0
+                              Decorate 177(ui3D) Binding 5
                               Decorate 181(ic3) Flat
+                              Decorate 181(ic3) Location 4
+                              Decorate 189(outColor) Location 0
+                              Decorate 206(c3) Location 1
+                              Decorate 208(c4) Location 2
                               Decorate 212(offsets) Flat
+                              Decorate 212(offsets) Location 5
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.1.4.texture.frag.out b/Test/baseResults/spv.1.4.texture.frag.out
old mode 100755
new mode 100644
index da3a24f..ac9f72f
--- a/Test/baseResults/spv.1.4.texture.frag.out
+++ b/Test/baseResults/spv.1.4.texture.frag.out
@@ -1,6 +1,6 @@
 spv.1.4.texture.frag
 // Module Version 10400
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 79
 
                               Capability Shader
@@ -21,12 +21,17 @@
                               Name 78  "color"
                               Decorate 15(texSampler2D) DescriptorSet 0
                               Decorate 15(texSampler2D) Binding 0
+                              Decorate 19(coords2D) Location 1
                               Decorate 28(itexSampler2D) DescriptorSet 0
-                              Decorate 28(itexSampler2D) Binding 0
+                              Decorate 28(itexSampler2D) Binding 1
                               Decorate 40(utexSampler2D) DescriptorSet 0
-                              Decorate 40(utexSampler2D) Binding 0
+                              Decorate 40(utexSampler2D) Binding 2
                               Decorate 51(iCoords2D) Flat
+                              Decorate 51(iCoords2D) Location 2
                               Decorate 54(iLod) Flat
+                              Decorate 54(iLod) Location 3
+                              Decorate 76(t) Location 0
+                              Decorate 78(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.100ops.frag.out b/Test/baseResults/spv.100ops.frag.out
index d2b8f3e..42c9995 100644
--- a/Test/baseResults/spv.100ops.frag.out
+++ b/Test/baseResults/spv.100ops.frag.out
@@ -1,6 +1,6 @@
 spv.100ops.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 49
 
                               Capability Shader
@@ -22,14 +22,17 @@
                               Decorate 13(face2) RelaxedPrecision
                               Decorate 17(z) RelaxedPrecision
                               Decorate 21(low) RelaxedPrecision
+                              Decorate 21(low) Location 0
                               Decorate 22 RelaxedPrecision
                               Decorate 23 RelaxedPrecision
                               Decorate 25 RelaxedPrecision
                               Decorate 26(high) RelaxedPrecision
+                              Decorate 26(high) Location 1
                               Decorate 27 RelaxedPrecision
                               Decorate 32 RelaxedPrecision
                               Decorate 34 RelaxedPrecision
                               Decorate 37(Color) RelaxedPrecision
+                              Decorate 37(Color) Location 0
                               Decorate 38 RelaxedPrecision
                               Decorate 39 RelaxedPrecision
                               Decorate 40 RelaxedPrecision
diff --git a/Test/baseResults/spv.130.frag.out b/Test/baseResults/spv.130.frag.out
index ca1f9e3..29c7d85 100644
--- a/Test/baseResults/spv.130.frag.out
+++ b/Test/baseResults/spv.130.frag.out
@@ -3,7 +3,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 205
 
                               Capability Shader
@@ -58,27 +58,34 @@
                               Name 199  "s2DRS"
                               Name 203  "s1D"
                               Name 204  "s2DS"
+                              Decorate 17(o) Location 0
                               Decorate 21(samp2D) DescriptorSet 0
-                              Decorate 21(samp2D) Binding 0
+                              Decorate 21(samp2D) Binding 2
                               Decorate 37(samp2DA) DescriptorSet 0
-                              Decorate 37(samp2DA) Binding 0
+                              Decorate 37(samp2DA) Binding 5
                               Decorate 47(samp2DR) DescriptorSet 0
-                              Decorate 47(samp2DR) Binding 0
+                              Decorate 47(samp2DR) Binding 4
                               Decorate 55(samp2DS) DescriptorSet 0
-                              Decorate 55(samp2DS) Binding 0
+                              Decorate 55(samp2DS) Binding 3
+                              Decorate 68(io) Location 1
                               Decorate 72(Sca) DescriptorSet 0
-                              Decorate 72(Sca) Binding 0
+                              Decorate 72(Sca) Binding 6
+                              Decorate 79(i) Location 0
                               Decorate 87(Isca) DescriptorSet 0
-                              Decorate 87(Isca) Binding 0
+                              Decorate 87(Isca) Binding 7
+                              Decorate 99(uo) Location 2
                               Decorate 103(Usca) DescriptorSet 0
-                              Decorate 103(Usca) Binding 0
+                              Decorate 103(Usca) Binding 8
                               Decorate 118(Scas) DescriptorSet 0
-                              Decorate 118(Scas) Binding 0
+                              Decorate 118(Scas) Binding 9
                               Decorate 167(sampC) DescriptorSet 0
-                              Decorate 167(sampC) Binding 0
+                              Decorate 167(sampC) Binding 1
                               Decorate 173(gl_ClipDistance) BuiltIn ClipDistance
                               Decorate 184(fflat) Flat
+                              Decorate 184(fflat) Location 1
+                              Decorate 185(fsmooth) Location 2
                               Decorate 186(fnop) NoPerspective
+                              Decorate 186(fnop) Location 3
                               Decorate 193(bounds) DescriptorSet 0
                               Decorate 193(bounds) Binding 0
                               Decorate 194(s2D) DescriptorSet 0
diff --git a/Test/baseResults/spv.140.frag.out b/Test/baseResults/spv.140.frag.out
index 45b7510..a517882 100644
--- a/Test/baseResults/spv.140.frag.out
+++ b/Test/baseResults/spv.140.frag.out
@@ -1,7 +1,7 @@
 spv.140.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 96
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               EntryPoint Fragment 4  "main" 14 23 28 38
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
+                              SourceExtension  "GL_ARB_enhanced_layouts"
                               Name 4  "main"
                               Name 8  "foo("
                               Name 11  "i1"
@@ -36,11 +37,13 @@
                               MemberName 92(bi) 0  "v"
                               Name 95  "bname"
                               Decorate 14(gl_FrontFacing) BuiltIn FrontFacing
+                              Decorate 23(o) Location 0
                               Decorate 28(gl_ClipDistance) BuiltIn ClipDistance
+                              Decorate 38(k) Location 0
                               Decorate 50(sampR) DescriptorSet 0
                               Decorate 50(sampR) Binding 0
                               Decorate 58(sampB) DescriptorSet 0
-                              Decorate 58(sampB) Binding 0
+                              Decorate 58(sampB) Binding 1
                               Decorate 82(samp2Da) DescriptorSet 0
                               Decorate 82(samp2Da) Binding 0
                               Decorate 85 ArrayStride 64
diff --git a/Test/baseResults/spv.150.geom.out b/Test/baseResults/spv.150.geom.out
index ab05846..0ad3337 100644
--- a/Test/baseResults/spv.150.geom.out
+++ b/Test/baseResults/spv.150.geom.out
@@ -1,6 +1,6 @@
 spv.150.geom
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 71
 
                               Capability Geometry
@@ -38,8 +38,10 @@
                               MemberName 68(toFragment) 0  "color"
                               Name 70  "toF"
                               Decorate 8(fromVertex) Block
+                              Decorate 10 Location 1
                               Decorate 10 Stream 3
                               Decorate 13(fromVertex) Block
+                              Decorate 18(fromV) Location 0
                               MemberDecorate 27(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 27(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 27(gl_PerVertex) 2 BuiltIn ClipDistance
@@ -55,6 +57,7 @@
                               Decorate 51(gl_Layer) Stream 0
                               Decorate 51(gl_Layer) BuiltIn Layer
                               Decorate 68(toFragment) Block
+                              Decorate 70(toF) Location 0
                               Decorate 70(toF) Stream 3
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.150.vert.out b/Test/baseResults/spv.150.vert.out
index 9e1c9f4..2b09f4b 100644
--- a/Test/baseResults/spv.150.vert.out
+++ b/Test/baseResults/spv.150.vert.out
@@ -1,6 +1,6 @@
 spv.150.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 63
 
                               Capability Shader
@@ -33,8 +33,12 @@
                               MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
                               Decorate 11(gl_PerVertex) Block
+                              Decorate 17(iv4) Location 0
+                              Decorate 23(ps) Location 1
+                              Decorate 38(s2out) Location 0
                               Decorate 47(s2D) DescriptorSet 0
                               Decorate 47(s2D) Binding 0
+                              Decorate 62(ui) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.16bitstorage-int.frag.out b/Test/baseResults/spv.16bitstorage-int.frag.out
index 80733ce..a91b4e4 100644
--- a/Test/baseResults/spv.16bitstorage-int.frag.out
+++ b/Test/baseResults/spv.16bitstorage-int.frag.out
@@ -1,6 +1,6 @@
 spv.16bitstorage-int.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 171
 
                               Capability Shader
@@ -93,7 +93,7 @@
                               MemberDecorate 17(B2) 7 Offset 472
                               Decorate 17(B2) BufferBlock
                               Decorate 19(b2) DescriptorSet 0
-                              Decorate 19(b2) Binding 0
+                              Decorate 19(b2) Binding 1
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 Offset 4
@@ -126,7 +126,7 @@
                               MemberDecorate 49(B5) 7 Offset 1696
                               Decorate 49(B5) Block
                               Decorate 51(b5) DescriptorSet 0
-                              Decorate 51(b5) Binding 0
+                              Decorate 51(b5) Binding 2
                               MemberDecorate 88(S2) 0 ColMajor
                               MemberDecorate 88(S2) 0 Offset 0
                               MemberDecorate 88(S2) 0 MatrixStride 16
@@ -137,7 +137,7 @@
                               MemberDecorate 90(B4) 1 Offset 80
                               Decorate 90(B4) BufferBlock
                               Decorate 92(b4) DescriptorSet 0
-                              Decorate 92(b4) Binding 0
+                              Decorate 92(b4) Binding 4
                               MemberDecorate 93(S2) 0 RowMajor
                               MemberDecorate 93(S2) 0 Offset 0
                               MemberDecorate 93(S2) 0 MatrixStride 16
@@ -146,7 +146,7 @@
                               MemberDecorate 94(B3) 0 Offset 0
                               Decorate 94(B3) BufferBlock
                               Decorate 96(b3) DescriptorSet 0
-                              Decorate 96(b3) Binding 0
+                              Decorate 96(b3) Binding 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 16 1
diff --git a/Test/baseResults/spv.16bitstorage-uint.frag.out b/Test/baseResults/spv.16bitstorage-uint.frag.out
index d4b1b75..f90d0c1 100644
--- a/Test/baseResults/spv.16bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.16bitstorage-uint.frag.out
@@ -1,6 +1,6 @@
 spv.16bitstorage-uint.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 173
 
                               Capability Shader
@@ -93,7 +93,7 @@
                               MemberDecorate 17(B2) 7 Offset 472
                               Decorate 17(B2) BufferBlock
                               Decorate 19(b2) DescriptorSet 0
-                              Decorate 19(b2) Binding 0
+                              Decorate 19(b2) Binding 1
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 Offset 4
@@ -126,7 +126,7 @@
                               MemberDecorate 49(B5) 7 Offset 1696
                               Decorate 49(B5) Block
                               Decorate 51(b5) DescriptorSet 0
-                              Decorate 51(b5) Binding 0
+                              Decorate 51(b5) Binding 2
                               MemberDecorate 89(S2) 0 ColMajor
                               MemberDecorate 89(S2) 0 Offset 0
                               MemberDecorate 89(S2) 0 MatrixStride 16
@@ -137,7 +137,7 @@
                               MemberDecorate 91(B4) 1 Offset 80
                               Decorate 91(B4) BufferBlock
                               Decorate 93(b4) DescriptorSet 0
-                              Decorate 93(b4) Binding 0
+                              Decorate 93(b4) Binding 4
                               MemberDecorate 94(S2) 0 RowMajor
                               MemberDecorate 94(S2) 0 Offset 0
                               MemberDecorate 94(S2) 0 MatrixStride 16
@@ -146,7 +146,7 @@
                               MemberDecorate 95(B3) 0 Offset 0
                               Decorate 95(B3) BufferBlock
                               Decorate 97(b3) DescriptorSet 0
-                              Decorate 97(b3) Binding 0
+                              Decorate 97(b3) Binding 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 16 0
diff --git a/Test/baseResults/spv.16bitstorage.frag.out b/Test/baseResults/spv.16bitstorage.frag.out
index c73eb59..2d934f4 100644
--- a/Test/baseResults/spv.16bitstorage.frag.out
+++ b/Test/baseResults/spv.16bitstorage.frag.out
@@ -1,6 +1,6 @@
 spv.16bitstorage.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 173
 
                               Capability Shader
@@ -93,7 +93,7 @@
                               MemberDecorate 17(B2) 7 Offset 472
                               Decorate 17(B2) BufferBlock
                               Decorate 19(b2) DescriptorSet 0
-                              Decorate 19(b2) Binding 0
+                              Decorate 19(b2) Binding 1
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 Offset 4
@@ -126,7 +126,7 @@
                               MemberDecorate 50(B5) 7 Offset 1696
                               Decorate 50(B5) Block
                               Decorate 52(b5) DescriptorSet 0
-                              Decorate 52(b5) Binding 0
+                              Decorate 52(b5) Binding 2
                               MemberDecorate 88(S2) 0 ColMajor
                               MemberDecorate 88(S2) 0 Offset 0
                               MemberDecorate 88(S2) 0 MatrixStride 16
@@ -137,7 +137,7 @@
                               MemberDecorate 90(B4) 1 Offset 80
                               Decorate 90(B4) BufferBlock
                               Decorate 92(b4) DescriptorSet 0
-                              Decorate 92(b4) Binding 0
+                              Decorate 92(b4) Binding 4
                               MemberDecorate 93(S2) 0 RowMajor
                               MemberDecorate 93(S2) 0 Offset 0
                               MemberDecorate 93(S2) 0 MatrixStride 16
@@ -146,7 +146,7 @@
                               MemberDecorate 94(B3) 0 Offset 0
                               Decorate 94(B3) BufferBlock
                               Decorate 96(b3) DescriptorSet 0
-                              Decorate 96(b3) Binding 0
+                              Decorate 96(b3) Binding 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 16
diff --git a/Test/baseResults/spv.16bitxfb.vert.out b/Test/baseResults/spv.16bitxfb.vert.out
index 96cff79..f4d66ef 100644
--- a/Test/baseResults/spv.16bitxfb.vert.out
+++ b/Test/baseResults/spv.16bitxfb.vert.out
@@ -1,6 +1,6 @@
 spv.16bitxfb.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 59
 
                               Capability Shader
diff --git a/Test/baseResults/spv.300BuiltIns.vert.out b/Test/baseResults/spv.300BuiltIns.vert.out
index 2633645..2201788 100644
--- a/Test/baseResults/spv.300BuiltIns.vert.out
+++ b/Test/baseResults/spv.300BuiltIns.vert.out
@@ -1,6 +1,6 @@
 spv.300BuiltIns.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
@@ -21,6 +21,7 @@
                               MemberDecorate 8(gl_PerVertex) 1 BuiltIn PointSize
                               Decorate 8(gl_PerVertex) Block
                               Decorate 14(ps) RelaxedPrecision
+                              Decorate 14(ps) Location 0
                               Decorate 15 RelaxedPrecision
                               Decorate 21(gl_VertexIndex) BuiltIn VertexIndex
                               Decorate 30 RelaxedPrecision
diff --git a/Test/baseResults/spv.300layout.frag.out b/Test/baseResults/spv.300layout.frag.out
index db06955..3b691e2 100644
--- a/Test/baseResults/spv.300layout.frag.out
+++ b/Test/baseResults/spv.300layout.frag.out
@@ -1,6 +1,6 @@
 spv.300layout.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 37
 
                               Capability Shader
@@ -21,14 +21,17 @@
                               Decorate 9(c) RelaxedPrecision
                               Decorate 9(c) Location 7
                               Decorate 11(color) RelaxedPrecision
+                              Decorate 11(color) Location 1
                               Decorate 12 RelaxedPrecision
                               MemberDecorate 13(S) 0 RelaxedPrecision
                               MemberDecorate 13(S) 1 RelaxedPrecision
+                              Decorate 15(s) Location 2
                               Decorate 19 RelaxedPrecision
                               Decorate 20 RelaxedPrecision
                               Decorate 26(p) RelaxedPrecision
                               Decorate 26(p) Location 3
                               Decorate 29(pos) RelaxedPrecision
+                              Decorate 29(pos) Location 0
                               Decorate 30 RelaxedPrecision
                               Decorate 33 RelaxedPrecision
                               Decorate 34 RelaxedPrecision
diff --git a/Test/baseResults/spv.300layout.vert.out b/Test/baseResults/spv.300layout.vert.out
index c97d217..3db50b0 100644
--- a/Test/baseResults/spv.300layout.vert.out
+++ b/Test/baseResults/spv.300layout.vert.out
@@ -1,6 +1,6 @@
 spv.300layout.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 163
 
                               Capability Shader
@@ -36,6 +36,7 @@
                               MemberName 126(S) 0  "c"
                               MemberName 126(S) 1  "f"
                               Name 128  "s"
+                              Decorate 9(pos) Location 0
                               Decorate 11(p) Location 3
                               MemberDecorate 17(Transform) 0 RowMajor
                               MemberDecorate 17(Transform) 0 Offset 0
@@ -63,17 +64,21 @@
                               MemberDecorate 45(T3) 3 Offset 2048
                               Decorate 45(T3) Block
                               Decorate 47 DescriptorSet 0
-                              Decorate 47 Binding 0
+                              Decorate 47 Binding 2
                               MemberDecorate 78(T2) 0 Offset 0
                               MemberDecorate 78(T2) 1 RowMajor
                               MemberDecorate 78(T2) 1 Offset 16
                               MemberDecorate 78(T2) 1 MatrixStride 16
                               Decorate 78(T2) Block
                               Decorate 80 DescriptorSet 0
-                              Decorate 80 Binding 0
+                              Decorate 80 Binding 1
+                              Decorate 98(color) Location 1
                               Decorate 100(c) Location 7
                               Decorate 108(iout) Flat
+                              Decorate 108(iout) Location 2
+                              Decorate 114(uiuin) Location 0
                               Decorate 120(aiv2) Location 9
+                              Decorate 128(s) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -224,7 +229,7 @@
                               Store 136 134
              139:    138(ptr) AccessChain 47 102 24
              140:   14(fvec3) Load 139
-             144:  143(bvec3) FOrdNotEqual 140 142
+             144:  143(bvec3) FUnordNotEqual 140 142
              145:   137(bool) Any 144
              146:   137(bool) LogicalNot 145
                               SelectionMerge 148 None
diff --git a/Test/baseResults/spv.300layoutp.vert.out b/Test/baseResults/spv.300layoutp.vert.out
index 2b1ef83..315605d 100644
--- a/Test/baseResults/spv.300layoutp.vert.out
+++ b/Test/baseResults/spv.300layoutp.vert.out
@@ -1,6 +1,6 @@
 spv.300layoutp.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 115
 
                               Capability Shader
@@ -36,6 +36,7 @@
                               MemberName 78(S) 0  "c"
                               MemberName 78(S) 1  "f"
                               Name 80  "s"
+                              Decorate 9(pos) Location 0
                               Decorate 11(p) Location 3
                               MemberDecorate 17(Transform) 0 RowMajor
                               MemberDecorate 17(Transform) 0 Offset 0
@@ -63,17 +64,20 @@
                               MemberDecorate 33(T3) 3 Offset 160
                               Decorate 33(T3) Block
                               Decorate 35 DescriptorSet 0
-                              Decorate 35 Binding 0
+                              Decorate 35 Binding 2
                               MemberDecorate 42(T2) 0 Offset 0
                               MemberDecorate 42(T2) 1 RowMajor
                               MemberDecorate 42(T2) 1 Offset 16
                               MemberDecorate 42(T2) 1 MatrixStride 16
                               Decorate 42(T2) Block
                               Decorate 44 DescriptorSet 0
-                              Decorate 44 Binding 0
+                              Decorate 44 Binding 1
+                              Decorate 50(color) Location 1
                               Decorate 52(c) Location 7
                               Decorate 60(iout) Flat
+                              Decorate 60(iout) Location 2
                               Decorate 72(aiv2) Location 9
+                              Decorate 80(s) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -176,7 +180,7 @@
                               Store 88 86
               91:     90(ptr) AccessChain 35 54 24
               92:   14(fvec3) Load 91
-              96:   95(bvec3) FOrdNotEqual 92 94
+              96:   95(bvec3) FUnordNotEqual 92 94
               97:    89(bool) Any 96
               98:    89(bool) LogicalNot 97
                               SelectionMerge 100 None
diff --git a/Test/baseResults/spv.310.bitcast.frag.out b/Test/baseResults/spv.310.bitcast.frag.out
index e4f62b4..b7f823d 100644
--- a/Test/baseResults/spv.310.bitcast.frag.out
+++ b/Test/baseResults/spv.310.bitcast.frag.out
@@ -1,6 +1,6 @@
 spv.310.bitcast.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 153
 
                               Capability Shader
@@ -26,34 +26,46 @@
                               Name 139  "u3"
                               Name 148  "u4"
                               Decorate 14(f1) RelaxedPrecision
+                              Decorate 14(f1) Location 8
                               Decorate 15 RelaxedPrecision
                               Decorate 26(f2) RelaxedPrecision
+                              Decorate 26(f2) Location 9
                               Decorate 27 RelaxedPrecision
                               Decorate 37(f3) RelaxedPrecision
+                              Decorate 37(f3) Location 10
                               Decorate 38 RelaxedPrecision
+                              Decorate 48(f4) Location 11
                               Decorate 57 RelaxedPrecision
                               Decorate 64 RelaxedPrecision
                               Decorate 72 RelaxedPrecision
                               Decorate 89(i1) RelaxedPrecision
                               Decorate 89(i1) Flat
+                              Decorate 89(i1) Location 0
                               Decorate 90 RelaxedPrecision
                               Decorate 98(i2) RelaxedPrecision
                               Decorate 98(i2) Flat
+                              Decorate 98(i2) Location 1
                               Decorate 99 RelaxedPrecision
                               Decorate 107(i3) RelaxedPrecision
                               Decorate 107(i3) Flat
+                              Decorate 107(i3) Location 2
                               Decorate 108 RelaxedPrecision
                               Decorate 116(i4) Flat
+                              Decorate 116(i4) Location 3
                               Decorate 122(u1) RelaxedPrecision
                               Decorate 122(u1) Flat
+                              Decorate 122(u1) Location 4
                               Decorate 123 RelaxedPrecision
                               Decorate 130(u2) RelaxedPrecision
                               Decorate 130(u2) Flat
+                              Decorate 130(u2) Location 5
                               Decorate 131 RelaxedPrecision
                               Decorate 139(u3) RelaxedPrecision
                               Decorate 139(u3) Flat
+                              Decorate 139(u3) Location 6
                               Decorate 140 RelaxedPrecision
                               Decorate 148(u4) Flat
+                              Decorate 148(u4) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out
index 3b90d41..931d038 100644
--- a/Test/baseResults/spv.310.comp.out
+++ b/Test/baseResults/spv.310.comp.out
@@ -1,6 +1,6 @@
 spv.310.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Shader
@@ -43,13 +43,13 @@
                               MemberDecorate 23(outbna) 1 Offset 16
                               Decorate 23(outbna) BufferBlock
                               Decorate 25(outbnamena) DescriptorSet 0
-                              Decorate 25(outbnamena) Binding 0
+                              Decorate 25(outbnamena) Binding 1
                               Decorate 47 ArrayStride 16
                               MemberDecorate 48(outs) 0 Offset 0
                               MemberDecorate 48(outs) 1 Offset 16
                               Decorate 48(outs) BufferBlock
                               Decorate 50(outnames) DescriptorSet 0
-                              Decorate 50(outnames) Binding 0
+                              Decorate 50(outnames) Binding 2
                               Decorate 53(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 65(gl_DeviceIndex) BuiltIn DeviceIndex
                               Decorate 71 BuiltIn WorkgroupSize
diff --git a/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
index 6881084..9bc86d0 100644
--- a/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
+++ b/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
@@ -1,6 +1,6 @@
 spv.320.meshShaderUserDefined.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 140
 
                               Capability MeshShadingNV
diff --git a/Test/baseResults/spv.330.geom.out b/Test/baseResults/spv.330.geom.out
index 79e03b6..1166508 100644
--- a/Test/baseResults/spv.330.geom.out
+++ b/Test/baseResults/spv.330.geom.out
@@ -1,6 +1,6 @@
 spv.330.geom
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.400.frag.nanclamp.out b/Test/baseResults/spv.400.frag.nanclamp.out
index 448aa5e..57f4365 100644
--- a/Test/baseResults/spv.400.frag.nanclamp.out
+++ b/Test/baseResults/spv.400.frag.nanclamp.out
@@ -1,6 +1,6 @@
 spv.400.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1118
 
                               Capability Shader
diff --git a/Test/baseResults/spv.400.frag.out b/Test/baseResults/spv.400.frag.out
index b2f4a16..2e7b2f5 100644
--- a/Test/baseResults/spv.400.frag.out
+++ b/Test/baseResults/spv.400.frag.out
@@ -1,7 +1,7 @@
 spv.400.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1118
 
                               Capability Shader
@@ -53,19 +53,26 @@
                               Name 1107  "u"
                               Name 1115  "id"
                               Name 1116  "gl_PrimitiveID"
+                              Decorate 13(outp) Location 1
                               Decorate 17(u2drs) DescriptorSet 0
-                              Decorate 17(u2drs) Binding 0
+                              Decorate 17(u2drs) Binding 3
                               Decorate 1025(arrayedSampler) DescriptorSet 0
                               Decorate 1025(arrayedSampler) Binding 0
                               Decorate 1027(i) Flat
+                              Decorate 1027(i) Location 1
+                              Decorate 1033(c2D) Location 0
                               Decorate 1038(gl_ClipDistance) BuiltIn ClipDistance
+                              Decorate 1050(uoutp) Location 3
                               Decorate 1054(samp2dr) DescriptorSet 0
-                              Decorate 1054(samp2dr) Binding 0
+                              Decorate 1054(samp2dr) Binding 1
+                              Decorate 1076(ioutp) Location 2
                               Decorate 1080(isamp2DA) DescriptorSet 0
-                              Decorate 1080(isamp2DA) Binding 0
+                              Decorate 1080(isamp2DA) Binding 2
                               Decorate 1097(gl_FragCoord) BuiltIn FragCoord
                               Decorate 1099(vl2) Location 6
+                              Decorate 1105(uo) Location 0
                               Decorate 1107(u) Flat
+                              Decorate 1107(u) Location 2
                               Decorate 1116(gl_PrimitiveID) Flat
                               Decorate 1116(gl_PrimitiveID) BuiltIn PrimitiveId
                2:             TypeVoid
diff --git a/Test/baseResults/spv.400.tesc.out b/Test/baseResults/spv.400.tesc.out
index e84b420..a07c9b1 100644
--- a/Test/baseResults/spv.400.tesc.out
+++ b/Test/baseResults/spv.400.tesc.out
@@ -1,6 +1,6 @@
 spv.400.tesc
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 92
 
                               Capability Tessellation
@@ -59,6 +59,9 @@
                               Decorate 72(gl_TessLevelInner) Patch
                               Decorate 72(gl_TessLevelInner) BuiltIn TessLevelInner
                               Decorate 78(patchOut) Patch
+                              Decorate 78(patchOut) Location 0
+                              Decorate 82(inb) Location 0
+                              Decorate 83(ind) Location 1
                               Decorate 86(ivla) Location 3
                               Decorate 87(ivlb) Location 4
                               Decorate 90(ovla) Location 3
diff --git a/Test/baseResults/spv.400.tese.out b/Test/baseResults/spv.400.tese.out
index 5705fbd..58f4b97 100644
--- a/Test/baseResults/spv.400.tese.out
+++ b/Test/baseResults/spv.400.tese.out
@@ -1,6 +1,6 @@
 spv.400.tese
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 96
 
                               Capability Tessellation
@@ -68,8 +68,13 @@
                               MemberDecorate 64(gl_PerVertex) 2 BuiltIn ClipDistance
                               Decorate 64(gl_PerVertex) Block
                               Decorate 75(patchIn) Patch
+                              Decorate 75(patchIn) Location 0
+                              Decorate 79(inb) Location 1
+                              Decorate 80(ind) Location 2
                               Decorate 81(testblb) Block
+                              Decorate 84(blb) Location 3
                               Decorate 85(testbld) Block
+                              Decorate 88(bld) Location 4
                               Decorate 91(ivla) Location 23
                               Decorate 92(ivlb) Location 24
                               Decorate 95(ovla) Location 23
diff --git a/Test/baseResults/spv.420.geom.out b/Test/baseResults/spv.420.geom.out
index c75ae5d..17f2749 100644
--- a/Test/baseResults/spv.420.geom.out
+++ b/Test/baseResults/spv.420.geom.out
@@ -1,6 +1,6 @@
 spv.420.geom
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Geometry
@@ -42,6 +42,7 @@
                               Decorate 33(gl_InvocationID) BuiltIn InvocationId
                               Decorate 41(s2D) DescriptorSet 0
                               Decorate 41(s2D) Binding 0
+                              Decorate 46(coord) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.430.frag.out b/Test/baseResults/spv.430.frag.out
index 96ab1e9..15da382 100644
--- a/Test/baseResults/spv.430.frag.out
+++ b/Test/baseResults/spv.430.frag.out
@@ -1,6 +1,6 @@
 spv.430.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
@@ -15,6 +15,7 @@
                               Name 9  "color"
                               Name 14  "gl_Layer"
                               Name 19  "gl_ViewportIndex"
+                              Decorate 9(color) Location 0
                               Decorate 14(gl_Layer) Flat
                               Decorate 14(gl_Layer) BuiltIn Layer
                               Decorate 19(gl_ViewportIndex) Flat
diff --git a/Test/baseResults/spv.430.vert.out b/Test/baseResults/spv.430.vert.out
index 89e5b16..a6b2e34 100644
--- a/Test/baseResults/spv.430.vert.out
+++ b/Test/baseResults/spv.430.vert.out
@@ -1,6 +1,7 @@
 spv.430.vert
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 66
 
                               Capability Shader
@@ -41,7 +42,12 @@
                               Name 65  "outMS"
                               MemberDecorate 10(gl_PerVertex) 0 BuiltIn ClipDistance
                               Decorate 10(gl_PerVertex) Block
+                              Decorate 23(bad) Location 0
                               Decorate 34(badorder3) Flat
+                              Decorate 34(badorder3) Location 1
+                              Decorate 38(f) Location 11
+                              Decorate 41(badorder) Location 10
+                              Decorate 42(badorder2) Location 0
                               Decorate 42(badorder2) Invariant
                               MemberDecorate 43(boundblock) 0 Offset 0
                               Decorate 43(boundblock) Block
@@ -62,6 +68,7 @@
                               Decorate 62(var) Location 0
                               MemberDecorate 63(MS) 0 Location 17
                               Decorate 63(MS) Block
+                              Decorate 65(outMS) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.450.geom.out b/Test/baseResults/spv.450.geom.out
index 1e7e8c5..3e7ac45 100644
--- a/Test/baseResults/spv.450.geom.out
+++ b/Test/baseResults/spv.450.geom.out
@@ -1,6 +1,6 @@
 spv.450.geom
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.450.noRedecl.tesc.out b/Test/baseResults/spv.450.noRedecl.tesc.out
index 31c7b4d..0925119 100644
--- a/Test/baseResults/spv.450.noRedecl.tesc.out
+++ b/Test/baseResults/spv.450.noRedecl.tesc.out
@@ -1,6 +1,6 @@
 spv.450.noRedecl.tesc
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Tessellation
@@ -24,6 +24,7 @@
                               MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
                               Decorate 11(gl_PerVertex) Block
                               Decorate 20(patchOut) Patch
+                              Decorate 20(patchOut) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.450.tesc.out b/Test/baseResults/spv.450.tesc.out
index 0c22d9a..c18ab3f 100644
--- a/Test/baseResults/spv.450.tesc.out
+++ b/Test/baseResults/spv.450.tesc.out
@@ -1,6 +1,7 @@
 spv.450.tesc
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 45
 
                               Capability Tessellation
@@ -72,6 +73,7 @@
                               MemberDecorate 42(bn) 2 Patch
                               MemberDecorate 42(bn) 2 Location 25
                               Decorate 42(bn) Block
+                              Decorate 44 Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.460.comp.out b/Test/baseResults/spv.460.comp.out
index 0925674..d53efde 100644
--- a/Test/baseResults/spv.460.comp.out
+++ b/Test/baseResults/spv.460.comp.out
@@ -1,6 +1,6 @@
 spv.460.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 15
 
                               Capability Shader
diff --git a/Test/baseResults/spv.460.frag.out b/Test/baseResults/spv.460.frag.out
index 067bd43..a8bec34 100644
--- a/Test/baseResults/spv.460.frag.out
+++ b/Test/baseResults/spv.460.frag.out
@@ -1,6 +1,6 @@
 spv.460.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
@@ -16,6 +16,7 @@
                               Name 8  "aui"
                               Name 10  "ui"
                               Decorate 8(aui) Offset 0
+                              Decorate 8(aui) DescriptorSet 0
                               Decorate 8(aui) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.460.vert.out b/Test/baseResults/spv.460.vert.out
index a73b7e1..e15f364 100644
--- a/Test/baseResults/spv.460.vert.out
+++ b/Test/baseResults/spv.460.vert.out
@@ -1,6 +1,6 @@
 spv.460.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.8bit-16bit-construction.frag.out b/Test/baseResults/spv.8bit-16bit-construction.frag.out
index 6cb9dc1..4eb9021 100644
--- a/Test/baseResults/spv.8bit-16bit-construction.frag.out
+++ b/Test/baseResults/spv.8bit-16bit-construction.frag.out
@@ -1,7 +1,7 @@
 spv.8bit-16bit-construction.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
diff --git a/Test/baseResults/spv.8bitstorage-int.frag.out b/Test/baseResults/spv.8bitstorage-int.frag.out
index 54a47af..00ef309 100644
--- a/Test/baseResults/spv.8bitstorage-int.frag.out
+++ b/Test/baseResults/spv.8bitstorage-int.frag.out
@@ -1,6 +1,6 @@
 spv.8bitstorage-int.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 171
 
                               Capability Shader
@@ -92,7 +92,7 @@
                               MemberDecorate 17(B2) 7 Offset 236
                               Decorate 17(B2) BufferBlock
                               Decorate 19(b2) DescriptorSet 0
-                              Decorate 19(b2) Binding 0
+                              Decorate 19(b2) Binding 1
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 Offset 2
@@ -125,7 +125,7 @@
                               MemberDecorate 49(B5) 7 Offset 1696
                               Decorate 49(B5) Block
                               Decorate 51(b5) DescriptorSet 0
-                              Decorate 51(b5) Binding 0
+                              Decorate 51(b5) Binding 2
                               MemberDecorate 88(S2) 0 ColMajor
                               MemberDecorate 88(S2) 0 Offset 0
                               MemberDecorate 88(S2) 0 MatrixStride 16
@@ -136,7 +136,7 @@
                               MemberDecorate 90(B4) 1 Offset 80
                               Decorate 90(B4) BufferBlock
                               Decorate 92(b4) DescriptorSet 0
-                              Decorate 92(b4) Binding 0
+                              Decorate 92(b4) Binding 4
                               MemberDecorate 93(S2) 0 RowMajor
                               MemberDecorate 93(S2) 0 Offset 0
                               MemberDecorate 93(S2) 0 MatrixStride 16
@@ -145,7 +145,7 @@
                               MemberDecorate 94(B3) 0 Offset 0
                               Decorate 94(B3) BufferBlock
                               Decorate 96(b3) DescriptorSet 0
-                              Decorate 96(b3) Binding 0
+                              Decorate 96(b3) Binding 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 8 1
diff --git a/Test/baseResults/spv.8bitstorage-ssbo.vert.out b/Test/baseResults/spv.8bitstorage-ssbo.vert.out
index 274639b..863eb68 100644
--- a/Test/baseResults/spv.8bitstorage-ssbo.vert.out
+++ b/Test/baseResults/spv.8bitstorage-ssbo.vert.out
@@ -1,6 +1,6 @@
 spv.8bitstorage-ssbo.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 28
 
                               Capability Shader
diff --git a/Test/baseResults/spv.8bitstorage-ubo.vert.out b/Test/baseResults/spv.8bitstorage-ubo.vert.out
index af95a76..c64945f 100644
--- a/Test/baseResults/spv.8bitstorage-ubo.vert.out
+++ b/Test/baseResults/spv.8bitstorage-ubo.vert.out
@@ -1,6 +1,6 @@
 spv.8bitstorage-ubo.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.8bitstorage-uint.frag.out b/Test/baseResults/spv.8bitstorage-uint.frag.out
index 6565882..5809991 100644
--- a/Test/baseResults/spv.8bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.8bitstorage-uint.frag.out
@@ -1,6 +1,6 @@
 spv.8bitstorage-uint.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 173
 
                               Capability Shader
@@ -92,7 +92,7 @@
                               MemberDecorate 17(B2) 7 Offset 236
                               Decorate 17(B2) BufferBlock
                               Decorate 19(b2) DescriptorSet 0
-                              Decorate 19(b2) Binding 0
+                              Decorate 19(b2) Binding 1
                               Decorate 22 ArrayStride 16
                               MemberDecorate 23(S) 0 Offset 0
                               MemberDecorate 23(S) 1 Offset 2
@@ -125,7 +125,7 @@
                               MemberDecorate 49(B5) 7 Offset 1696
                               Decorate 49(B5) Block
                               Decorate 51(b5) DescriptorSet 0
-                              Decorate 51(b5) Binding 0
+                              Decorate 51(b5) Binding 2
                               MemberDecorate 89(S2) 0 ColMajor
                               MemberDecorate 89(S2) 0 Offset 0
                               MemberDecorate 89(S2) 0 MatrixStride 16
@@ -136,7 +136,7 @@
                               MemberDecorate 91(B4) 1 Offset 80
                               Decorate 91(B4) BufferBlock
                               Decorate 93(b4) DescriptorSet 0
-                              Decorate 93(b4) Binding 0
+                              Decorate 93(b4) Binding 4
                               MemberDecorate 94(S2) 0 RowMajor
                               MemberDecorate 94(S2) 0 Offset 0
                               MemberDecorate 94(S2) 0 MatrixStride 16
@@ -145,7 +145,7 @@
                               MemberDecorate 95(B3) 0 Offset 0
                               Decorate 95(B3) BufferBlock
                               Decorate 97(b3) DescriptorSet 0
-                              Decorate 97(b3) Binding 0
+                              Decorate 97(b3) Binding 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 8 0
diff --git a/Test/baseResults/spv.AnyHitShader.rahit.out b/Test/baseResults/spv.AnyHitShader.rahit.out
index 6bef52d..c893f88 100644
--- a/Test/baseResults/spv.AnyHitShader.rahit.out
+++ b/Test/baseResults/spv.AnyHitShader.rahit.out
@@ -1,6 +1,6 @@
 spv.AnyHitShader.rahit
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 81
 
                               Capability RayTracingNV
@@ -53,7 +53,7 @@
                               Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminNV) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTNV) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
                               Decorate 58(gl_HitKindNV) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectKHR
@@ -153,10 +153,10 @@
                               SelectionMerge 79 None
                               BranchConditional 77 78 80
               78:               Label
-                                IgnoreIntersectionKHR
+                                IgnoreIntersectionNV
                                 Branch 79
               80:               Label
-                                TerminateRayKHR
+                                TerminateRayNV
                                 Branch 79
               79:             Label
                               Return
diff --git a/Test/baseResults/spv.AofA.frag.out b/Test/baseResults/spv.AofA.frag.out
index c9f8b46..57cdcb0 100644
--- a/Test/baseResults/spv.AofA.frag.out
+++ b/Test/baseResults/spv.AofA.frag.out
@@ -3,7 +3,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 104
 
                               Capability Shader
@@ -30,9 +30,15 @@
                               Name 94  "uAofA"
                               MemberName 94(uAofA) 0  "f"
                               Name 98  "nameAofA"
+                              Decorate 39(outfloat) Location 0
+                              Decorate 44(g5) Location 1
                               Decorate 68(i) Flat
+                              Decorate 68(i) Location 36
                               Decorate 70(j) Flat
+                              Decorate 70(j) Location 37
                               Decorate 72(k) Flat
+                              Decorate 72(k) Location 38
+                              Decorate 78(infloat) Location 0
                               Decorate 92 ArrayStride 16
                               Decorate 93 ArrayStride 64
                               MemberDecorate 94(uAofA) 0 Offset 0
diff --git a/Test/baseResults/spv.ClosestHitShader.rchit.out b/Test/baseResults/spv.ClosestHitShader.rchit.out
index cefdc50..b76629c 100644
--- a/Test/baseResults/spv.ClosestHitShader.rchit.out
+++ b/Test/baseResults/spv.ClosestHitShader.rchit.out
@@ -1,6 +1,6 @@
 spv.ClosestHitShader.rchit
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 88
 
                               Capability RayTracingNV
@@ -55,7 +55,7 @@
                               Decorate 42(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminNV) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTNV) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTNV) BuiltIn HitTNV
                               Decorate 58(gl_HitKindNV) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldNV) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectNV) BuiltIn WorldToObjectKHR
@@ -164,6 +164,6 @@
               68:          60 Load 67(gl_WorldToObjectNV)
                               Store 66(v14) 68
               72:          69 Load 71(accNV)
-                              TraceRayKHR 72 73 74 75 76 73 78 77 80 81 82
+                              TraceNV 72 73 74 75 76 73 78 77 80 81 82
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.GeometryShaderPassthrough.geom.out b/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
index 7e62c57..4b29238 100644
--- a/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
+++ b/Test/baseResults/spv.GeometryShaderPassthrough.geom.out
@@ -1,6 +1,6 @@
 spv.GeometryShaderPassthrough.geom
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 15
 
                               Capability Geometry
@@ -27,6 +27,7 @@
                               Decorate 8(gl_PerVertex) Block
                               Decorate 10 PassthroughNV
                               Decorate 12(Inputs) Block
+                              Decorate 14 Location 0
                               Decorate 14 PassthroughNV
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.IntersectShader.rint.out b/Test/baseResults/spv.IntersectShader.rint.out
index bf99241..7b0058c 100644
--- a/Test/baseResults/spv.IntersectShader.rint.out
+++ b/Test/baseResults/spv.IntersectShader.rint.out
@@ -1,6 +1,6 @@
 spv.IntersectShader.rint
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 71
 
                               Capability RayTracingNV
diff --git a/Test/baseResults/spv.MissShader.rmiss.out b/Test/baseResults/spv.MissShader.rmiss.out
index b811044..e573bba 100644
--- a/Test/baseResults/spv.MissShader.rmiss.out
+++ b/Test/baseResults/spv.MissShader.rmiss.out
@@ -1,13 +1,13 @@
 spv.MissShader.rmiss
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 60
+// Generated by (magic number): 8000a
+// Id's are bound by 59
 
                               Capability RayTracingNV
                               Extension  "SPV_NV_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MissKHR 4  "main" 11 14 21 24 27 30 35 38
+                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 34 37
                               Source GLSL 460
                               SourceExtension  "GL_NV_ray_tracing"
                               Name 4  "main"
@@ -19,29 +19,26 @@
                               Name 21  "gl_WorldRayOriginNV"
                               Name 23  "v3"
                               Name 24  "gl_WorldRayDirectionNV"
-                              Name 26  "v4"
-                              Name 27  "gl_ObjectRayOriginNV"
-                              Name 29  "v5"
-                              Name 30  "gl_ObjectRayDirectionNV"
-                              Name 33  "v6"
-                              Name 35  "gl_RayTminNV"
-                              Name 37  "v7"
-                              Name 38  "gl_RayTmaxNV"
-                              Name 42  "accNV"
-                              Name 57  "localPayload"
-                              Name 59  "incomingPayload"
+                              Name 27  "v4"
+                              Name 29  "gl_IncomingRayFlagsNV"
+                              Name 32  "v6"
+                              Name 34  "gl_RayTminNV"
+                              Name 36  "v7"
+                              Name 37  "gl_RayTmaxNV"
+                              Name 41  "accNV"
+                              Name 56  "localPayload"
+                              Name 58  "incomingPayload"
                               Decorate 11(gl_LaunchIDNV) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeNV) BuiltIn LaunchSizeKHR
                               Decorate 21(gl_WorldRayOriginNV) BuiltIn WorldRayOriginKHR
                               Decorate 24(gl_WorldRayDirectionNV) BuiltIn WorldRayDirectionKHR
-                              Decorate 27(gl_ObjectRayOriginNV) BuiltIn ObjectRayOriginKHR
-                              Decorate 30(gl_ObjectRayDirectionNV) BuiltIn ObjectRayDirectionKHR
-                              Decorate 35(gl_RayTminNV) BuiltIn RayTminKHR
-                              Decorate 38(gl_RayTmaxNV) BuiltIn RayTmaxKHR
-                              Decorate 42(accNV) DescriptorSet 0
-                              Decorate 42(accNV) Binding 0
-                              Decorate 57(localPayload) Location 0
-                              Decorate 59(incomingPayload) Location 1
+                              Decorate 29(gl_IncomingRayFlagsNV) BuiltIn IncomingRayFlagsKHR
+                              Decorate 34(gl_RayTminNV) BuiltIn RayTminKHR
+                              Decorate 37(gl_RayTmaxNV) BuiltIn RayTmaxKHR
+                              Decorate 41(accNV) DescriptorSet 0
+                              Decorate 41(accNV) Binding 0
+                              Decorate 56(localPayload) Location 0
+                              Decorate 58(incomingPayload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -56,41 +53,41 @@
               20:             TypePointer Input 17(fvec3)
 21(gl_WorldRayOriginNV):     20(ptr) Variable Input
 24(gl_WorldRayDirectionNV):     20(ptr) Variable Input
-27(gl_ObjectRayOriginNV):     20(ptr) Variable Input
-30(gl_ObjectRayDirectionNV):     20(ptr) Variable Input
-              32:             TypePointer Function 16(float)
-              34:             TypePointer Input 16(float)
-35(gl_RayTminNV):     34(ptr) Variable Input
-38(gl_RayTmaxNV):     34(ptr) Variable Input
-              40:             TypeAccelerationStructureKHR
-              41:             TypePointer UniformConstant 40
-       42(accNV):     41(ptr) Variable UniformConstant
-              44:      6(int) Constant 0
-              45:      6(int) Constant 1
-              46:      6(int) Constant 2
-              47:      6(int) Constant 3
-              48:   16(float) Constant 1056964608
-              49:   17(fvec3) ConstantComposite 48 48 48
-              50:   16(float) Constant 1065353216
-              51:   17(fvec3) ConstantComposite 50 50 50
-              52:   16(float) Constant 1061158912
-              53:             TypeInt 32 1
-              54:     53(int) Constant 1
-              55:             TypeVector 16(float) 4
-              56:             TypePointer RayPayloadKHR 55(fvec4)
-57(localPayload):     56(ptr) Variable RayPayloadKHR
-              58:             TypePointer IncomingRayPayloadKHR 55(fvec4)
-59(incomingPayload):     58(ptr) Variable IncomingRayPayloadKHR
+              26:             TypePointer Function 6(int)
+              28:             TypePointer Input 6(int)
+29(gl_IncomingRayFlagsNV):     28(ptr) Variable Input
+              31:             TypePointer Function 16(float)
+              33:             TypePointer Input 16(float)
+34(gl_RayTminNV):     33(ptr) Variable Input
+37(gl_RayTmaxNV):     33(ptr) Variable Input
+              39:             TypeAccelerationStructureKHR
+              40:             TypePointer UniformConstant 39
+       41(accNV):     40(ptr) Variable UniformConstant
+              43:      6(int) Constant 0
+              44:      6(int) Constant 1
+              45:      6(int) Constant 2
+              46:      6(int) Constant 3
+              47:   16(float) Constant 1056964608
+              48:   17(fvec3) ConstantComposite 47 47 47
+              49:   16(float) Constant 1065353216
+              50:   17(fvec3) ConstantComposite 49 49 49
+              51:   16(float) Constant 1061158912
+              52:             TypeInt 32 1
+              53:     52(int) Constant 1
+              54:             TypeVector 16(float) 4
+              55:             TypePointer RayPayloadKHR 54(fvec4)
+56(localPayload):     55(ptr) Variable RayPayloadKHR
+              57:             TypePointer IncomingRayPayloadKHR 54(fvec4)
+58(incomingPayload):     57(ptr) Variable IncomingRayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
           13(v1):      8(ptr) Variable Function
           19(v2):     18(ptr) Variable Function
           23(v3):     18(ptr) Variable Function
-          26(v4):     18(ptr) Variable Function
-          29(v5):     18(ptr) Variable Function
-          33(v6):     32(ptr) Variable Function
-          37(v7):     32(ptr) Variable Function
+          27(v4):     26(ptr) Variable Function
+          32(v6):     31(ptr) Variable Function
+          36(v7):     31(ptr) Variable Function
               12:    7(ivec3) Load 11(gl_LaunchIDNV)
                               Store 9(v0) 12
               15:    7(ivec3) Load 14(gl_LaunchSizeNV)
@@ -99,15 +96,13 @@
                               Store 19(v2) 22
               25:   17(fvec3) Load 24(gl_WorldRayDirectionNV)
                               Store 23(v3) 25
-              28:   17(fvec3) Load 27(gl_ObjectRayOriginNV)
-                              Store 26(v4) 28
-              31:   17(fvec3) Load 30(gl_ObjectRayDirectionNV)
-                              Store 29(v5) 31
-              36:   16(float) Load 35(gl_RayTminNV)
-                              Store 33(v6) 36
-              39:   16(float) Load 38(gl_RayTmaxNV)
-                              Store 37(v7) 39
-              43:          40 Load 42(accNV)
-                              TraceRayKHR 43 44 45 46 47 44 49 48 51 52 54
+              30:      6(int) Load 29(gl_IncomingRayFlagsNV)
+                              Store 27(v4) 30
+              35:   16(float) Load 34(gl_RayTminNV)
+                              Store 32(v6) 35
+              38:   16(float) Load 37(gl_RayTmaxNV)
+                              Store 36(v7) 38
+              42:          39 Load 41(accNV)
+                              TraceNV 42 43 44 45 46 43 48 47 50 51 53
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.OVR_multiview.vert.out b/Test/baseResults/spv.OVR_multiview.vert.out
index 66168dc..90afed2 100644
--- a/Test/baseResults/spv.OVR_multiview.vert.out
+++ b/Test/baseResults/spv.OVR_multiview.vert.out
@@ -1,6 +1,6 @@
 spv.OVR_multiview.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.Operations.frag.out b/Test/baseResults/spv.Operations.frag.out
index ad54f6c..a856e6e 100644
--- a/Test/baseResults/spv.Operations.frag.out
+++ b/Test/baseResults/spv.Operations.frag.out
@@ -1,6 +1,6 @@
 spv.Operations.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 583
 
                               Capability Shader
@@ -33,10 +33,17 @@
                               Name 564  "m2"
                               Name 580  "uiv4"
                               Name 582  "ub"
+                              Decorate 11(uv4) Location 1
                               Decorate 22(ui) Flat
+                              Decorate 22(ui) Location 3
+                              Decorate 220(uf) Location 2
                               Decorate 296(uui) Flat
+                              Decorate 296(uui) Location 5
                               Decorate 314(uuv4) Flat
+                              Decorate 314(uuv4) Location 4
+                              Decorate 539(FragColor) Location 0
                               Decorate 580(uiv4) Flat
+                              Decorate 580(uiv4) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -681,9 +688,9 @@
              502:               Label
              504:    6(float)   Load 196(f)
              505:    6(float)   Load 220(uf)
-             506:   186(bool)   FOrdNotEqual 504 505
+             506:   186(bool)   FUnordNotEqual 504 505
              507:    6(float)   Load 196(f)
-             509:   186(bool)   FOrdNotEqual 507 508
+             509:   186(bool)   FUnordNotEqual 507 508
              510:   186(bool)   LogicalAnd 506 509
                                 Branch 503
              503:             Label
diff --git a/Test/baseResults/spv.RayCallable.rcall.out b/Test/baseResults/spv.RayCallable.rcall.out
index b5e25be..75698fc 100644
--- a/Test/baseResults/spv.RayCallable.rcall.out
+++ b/Test/baseResults/spv.RayCallable.rcall.out
@@ -1,6 +1,6 @@
 spv.RayCallable.rcall
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability RayTracingNV
@@ -55,6 +55,6 @@
                               Store 13(size) 15
               23:     22(ptr) AccessChain 18 20
                               Store 23 21
-                              ExecuteCallableKHR 24 25
+                              ExecuteCallableNV 24 25
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.RayConstants.rgen.out b/Test/baseResults/spv.RayConstants.rgen.out
index 97b47b7..962aeb7 100644
--- a/Test/baseResults/spv.RayConstants.rgen.out
+++ b/Test/baseResults/spv.RayConstants.rgen.out
@@ -1,6 +1,6 @@
 spv.RayConstants.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability RayTracingNV
@@ -41,6 +41,6 @@
          4(main):           2 Function None 3
                5:             Label
                9:           6 Load 8(accNV)
-                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 23
+                              TraceNV 9 11 12 13 13 12 17 18 20 21 23
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.RayGenShader.rgen.out b/Test/baseResults/spv.RayGenShader.rgen.out
index 47b7c92..f8f3fd6 100644
--- a/Test/baseResults/spv.RayGenShader.rgen.out
+++ b/Test/baseResults/spv.RayGenShader.rgen.out
@@ -1,6 +1,6 @@
 spv.RayGenShader.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 54
 
                               Capability RayTracingNV
@@ -31,6 +31,8 @@
                               MemberDecorate 37(block) 0 Offset 0
                               MemberDecorate 37(block) 1 Offset 16
                               Decorate 37(block) BufferBlock
+                              Decorate 39 DescriptorSet 0
+                              Decorate 39 Binding 2
                               Decorate 50(accNV1) DescriptorSet 0
                               Decorate 50(accNV1) Binding 1
                               Decorate 53(payload) Location 0
@@ -90,6 +92,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceNV 30 31 32 33 34 12 44 45 48 49 41
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.RayGenShader11.rgen.out b/Test/baseResults/spv.RayGenShader11.rgen.out
old mode 100755
new mode 100644
index 0bbcab9..f6b79c5
--- a/Test/baseResults/spv.RayGenShader11.rgen.out
+++ b/Test/baseResults/spv.RayGenShader11.rgen.out
@@ -1,6 +1,6 @@
 spv.RayGenShader11.rgen
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability RayTracingNV
@@ -30,6 +30,8 @@
                               MemberDecorate 37(block) 0 Offset 0
                               MemberDecorate 37(block) 1 Offset 16
                               Decorate 37(block) Block
+                              Decorate 39 DescriptorSet 0
+                              Decorate 39 Binding 1
                               Decorate 52(payload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
@@ -86,6 +88,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceNV 30 31 32 33 34 12 44 45 48 49 41
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.RayGenShaderArray.rgen.out b/Test/baseResults/spv.RayGenShaderArray.rgen.out
index ce5f016..63a04b3 100644
--- a/Test/baseResults/spv.RayGenShaderArray.rgen.out
+++ b/Test/baseResults/spv.RayGenShaderArray.rgen.out
@@ -1,6 +1,6 @@
 spv.RayGenShaderArray.rgen
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 89
 
                               Capability ShaderNonUniformEXT
@@ -37,6 +37,8 @@
                               MemberDecorate 34(block) 1 Offset 16
                               MemberDecorate 34(block) 2 Offset 28
                               Decorate 34(block) BufferBlock
+                              Decorate 36 DescriptorSet 0
+                              Decorate 36 Binding 2
                               Decorate 60(accNV1) DescriptorSet 0
                               Decorate 60(accNV1) Binding 1
                               Decorate 75 DecorationNonUniformEXT
@@ -109,7 +111,7 @@
               51:   32(fvec3) Load 50
               54:     49(ptr) AccessChain 36 53
               55:   32(fvec3) Load 54
-                              TraceRayKHR 43 44 45 46 47 12 51 52 55 56 48
+                              TraceNV 43 44 45 46 47 12 51 52 55 56 48
               61:     38(ptr) AccessChain 36 37
               62:     33(int) Load 61
               63:     41(ptr) AccessChain 60(accNV1) 62
@@ -122,7 +124,7 @@
               70:   32(fvec3) Load 69
               71:     49(ptr) AccessChain 36 53
               72:   32(fvec3) Load 71
-                              TraceRayKHR 64 65 66 67 68 12 70 52 72 56 48
+                              TraceNV 64 65 66 67 68 12 70 52 72 56 48
               73:     38(ptr) AccessChain 36 37
               74:     33(int) Load 73
               75:     33(int) CopyObject 74
@@ -136,6 +138,6 @@
               83:   32(fvec3) Load 82
               84:     49(ptr) AccessChain 36 53
               85:   32(fvec3) Load 84
-                              TraceRayKHR 77 78 79 80 81 12 83 52 85 56 48
+                              TraceNV 77 78 79 80 81 12 83 52 85 56 48
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp.out
new file mode 100644
index 0000000..31dd2dd
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp.out
@@ -0,0 +1,54 @@
+spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+                              Capability Shader
+                              Capability Float16
+                              Capability Int16
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Capability CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 10
+                              ExecutionMode 4 LocalSize 2 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 8  "first"
+                              MemberName 8(first) 0  "a"
+                              MemberName 8(first) 1  "f"
+                              Name 10  ""
+                              MemberDecorate 8(first) 0 Offset 0
+                              MemberDecorate 8(first) 1 Offset 2
+                              Decorate 8(first) Block
+                              Decorate 24 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 16 1
+               7:             TypeFloat 16
+        8(first):             TypeStruct 6(int16_t) 7(float16_t)
+               9:             TypePointer Workgroup 8(first)
+              10:      9(ptr) Variable Workgroup
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:  6(int16_t) Constant 3
+              14:             TypePointer Workgroup 6(int16_t)
+              16:     11(int) Constant 1
+              17:7(float16_t) Constant 18982
+              18:             TypePointer Workgroup 7(float16_t)
+              20:             TypeInt 32 0
+              21:             TypeVector 20(int) 3
+              22:     20(int) Constant 2
+              23:     20(int) Constant 1
+              24:   21(ivec3) ConstantComposite 22 23 23
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 10 12
+                              Store 15 13
+              19:     18(ptr) AccessChain 10 16
+                              Store 19 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp.out
new file mode 100644
index 0000000..3447791
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp.out
@@ -0,0 +1,45 @@
+spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 20
+
+                              Capability Shader
+                              Capability Int8
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Capability CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 9
+                              ExecutionMode 4 LocalSize 2 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types"
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 7  "first"
+                              MemberName 7(first) 0  "a"
+                              Name 9  ""
+                              MemberDecorate 7(first) 0 Offset 0
+                              Decorate 7(first) Block
+                              Decorate 19 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 1
+        7(first):             TypeStruct 6(int8_t)
+               8:             TypePointer Workgroup 7(first)
+               9:      8(ptr) Variable Workgroup
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+              12:   6(int8_t) Constant 2
+              13:             TypePointer Workgroup 6(int8_t)
+              15:             TypeInt 32 0
+              16:             TypeVector 15(int) 3
+              17:     15(int) Constant 2
+              18:     15(int) Constant 1
+              19:   16(ivec3) ConstantComposite 17 18 18
+         4(main):           2 Function None 3
+               5:             Label
+              14:     13(ptr) AccessChain 9 11
+                              Store 14 12
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp.out
new file mode 100644
index 0000000..82495d1
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp.out
@@ -0,0 +1,4 @@
+spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp
+ERROR: Linking compute stage: cannot mix use of shared variables inside and outside blocks
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp.out
new file mode 100644
index 0000000..b578bd3
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp.out
@@ -0,0 +1,54 @@
+spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 24
+
+                              Capability Shader
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 9 16
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 7  "first"
+                              MemberName 7(first) 0  "a"
+                              Name 9  ""
+                              Name 14  "second"
+                              MemberName 14(second) 0  "b"
+                              Name 16  ""
+                              MemberDecorate 7(first) 0 Offset 0
+                              Decorate 7(first) Block
+                              MemberDecorate 14(second) 0 Offset 0
+                              Decorate 14(second) Block
+                              Decorate 23 BuiltIn WorkgroupSize
+                              Decorate 9 Aliased
+                              Decorate 16 Aliased
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+        7(first):             TypeStruct 6(int)
+               8:             TypePointer Workgroup 7(first)
+               9:      8(ptr) Variable Workgroup
+              10:      6(int) Constant 0
+              11:      6(int) Constant 2
+              12:             TypePointer Workgroup 6(int)
+      14(second):             TypeStruct 6(int)
+              15:             TypePointer Workgroup 14(second)
+              16:     15(ptr) Variable Workgroup
+              17:      6(int) Constant 3
+              19:             TypeInt 32 0
+              20:             TypeVector 19(int) 3
+              21:     19(int) Constant 8
+              22:     19(int) Constant 1
+              23:   20(ivec3) ConstantComposite 21 22 22
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9 10
+                              Store 13 11
+              18:     12(ptr) AccessChain 16 10
+                              Store 18 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp.out
new file mode 100644
index 0000000..19bcff6
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp.out
@@ -0,0 +1,35 @@
+spv.WorkgroupMemoryExplicitLayout.NonBlock.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 17
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 8 10
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 8  "a"
+                              Name 10  "b"
+                              Decorate 16 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Workgroup 6(int)
+            8(a):      7(ptr) Variable Workgroup
+               9:      6(int) Constant 2
+           10(b):      7(ptr) Variable Workgroup
+              11:      6(int) Constant 3
+              12:             TypeInt 32 0
+              13:             TypeVector 12(int) 3
+              14:     12(int) Constant 8
+              15:     12(int) Constant 1
+              16:   13(ivec3) ConstantComposite 14 15 15
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(a) 9
+                              Store 10(b) 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp.out
new file mode 100644
index 0000000..413fd2e
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp.out
@@ -0,0 +1,41 @@
+spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 19
+
+                              Capability Shader
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 9
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 7  "first"
+                              MemberName 7(first) 0  "a"
+                              Name 9  ""
+                              MemberDecorate 7(first) 0 Offset 0
+                              Decorate 7(first) Block
+                              Decorate 18 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+        7(first):             TypeStruct 6(int)
+               8:             TypePointer Workgroup 7(first)
+               9:      8(ptr) Variable Workgroup
+              10:      6(int) Constant 0
+              11:      6(int) Constant 2
+              12:             TypePointer Workgroup 6(int)
+              14:             TypeInt 32 0
+              15:             TypeVector 14(int) 3
+              16:     14(int) Constant 8
+              17:     14(int) Constant 1
+              18:   15(ivec3) ConstantComposite 16 17 17
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9 10
+                              Store 13 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.scalar.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.scalar.comp.out
new file mode 100644
index 0000000..6a43e23
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.scalar.comp.out
@@ -0,0 +1,84 @@
+spv.WorkgroupMemoryExplicitLayout.scalar.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 28
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 17  "T"
+                              MemberName 17(T) 0  "t"
+                              Name 24  "S"
+                              MemberName 24(S) 0  "f"
+                              MemberName 24(S) 1  "v2"
+                              MemberName 24(S) 2  "v3"
+                              MemberName 24(S) 3  "v4"
+                              MemberName 24(S) 4  "t"
+                              MemberName 24(S) 5  "f_array"
+                              MemberName 24(S) 6  "v2_array"
+                              MemberName 24(S) 7  "v3_array"
+                              MemberName 24(S) 8  "v4_array"
+                              MemberName 24(S) 9  "t_array"
+                              Name 26  "Block"
+                              MemberName 26(Block) 0  "s"
+                              MemberName 26(Block) 1  "s_array"
+                              Name 28  ""
+                              Decorate 10 BuiltIn WorkgroupSize
+                              Decorate 16 ArrayStride 4
+                              MemberDecorate 17(T) 0 Offset 0
+                              Decorate 19 ArrayStride 4
+                              Decorate 20 ArrayStride 8
+                              Decorate 21 ArrayStride 12
+                              Decorate 22 ArrayStride 16
+                              Decorate 23 ArrayStride 12
+                              MemberDecorate 24(S) 0 Offset 0
+                              MemberDecorate 24(S) 1 Offset 4
+                              MemberDecorate 24(S) 2 Offset 12
+                              MemberDecorate 24(S) 3 Offset 24
+                              MemberDecorate 24(S) 4 Offset 40
+                              MemberDecorate 24(S) 5 Offset 52
+                              MemberDecorate 24(S) 6 Offset 76
+                              MemberDecorate 24(S) 7 Offset 124
+                              MemberDecorate 24(S) 8 Offset 196
+                              MemberDecorate 24(S) 9 Offset 292
+                              Decorate 25 ArrayStride 364
+                              MemberDecorate 26(Block) 0 Offset 0
+                              MemberDecorate 26(Block) 1 Offset 364
+                              Decorate 26(Block) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:      6(int) Constant 8
+               9:      6(int) Constant 1
+              10:    7(ivec3) ConstantComposite 8 9 9
+              11:             TypeFloat 32
+              12:             TypeVector 11(float) 2
+              13:             TypeVector 11(float) 3
+              14:             TypeVector 11(float) 4
+              15:      6(int) Constant 3
+              16:             TypeArray 11(float) 15
+           17(T):             TypeStruct 16
+              18:      6(int) Constant 6
+              19:             TypeArray 11(float) 18
+              20:             TypeArray 12(fvec2) 18
+              21:             TypeArray 13(fvec3) 18
+              22:             TypeArray 14(fvec4) 18
+              23:             TypeArray 17(T) 18
+           24(S):             TypeStruct 11(float) 12(fvec2) 13(fvec3) 14(fvec4) 17(T) 19 20 21 22 23
+              25:             TypeArray 24(S) 18
+       26(Block):             TypeStruct 24(S) 25
+              27:             TypePointer Workgroup 26(Block)
+              28:     27(ptr) Variable Workgroup
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std140.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std140.comp.out
new file mode 100644
index 0000000..df4b8ae
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std140.comp.out
@@ -0,0 +1,83 @@
+spv.WorkgroupMemoryExplicitLayout.std140.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 28
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 17  "T"
+                              MemberName 17(T) 0  "t"
+                              Name 24  "S"
+                              MemberName 24(S) 0  "f"
+                              MemberName 24(S) 1  "v2"
+                              MemberName 24(S) 2  "v3"
+                              MemberName 24(S) 3  "v4"
+                              MemberName 24(S) 4  "t"
+                              MemberName 24(S) 5  "f_array"
+                              MemberName 24(S) 6  "v2_array"
+                              MemberName 24(S) 7  "v3_array"
+                              MemberName 24(S) 8  "v4_array"
+                              MemberName 24(S) 9  "t_array"
+                              Name 26  "Block"
+                              MemberName 26(Block) 0  "s"
+                              MemberName 26(Block) 1  "s_array"
+                              Name 28  ""
+                              Decorate 10 BuiltIn WorkgroupSize
+                              Decorate 16 ArrayStride 16
+                              MemberDecorate 17(T) 0 Offset 0
+                              Decorate 19 ArrayStride 16
+                              Decorate 20 ArrayStride 16
+                              Decorate 21 ArrayStride 16
+                              Decorate 22 ArrayStride 16
+                              Decorate 23 ArrayStride 48
+                              MemberDecorate 24(S) 0 Offset 0
+                              MemberDecorate 24(S) 1 Offset 8
+                              MemberDecorate 24(S) 2 Offset 16
+                              MemberDecorate 24(S) 3 Offset 32
+                              MemberDecorate 24(S) 4 Offset 48
+                              MemberDecorate 24(S) 5 Offset 96
+                              MemberDecorate 24(S) 6 Offset 192
+                              MemberDecorate 24(S) 7 Offset 288
+                              MemberDecorate 24(S) 8 Offset 384
+                              MemberDecorate 24(S) 9 Offset 480
+                              Decorate 25 ArrayStride 768
+                              MemberDecorate 26(Block) 0 Offset 0
+                              MemberDecorate 26(Block) 1 Offset 768
+                              Decorate 26(Block) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:      6(int) Constant 8
+               9:      6(int) Constant 1
+              10:    7(ivec3) ConstantComposite 8 9 9
+              11:             TypeFloat 32
+              12:             TypeVector 11(float) 2
+              13:             TypeVector 11(float) 3
+              14:             TypeVector 11(float) 4
+              15:      6(int) Constant 3
+              16:             TypeArray 11(float) 15
+           17(T):             TypeStruct 16
+              18:      6(int) Constant 6
+              19:             TypeArray 11(float) 18
+              20:             TypeArray 12(fvec2) 18
+              21:             TypeArray 13(fvec3) 18
+              22:             TypeArray 14(fvec4) 18
+              23:             TypeArray 17(T) 18
+           24(S):             TypeStruct 11(float) 12(fvec2) 13(fvec3) 14(fvec4) 17(T) 19 20 21 22 23
+              25:             TypeArray 24(S) 18
+       26(Block):             TypeStruct 24(S) 25
+              27:             TypePointer Workgroup 26(Block)
+              28:     27(ptr) Variable Workgroup
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std430.comp.out b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std430.comp.out
new file mode 100644
index 0000000..e782784
--- /dev/null
+++ b/Test/baseResults/spv.WorkgroupMemoryExplicitLayout.std430.comp.out
@@ -0,0 +1,83 @@
+spv.WorkgroupMemoryExplicitLayout.std430.comp
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability CapabilityWorkgroupMemoryExplicitLayoutKHR
+                              Extension  "SPV_KHR_workgroup_memory_explicit_layout"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 28
+                              ExecutionMode 4 LocalSize 8 1 1
+                              Source GLSL 430
+                              SourceExtension  "GL_EXT_shared_memory_block"
+                              Name 4  "main"
+                              Name 17  "T"
+                              MemberName 17(T) 0  "t"
+                              Name 24  "S"
+                              MemberName 24(S) 0  "f"
+                              MemberName 24(S) 1  "v2"
+                              MemberName 24(S) 2  "v3"
+                              MemberName 24(S) 3  "v4"
+                              MemberName 24(S) 4  "t"
+                              MemberName 24(S) 5  "f_array"
+                              MemberName 24(S) 6  "v2_array"
+                              MemberName 24(S) 7  "v3_array"
+                              MemberName 24(S) 8  "v4_array"
+                              MemberName 24(S) 9  "t_array"
+                              Name 26  "Block"
+                              MemberName 26(Block) 0  "s"
+                              MemberName 26(Block) 1  "s_array"
+                              Name 28  ""
+                              Decorate 10 BuiltIn WorkgroupSize
+                              Decorate 16 ArrayStride 4
+                              MemberDecorate 17(T) 0 Offset 0
+                              Decorate 19 ArrayStride 4
+                              Decorate 20 ArrayStride 8
+                              Decorate 21 ArrayStride 16
+                              Decorate 22 ArrayStride 16
+                              Decorate 23 ArrayStride 12
+                              MemberDecorate 24(S) 0 Offset 0
+                              MemberDecorate 24(S) 1 Offset 8
+                              MemberDecorate 24(S) 2 Offset 16
+                              MemberDecorate 24(S) 3 Offset 32
+                              MemberDecorate 24(S) 4 Offset 48
+                              MemberDecorate 24(S) 5 Offset 60
+                              MemberDecorate 24(S) 6 Offset 88
+                              MemberDecorate 24(S) 7 Offset 144
+                              MemberDecorate 24(S) 8 Offset 240
+                              MemberDecorate 24(S) 9 Offset 336
+                              Decorate 25 ArrayStride 416
+                              MemberDecorate 26(Block) 0 Offset 0
+                              MemberDecorate 26(Block) 1 Offset 416
+                              Decorate 26(Block) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:      6(int) Constant 8
+               9:      6(int) Constant 1
+              10:    7(ivec3) ConstantComposite 8 9 9
+              11:             TypeFloat 32
+              12:             TypeVector 11(float) 2
+              13:             TypeVector 11(float) 3
+              14:             TypeVector 11(float) 4
+              15:      6(int) Constant 3
+              16:             TypeArray 11(float) 15
+           17(T):             TypeStruct 16
+              18:      6(int) Constant 6
+              19:             TypeArray 11(float) 18
+              20:             TypeArray 12(fvec2) 18
+              21:             TypeArray 13(fvec3) 18
+              22:             TypeArray 14(fvec4) 18
+              23:             TypeArray 17(T) 18
+           24(S):             TypeStruct 11(float) 12(fvec2) 13(fvec3) 14(fvec4) 17(T) 19 20 21 22 23
+              25:             TypeArray 24(S) 18
+       26(Block):             TypeStruct 24(S) 25
+              27:             TypePointer Workgroup 26(Block)
+              28:     27(ptr) Variable Workgroup
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.accessChain.frag.out b/Test/baseResults/spv.accessChain.frag.out
index c5c71a5..753688f 100644
--- a/Test/baseResults/spv.accessChain.frag.out
+++ b/Test/baseResults/spv.accessChain.frag.out
@@ -1,6 +1,6 @@
 spv.accessChain.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 222
 
                               Capability Shader
@@ -71,6 +71,7 @@
                               Name 219  "param"
                               Decorate 69(OutColor) Location 0
                               Decorate 170(u) Flat
+                              Decorate 170(u) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.aggOps.frag.out b/Test/baseResults/spv.aggOps.frag.out
index 976c747..05b14ea 100644
--- a/Test/baseResults/spv.aggOps.frag.out
+++ b/Test/baseResults/spv.aggOps.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 215
 
                               Capability Shader
@@ -44,6 +44,8 @@
                               Name 97  "samp2D"
                               Name 101  "coord"
                               Name 213  "color"
+                              Decorate 16(u) Location 1
+                              Decorate 41(w) Location 2
                               MemberDecorate 55(s1) 0 Offset 0
                               MemberDecorate 55(s1) 1 Offset 4
                               MemberDecorate 56(s2) 0 Offset 0
@@ -52,7 +54,7 @@
                               MemberDecorate 57(ub1) 0 Offset 0
                               Decorate 57(ub1) Block
                               Decorate 59(uName1) DescriptorSet 0
-                              Decorate 59(uName1) Binding 0
+                              Decorate 59(uName1) Binding 1
                               MemberDecorate 64(s1) 0 Offset 0
                               MemberDecorate 64(s1) 1 Offset 4
                               MemberDecorate 65(s2) 0 Offset 0
@@ -61,14 +63,16 @@
                               MemberDecorate 66(ub2) 0 Offset 0
                               Decorate 66(ub2) BufferBlock
                               Decorate 68(uName2) DescriptorSet 0
-                              Decorate 68(uName2) Binding 0
+                              Decorate 68(uName2) Binding 2
                               Decorate 97(samp2D) DescriptorSet 0
                               Decorate 97(samp2D) Binding 0
                               Decorate 101(coord) RelaxedPrecision
+                              Decorate 101(coord) Location 0
                               Decorate 102 RelaxedPrecision
                               Decorate 107 RelaxedPrecision
                               Decorate 108 RelaxedPrecision
                               Decorate 129 RelaxedPrecision
+                              Decorate 213(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -208,7 +212,7 @@
              116:             Label
              120:   14(fvec4) Load 16(u)
              121:   14(fvec4) Load 93(v)
-             122:  112(bvec4) FOrdNotEqual 120 121
+             122:  112(bvec4) FUnordNotEqual 120 121
              123:    72(bool) Any 122
                               SelectionMerge 125 None
                               BranchConditional 123 124 125
@@ -279,7 +283,7 @@
              182:    72(bool) INotEqual 180 181
              183:    7(float) CompositeExtract 178 1
              184:    7(float) CompositeExtract 179 1
-             185:    72(bool) FOrdNotEqual 183 184
+             185:    72(bool) FUnordNotEqual 183 184
              186:    72(bool) LogicalOr 182 185
              187:       8(s1) CompositeExtract 176 1
              188:       8(s1) CompositeExtract 177 1
@@ -288,7 +292,7 @@
              191:    72(bool) INotEqual 189 190
              192:    7(float) CompositeExtract 187 1
              193:    7(float) CompositeExtract 188 1
-             194:    72(bool) FOrdNotEqual 192 193
+             194:    72(bool) FUnordNotEqual 192 193
              195:    72(bool) LogicalOr 191 194
              196:    72(bool) LogicalOr 186 195
              197:       8(s1) CompositeExtract 176 2
@@ -298,7 +302,7 @@
              201:    72(bool) INotEqual 199 200
              202:    7(float) CompositeExtract 197 1
              203:    7(float) CompositeExtract 198 1
-             204:    72(bool) FOrdNotEqual 202 203
+             204:    72(bool) FUnordNotEqual 202 203
              205:    72(bool) LogicalOr 201 204
              206:    72(bool) LogicalOr 196 205
                               SelectionMerge 208 None
diff --git a/Test/baseResults/spv.always-discard.frag.out b/Test/baseResults/spv.always-discard.frag.out
index fb4529e..ed21b38 100644
--- a/Test/baseResults/spv.always-discard.frag.out
+++ b/Test/baseResults/spv.always-discard.frag.out
@@ -1,6 +1,6 @@
 spv.always-discard.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               Name 30  "y"
                               Name 36  "radius"
                               Name 59  "gl_FragColor"
+                              Decorate 21(tex_coord) Location 0
                               Decorate 59(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.always-discard2.frag.out b/Test/baseResults/spv.always-discard2.frag.out
index 2d8f66e..5e7ac9f 100644
--- a/Test/baseResults/spv.always-discard2.frag.out
+++ b/Test/baseResults/spv.always-discard2.frag.out
@@ -1,6 +1,6 @@
 spv.always-discard2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
@@ -17,6 +17,7 @@
                               Name 21  "tex_coord"
                               Name 30  "y"
                               Name 38  "gl_FragColor"
+                              Decorate 21(tex_coord) Location 0
                               Decorate 38(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.arbPostDepthCoverage.frag.out b/Test/baseResults/spv.arbPostDepthCoverage.frag.out
index d62c677..9b911cf 100644
--- a/Test/baseResults/spv.arbPostDepthCoverage.frag.out
+++ b/Test/baseResults/spv.arbPostDepthCoverage.frag.out
@@ -1,6 +1,6 @@
 spv.arbPostDepthCoverage.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/spv.atomic.comp.out b/Test/baseResults/spv.atomic.comp.out
index 08bd830..e74066c 100644
--- a/Test/baseResults/spv.atomic.comp.out
+++ b/Test/baseResults/spv.atomic.comp.out
@@ -1,6 +1,6 @@
 spv.atomic.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 74
 
                               Capability Shader
@@ -30,8 +30,10 @@
                               Name 72  "arrY"
                               Name 73  "arrZ"
                               Decorate 20(counter) Offset 0
+                              Decorate 20(counter) DescriptorSet 0
                               Decorate 20(counter) Binding 0
                               Decorate 27(countArr) Offset 4
+                              Decorate 27(countArr) DescriptorSet 0
                               Decorate 27(countArr) Binding 0
                               MemberDecorate 62(dataSSB) 0 Restrict
                               MemberDecorate 62(dataSSB) 0 Offset 0
diff --git a/Test/baseResults/spv.atomicFloat.comp.out b/Test/baseResults/spv.atomicFloat.comp.out
new file mode 100644
index 0000000..3799557
--- /dev/null
+++ b/Test/baseResults/spv.atomicFloat.comp.out
@@ -0,0 +1,658 @@
+spv.atomicFloat.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 470
+
+                              Capability Shader
+                              Capability Float64
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability Image1D
+                              Capability VulkanMemoryModelKHR
+                              Capability VulkanMemoryModelDeviceScopeKHR
+                              Capability AtomicFloat32AddEXT
+                              Capability AtomicFloat64AddEXT
+                              Extension  "SPV_EXT_shader_atomic_float_add"
+                              Extension  "SPV_KHR_vulkan_memory_model"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 16 16 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_atomic_float"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 8  "resultf"
+                              Name 11  "atomf"
+                              Name 25  "Buffer"
+                              MemberName 25(Buffer) 0  "dataf"
+                              MemberName 25(Buffer) 1  "datad"
+                              Name 27  "buf"
+                              Name 34  "resultd"
+                              Name 37  "atomd"
+                              Name 143  "fimage1D"
+                              Name 189  "fimage1DArray"
+                              Name 232  "fimage2D"
+                              Name 270  "fimage2DRect"
+                              Name 308  "fimage2DArray"
+                              Name 352  "fimageCube"
+                              Name 392  "fimageCubeArray"
+                              Name 430  "fimage3D"
+                              MemberDecorate 25(Buffer) 0 Offset 0
+                              MemberDecorate 25(Buffer) 1 Offset 8
+                              Decorate 25(Buffer) BufferBlock
+                              Decorate 27(buf) DescriptorSet 0
+                              Decorate 27(buf) Binding 0
+                              Decorate 143(fimage1D) Location 0
+                              Decorate 143(fimage1D) DescriptorSet 0
+                              Decorate 143(fimage1D) Binding 0
+                              Decorate 189(fimage1DArray) Location 1
+                              Decorate 189(fimage1DArray) DescriptorSet 0
+                              Decorate 189(fimage1DArray) Binding 1
+                              Decorate 232(fimage2D) Location 2
+                              Decorate 232(fimage2D) DescriptorSet 0
+                              Decorate 232(fimage2D) Binding 2
+                              Decorate 270(fimage2DRect) Location 4
+                              Decorate 270(fimage2DRect) DescriptorSet 0
+                              Decorate 270(fimage2DRect) Binding 4
+                              Decorate 308(fimage2DArray) Location 3
+                              Decorate 308(fimage2DArray) DescriptorSet 0
+                              Decorate 308(fimage2DArray) Binding 3
+                              Decorate 352(fimageCube) Location 5
+                              Decorate 352(fimageCube) DescriptorSet 0
+                              Decorate 352(fimageCube) Binding 5
+                              Decorate 392(fimageCubeArray) Location 6
+                              Decorate 392(fimageCubeArray) DescriptorSet 0
+                              Decorate 392(fimageCubeArray) Binding 6
+                              Decorate 430(fimage3D) Location 7
+                              Decorate 430(fimage3D) DescriptorSet 0
+                              Decorate 430(fimage3D) Binding 9
+                              Decorate 469 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:    6(float) Constant 0
+              10:             TypePointer Workgroup 6(float)
+       11(atomf):     10(ptr) Variable Workgroup
+              12:    6(float) Constant 1077936128
+              13:             TypeInt 32 0
+              14:     13(int) Constant 5
+              15:     13(int) Constant 0
+              17:    6(float) Constant 1083179008
+              18:             TypeInt 32 1
+              19:     18(int) Constant 1
+              20:     18(int) Constant 64
+              21:     18(int) Constant 0
+              22:     13(int) Constant 64
+              24:             TypeFloat 64
+      25(Buffer):             TypeStruct 6(float) 24(float64_t)
+              26:             TypePointer Uniform 25(Buffer)
+         27(buf):     26(ptr) Variable Uniform
+              28:             TypePointer Uniform 6(float)
+              33:             TypePointer Function 24(float64_t)
+              35:24(float64_t) Constant 0 0
+              36:             TypePointer Workgroup 24(float64_t)
+       37(atomd):     36(ptr) Variable Workgroup
+              38:24(float64_t) Constant 0 1074266112
+              40:24(float64_t) Constant 0 1074921472
+              42:             TypePointer Uniform 24(float64_t)
+              57:     18(int) Constant 256
+              58:     13(int) Constant 256
+             141:             TypeImage 6(float) 1D nonsampled format:R32f
+             142:             TypePointer UniformConstant 141
+   143(fimage1D):    142(ptr) Variable UniformConstant
+             144:    6(float) Constant 1073741824
+             145:             TypePointer Image 6(float)
+             147:     13(int) Constant 32768
+             149:     13(int) Constant 2
+             155:     18(int) Constant 2048
+             157:     13(int) Constant 2048
+             164:    6(float) Constant 1082130432
+             179:     18(int) Constant 2
+             187:             TypeImage 6(float) 1D array nonsampled format:R32f
+             188:             TypePointer UniformConstant 187
+189(fimage1DArray):    188(ptr) Variable UniformConstant
+             190:             TypeVector 18(int) 2
+             191:  190(ivec2) ConstantComposite 21 21
+             199:  190(ivec2) ConstantComposite 19 19
+             207:  190(ivec2) ConstantComposite 19 21
+             222:  190(ivec2) ConstantComposite 179 179
+             230:             TypeImage 6(float) 2D nonsampled format:R32f
+             231:             TypePointer UniformConstant 230
+   232(fimage2D):    231(ptr) Variable UniformConstant
+             268:             TypeImage 6(float) Rect nonsampled format:R32f
+             269:             TypePointer UniformConstant 268
+270(fimage2DRect):    269(ptr) Variable UniformConstant
+             306:             TypeImage 6(float) 2D array nonsampled format:R32f
+             307:             TypePointer UniformConstant 306
+308(fimage2DArray):    307(ptr) Variable UniformConstant
+             309:             TypeVector 18(int) 3
+             310:  309(ivec3) ConstantComposite 21 21 21
+             318:  309(ivec3) ConstantComposite 19 19 21
+             326:  309(ivec3) ConstantComposite 19 21 19
+             334:  309(ivec3) ConstantComposite 19 19 19
+             342:  309(ivec3) ConstantComposite 179 179 21
+             350:             TypeImage 6(float) Cube nonsampled format:R32f
+             351:             TypePointer UniformConstant 350
+ 352(fimageCube):    351(ptr) Variable UniformConstant
+             367:  309(ivec3) ConstantComposite 19 21 21
+             382:  309(ivec3) ConstantComposite 179 179 19
+             390:             TypeImage 6(float) Cube array nonsampled format:R32f
+             391:             TypePointer UniformConstant 390
+392(fimageCubeArray):    391(ptr) Variable UniformConstant
+             428:             TypeImage 6(float) 3D nonsampled format:R32f
+             429:             TypePointer UniformConstant 428
+   430(fimage3D):    429(ptr) Variable UniformConstant
+             466:             TypeVector 13(int) 3
+             467:     13(int) Constant 16
+             468:     13(int) Constant 1
+             469:  466(ivec3) ConstantComposite 467 467 468
+         4(main):           2 Function None 3
+               5:             Label
+      8(resultf):      7(ptr) Variable Function
+     34(resultd):     33(ptr) Variable Function
+                              Store 8(resultf) 9
+              16:    6(float) AtomicFAddEXT 11(atomf) 14 15 12
+                              Store 8(resultf) 16
+              23:    6(float) AtomicFAddEXT 11(atomf) 19 22 17
+                              Store 8(resultf) 23
+              29:     28(ptr) AccessChain 27(buf) 21
+              30:    6(float) AtomicFAddEXT 29 14 15 12
+                              Store 8(resultf) 30
+              31:     28(ptr) AccessChain 27(buf) 21
+              32:    6(float) AtomicFAddEXT 31 19 22 17
+                              Store 8(resultf) 32
+                              Store 34(resultd) 35
+              39:24(float64_t) AtomicFAddEXT 37(atomd) 14 15 38
+                              Store 34(resultd) 39
+              41:24(float64_t) AtomicFAddEXT 37(atomd) 19 22 40
+                              Store 34(resultd) 41
+              43:     42(ptr) AccessChain 27(buf) 19
+              44:24(float64_t) AtomicFAddEXT 43 14 15 38
+                              Store 34(resultd) 44
+              45:     42(ptr) AccessChain 27(buf) 19
+              46:24(float64_t) AtomicFAddEXT 45 19 22 40
+                              Store 34(resultd) 46
+              47:     28(ptr) AccessChain 27(buf) 21
+              48:    6(float) Load 8(resultf)
+              49:    6(float) AtomicExchange 47 14 15 48
+                              Store 8(resultf) 49
+              50:    6(float) Load 8(resultf)
+              51:     28(ptr) AccessChain 27(buf) 21
+              52:    6(float) Load 51
+              53:    6(float) FAdd 52 50
+              54:     28(ptr) AccessChain 27(buf) 21
+                              Store 54 53
+              55:     28(ptr) AccessChain 27(buf) 21
+              56:    6(float) Load 8(resultf)
+              59:    6(float) AtomicExchange 55 19 58 56
+                              Store 8(resultf) 59
+              60:    6(float) Load 8(resultf)
+              61:     28(ptr) AccessChain 27(buf) 21
+              62:    6(float) Load 61
+              63:    6(float) FAdd 62 60
+              64:     28(ptr) AccessChain 27(buf) 21
+                              Store 64 63
+              65:    6(float) Load 8(resultf)
+              66:    6(float) AtomicExchange 11(atomf) 14 15 65
+                              Store 8(resultf) 66
+              67:    6(float) Load 8(resultf)
+              68:     28(ptr) AccessChain 27(buf) 21
+              69:    6(float) Load 68
+              70:    6(float) FAdd 69 67
+              71:     28(ptr) AccessChain 27(buf) 21
+                              Store 71 70
+              72:    6(float) Load 8(resultf)
+              73:    6(float) AtomicExchange 11(atomf) 19 58 72
+                              Store 8(resultf) 73
+              74:    6(float) Load 8(resultf)
+              75:     28(ptr) AccessChain 27(buf) 21
+              76:    6(float) Load 75
+              77:    6(float) FAdd 76 74
+              78:     28(ptr) AccessChain 27(buf) 21
+                              Store 78 77
+              79:     42(ptr) AccessChain 27(buf) 19
+              80:24(float64_t) Load 34(resultd)
+              81:24(float64_t) AtomicExchange 79 14 15 80
+                              Store 34(resultd) 81
+              82:24(float64_t) Load 34(resultd)
+              83:     42(ptr) AccessChain 27(buf) 19
+              84:24(float64_t) Load 83
+              85:24(float64_t) FAdd 84 82
+              86:     42(ptr) AccessChain 27(buf) 19
+                              Store 86 85
+              87:     42(ptr) AccessChain 27(buf) 19
+              88:24(float64_t) Load 34(resultd)
+              89:24(float64_t) AtomicExchange 87 19 58 88
+                              Store 34(resultd) 89
+              90:24(float64_t) Load 34(resultd)
+              91:     42(ptr) AccessChain 27(buf) 19
+              92:24(float64_t) Load 91
+              93:24(float64_t) FAdd 92 90
+              94:     42(ptr) AccessChain 27(buf) 19
+                              Store 94 93
+              95:24(float64_t) Load 34(resultd)
+              96:24(float64_t) AtomicExchange 37(atomd) 14 15 95
+                              Store 34(resultd) 96
+              97:24(float64_t) Load 34(resultd)
+              98:     42(ptr) AccessChain 27(buf) 19
+              99:24(float64_t) Load 98
+             100:24(float64_t) FAdd 99 97
+             101:     42(ptr) AccessChain 27(buf) 19
+                              Store 101 100
+             102:24(float64_t) Load 34(resultd)
+             103:24(float64_t) AtomicExchange 37(atomd) 19 58 102
+                              Store 34(resultd) 103
+             104:24(float64_t) Load 34(resultd)
+             105:     42(ptr) AccessChain 27(buf) 19
+             106:24(float64_t) Load 105
+             107:24(float64_t) FAdd 106 104
+             108:     42(ptr) AccessChain 27(buf) 19
+                              Store 108 107
+             109:     28(ptr) AccessChain 27(buf) 21
+             110:    6(float) AtomicLoad 109 19 58
+                              Store 8(resultf) 110
+             111:     28(ptr) AccessChain 27(buf) 21
+             112:    6(float) Load 8(resultf)
+                              AtomicStore 111 19 58 112
+             113:    6(float) Load 8(resultf)
+             114:     28(ptr) AccessChain 27(buf) 21
+             115:    6(float) Load 114
+             116:    6(float) FAdd 115 113
+             117:     28(ptr) AccessChain 27(buf) 21
+                              Store 117 116
+             118:    6(float) AtomicLoad 11(atomf) 19 58
+                              Store 8(resultf) 118
+             119:    6(float) Load 8(resultf)
+                              AtomicStore 11(atomf) 19 58 119
+             120:    6(float) Load 8(resultf)
+             121:     28(ptr) AccessChain 27(buf) 21
+             122:    6(float) Load 121
+             123:    6(float) FAdd 122 120
+             124:     28(ptr) AccessChain 27(buf) 21
+                              Store 124 123
+             125:     42(ptr) AccessChain 27(buf) 19
+             126:24(float64_t) AtomicLoad 125 19 58
+                              Store 34(resultd) 126
+             127:     42(ptr) AccessChain 27(buf) 19
+             128:24(float64_t) Load 34(resultd)
+                              AtomicStore 127 19 58 128
+             129:24(float64_t) Load 34(resultd)
+             130:     42(ptr) AccessChain 27(buf) 19
+             131:24(float64_t) Load 130
+             132:24(float64_t) FAdd 131 129
+             133:     42(ptr) AccessChain 27(buf) 19
+                              Store 133 132
+             134:24(float64_t) AtomicLoad 37(atomd) 19 58
+                              Store 34(resultd) 134
+             135:24(float64_t) Load 34(resultd)
+                              AtomicStore 37(atomd) 19 58 135
+             136:24(float64_t) Load 34(resultd)
+             137:     42(ptr) AccessChain 27(buf) 19
+             138:24(float64_t) Load 137
+             139:24(float64_t) FAdd 138 136
+             140:     42(ptr) AccessChain 27(buf) 19
+                              Store 140 139
+             146:    145(ptr) ImageTexelPointer 143(fimage1D) 21 15
+             148:    6(float) AtomicFAddEXT 146 14 147 144
+                              Store 11(atomf) 148 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             150:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             151:     28(ptr) AccessChain 27(buf) 21
+             152:    6(float) Load 151
+             153:    6(float) FAdd 152 150
+             154:     28(ptr) AccessChain 27(buf) 21
+                              Store 154 153
+             156:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             158:    6(float) AtomicFAddEXT 156 19 157 12
+                              Store 11(atomf) 158 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             159:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             160:     28(ptr) AccessChain 27(buf) 21
+             161:    6(float) Load 160
+             162:    6(float) FAdd 161 159
+             163:     28(ptr) AccessChain 27(buf) 21
+                              Store 163 162
+             165:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             166:    6(float) AtomicExchange 165 19 157 164
+                              Store 11(atomf) 166 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             167:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             168:     28(ptr) AccessChain 27(buf) 21
+             169:    6(float) Load 168
+             170:    6(float) FAdd 169 167
+             171:     28(ptr) AccessChain 27(buf) 21
+                              Store 171 170
+             172:    145(ptr) ImageTexelPointer 143(fimage1D) 19 15
+             173:    6(float) AtomicLoad 172 19 157
+                              Store 11(atomf) 173 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             174:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             175:     28(ptr) AccessChain 27(buf) 21
+             176:    6(float) Load 175
+             177:    6(float) FAdd 176 174
+             178:     28(ptr) AccessChain 27(buf) 21
+                              Store 178 177
+             180:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             181:    145(ptr) ImageTexelPointer 143(fimage1D) 179 15
+                              AtomicStore 181 19 157 180
+             182:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             183:     28(ptr) AccessChain 27(buf) 21
+             184:    6(float) Load 183
+             185:    6(float) FAdd 184 182
+             186:     28(ptr) AccessChain 27(buf) 21
+                              Store 186 185
+             192:    145(ptr) ImageTexelPointer 189(fimage1DArray) 191 15
+             193:    6(float) AtomicFAddEXT 192 14 147 144
+                              Store 11(atomf) 193 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             194:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             195:     28(ptr) AccessChain 27(buf) 21
+             196:    6(float) Load 195
+             197:    6(float) FAdd 196 194
+             198:     28(ptr) AccessChain 27(buf) 21
+                              Store 198 197
+             200:    145(ptr) ImageTexelPointer 189(fimage1DArray) 199 15
+             201:    6(float) AtomicFAddEXT 200 19 157 12
+                              Store 11(atomf) 201 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             202:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             203:     28(ptr) AccessChain 27(buf) 21
+             204:    6(float) Load 203
+             205:    6(float) FAdd 204 202
+             206:     28(ptr) AccessChain 27(buf) 21
+                              Store 206 205
+             208:    145(ptr) ImageTexelPointer 189(fimage1DArray) 207 15
+             209:    6(float) AtomicExchange 208 19 157 164
+                              Store 11(atomf) 209 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             210:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             211:     28(ptr) AccessChain 27(buf) 21
+             212:    6(float) Load 211
+             213:    6(float) FAdd 212 210
+             214:     28(ptr) AccessChain 27(buf) 21
+                              Store 214 213
+             215:    145(ptr) ImageTexelPointer 189(fimage1DArray) 199 15
+             216:    6(float) AtomicLoad 215 19 157
+                              Store 11(atomf) 216 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             217:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             218:     28(ptr) AccessChain 27(buf) 21
+             219:    6(float) Load 218
+             220:    6(float) FAdd 219 217
+             221:     28(ptr) AccessChain 27(buf) 21
+                              Store 221 220
+             223:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             224:    145(ptr) ImageTexelPointer 189(fimage1DArray) 222 15
+                              AtomicStore 224 19 157 223
+             225:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             226:     28(ptr) AccessChain 27(buf) 21
+             227:    6(float) Load 226
+             228:    6(float) FAdd 227 225
+             229:     28(ptr) AccessChain 27(buf) 21
+                              Store 229 228
+             233:    145(ptr) ImageTexelPointer 232(fimage2D) 191 15
+             234:    6(float) AtomicFAddEXT 233 14 147 144
+                              Store 11(atomf) 234 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             235:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             236:     28(ptr) AccessChain 27(buf) 21
+             237:    6(float) Load 236
+             238:    6(float) FAdd 237 235
+             239:     28(ptr) AccessChain 27(buf) 21
+                              Store 239 238
+             240:    145(ptr) ImageTexelPointer 232(fimage2D) 199 15
+             241:    6(float) AtomicFAddEXT 240 19 157 12
+                              Store 11(atomf) 241 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             242:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             243:     28(ptr) AccessChain 27(buf) 21
+             244:    6(float) Load 243
+             245:    6(float) FAdd 244 242
+             246:     28(ptr) AccessChain 27(buf) 21
+                              Store 246 245
+             247:    145(ptr) ImageTexelPointer 232(fimage2D) 207 15
+             248:    6(float) AtomicExchange 247 19 157 164
+                              Store 11(atomf) 248 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             249:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             250:     28(ptr) AccessChain 27(buf) 21
+             251:    6(float) Load 250
+             252:    6(float) FAdd 251 249
+             253:     28(ptr) AccessChain 27(buf) 21
+                              Store 253 252
+             254:    145(ptr) ImageTexelPointer 232(fimage2D) 199 15
+             255:    6(float) AtomicLoad 254 19 157
+                              Store 11(atomf) 255 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             256:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             257:     28(ptr) AccessChain 27(buf) 21
+             258:    6(float) Load 257
+             259:    6(float) FAdd 258 256
+             260:     28(ptr) AccessChain 27(buf) 21
+                              Store 260 259
+             261:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             262:    145(ptr) ImageTexelPointer 232(fimage2D) 222 15
+                              AtomicStore 262 19 157 261
+             263:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             264:     28(ptr) AccessChain 27(buf) 21
+             265:    6(float) Load 264
+             266:    6(float) FAdd 265 263
+             267:     28(ptr) AccessChain 27(buf) 21
+                              Store 267 266
+             271:    145(ptr) ImageTexelPointer 270(fimage2DRect) 191 15
+             272:    6(float) AtomicFAddEXT 271 14 147 144
+                              Store 11(atomf) 272 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             273:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             274:     28(ptr) AccessChain 27(buf) 21
+             275:    6(float) Load 274
+             276:    6(float) FAdd 275 273
+             277:     28(ptr) AccessChain 27(buf) 21
+                              Store 277 276
+             278:    145(ptr) ImageTexelPointer 270(fimage2DRect) 199 15
+             279:    6(float) AtomicFAddEXT 278 19 157 12
+                              Store 11(atomf) 279 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             280:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             281:     28(ptr) AccessChain 27(buf) 21
+             282:    6(float) Load 281
+             283:    6(float) FAdd 282 280
+             284:     28(ptr) AccessChain 27(buf) 21
+                              Store 284 283
+             285:    145(ptr) ImageTexelPointer 270(fimage2DRect) 207 15
+             286:    6(float) AtomicExchange 285 19 157 164
+                              Store 11(atomf) 286 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             287:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             288:     28(ptr) AccessChain 27(buf) 21
+             289:    6(float) Load 288
+             290:    6(float) FAdd 289 287
+             291:     28(ptr) AccessChain 27(buf) 21
+                              Store 291 290
+             292:    145(ptr) ImageTexelPointer 270(fimage2DRect) 199 15
+             293:    6(float) AtomicLoad 292 19 157
+                              Store 11(atomf) 293 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             294:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             295:     28(ptr) AccessChain 27(buf) 21
+             296:    6(float) Load 295
+             297:    6(float) FAdd 296 294
+             298:     28(ptr) AccessChain 27(buf) 21
+                              Store 298 297
+             299:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             300:    145(ptr) ImageTexelPointer 270(fimage2DRect) 222 15
+                              AtomicStore 300 19 157 299
+             301:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             302:     28(ptr) AccessChain 27(buf) 21
+             303:    6(float) Load 302
+             304:    6(float) FAdd 303 301
+             305:     28(ptr) AccessChain 27(buf) 21
+                              Store 305 304
+             311:    145(ptr) ImageTexelPointer 308(fimage2DArray) 310 15
+             312:    6(float) AtomicFAddEXT 311 14 147 144
+                              Store 11(atomf) 312 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             313:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             314:     28(ptr) AccessChain 27(buf) 21
+             315:    6(float) Load 314
+             316:    6(float) FAdd 315 313
+             317:     28(ptr) AccessChain 27(buf) 21
+                              Store 317 316
+             319:    145(ptr) ImageTexelPointer 308(fimage2DArray) 318 15
+             320:    6(float) AtomicFAddEXT 319 19 157 12
+                              Store 11(atomf) 320 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             321:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             322:     28(ptr) AccessChain 27(buf) 21
+             323:    6(float) Load 322
+             324:    6(float) FAdd 323 321
+             325:     28(ptr) AccessChain 27(buf) 21
+                              Store 325 324
+             327:    145(ptr) ImageTexelPointer 308(fimage2DArray) 326 15
+             328:    6(float) AtomicExchange 327 19 157 164
+                              Store 11(atomf) 328 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             329:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             330:     28(ptr) AccessChain 27(buf) 21
+             331:    6(float) Load 330
+             332:    6(float) FAdd 331 329
+             333:     28(ptr) AccessChain 27(buf) 21
+                              Store 333 332
+             335:    145(ptr) ImageTexelPointer 308(fimage2DArray) 334 15
+             336:    6(float) AtomicLoad 335 19 157
+                              Store 11(atomf) 336 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             337:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             338:     28(ptr) AccessChain 27(buf) 21
+             339:    6(float) Load 338
+             340:    6(float) FAdd 339 337
+             341:     28(ptr) AccessChain 27(buf) 21
+                              Store 341 340
+             343:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             344:    145(ptr) ImageTexelPointer 308(fimage2DArray) 342 15
+                              AtomicStore 344 19 157 343
+             345:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             346:     28(ptr) AccessChain 27(buf) 21
+             347:    6(float) Load 346
+             348:    6(float) FAdd 347 345
+             349:     28(ptr) AccessChain 27(buf) 21
+                              Store 349 348
+             353:    145(ptr) ImageTexelPointer 352(fimageCube) 310 15
+             354:    6(float) AtomicFAddEXT 353 14 147 144
+                              Store 11(atomf) 354 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             355:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             356:     28(ptr) AccessChain 27(buf) 21
+             357:    6(float) Load 356
+             358:    6(float) FAdd 357 355
+             359:     28(ptr) AccessChain 27(buf) 21
+                              Store 359 358
+             360:    145(ptr) ImageTexelPointer 352(fimageCube) 318 15
+             361:    6(float) AtomicFAddEXT 360 19 157 12
+                              Store 11(atomf) 361 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             362:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             363:     28(ptr) AccessChain 27(buf) 21
+             364:    6(float) Load 363
+             365:    6(float) FAdd 364 362
+             366:     28(ptr) AccessChain 27(buf) 21
+                              Store 366 365
+             368:    145(ptr) ImageTexelPointer 352(fimageCube) 367 15
+             369:    6(float) AtomicExchange 368 19 157 164
+                              Store 11(atomf) 369 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             370:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             371:     28(ptr) AccessChain 27(buf) 21
+             372:    6(float) Load 371
+             373:    6(float) FAdd 372 370
+             374:     28(ptr) AccessChain 27(buf) 21
+                              Store 374 373
+             375:    145(ptr) ImageTexelPointer 352(fimageCube) 334 15
+             376:    6(float) AtomicLoad 375 19 157
+                              Store 11(atomf) 376 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             377:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             378:     28(ptr) AccessChain 27(buf) 21
+             379:    6(float) Load 378
+             380:    6(float) FAdd 379 377
+             381:     28(ptr) AccessChain 27(buf) 21
+                              Store 381 380
+             383:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             384:    145(ptr) ImageTexelPointer 352(fimageCube) 382 15
+                              AtomicStore 384 19 157 383
+             385:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             386:     28(ptr) AccessChain 27(buf) 21
+             387:    6(float) Load 386
+             388:    6(float) FAdd 387 385
+             389:     28(ptr) AccessChain 27(buf) 21
+                              Store 389 388
+             393:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 310 15
+             394:    6(float) AtomicFAddEXT 393 14 147 144
+                              Store 11(atomf) 394 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             395:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             396:     28(ptr) AccessChain 27(buf) 21
+             397:    6(float) Load 396
+             398:    6(float) FAdd 397 395
+             399:     28(ptr) AccessChain 27(buf) 21
+                              Store 399 398
+             400:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 318 15
+             401:    6(float) AtomicFAddEXT 400 19 157 12
+                              Store 11(atomf) 401 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             402:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             403:     28(ptr) AccessChain 27(buf) 21
+             404:    6(float) Load 403
+             405:    6(float) FAdd 404 402
+             406:     28(ptr) AccessChain 27(buf) 21
+                              Store 406 405
+             407:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 326 15
+             408:    6(float) AtomicExchange 407 19 157 164
+                              Store 11(atomf) 408 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             409:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             410:     28(ptr) AccessChain 27(buf) 21
+             411:    6(float) Load 410
+             412:    6(float) FAdd 411 409
+             413:     28(ptr) AccessChain 27(buf) 21
+                              Store 413 412
+             414:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 334 15
+             415:    6(float) AtomicLoad 414 19 157
+                              Store 11(atomf) 415 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             416:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             417:     28(ptr) AccessChain 27(buf) 21
+             418:    6(float) Load 417
+             419:    6(float) FAdd 418 416
+             420:     28(ptr) AccessChain 27(buf) 21
+                              Store 420 419
+             421:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             422:    145(ptr) ImageTexelPointer 392(fimageCubeArray) 342 15
+                              AtomicStore 422 19 157 421
+             423:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             424:     28(ptr) AccessChain 27(buf) 21
+             425:    6(float) Load 424
+             426:    6(float) FAdd 425 423
+             427:     28(ptr) AccessChain 27(buf) 21
+                              Store 427 426
+             431:    145(ptr) ImageTexelPointer 430(fimage3D) 310 15
+             432:    6(float) AtomicFAddEXT 431 14 147 144
+                              Store 11(atomf) 432 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             433:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             434:     28(ptr) AccessChain 27(buf) 21
+             435:    6(float) Load 434
+             436:    6(float) FAdd 435 433
+             437:     28(ptr) AccessChain 27(buf) 21
+                              Store 437 436
+             438:    145(ptr) ImageTexelPointer 430(fimage3D) 318 15
+             439:    6(float) AtomicFAddEXT 438 19 157 12
+                              Store 11(atomf) 439 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             440:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             441:     28(ptr) AccessChain 27(buf) 21
+             442:    6(float) Load 441
+             443:    6(float) FAdd 442 440
+             444:     28(ptr) AccessChain 27(buf) 21
+                              Store 444 443
+             445:    145(ptr) ImageTexelPointer 430(fimage3D) 326 15
+             446:    6(float) AtomicExchange 445 19 157 164
+                              Store 11(atomf) 446 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             447:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             448:     28(ptr) AccessChain 27(buf) 21
+             449:    6(float) Load 448
+             450:    6(float) FAdd 449 447
+             451:     28(ptr) AccessChain 27(buf) 21
+                              Store 451 450
+             452:    145(ptr) ImageTexelPointer 430(fimage3D) 334 15
+             453:    6(float) AtomicLoad 452 19 157
+                              Store 11(atomf) 453 MakePointerAvailableKHR NonPrivatePointerKHR 149
+             454:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             455:     28(ptr) AccessChain 27(buf) 21
+             456:    6(float) Load 455
+             457:    6(float) FAdd 456 454
+             458:     28(ptr) AccessChain 27(buf) 21
+                              Store 458 457
+             459:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             460:    145(ptr) ImageTexelPointer 430(fimage3D) 342 15
+                              AtomicStore 460 19 157 459
+             461:    6(float) Load 11(atomf) MakePointerVisibleKHR NonPrivatePointerKHR 149
+             462:     28(ptr) AccessChain 27(buf) 21
+             463:    6(float) Load 462
+             464:    6(float) FAdd 463 461
+             465:     28(ptr) AccessChain 27(buf) 21
+                              Store 465 464
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.atomicFloat_Error.comp.out b/Test/baseResults/spv.atomicFloat_Error.comp.out
new file mode 100644
index 0000000..e00ed19
--- /dev/null
+++ b/Test/baseResults/spv.atomicFloat_Error.comp.out
@@ -0,0 +1,57 @@
+spv.atomicFloat_Error.comp
+ERROR: 0:25: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:26: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:27: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:28: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:31: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:32: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:33: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:34: 'atomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:37: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:38: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:39: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:40: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:43: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:44: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:45: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:46: 'atomicExchange' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:50: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:51: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:52: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:53: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:56: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:57: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:58: 'atomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:59: 'atomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:63: 'imageAtomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:64: 'imageAtomicAdd' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:66: 'imageAtomicLoad' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:67: 'imageAtomicStore' : required extension not requested: GL_EXT_shader_atomic_float
+ERROR: 0:80: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:81: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:82: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:83: 'atomicAdd' : no matching overloaded function found 
+ERROR: 0:86: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:87: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:88: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:89: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:90: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:91: 'atomicExchange' : no matching overloaded function found 
+ERROR: 0:95: 'atomicLoad' : no matching overloaded function found 
+ERROR: 0:96: 'atomicStore' : no matching overloaded function found 
+ERROR: 0:99: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:100: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:101: 'imageAtomicAdd' : no matching overloaded function found 
+ERROR: 0:102: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:103: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:104: 'imageAtomicExchange' : no matching overloaded function found 
+ERROR: 0:105: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:106: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:107: 'imageAtomicLoad' : no matching overloaded function found 
+ERROR: 0:108: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 0:109: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 0:110: 'imageAtomicStore' : no matching overloaded function found 
+ERROR: 52 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.atomicInt64.comp.out b/Test/baseResults/spv.atomicInt64.comp.out
index 5ac910e..5b2e134 100644
--- a/Test/baseResults/spv.atomicInt64.comp.out
+++ b/Test/baseResults/spv.atomicInt64.comp.out
@@ -1,6 +1,6 @@
 spv.atomicInt64.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 149
 
                               Capability Shader
diff --git a/Test/baseResults/spv.barrier.vert.out b/Test/baseResults/spv.barrier.vert.out
index ffc2eaa..7199882 100644
--- a/Test/baseResults/spv.barrier.vert.out
+++ b/Test/baseResults/spv.barrier.vert.out
@@ -1,6 +1,6 @@
 spv.barrier.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bitCast.frag.out b/Test/baseResults/spv.bitCast.frag.out
index f590ec7..daf7b1d 100644
--- a/Test/baseResults/spv.bitCast.frag.out
+++ b/Test/baseResults/spv.bitCast.frag.out
@@ -1,6 +1,6 @@
 spv.bitCast.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 172
 
                               Capability Shader
@@ -26,14 +26,27 @@
                               Name 139  "u3"
                               Name 148  "u4"
                               Name 154  "fragColor"
+                              Decorate 14(f1) Location 8
+                              Decorate 26(f2) Location 9
+                              Decorate 37(f3) Location 10
+                              Decorate 48(f4) Location 11
                               Decorate 89(i1) Flat
+                              Decorate 89(i1) Location 0
                               Decorate 98(i2) Flat
+                              Decorate 98(i2) Location 1
                               Decorate 107(i3) Flat
+                              Decorate 107(i3) Location 2
                               Decorate 116(i4) Flat
+                              Decorate 116(i4) Location 3
                               Decorate 122(u1) Flat
+                              Decorate 122(u1) Location 4
                               Decorate 130(u2) Flat
+                              Decorate 130(u2) Location 5
                               Decorate 139(u3) Flat
+                              Decorate 139(u3) Location 6
                               Decorate 148(u4) Flat
+                              Decorate 148(u4) Location 7
+                              Decorate 154(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.bool.vert.out b/Test/baseResults/spv.bool.vert.out
index 3e5a190..fb7c686 100644
--- a/Test/baseResults/spv.bool.vert.out
+++ b/Test/baseResults/spv.bool.vert.out
@@ -1,6 +1,6 @@
 spv.bool.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 46
 
                               Capability Shader
diff --git a/Test/baseResults/spv.boolInBlock.frag.out b/Test/baseResults/spv.boolInBlock.frag.out
index b0a4023..004c204 100644
--- a/Test/baseResults/spv.boolInBlock.frag.out
+++ b/Test/baseResults/spv.boolInBlock.frag.out
@@ -1,6 +1,6 @@
 spv.boolInBlock.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 102
 
                               Capability Shader
diff --git a/Test/baseResults/spv.branch-return.vert.out b/Test/baseResults/spv.branch-return.vert.out
index 3aacca7..30918ab 100644
--- a/Test/baseResults/spv.branch-return.vert.out
+++ b/Test/baseResults/spv.branch-return.vert.out
@@ -1,6 +1,6 @@
 spv.branch-return.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.buffer.autoassign.frag.out b/Test/baseResults/spv.buffer.autoassign.frag.out
index e526ada..3475266 100644
--- a/Test/baseResults/spv.buffer.autoassign.frag.out
+++ b/Test/baseResults/spv.buffer.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.buffer.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle1.frag.out b/Test/baseResults/spv.bufferhandle1.frag.out
index 9d18188..59bcc78 100644
--- a/Test/baseResults/spv.bufferhandle1.frag.out
+++ b/Test/baseResults/spv.bufferhandle1.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle1.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 52
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle10.frag.out b/Test/baseResults/spv.bufferhandle10.frag.out
index 5064c7e..3a33c42 100644
--- a/Test/baseResults/spv.bufferhandle10.frag.out
+++ b/Test/baseResults/spv.bufferhandle10.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle10.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle11.frag.out b/Test/baseResults/spv.bufferhandle11.frag.out
index 783577c..bd034aa 100644
--- a/Test/baseResults/spv.bufferhandle11.frag.out
+++ b/Test/baseResults/spv.bufferhandle11.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 61
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle12.frag.out b/Test/baseResults/spv.bufferhandle12.frag.out
index 9f0f4fb..c47c718 100644
--- a/Test/baseResults/spv.bufferhandle12.frag.out
+++ b/Test/baseResults/spv.bufferhandle12.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 183
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle13.frag.out b/Test/baseResults/spv.bufferhandle13.frag.out
index 516b9fc..bfc1524 100644
--- a/Test/baseResults/spv.bufferhandle13.frag.out
+++ b/Test/baseResults/spv.bufferhandle13.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle13.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 58
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle14.frag.out b/Test/baseResults/spv.bufferhandle14.frag.out
index 440a032..514a798 100644
--- a/Test/baseResults/spv.bufferhandle14.frag.out
+++ b/Test/baseResults/spv.bufferhandle14.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle14.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 46
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle15.frag.out b/Test/baseResults/spv.bufferhandle15.frag.out
index f018e21..bfa5d94 100644
--- a/Test/baseResults/spv.bufferhandle15.frag.out
+++ b/Test/baseResults/spv.bufferhandle15.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle16.frag.out b/Test/baseResults/spv.bufferhandle16.frag.out
index cfc6f05..284bcb0 100644
--- a/Test/baseResults/spv.bufferhandle16.frag.out
+++ b/Test/baseResults/spv.bufferhandle16.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle16.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 48
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle17_Errors.frag.out b/Test/baseResults/spv.bufferhandle17_Errors.frag.out
index cdcfb9c..9c7ddf9 100644
--- a/Test/baseResults/spv.bufferhandle17_Errors.frag.out
+++ b/Test/baseResults/spv.bufferhandle17_Errors.frag.out
@@ -2,8 +2,12 @@
 ERROR: 0:11: 'qualifier' : variables with reference type can't have qualifier 'const' 
 ERROR: 0:16: 'qualifier' : variables with reference type can't have qualifier 'const' 
 ERROR: 0:18: '==' : can't use with reference types 
+ERROR: 0:18: 'buffer reference math' : required extension not requested: GL_EXT_buffer_reference2
+ERROR: 0:18: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type ' temp reference' and a right operand of type ' temp reference' (or there is no acceptable conversion)
 ERROR: 0:19: '!=' : can't use with reference types 
-ERROR: 4 compilation errors.  No code generated.
+ERROR: 0:19: 'buffer reference math' : required extension not requested: GL_EXT_buffer_reference2
+ERROR: 0:19: '!=' :  wrong operand types: no operation '!=' exists that takes a left-hand operand of type ' temp reference' and a right operand of type ' temp reference' (or there is no acceptable conversion)
+ERROR: 8 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.bufferhandle18.frag.out b/Test/baseResults/spv.bufferhandle18.frag.out
index 0a5f6fb..21dddc5 100644
--- a/Test/baseResults/spv.bufferhandle18.frag.out
+++ b/Test/baseResults/spv.bufferhandle18.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle18.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 196
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle2.frag.out b/Test/baseResults/spv.bufferhandle2.frag.out
index 6c43fbe..f66c92a 100644
--- a/Test/baseResults/spv.bufferhandle2.frag.out
+++ b/Test/baseResults/spv.bufferhandle2.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 45
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle3.frag.out b/Test/baseResults/spv.bufferhandle3.frag.out
index ba50eb1..95d4dcf 100644
--- a/Test/baseResults/spv.bufferhandle3.frag.out
+++ b/Test/baseResults/spv.bufferhandle3.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle3.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
@@ -46,6 +46,7 @@
                               Decorate 40(x) DescriptorSet 1
                               Decorate 40(x) Binding 2
                               Decorate 42(k) Flat
+                              Decorate 42(k) Location 0
                               Decorate 42(k) DecorationAliasedPointerEXT
                               Decorate 23(param) DecorationAliasedPointerEXT
                2:             TypeVoid
diff --git a/Test/baseResults/spv.bufferhandle4.frag.out b/Test/baseResults/spv.bufferhandle4.frag.out
index 7dff09c..6751d6f 100644
--- a/Test/baseResults/spv.bufferhandle4.frag.out
+++ b/Test/baseResults/spv.bufferhandle4.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle4.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 61
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle5.frag.out b/Test/baseResults/spv.bufferhandle5.frag.out
index 209459b..9f78166 100644
--- a/Test/baseResults/spv.bufferhandle5.frag.out
+++ b/Test/baseResults/spv.bufferhandle5.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle5.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle6.frag.out b/Test/baseResults/spv.bufferhandle6.frag.out
index b373a2f..441c762 100644
--- a/Test/baseResults/spv.bufferhandle6.frag.out
+++ b/Test/baseResults/spv.bufferhandle6.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle6.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 165
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle7.frag.out b/Test/baseResults/spv.bufferhandle7.frag.out
index 9beaee1..3c8e86c 100644
--- a/Test/baseResults/spv.bufferhandle7.frag.out
+++ b/Test/baseResults/spv.bufferhandle7.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle7.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
@@ -47,7 +47,7 @@
                               MemberDecorate 15(t2) 1 Offset 8
                               Decorate 15(t2) Block
                               Decorate 17(u) DescriptorSet 0
-                              Decorate 17(u) Binding 0
+                              Decorate 17(u) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                               TypeForwardPointer 6 PhysicalStorageBufferEXT
diff --git a/Test/baseResults/spv.bufferhandle8.frag.out b/Test/baseResults/spv.bufferhandle8.frag.out
index 95abfd9..b9f23c5 100644
--- a/Test/baseResults/spv.bufferhandle8.frag.out
+++ b/Test/baseResults/spv.bufferhandle8.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle8.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.bufferhandle9.frag.out b/Test/baseResults/spv.bufferhandle9.frag.out
index b452acc..7e534df 100644
--- a/Test/baseResults/spv.bufferhandle9.frag.out
+++ b/Test/baseResults/spv.bufferhandle9.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandle9.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 56
 
                               Capability Shader
@@ -40,7 +40,9 @@
                               Decorate 8(blockType) Block
                               Decorate 13(b1) DecorationAliasedPointerEXT
                               Decorate 16(h) Flat
+                              Decorate 16(h) Location 0
                               Decorate 19(i) Flat
+                              Decorate 19(i) Location 1
                               Decorate 34(b2) DecorationAliasedPointerEXT
                               Decorate 37(b3) DecorationAliasedPointerEXT
                               MemberDecorate 53(t2) 0 Offset 0
diff --git a/Test/baseResults/spv.bufferhandleUvec2.frag.out b/Test/baseResults/spv.bufferhandleUvec2.frag.out
old mode 100755
new mode 100644
index b1944cf..fbdbb6a
--- a/Test/baseResults/spv.bufferhandleUvec2.frag.out
+++ b/Test/baseResults/spv.bufferhandleUvec2.frag.out
@@ -1,6 +1,6 @@
 spv.bufferhandleUvec2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 71
 
                               Capability Shader
@@ -41,7 +41,9 @@
                               Decorate 8(blockType) Block
                               Decorate 13(b1) DecorationAliasedPointerEXT
                               Decorate 16(h) Flat
+                              Decorate 16(h) Location 0
                               Decorate 19(i) Flat
+                              Decorate 19(i) Location 1
                               Decorate 34(b2) DecorationAliasedPointerEXT
                               Decorate 37(b3) DecorationAliasedPointerEXT
                               MemberDecorate 68(t2) 0 Offset 0
diff --git a/Test/baseResults/spv.builtInXFB.vert.out b/Test/baseResults/spv.builtInXFB.vert.out
index 7a8b17a..1f612e2 100644
--- a/Test/baseResults/spv.builtInXFB.vert.out
+++ b/Test/baseResults/spv.builtInXFB.vert.out
@@ -1,6 +1,6 @@
 spv.builtInXFB.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.builtin.PrimitiveShadingRateEXT.vert.out b/Test/baseResults/spv.builtin.PrimitiveShadingRateEXT.vert.out
new file mode 100644
index 0000000..8daa79e
--- /dev/null
+++ b/Test/baseResults/spv.builtin.PrimitiveShadingRateEXT.vert.out
@@ -0,0 +1,53 @@
+spv.builtin.PrimitiveShadingRateEXT.vert
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 26
+
+                              Capability Shader
+                              Capability FragmentShadingRateKHR
+                              Extension  "SPV_KHR_fragment_shading_rate"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 8 16
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_fragment_shading_rate"
+                              Name 4  "main"
+                              Name 8  "id"
+                              Name 16  "gl_PrimitiveShadingRateEXT"
+                              Decorate 8(id) Location 0
+                              Decorate 16(gl_PrimitiveShadingRateEXT) BuiltIn PrimitiveShadingRateKHR
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Input 6(int)
+           8(id):      7(ptr) Variable Input
+              15:             TypePointer Output 6(int)
+16(gl_PrimitiveShadingRateEXT):     15(ptr) Variable Output
+              17:      6(int) Constant 5
+              19:      6(int) Constant 9
+              21:      6(int) Constant 6
+              23:      6(int) Constant 10
+         4(main):           2 Function None 3
+               5:             Label
+               9:      6(int) Load 8(id)
+                              SelectionMerge 14 None
+                              Switch 9 14 
+                                     case 0: 10
+                                     case 1: 11
+                                     case 2: 12
+                                     case 3: 13
+              10:               Label
+                                Store 16(gl_PrimitiveShadingRateEXT) 17
+                                Branch 14
+              11:               Label
+                                Store 16(gl_PrimitiveShadingRateEXT) 19
+                                Branch 14
+              12:               Label
+                                Store 16(gl_PrimitiveShadingRateEXT) 21
+                                Branch 14
+              13:               Label
+                                Store 16(gl_PrimitiveShadingRateEXT) 23
+                                Branch 14
+              14:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.builtin.ShadingRateEXT.frag.out b/Test/baseResults/spv.builtin.ShadingRateEXT.frag.out
new file mode 100644
index 0000000..95b94d2
--- /dev/null
+++ b/Test/baseResults/spv.builtin.ShadingRateEXT.frag.out
@@ -0,0 +1,36 @@
+spv.builtin.ShadingRateEXT.frag
+WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
+         "precision mediump int; precision highp float;" 
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 12
+
+                              Capability Shader
+                              Capability FragmentShadingRateKHR
+                              Extension  "SPV_KHR_fragment_shading_rate"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 10
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_fragment_shading_rate"
+                              Name 4  "main"
+                              Name 8  "val"
+                              Name 10  "gl_ShadingRateEXT"
+                              Decorate 8(val) Location 0
+                              Decorate 10(gl_ShadingRateEXT) Flat
+                              Decorate 10(gl_ShadingRateEXT) BuiltIn ShadingRateKHR
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+          8(val):      7(ptr) Variable Output
+               9:             TypePointer Input 6(int)
+10(gl_ShadingRateEXT):      9(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              11:      6(int) Load 10(gl_ShadingRateEXT)
+                              Store 8(val) 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.computeShaderDerivatives.comp.out b/Test/baseResults/spv.computeShaderDerivatives.comp.out
index 052ac06..a713845 100644
--- a/Test/baseResults/spv.computeShaderDerivatives.comp.out
+++ b/Test/baseResults/spv.computeShaderDerivatives.comp.out
@@ -1,6 +1,6 @@
 spv.computeShaderDerivatives.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 212
 
                               Capability Shader
diff --git a/Test/baseResults/spv.computeShaderDerivatives2.comp.out b/Test/baseResults/spv.computeShaderDerivatives2.comp.out
index 3ef5ee4..3c3d54e 100644
--- a/Test/baseResults/spv.computeShaderDerivatives2.comp.out
+++ b/Test/baseResults/spv.computeShaderDerivatives2.comp.out
@@ -1,6 +1,6 @@
 spv.computeShaderDerivatives2.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 212
 
                               Capability Shader
diff --git a/Test/baseResults/spv.conditionalDemote.frag.out b/Test/baseResults/spv.conditionalDemote.frag.out
index f255176..dfd4596 100644
--- a/Test/baseResults/spv.conditionalDemote.frag.out
+++ b/Test/baseResults/spv.conditionalDemote.frag.out
@@ -1,6 +1,6 @@
 spv.conditionalDemote.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
diff --git a/Test/baseResults/spv.conditionalDiscard.frag.out b/Test/baseResults/spv.conditionalDiscard.frag.out
index a05afb9..2e53e9b 100644
--- a/Test/baseResults/spv.conditionalDiscard.frag.out
+++ b/Test/baseResults/spv.conditionalDiscard.frag.out
@@ -1,6 +1,6 @@
 spv.conditionalDiscard.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Shader
@@ -16,6 +16,7 @@
                               Name 34  "gl_FragColor"
                               Decorate 13(tex) DescriptorSet 0
                               Decorate 13(tex) Binding 0
+                              Decorate 17(coord) Location 0
                               Decorate 34(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.constConstruct.vert.out b/Test/baseResults/spv.constConstruct.vert.out
index d3250a1..db637a9 100644
--- a/Test/baseResults/spv.constConstruct.vert.out
+++ b/Test/baseResults/spv.constConstruct.vert.out
@@ -1,7 +1,7 @@
 spv.constConstruct.vert
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 150
 
                               Capability Shader
diff --git a/Test/baseResults/spv.constStruct.vert.out b/Test/baseResults/spv.constStruct.vert.out
index 1fce728..61d0e54 100644
--- a/Test/baseResults/spv.constStruct.vert.out
+++ b/Test/baseResults/spv.constStruct.vert.out
@@ -1,6 +1,6 @@
 spv.constStruct.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23
 
                               Capability Shader
diff --git a/Test/baseResults/spv.constructComposite.comp.out b/Test/baseResults/spv.constructComposite.comp.out
index f1179d4..73d663b 100644
--- a/Test/baseResults/spv.constructComposite.comp.out
+++ b/Test/baseResults/spv.constructComposite.comp.out
@@ -1,6 +1,6 @@
 spv.constructComposite.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.controlFlowAttributes.frag.out b/Test/baseResults/spv.controlFlowAttributes.frag.out
index c222f25..cf34ae2 100644
--- a/Test/baseResults/spv.controlFlowAttributes.frag.out
+++ b/Test/baseResults/spv.controlFlowAttributes.frag.out
@@ -9,7 +9,7 @@
 
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 123
 
                               Capability Shader
diff --git a/Test/baseResults/spv.conversion.frag.out b/Test/baseResults/spv.conversion.frag.out
index 60129dd..b600b38 100644
--- a/Test/baseResults/spv.conversion.frag.out
+++ b/Test/baseResults/spv.conversion.frag.out
@@ -1,6 +1,6 @@
 spv.conversion.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 455
 
                               Capability Shader
@@ -50,10 +50,18 @@
                               Name 452  "i_f3"
                               Name 454  "i_f4"
                               Decorate 39(i_i) Flat
+                              Decorate 39(i_i) Location 0
+                              Decorate 53(i_f) Location 4
                               Decorate 157(i_i4) Flat
+                              Decorate 157(i_i4) Location 3
                               Decorate 322(gl_FragColor) Location 0
                               Decorate 446(i_i2) Flat
+                              Decorate 446(i_i2) Location 1
                               Decorate 448(i_i3) Flat
+                              Decorate 448(i_i3) Location 2
+                              Decorate 450(i_f2) Location 5
+                              Decorate 452(i_f3) Location 6
+                              Decorate 454(i_f4) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
@@ -171,19 +179,19 @@
               12:      9(int) Load 11(u_i)
               15:     6(bool) INotEqual 12 14
               19:   16(float) Load 18(u_f)
-              21:     6(bool) FOrdNotEqual 19 20
+              21:     6(bool) FUnordNotEqual 19 20
               22:     6(bool) LogicalNotEqual 15 21
                               Store 8(b) 22
               26:      9(int) Load 11(u_i)
               27:     6(bool) INotEqual 26 14
               28:   16(float) Load 18(u_f)
-              29:     6(bool) FOrdNotEqual 28 20
+              29:     6(bool) FUnordNotEqual 28 20
               30:   23(bvec2) CompositeConstruct 27 29
                               Store 25(b2) 30
               34:      9(int) Load 11(u_i)
               35:     6(bool) INotEqual 34 14
               36:   16(float) Load 18(u_f)
-              37:     6(bool) FOrdNotEqual 36 20
+              37:     6(bool) FUnordNotEqual 36 20
               40:      9(int) Load 39(i_i)
               41:     6(bool) INotEqual 40 14
               42:   31(bvec3) CompositeConstruct 35 37 41
@@ -191,11 +199,11 @@
               46:      9(int) Load 11(u_i)
               47:     6(bool) INotEqual 46 14
               48:   16(float) Load 18(u_f)
-              49:     6(bool) FOrdNotEqual 48 20
+              49:     6(bool) FUnordNotEqual 48 20
               50:      9(int) Load 39(i_i)
               51:     6(bool) INotEqual 50 14
               54:   16(float) Load 53(i_f)
-              55:     6(bool) FOrdNotEqual 54 20
+              55:     6(bool) FUnordNotEqual 54 20
               56:   43(bvec4) CompositeConstruct 47 49 51 55
                               Store 45(b4) 56
               59:   16(float) Load 18(u_f)
@@ -273,7 +281,7 @@
              164:   95(fvec4) FAdd 163 162
                               Store 118(f4) 164
              165:   95(fvec4) Load 97(u_f4)
-             166:   43(bvec4) FOrdNotEqual 165 150
+             166:   43(bvec4) FUnordNotEqual 165 150
              167:   95(fvec4) Select 166 151 150
              168:   95(fvec4) Load 118(f4)
              169:   95(fvec4) FAdd 168 167
@@ -417,7 +425,7 @@
              289:   79(ivec3)   Load 81(i3)
              290:   82(fvec3)   ConvertSToF 289
              291:   82(fvec3)   Load 114(f3)
-             292:   31(bvec3)   FOrdNotEqual 290 291
+             292:   31(bvec3)   FUnordNotEqual 290 291
              293:     6(bool)   Any 292
                                 Branch 288
              288:             Label
diff --git a/Test/baseResults/spv.coopmat.comp.out b/Test/baseResults/spv.coopmat.comp.out
index 4ef7028..6838bfc 100644
--- a/Test/baseResults/spv.coopmat.comp.out
+++ b/Test/baseResults/spv.coopmat.comp.out
@@ -1,6 +1,6 @@
 spv.coopmat.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 228
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dataOut.frag.out b/Test/baseResults/spv.dataOut.frag.out
index 5dc14ce..980d1bd 100644
--- a/Test/baseResults/spv.dataOut.frag.out
+++ b/Test/baseResults/spv.dataOut.frag.out
@@ -1,6 +1,7 @@
 spv.dataOut.frag
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
@@ -12,6 +13,7 @@
                               Name 4  "main"
                               Name 12  "gl_FragData"
                               Name 16  "Color"
+                              Decorate 16(Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.dataOutIndirect.frag.out b/Test/baseResults/spv.dataOutIndirect.frag.out
index fa6a0da..a75e8d5 100644
--- a/Test/baseResults/spv.dataOutIndirect.frag.out
+++ b/Test/baseResults/spv.dataOutIndirect.frag.out
@@ -1,6 +1,6 @@
 spv.dataOutIndirect.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Shader
@@ -15,10 +15,12 @@
                               MemberName 14(b) 0  "i"
                               Name 16  "bName"
                               Name 22  "Color"
+                              Decorate 12(fcolor) Location 0
                               MemberDecorate 14(b) 0 Offset 0
                               Decorate 14(b) Block
                               Decorate 16(bName) DescriptorSet 0
                               Decorate 16(bName) Binding 0
+                              Decorate 22(Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.dataOutIndirect.vert.out b/Test/baseResults/spv.dataOutIndirect.vert.out
index fab5e58..1c29410 100644
--- a/Test/baseResults/spv.dataOutIndirect.vert.out
+++ b/Test/baseResults/spv.dataOutIndirect.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:3: attribute deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
@@ -15,6 +15,8 @@
                               Name 25  "colorOut"
                               Name 28  "color"
                               Name 34  "gl_Position"
+                              Decorate 25(colorOut) Location 0
+                              Decorate 28(color) Location 0
                               Decorate 34(gl_Position) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.dead-after-continue.vert.out b/Test/baseResults/spv.dead-after-continue.vert.out
index f3b8792..6d8d7d9 100644
--- a/Test/baseResults/spv.dead-after-continue.vert.out
+++ b/Test/baseResults/spv.dead-after-continue.vert.out
@@ -1,6 +1,6 @@
 spv.dead-after-continue.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-after-discard.frag.out b/Test/baseResults/spv.dead-after-discard.frag.out
index f378d04..987f5a2 100644
--- a/Test/baseResults/spv.dead-after-discard.frag.out
+++ b/Test/baseResults/spv.dead-after-discard.frag.out
@@ -1,6 +1,6 @@
 spv.dead-after-discard.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 15
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-after-loop-break.vert.out b/Test/baseResults/spv.dead-after-loop-break.vert.out
index b653e39..2d9e35a 100644
--- a/Test/baseResults/spv.dead-after-loop-break.vert.out
+++ b/Test/baseResults/spv.dead-after-loop-break.vert.out
@@ -1,6 +1,6 @@
 spv.dead-after-loop-break.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-after-return.vert.out b/Test/baseResults/spv.dead-after-return.vert.out
index d963f9f..d6ba2c7 100644
--- a/Test/baseResults/spv.dead-after-return.vert.out
+++ b/Test/baseResults/spv.dead-after-return.vert.out
@@ -1,6 +1,6 @@
 spv.dead-after-return.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 14
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-after-switch-break.vert.out b/Test/baseResults/spv.dead-after-switch-break.vert.out
index a506012..f8bc4d0 100644
--- a/Test/baseResults/spv.dead-after-switch-break.vert.out
+++ b/Test/baseResults/spv.dead-after-switch-break.vert.out
@@ -1,6 +1,6 @@
 spv.dead-after-switch-break.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-complex-continue-after-return.vert.out b/Test/baseResults/spv.dead-complex-continue-after-return.vert.out
index 60e81bd..3db78ec 100644
--- a/Test/baseResults/spv.dead-complex-continue-after-return.vert.out
+++ b/Test/baseResults/spv.dead-complex-continue-after-return.vert.out
@@ -1,6 +1,6 @@
 spv.dead-complex-continue-after-return.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/spv.dead-complex-merge-after-return.vert.out b/Test/baseResults/spv.dead-complex-merge-after-return.vert.out
index 609a3ce..cc1b25c 100644
--- a/Test/baseResults/spv.dead-complex-merge-after-return.vert.out
+++ b/Test/baseResults/spv.dead-complex-merge-after-return.vert.out
@@ -1,6 +1,6 @@
 spv.dead-complex-merge-after-return.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 36
 
                               Capability Shader
diff --git a/Test/baseResults/spv.debugInfo.1.1.frag.out b/Test/baseResults/spv.debugInfo.1.1.frag.out
index b68de49..78044ff 100644
--- a/Test/baseResults/spv.debugInfo.1.1.frag.out
+++ b/Test/baseResults/spv.debugInfo.1.1.frag.out
@@ -1,15 +1,13 @@
 spv.debugInfo.frag
-error: SPIRV-Tools Validation Errors
-error: Invalid SPIR-V binary version 1.3 for target environment SPIR-V 1.0 (under OpenGL 4.5 semantics).
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 124
 
                               Capability Shader
                2:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 5  "main" 24 52
-                              ExecutionMode 5 OriginLowerLeft
+                              ExecutionMode 5 OriginUpperLeft
                1:             String  "spv.debugInfo.frag"
                               Source GLSL 450 1  "#version 450
 
@@ -83,14 +81,13 @@
                               ModuleProcessed  "resource-set-binding 3"
                               ModuleProcessed  "auto-map-bindings"
                               ModuleProcessed  "auto-map-locations"
-                              ModuleProcessed  "client opengl100"
+                              ModuleProcessed  "client vulkan100"
                               ModuleProcessed  "target-env spirv1.3"
-                              ModuleProcessed  "target-env opengl"
+                              ModuleProcessed  "target-env vulkan1.1"
                               ModuleProcessed  "relaxed-errors"
                               ModuleProcessed  "suppress-warnings"
                               ModuleProcessed  "hlsl-offsets"
                               ModuleProcessed  "entry-point main"
-                              ModuleProcessed  "use-storage-buffer"
                               Decorate 24(inv) Location 0
                               Decorate 52(outv) Location 0
                               MemberDecorate 53(S) 0 Offset 0
@@ -98,7 +95,6 @@
                               Decorate 54(ubuf) Block
                               Decorate 56 DescriptorSet 3
                               Decorate 56 Binding 0
-                              Decorate 67(s2d) Location 0
                               Decorate 67(s2d) DescriptorSet 3
                               Decorate 67(s2d) Binding 1
                3:             TypeVoid
diff --git a/Test/baseResults/spv.debugInfo.frag.out b/Test/baseResults/spv.debugInfo.frag.out
index f27aac0..e146398 100644
--- a/Test/baseResults/spv.debugInfo.frag.out
+++ b/Test/baseResults/spv.debugInfo.frag.out
@@ -1,6 +1,6 @@
 spv.debugInfo.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 124
 
                               Capability Shader
diff --git a/Test/baseResults/spv.debugPrintf.frag.out b/Test/baseResults/spv.debugPrintf.frag.out
index dbd0b4e..6517415 100644
--- a/Test/baseResults/spv.debugPrintf.frag.out
+++ b/Test/baseResults/spv.debugPrintf.frag.out
@@ -1,6 +1,6 @@
 spv.debugPrintf.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 17
 
                               Capability Shader
diff --git a/Test/baseResults/spv.deepRvalue.frag.out b/Test/baseResults/spv.deepRvalue.frag.out
index 776fdf8..d46159d 100644
--- a/Test/baseResults/spv.deepRvalue.frag.out
+++ b/Test/baseResults/spv.deepRvalue.frag.out
@@ -1,6 +1,6 @@
 spv.deepRvalue.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 152
 
                               Capability Shader
diff --git a/Test/baseResults/spv.depthOut.frag.out b/Test/baseResults/spv.depthOut.frag.out
index d212c89..50c4770 100644
--- a/Test/baseResults/spv.depthOut.frag.out
+++ b/Test/baseResults/spv.depthOut.frag.out
@@ -1,6 +1,6 @@
 spv.depthOut.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 15
 
                               Capability Shader
@@ -16,6 +16,8 @@
                               Name 10  "Depth"
                               Name 14  "Color"
                               Decorate 8(gl_FragDepth) BuiltIn FragDepth
+                              Decorate 10(Depth) Location 1
+                              Decorate 14(Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.deviceGroup.frag.out b/Test/baseResults/spv.deviceGroup.frag.out
index 2d16272..57c443c 100644
--- a/Test/baseResults/spv.deviceGroup.frag.out
+++ b/Test/baseResults/spv.deviceGroup.frag.out
@@ -1,6 +1,6 @@
 spv.deviceGroup.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 17
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               Name 4  "main"
                               Name 9  "color"
                               Name 12  "gl_DeviceIndex"
+                              Decorate 9(color) Location 0
                               Decorate 12(gl_DeviceIndex) Flat
                               Decorate 12(gl_DeviceIndex) BuiltIn DeviceIndex
                2:             TypeVoid
diff --git a/Test/baseResults/spv.discard-dce.frag.out b/Test/baseResults/spv.discard-dce.frag.out
index c4a5cb2..93c2de8 100644
--- a/Test/baseResults/spv.discard-dce.frag.out
+++ b/Test/baseResults/spv.discard-dce.frag.out
@@ -1,6 +1,6 @@
 spv.discard-dce.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 84
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               Name 30  "y"
                               Name 36  "radius"
                               Name 59  "gl_FragColor"
+                              Decorate 21(tex_coord) Location 0
                               Decorate 59(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.do-simple.vert.out b/Test/baseResults/spv.do-simple.vert.out
index 826cc1c..c240c44 100644
--- a/Test/baseResults/spv.do-simple.vert.out
+++ b/Test/baseResults/spv.do-simple.vert.out
@@ -1,6 +1,6 @@
 spv.do-simple.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.do-while-continue-break.vert.out b/Test/baseResults/spv.do-while-continue-break.vert.out
index 36315a2..081dc62 100644
--- a/Test/baseResults/spv.do-while-continue-break.vert.out
+++ b/Test/baseResults/spv.do-while-continue-break.vert.out
@@ -1,6 +1,6 @@
 spv.do-while-continue-break.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
diff --git a/Test/baseResults/spv.doWhileLoop.frag.out b/Test/baseResults/spv.doWhileLoop.frag.out
index 945f0d7..a57b9b2 100644
--- a/Test/baseResults/spv.doWhileLoop.frag.out
+++ b/Test/baseResults/spv.doWhileLoop.frag.out
@@ -1,6 +1,6 @@
 spv.doWhileLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
@@ -15,6 +15,9 @@
                               Name 17  "bigColor"
                               Name 27  "d"
                               Name 32  "gl_FragColor"
+                              Decorate 11(BaseColor) Location 1
+                              Decorate 17(bigColor) Location 0
+                              Decorate 27(d) Location 2
                               Decorate 32(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.double.comp.out b/Test/baseResults/spv.double.comp.out
index 7961fc6..800464c 100644
--- a/Test/baseResults/spv.double.comp.out
+++ b/Test/baseResults/spv.double.comp.out
@@ -1,6 +1,6 @@
 spv.double.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
diff --git a/Test/baseResults/spv.drawParams.vert.out b/Test/baseResults/spv.drawParams.vert.out
index e9d4970..a8dab45 100644
--- a/Test/baseResults/spv.drawParams.vert.out
+++ b/Test/baseResults/spv.drawParams.vert.out
@@ -1,6 +1,6 @@
 spv.drawParams.vert
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
@@ -21,6 +21,7 @@
                               Decorate 10(gl_BaseVertexARB) BuiltIn BaseVertex
                               Decorate 13(gl_BaseInstanceARB) BuiltIn BaseInstance
                               Decorate 16(gl_DrawIDARB) BuiltIn DrawIndex
+                              Decorate 21(pos) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.earlyReturnDiscard.frag.out b/Test/baseResults/spv.earlyReturnDiscard.frag.out
index a4eb8ca..8f983cb 100644
--- a/Test/baseResults/spv.earlyReturnDiscard.frag.out
+++ b/Test/baseResults/spv.earlyReturnDiscard.frag.out
@@ -1,6 +1,6 @@
 spv.earlyReturnDiscard.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 110
 
                               Capability Shader
@@ -24,7 +24,17 @@
                               Name 77  "b"
                               Name 105  "gl_FragColor"
                               Name 109  "threshhold3"
+                              Decorate 11(BaseColor) Location 9
+                              Decorate 14(otherColor) Location 3
+                              Decorate 17(c) Location 4
+                              Decorate 19(d) Location 0
+                              Decorate 25(bigColor) Location 1
+                              Decorate 30(smallColor) Location 2
+                              Decorate 39(minimum) Location 8
+                              Decorate 51(threshhold) Location 5
+                              Decorate 63(threshhold2) Location 6
                               Decorate 105(gl_FragColor) Location 0
+                              Decorate 109(threshhold3) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.explicittypes.frag.out b/Test/baseResults/spv.explicittypes.frag.out
index 9318913..3382872 100644
--- a/Test/baseResults/spv.explicittypes.frag.out
+++ b/Test/baseResults/spv.explicittypes.frag.out
@@ -1,6 +1,6 @@
 spv.explicittypes.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 576
 
                               Capability Shader
diff --git a/Test/baseResults/spv.ext.AccelDecl.frag.out b/Test/baseResults/spv.ext.AccelDecl.frag.out
new file mode 100644
index 0000000..11d4560
--- /dev/null
+++ b/Test/baseResults/spv.ext.AccelDecl.frag.out
@@ -0,0 +1,41 @@
+spv.ext.AccelDecl.frag
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability RayQueryKHR
+                              Extension  "SPV_KHR_ray_query"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 14
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_separate_shader_objects"
+                              SourceExtension  "GL_EXT_nonuniform_qualifier"
+                              SourceExtension  "GL_EXT_ray_query"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_GOOGLE_cpp_style_line_directive"
+                              SourceExtension  "GL_GOOGLE_include_directive"
+                              Name 4  "main"
+                              Name 9  "outColor"
+                              Name 14  "topLevelAS"
+                              Decorate 9(outColor) Location 0
+                              Decorate 14(topLevelAS) DescriptorSet 0
+                              Decorate 14(topLevelAS) Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+     9(outColor):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeAccelerationStructureKHR
+              13:             TypePointer UniformConstant 12
+  14(topLevelAS):     13(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(outColor) 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.AnyHitShader.rahit.out b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
index 3cd60c7..7bcf812 100644
--- a/Test/baseResults/spv.ext.AnyHitShader.rahit.out
+++ b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
@@ -1,15 +1,17 @@
 spv.ext.AnyHitShader.rahit
-// Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 94
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 107
 
-                              Capability RayTracingProvisionalKHR
+                              Capability GroupNonUniform
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint AnyHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80
+                              EntryPoint AnyHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80 84 98
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
                               Name 4  "main"
                               Name 9  "v0"
                               Name 11  "gl_LaunchIDEXT"
@@ -48,6 +50,7 @@
                               Name 79  "v17"
                               Name 80  "gl_WorldToObject3x4EXT"
                               Name 84  "incomingPayload"
+                              Name 98  "gl_SubgroupSize"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
@@ -59,7 +62,7 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTEXT) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTEXT) BuiltIn RayTmaxKHR
                               Decorate 58(gl_HitKindEXT) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
@@ -67,6 +70,9 @@
                               Decorate 76(gl_ObjectToWorld3x4EXT) BuiltIn ObjectToWorldKHR
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 84(incomingPayload) Location 1
+                              Decorate 98(gl_SubgroupSize) RelaxedPrecision
+                              Decorate 98(gl_SubgroupSize) BuiltIn SubgroupSize
+                              Decorate 99 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -114,6 +120,9 @@
               86:   72(fvec4) ConstantComposite 85 85 85 85
               88:     16(int) Constant 1
               89:             TypeBool
+              94:      6(int) Constant 0
+98(gl_SubgroupSize):     57(ptr) Variable Input
+             101:             TypePointer IncomingRayPayloadKHR 28(float)
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -176,13 +185,16 @@
               87:     16(int) Load 18(v2)
               90:    89(bool) IEqual 87 88
                               SelectionMerge 92 None
-                              BranchConditional 90 91 93
+                              BranchConditional 90 91 92
               91:               Label
                                 IgnoreIntersectionKHR
-                                Branch 92
-              93:               Label
-                                TerminateRayKHR
-                                Branch 92
               92:             Label
-                              Return
+              99:      6(int) Load 98(gl_SubgroupSize)
+             100:   28(float) ConvertUToF 99
+             102:    101(ptr) AccessChain 84(incomingPayload) 94
+             103:   28(float) Load 102
+             104:   28(float) FAdd 103 100
+             105:    101(ptr) AccessChain 84(incomingPayload) 94
+                              Store 105 104
+                              TerminateRayKHR
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.ClosestHitShader.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
index 278b5c1..40903e6 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
@@ -1,13 +1,13 @@
 spv.ext.ClosestHitShader.rchit
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 101
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint ClosestHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80
+                              EntryPoint ClosestHitKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 53 58 64 67 70 76 80 85 98 100
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -48,8 +48,8 @@
                               Name 79  "v17"
                               Name 80  "gl_WorldToObject3x4EXT"
                               Name 85  "accEXT"
-                              Name 98  "localPayload"
-                              Name 100  "incomingPayload"
+                              Name 98  "incomingPayload"
+                              Name 100  "localPayload"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 20(gl_PrimitiveID) BuiltIn PrimitiveId
@@ -61,7 +61,7 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
-                              Decorate 53(gl_HitTEXT) BuiltIn HitTKHR
+                              Decorate 53(gl_HitTEXT) BuiltIn RayTmaxKHR
                               Decorate 58(gl_HitKindEXT) BuiltIn HitKindKHR
                               Decorate 64(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 67(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
@@ -70,8 +70,8 @@
                               Decorate 80(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
                               Decorate 85(accEXT) DescriptorSet 0
                               Decorate 85(accEXT) Binding 0
-                              Decorate 98(localPayload) Location 0
-                              Decorate 100(incomingPayload) Location 1
+                              Decorate 98(incomingPayload) Location 1
+                              Decorate 100(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -126,10 +126,10 @@
               94:   29(fvec3) ConstantComposite 93 93 93
               95:   28(float) Constant 1061158912
               96:     16(int) Constant 1
-              97:             TypePointer RayPayloadKHR 72(fvec4)
-98(localPayload):     97(ptr) Variable RayPayloadKHR
-              99:             TypePointer IncomingRayPayloadKHR 72(fvec4)
-100(incomingPayload):     99(ptr) Variable IncomingRayPayloadKHR
+              97:             TypePointer IncomingRayPayloadKHR 72(fvec4)
+98(incomingPayload):     97(ptr) Variable IncomingRayPayloadKHR
+              99:             TypePointer RayPayloadKHR 72(fvec4)
+100(localPayload):     99(ptr) Variable RayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -189,6 +189,6 @@
               82:          73 Transpose 81
                               Store 79(v17) 82
               86:          83 Load 85(accEXT)
-                              TraceRayKHR 86 87 88 89 90 87 92 91 94 95 96
+                              TraceRayKHR 86 87 88 89 90 87 92 91 94 95 98(incomingPayload)
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
index 6c87d1c..9f945a2 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out
@@ -1,10 +1,12 @@
 spv.ext.ClosestHitShader_Errors.rchit
-ERROR: 0:8: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
-ERROR: 0:9: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:10: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 0:11: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:12: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
-ERROR: 5 compilation errors.  No code generated.
+ERROR: 0:6: 'location' : overlapping use of location 2
+ERROR: 0:9: 'assign' :  l-value required "payload" (cannot modify hitAttributeNV in this stage)
+ERROR: 0:10: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:11: 'terminateRayEXT' : not supported in this stage: closest-hit
+ERROR: 0:12: 'ignoreIntersectionEXT' : not supported in this stage: closest-hit
+ERROR: 0:13: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
+ERROR: 0:14: 'no rayPayloadEXT/rayPayloadInEXT declared' : with layout(location = 0)
+ERROR: 7 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
new file mode 100644
index 0000000..14ec09b
--- /dev/null
+++ b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
@@ -0,0 +1,114 @@
+spv.ext.ClosestHitShader_Subgroup.rchit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 67
+
+                              Capability Int64
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+                              Capability SubgroupBallotKHR
+                              Capability RayTracingKHR
+                              Capability VulkanMemoryModelKHR
+                              Capability ShaderSMBuiltinsNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_KHR_shader_ballot"
+                              Extension  "SPV_KHR_vulkan_memory_model"
+                              Extension  "SPV_NV_shader_sm_builtins"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint ClosestHitKHR 4  "main" 8 26 28 34 43 48 53 61
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_shader_ballot"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_NV_shader_sm_builtins"
+                              Name 4  "main"
+                              Name 8  "accEXT"
+                              Name 26  "incomingPayload"
+                              Name 28  "gl_SubgroupInvocationID"
+                              Name 34  "gl_SubGroupGeMaskARB"
+                              Name 43  "gl_SubgroupGtMask"
+                              Name 48  "gl_SubgroupLeMask"
+                              Name 53  "gl_SubGroupLtMaskARB"
+                              Name 61  "gl_SMIDNV"
+                              Decorate 8(accEXT) DescriptorSet 0
+                              Decorate 8(accEXT) Binding 0
+                              Decorate 26(incomingPayload) Location 1
+                              Decorate 28(gl_SubgroupInvocationID) RelaxedPrecision
+                              Decorate 28(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
+                              Decorate 29 RelaxedPrecision
+                              Decorate 34(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
+                              Decorate 43(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR
+                              Decorate 48(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR
+                              Decorate 53(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
+                              Decorate 61(gl_SMIDNV) BuiltIn SMIDNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeAccelerationStructureKHR
+               7:             TypePointer UniformConstant 6
+       8(accEXT):      7(ptr) Variable UniformConstant
+              10:             TypeInt 32 0
+              11:     10(int) Constant 0
+              12:     10(int) Constant 1
+              13:     10(int) Constant 2
+              14:     10(int) Constant 3
+              15:             TypeFloat 32
+              16:             TypeVector 15(float) 3
+              17:   15(float) Constant 1056964608
+              18:   16(fvec3) ConstantComposite 17 17 17
+              19:   15(float) Constant 1065353216
+              20:   16(fvec3) ConstantComposite 19 19 19
+              21:   15(float) Constant 1061158912
+              22:             TypeInt 32 1
+              23:     22(int) Constant 1
+              24:             TypeVector 15(float) 4
+              25:             TypePointer IncomingRayPayloadKHR 24(fvec4)
+26(incomingPayload):     25(ptr) Variable IncomingRayPayloadKHR
+              27:             TypePointer Input 10(int)
+28(gl_SubgroupInvocationID):     27(ptr) Variable Input
+              31:             TypeVector 10(int) 4
+              32:             TypeInt 64 0
+              33:             TypePointer Input 31(ivec4)
+34(gl_SubGroupGeMaskARB):     33(ptr) Variable Input
+              38:             TypeVector 10(int) 2
+43(gl_SubgroupGtMask):     33(ptr) Variable Input
+48(gl_SubgroupLeMask):     33(ptr) Variable Input
+53(gl_SubGroupLtMaskARB):     33(ptr) Variable Input
+   61(gl_SMIDNV):     27(ptr) Variable Input
+              65:             TypePointer IncomingRayPayloadKHR 15(float)
+         4(main):           2 Function None 3
+               5:             Label
+               9:           6 Load 8(accEXT)
+                              TraceRayKHR 9 11 12 13 14 11 18 17 20 21 26(incomingPayload)
+              29:     10(int) Load 28(gl_SubgroupInvocationID) Volatile 
+              30:   15(float) ConvertUToF 29
+              35:   31(ivec4) Load 34(gl_SubGroupGeMaskARB)
+              36:     10(int) CompositeExtract 35 0
+              37:     10(int) CompositeExtract 35 1
+              39:   38(ivec2) CompositeConstruct 36 37
+              40: 32(int64_t) Bitcast 39
+              41:   15(float) ConvertUToF 40
+              42:   15(float) FAdd 30 41
+              44:   31(ivec4) Load 43(gl_SubgroupGtMask) Volatile 
+              45:   24(fvec4) ConvertUToF 44
+              46:   15(float) CompositeExtract 45 0
+              47:   15(float) FAdd 42 46
+              49:   31(ivec4) Load 48(gl_SubgroupLeMask) Volatile 
+              50:   24(fvec4) ConvertUToF 49
+              51:   15(float) CompositeExtract 50 0
+              52:   15(float) FAdd 47 51
+              54:   31(ivec4) Load 53(gl_SubGroupLtMaskARB)
+              55:     10(int) CompositeExtract 54 0
+              56:     10(int) CompositeExtract 54 1
+              57:   38(ivec2) CompositeConstruct 55 56
+              58: 32(int64_t) Bitcast 57
+              59:   15(float) ConvertUToF 58
+              60:   15(float) FAdd 52 59
+              62:     10(int) Load 61(gl_SMIDNV) Volatile 
+              63:   15(float) ConvertUToF 62
+              64:   15(float) FAdd 60 63
+              66:     65(ptr) AccessChain 26(incomingPayload) 11
+                              Store 66 64
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.IntersectShader.rint.out b/Test/baseResults/spv.ext.IntersectShader.rint.out
index b8b8de2..2d389a0 100644
--- a/Test/baseResults/spv.ext.IntersectShader.rint.out
+++ b/Test/baseResults/spv.ext.IntersectShader.rint.out
@@ -1,13 +1,13 @@
 spv.ext.IntersectShader.rint
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 81
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint IntersectionKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 56 59 65 69
+                              EntryPoint IntersectionKHR 4  "main" 11 14 20 23 26 33 36 39 42 47 50 56 59 65 69 73
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -53,6 +53,8 @@
                               Decorate 42(gl_ObjectRayDirectionEXT) BuiltIn ObjectRayDirectionKHR
                               Decorate 47(gl_RayTminEXT) BuiltIn RayTminKHR
                               Decorate 50(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
+                              Decorate 50(gl_RayTmaxEXT) Volatile
+                              Decorate 50(gl_RayTmaxEXT) Coherent
                               Decorate 56(gl_ObjectToWorldEXT) BuiltIn ObjectToWorldKHR
                               Decorate 59(gl_WorldToObjectEXT) BuiltIn WorldToObjectKHR
                               Decorate 65(gl_ObjectToWorld3x4EXT) BuiltIn ObjectToWorldKHR
diff --git a/Test/baseResults/spv.ext.MissShader.rmiss.out b/Test/baseResults/spv.ext.MissShader.rmiss.out
index dd3f15f..bc29ccc 100644
--- a/Test/baseResults/spv.ext.MissShader.rmiss.out
+++ b/Test/baseResults/spv.ext.MissShader.rmiss.out
@@ -1,15 +1,25 @@
 spv.ext.MissShader.rmiss
-// Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 54
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 71
 
-                              Capability RayTracingProvisionalKHR
+                              Capability GroupNonUniform
+                              Capability GroupNonUniformBallot
+                              Capability SubgroupBallotKHR
+                              Capability RayTracingKHR
+                              Capability ShaderSMBuiltinsNV
                               Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_KHR_shader_ballot"
+                              Extension  "SPV_NV_shader_sm_builtins"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 32
+                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 32 36 51 53 58 63 70
                               Source GLSL 460
+                              SourceExtension  "GL_ARB_shader_ballot"
                               SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_NV_shader_sm_builtins"
                               Name 4  "main"
                               Name 9  "v0"
                               Name 11  "gl_LaunchIDEXT"
@@ -24,8 +34,11 @@
                               Name 31  "v5"
                               Name 32  "gl_RayTmaxEXT"
                               Name 36  "accEXT"
-                              Name 51  "localPayload"
-                              Name 53  "incomingPayload"
+                              Name 51  "incomingPayload"
+                              Name 53  "gl_SubGroupSizeARB"
+                              Name 58  "gl_SubgroupEqMask"
+                              Name 63  "gl_WarpIDNV"
+                              Name 70  "localPayload"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 21(gl_WorldRayOriginEXT) BuiltIn WorldRayOriginKHR
@@ -34,8 +47,17 @@
                               Decorate 32(gl_RayTmaxEXT) BuiltIn RayTmaxKHR
                               Decorate 36(accEXT) DescriptorSet 0
                               Decorate 36(accEXT) Binding 0
-                              Decorate 51(localPayload) Location 0
-                              Decorate 53(incomingPayload) Location 1
+                              Decorate 51(incomingPayload) Location 1
+                              Decorate 53(gl_SubGroupSizeARB) BuiltIn SubgroupSize
+                              Decorate 53(gl_SubGroupSizeARB) Volatile
+                              Decorate 53(gl_SubGroupSizeARB) Coherent
+                              Decorate 58(gl_SubgroupEqMask) BuiltIn SubgroupEqMaskKHR
+                              Decorate 58(gl_SubgroupEqMask) Volatile
+                              Decorate 58(gl_SubgroupEqMask) Coherent
+                              Decorate 63(gl_WarpIDNV) BuiltIn WarpIDNV
+                              Decorate 63(gl_WarpIDNV) Volatile
+                              Decorate 63(gl_WarpIDNV) Coherent
+                              Decorate 70(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -69,10 +91,17 @@
               47:             TypeInt 32 1
               48:     47(int) Constant 1
               49:             TypeVector 16(float) 4
-              50:             TypePointer RayPayloadKHR 49(fvec4)
-51(localPayload):     50(ptr) Variable RayPayloadKHR
-              52:             TypePointer IncomingRayPayloadKHR 49(fvec4)
-53(incomingPayload):     52(ptr) Variable IncomingRayPayloadKHR
+              50:             TypePointer IncomingRayPayloadKHR 49(fvec4)
+51(incomingPayload):     50(ptr) Variable IncomingRayPayloadKHR
+              52:             TypePointer Input 6(int)
+53(gl_SubGroupSizeARB):     52(ptr) Variable Input
+              56:             TypeVector 6(int) 4
+              57:             TypePointer Input 56(ivec4)
+58(gl_SubgroupEqMask):     57(ptr) Variable Input
+ 63(gl_WarpIDNV):     52(ptr) Variable Input
+              67:             TypePointer IncomingRayPayloadKHR 16(float)
+              69:             TypePointer RayPayloadKHR 49(fvec4)
+70(localPayload):     69(ptr) Variable RayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -94,6 +123,17 @@
               33:   16(float) Load 32(gl_RayTmaxEXT)
                               Store 31(v5) 33
               37:          34 Load 36(accEXT)
-                              TraceRayKHR 37 38 39 40 41 38 43 42 45 46 48
+                              TraceRayKHR 37 38 39 40 41 38 43 42 45 46 51(incomingPayload)
+              54:      6(int) Load 53(gl_SubGroupSizeARB)
+              55:   16(float) ConvertUToF 54
+              59:   56(ivec4) Load 58(gl_SubgroupEqMask)
+              60:   49(fvec4) ConvertUToF 59
+              61:   16(float) CompositeExtract 60 0
+              62:   16(float) FAdd 55 61
+              64:      6(int) Load 63(gl_WarpIDNV)
+              65:   16(float) ConvertUToF 64
+              66:   16(float) FAdd 62 65
+              68:     67(ptr) AccessChain 51(incomingPayload) 38
+                              Store 68 66
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out b/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
index 929a2a7..50d3c83 100644
--- a/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
+++ b/Test/baseResults/spv.ext.MissShader_Errors.rmiss.out
@@ -13,8 +13,8 @@
 ERROR: 0:11: 'gl_HitTEXT' : undeclared identifier 
 ERROR: 0:12: 'gl_HitKindEXT' : undeclared identifier 
 ERROR: 0:13: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:14: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:15: 'terminateRayEXT' : no matching overloaded function found 
+ERROR: 0:14: 'ignoreIntersectionEXT' : not supported in this stage: miss
+ERROR: 0:15: 'terminateRayEXT' : not supported in this stage: miss
 ERROR: 16 compilation errors.  No code generated.
 
 
diff --git a/Test/baseResults/spv.ext.RayCallable.rcall.out b/Test/baseResults/spv.ext.RayCallable.rcall.out
index ac3b2b5..d429116 100644
--- a/Test/baseResults/spv.ext.RayCallable.rcall.out
+++ b/Test/baseResults/spv.ext.RayCallable.rcall.out
@@ -1,13 +1,13 @@
 spv.ext.RayCallable.rcall
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint CallableKHR 4  "main" 11 14
+                              EntryPoint CallableKHR 4  "main" 11 14 18 29
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -55,6 +55,6 @@
                               Store 13(size) 15
               23:     22(ptr) AccessChain 18 20
                               Store 23 21
-                              ExecuteCallableKHR 24 25
+                              ExecuteCallableKHR 24 18
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out b/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
index 4699342..e623874 100644
--- a/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
+++ b/Test/baseResults/spv.ext.RayCallable_Errors.rcall.out
@@ -2,34 +2,36 @@
 ERROR: 0:3: 'hitAttributeEXT' : not supported in this stage: callable
 ERROR: 0:4: 'rayPayloadEXT' : not supported in this stage: callable
 ERROR: 0:5: 'rayPayloadInEXT' : not supported in this stage: callable
-ERROR: 0:9: 'gl_PrimitiveID' : undeclared identifier 
-ERROR: 0:9: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:10: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
+ERROR: 0:7: 'location' : overlapping use of location 0
+ERROR: 0:10: 'gl_PrimitiveID' : undeclared identifier 
 ERROR: 0:10: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:11: 'gl_InstanceCustomIndexEXT' : undeclared identifier 
+ERROR: 0:11: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
 ERROR: 0:11: '=' :  cannot convert from ' temp float' to ' temp highp int'
-ERROR: 0:12: 'gl_WorldRayOriginEXT' : undeclared identifier 
-ERROR: 0:12: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:13: 'gl_WorldRayDirectionEXT' : undeclared identifier 
+ERROR: 0:12: 'gl_InstanceCustomIndexEXT' : undeclared identifier 
+ERROR: 0:12: '=' :  cannot convert from ' temp float' to ' temp highp int'
+ERROR: 0:13: 'gl_WorldRayOriginEXT' : undeclared identifier 
 ERROR: 0:13: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:14: 'gl_ObjectRayOriginEXT' : undeclared identifier 
+ERROR: 0:14: 'gl_WorldRayDirectionEXT' : undeclared identifier 
 ERROR: 0:14: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:15: 'gl_ObjectRayDirectionEXT' : undeclared identifier 
+ERROR: 0:15: 'gl_ObjectRayOriginEXT' : undeclared identifier 
 ERROR: 0:15: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
-ERROR: 0:16: 'gl_RayTminEXT' : undeclared identifier 
-ERROR: 0:17: 'gl_RayTmaxEXT' : undeclared identifier 
-ERROR: 0:18: 'gl_ObjectToWorldEXT' : undeclared identifier 
-ERROR: 0:18: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
-ERROR: 0:19: 'gl_WorldToObjectEXT' : undeclared identifier 
+ERROR: 0:16: 'gl_ObjectRayDirectionEXT' : undeclared identifier 
+ERROR: 0:16: '=' :  cannot convert from ' temp float' to ' temp highp 3-component vector of float'
+ERROR: 0:17: 'gl_RayTminEXT' : undeclared identifier 
+ERROR: 0:18: 'gl_RayTmaxEXT' : undeclared identifier 
+ERROR: 0:19: 'gl_ObjectToWorldEXT' : undeclared identifier 
 ERROR: 0:19: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
-ERROR: 0:20: 'gl_HitTEXT' : undeclared identifier 
-ERROR: 0:21: 'gl_HitKindEXT' : undeclared identifier 
-ERROR: 0:22: 'gl_IncomingRayFlagsEXT' : undeclared identifier 
-ERROR: 0:22: '=' :  cannot convert from ' temp float' to ' temp highp uint'
-ERROR: 0:23: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:24: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:25: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 30 compilation errors.  No code generated.
+ERROR: 0:20: 'gl_WorldToObjectEXT' : undeclared identifier 
+ERROR: 0:20: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
+ERROR: 0:21: 'gl_HitTEXT' : undeclared identifier 
+ERROR: 0:22: 'gl_HitKindEXT' : undeclared identifier 
+ERROR: 0:23: 'gl_IncomingRayFlagsEXT' : undeclared identifier 
+ERROR: 0:23: '=' :  cannot convert from ' temp float' to ' temp highp uint'
+ERROR: 0:24: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:25: 'ignoreIntersectionEXT' : not supported in this stage: callable
+ERROR: 0:26: 'terminateRayEXT' : not supported in this stage: callable
+ERROR: 0:27: 'no callableDataEXT/callableDataInEXT declared' : with layout(location = 1)
+ERROR: 32 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.ext.RayConstants.rgen.out b/Test/baseResults/spv.ext.RayConstants.rgen.out
index 5903ec9..afd5083 100644
--- a/Test/baseResults/spv.ext.RayConstants.rgen.out
+++ b/Test/baseResults/spv.ext.RayConstants.rgen.out
@@ -1,13 +1,13 @@
 spv.ext.RayConstants.rgen
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main"
+                              EntryPoint RayGenerationKHR 4  "main" 8 26
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -15,7 +15,7 @@
                               Name 26  "payload"
                               Decorate 8(accEXT) DescriptorSet 0
                               Decorate 8(accEXT) Binding 0
-                              Decorate 26(payload) Location 0
+                              Decorate 26(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeAccelerationStructureKHR
@@ -41,6 +41,6 @@
          4(main):           2 Function None 3
                5:             Label
                9:           6 Load 8(accEXT)
-                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 23
+                              TraceRayKHR 9 11 12 13 13 12 17 18 20 21 26(payload)
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
new file mode 100644
index 0000000..60b5e93
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr2"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 80
+                              MemberDecorate 36(block) 8 Offset 112
+                              MemberDecorate 36(block) 9 Offset 120
+                              MemberDecorate 36(block) 10 Offset 128
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
new file mode 100644
index 0000000..cc175f7
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout140.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout140.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 16
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 80
+                              MemberDecorate 36(block) 7 Offset 96
+                              MemberDecorate 36(block) 8 Offset 128
+                              MemberDecorate 36(block) 9 Offset 136
+                              MemberDecorate 36(block) 10 Offset 144
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
new file mode 100644
index 0000000..afcfa9c
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayGenSBTlayout430.rgen.out
@@ -0,0 +1,134 @@
+spv.ext.RayGenSBTlayout430.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 16
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 80
+                              MemberDecorate 36(block) 8 Offset 112
+                              MemberDecorate 36(block) 9 Offset 120
+                              MemberDecorate 36(block) 10 Offset 128
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out b/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
new file mode 100644
index 0000000..eac481a
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayGenSBTlayoutscalar.rgen.out
@@ -0,0 +1,135 @@
+spv.ext.RayGenSBTlayoutscalar.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Int64
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 38 60
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              MemberName 36(block) 5  "arr"
+                              MemberName 36(block) 6  "a"
+                              MemberName 36(block) 7  "arr3"
+                              MemberName 36(block) 8  "packme"
+                              MemberName 36(block) 9  "b"
+                              MemberName 36(block) 10  "c"
+                              Name 38  ""
+                              Name 60  "payload"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 34 ArrayStride 8
+                              Decorate 35 ArrayStride 12
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 12
+                              MemberDecorate 36(block) 2 Offset 24
+                              MemberDecorate 36(block) 3 Offset 28
+                              MemberDecorate 36(block) 4 Offset 40
+                              MemberDecorate 36(block) 5 Offset 48
+                              MemberDecorate 36(block) 6 Offset 64
+                              MemberDecorate 36(block) 7 Offset 68
+                              MemberDecorate 36(block) 8 Offset 92
+                              MemberDecorate 36(block) 9 Offset 96
+                              MemberDecorate 36(block) 10 Offset 104
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 0
+                              Decorate 60(payload) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 3
+              29:             TypeInt 32 1
+              30:             TypeVector 6(int) 2
+              31:             TypeInt 64 0
+              32:             TypeVector 27(float) 2
+              33:      6(int) Constant 2
+              34:             TypeArray 32(fvec2) 33
+              35:             TypeArray 28(fvec3) 33
+       36(block):             TypeStruct 28(fvec3) 28(fvec3) 29(int) 30(ivec2) 31(int64_t) 34 27(float) 35 27(float) 32(fvec2) 27(float)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     29(int) Constant 3
+              40:             TypePointer ShaderRecordBufferKHR 30(ivec2)
+              43:             TypeAccelerationStructureKHR
+              49:     29(int) Constant 1
+              50:             TypePointer ShaderRecordBufferKHR 28(fvec3)
+              53:   27(float) Constant 1056964608
+              54:     29(int) Constant 0
+              57:   27(float) Constant 1061158912
+              58:             TypeVector 27(float) 4
+              59:             TypePointer RayPayloadKHR 58(fvec4)
+     60(payload):     59(ptr) Variable RayPayloadKHR
+              61:     29(int) Constant 4
+              62:             TypePointer ShaderRecordBufferKHR 31(int64_t)
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              41:     40(ptr) AccessChain 38 39
+              42:   30(ivec2) Load 41
+              44:          43 ConvertUToAccelerationStructureKHR 42
+              45:      6(int) Load 8(lx)
+              46:      6(int) Load 16(ly)
+              47:      6(int) Load 20(sx)
+              48:      6(int) Load 24(sy)
+              51:     50(ptr) AccessChain 38 49
+              52:   28(fvec3) Load 51
+              55:     50(ptr) AccessChain 38 54
+              56:   28(fvec3) Load 55
+                              TraceRayKHR 44 45 46 47 48 12 52 53 56 57 60(payload)
+              63:     62(ptr) AccessChain 38 61
+              64: 31(int64_t) Load 63
+              65:          43 ConvertUToAccelerationStructureKHR 64
+              66:      6(int) Load 8(lx)
+              67:      6(int) Load 16(ly)
+              68:      6(int) Load 20(sx)
+              69:      6(int) Load 24(sy)
+              70:     50(ptr) AccessChain 38 49
+              71:   28(fvec3) Load 70
+              72:     50(ptr) AccessChain 38 54
+              73:   28(fvec3) Load 72
+                              TraceRayKHR 65 66 67 68 69 12 71 53 73 57 60(payload)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenShader.rgen.out b/Test/baseResults/spv.ext.RayGenShader.rgen.out
index da16fa4..da516f3 100644
--- a/Test/baseResults/spv.ext.RayGenShader.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader.rgen.out
@@ -1,14 +1,14 @@
 spv.ext.RayGenShader.rgen
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 58
 
-                              Capability RayTraversalPrimitiveCullingProvisionalKHR
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTraversalPrimitiveCullingKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main" 11 21
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 29 40 53 54 57
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_flags_primitive_culling"
                               SourceExtension  "GL_EXT_ray_tracing"
@@ -24,21 +24,23 @@
                               MemberName 38(block) 0  "dir"
                               MemberName 38(block) 1  "origin"
                               Name 40  ""
-                              Name 51  "accEXT1"
-                              Name 54  "imageu"
-                              Name 57  "payload"
+                              Name 53  "payload"
+                              Name 54  "accEXT1"
+                              Name 57  "imageu"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 29(accEXT0) DescriptorSet 0
                               Decorate 29(accEXT0) Binding 0
                               MemberDecorate 38(block) 0 Offset 0
                               MemberDecorate 38(block) 1 Offset 16
-                              Decorate 38(block) BufferBlock
-                              Decorate 51(accEXT1) DescriptorSet 0
-                              Decorate 51(accEXT1) Binding 1
-                              Decorate 54(imageu) DescriptorSet 0
-                              Decorate 54(imageu) Binding 2
-                              Decorate 57(payload) Location 0
+                              Decorate 38(block) Block
+                              Decorate 40 DescriptorSet 0
+                              Decorate 40 Binding 3
+                              Decorate 53(payload) Location 1
+                              Decorate 54(accEXT1) DescriptorSet 0
+                              Decorate 54(accEXT1) Binding 1
+                              Decorate 57(imageu) DescriptorSet 0
+                              Decorate 57(imageu) Binding 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -65,13 +67,13 @@
               46:   36(float) Constant 1056964608
               47:     41(int) Constant 0
               50:   36(float) Constant 1061158912
-     51(accEXT1):     28(ptr) Variable UniformConstant
-              52:             TypeImage 6(int) 2D nonsampled format:R32ui
-              53:             TypePointer UniformConstant 52
-      54(imageu):     53(ptr) Variable UniformConstant
-              55:             TypeVector 36(float) 4
-              56:             TypePointer RayPayloadKHR 55(fvec4)
-     57(payload):     56(ptr) Variable RayPayloadKHR
+              51:             TypeVector 36(float) 4
+              52:             TypePointer RayPayloadKHR 51(fvec4)
+     53(payload):     52(ptr) Variable RayPayloadKHR
+     54(accEXT1):     28(ptr) Variable UniformConstant
+              55:             TypeImage 6(int) 2D nonsampled format:R32ui
+              56:             TypePointer UniformConstant 55
+      57(imageu):     56(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
            8(lx):      7(ptr) Variable Function
@@ -99,6 +101,6 @@
               45:   37(fvec3) Load 44
               48:     43(ptr) AccessChain 40 47
               49:   37(fvec3) Load 48
-                              TraceRayKHR 30 31 32 33 34 35 45 46 49 50 42
+                              TraceRayKHR 30 31 32 33 34 35 45 46 49 50 53(payload)
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenShader11.rgen.out b/Test/baseResults/spv.ext.RayGenShader11.rgen.out
index 30ed902..00262ac 100644
--- a/Test/baseResults/spv.ext.RayGenShader11.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader11.rgen.out
@@ -1,13 +1,13 @@
 spv.ext.RayGenShader11.rgen
-// Module Version 10000
-// Generated by (magic number): 80008
+// Module Version 10400
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main" 11 21
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 29 39 52
                               Source GLSL 460
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -29,8 +29,10 @@
                               Decorate 29(accEXT) Binding 0
                               MemberDecorate 37(block) 0 Offset 0
                               MemberDecorate 37(block) 1 Offset 16
-                              Decorate 37(block) BufferBlock
-                              Decorate 52(payload) Location 0
+                              Decorate 37(block) Block
+                              Decorate 39 DescriptorSet 0
+                              Decorate 39 Binding 1
+                              Decorate 52(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -86,6 +88,6 @@
               44:   36(fvec3) Load 43
               47:     42(ptr) AccessChain 39 46
               48:   36(fvec3) Load 47
-                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41
+                              TraceRayKHR 30 31 32 33 34 12 44 45 48 49 52(payload)
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out b/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
index 3962bcb..473937d 100644
--- a/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShaderArray.rgen.out
@@ -1,17 +1,19 @@
 spv.ext.RayGenShaderArray.rgen
-// Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 89
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 117
 
+                              Capability Int64
+                              Capability RayTracingKHR
                               Capability ShaderNonUniformEXT
                               Capability RuntimeDescriptorArrayEXT
-                              Capability RayTracingProvisionalKHR
                               Extension  "SPV_EXT_descriptor_indexing"
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint RayGenerationKHR 4  "main" 11 21
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 30 38 61 65
                               Source GLSL 460
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
                               SourceExtension  "GL_EXT_nonuniform_qualifier"
                               SourceExtension  "GL_EXT_ray_tracing"
                               Name 4  "main"
@@ -22,27 +24,33 @@
                               Name 21  "gl_LaunchSizeEXT"
                               Name 24  "sy"
                               Name 30  "accEXT0"
-                              Name 34  "block"
-                              MemberName 34(block) 0  "dir"
-                              MemberName 34(block) 1  "origin"
-                              MemberName 34(block) 2  "i"
-                              Name 36  ""
-                              Name 60  "accEXT1"
-                              Name 88  "payload"
+                              Name 36  "block"
+                              MemberName 36(block) 0  "dir"
+                              MemberName 36(block) 1  "origin"
+                              MemberName 36(block) 2  "i"
+                              MemberName 36(block) 3  "aHandle32"
+                              MemberName 36(block) 4  "aHandle64"
+                              Name 38  ""
+                              Name 61  "payload"
+                              Name 65  "accEXT1"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 30(accEXT0) DescriptorSet 0
                               Decorate 30(accEXT0) Binding 0
-                              MemberDecorate 34(block) 0 Offset 0
-                              MemberDecorate 34(block) 1 Offset 16
-                              MemberDecorate 34(block) 2 Offset 28
-                              Decorate 34(block) BufferBlock
-                              Decorate 60(accEXT1) DescriptorSet 0
-                              Decorate 60(accEXT1) Binding 1
-                              Decorate 75 DecorationNonUniformEXT
-                              Decorate 76 DecorationNonUniformEXT
-                              Decorate 77 DecorationNonUniformEXT
-                              Decorate 88(payload) Location 0
+                              MemberDecorate 36(block) 0 Offset 0
+                              MemberDecorate 36(block) 1 Offset 16
+                              MemberDecorate 36(block) 2 Offset 28
+                              MemberDecorate 36(block) 3 Offset 32
+                              MemberDecorate 36(block) 4 Offset 40
+                              Decorate 36(block) Block
+                              Decorate 38 DescriptorSet 0
+                              Decorate 38 Binding 2
+                              Decorate 61(payload) Location 1
+                              Decorate 65(accEXT1) DescriptorSet 0
+                              Decorate 65(accEXT1) Binding 1
+                              Decorate 80 DecorationNonUniformEXT
+                              Decorate 81 DecorationNonUniformEXT
+                              Decorate 82 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -61,24 +69,30 @@
               31:             TypeFloat 32
               32:             TypeVector 31(float) 3
               33:             TypeInt 32 1
-       34(block):             TypeStruct 32(fvec3) 32(fvec3) 33(int)
-              35:             TypePointer ShaderRecordBufferKHR 34(block)
-              36:     35(ptr) Variable ShaderRecordBufferKHR
-              37:     33(int) Constant 2
-              38:             TypePointer ShaderRecordBufferKHR 33(int)
-              41:             TypePointer UniformConstant 27
-              48:     33(int) Constant 1
-              49:             TypePointer ShaderRecordBufferKHR 32(fvec3)
-              52:   31(float) Constant 1056964608
-              53:     33(int) Constant 0
-              56:   31(float) Constant 1061158912
-              57:      6(int) Constant 2
-              58:             TypeArray 27 57
-              59:             TypePointer UniformConstant 58
-     60(accEXT1):     59(ptr) Variable UniformConstant
-              86:             TypeVector 31(float) 4
-              87:             TypePointer RayPayloadKHR 86(fvec4)
-     88(payload):     87(ptr) Variable RayPayloadKHR
+              34:             TypeVector 6(int) 2
+              35:             TypeInt 64 0
+       36(block):             TypeStruct 32(fvec3) 32(fvec3) 33(int) 34(ivec2) 35(int64_t)
+              37:             TypePointer ShaderRecordBufferKHR 36(block)
+              38:     37(ptr) Variable ShaderRecordBufferKHR
+              39:     33(int) Constant 2
+              40:             TypePointer ShaderRecordBufferKHR 33(int)
+              43:             TypePointer UniformConstant 27
+              50:     33(int) Constant 1
+              51:             TypePointer ShaderRecordBufferKHR 32(fvec3)
+              54:   31(float) Constant 1056964608
+              55:     33(int) Constant 0
+              58:   31(float) Constant 1061158912
+              59:             TypeVector 31(float) 4
+              60:             TypePointer RayPayloadKHR 59(fvec4)
+     61(payload):     60(ptr) Variable RayPayloadKHR
+              62:      6(int) Constant 2
+              63:             TypeArray 27 62
+              64:             TypePointer UniformConstant 63
+     65(accEXT1):     64(ptr) Variable UniformConstant
+              91:     33(int) Constant 3
+              92:             TypePointer ShaderRecordBufferKHR 34(ivec2)
+             104:     33(int) Constant 4
+             105:             TypePointer ShaderRecordBufferKHR 35(int64_t)
          4(main):           2 Function None 3
                5:             Label
            8(lx):      7(ptr) Variable Function
@@ -97,45 +111,69 @@
               25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
               26:      6(int) Load 25
                               Store 24(sy) 26
-              39:     38(ptr) AccessChain 36 37
-              40:     33(int) Load 39
-              42:     41(ptr) AccessChain 30(accEXT0) 40
-              43:          27 Load 42
-              44:      6(int) Load 8(lx)
-              45:      6(int) Load 16(ly)
-              46:      6(int) Load 20(sx)
-              47:      6(int) Load 24(sy)
-              50:     49(ptr) AccessChain 36 48
-              51:   32(fvec3) Load 50
-              54:     49(ptr) AccessChain 36 53
-              55:   32(fvec3) Load 54
-                              TraceRayKHR 43 44 45 46 47 12 51 52 55 56 48
-              61:     38(ptr) AccessChain 36 37
-              62:     33(int) Load 61
-              63:     41(ptr) AccessChain 60(accEXT1) 62
-              64:          27 Load 63
-              65:      6(int) Load 8(lx)
-              66:      6(int) Load 16(ly)
-              67:      6(int) Load 20(sx)
-              68:      6(int) Load 24(sy)
-              69:     49(ptr) AccessChain 36 48
-              70:   32(fvec3) Load 69
-              71:     49(ptr) AccessChain 36 53
-              72:   32(fvec3) Load 71
-                              TraceRayKHR 64 65 66 67 68 12 70 52 72 56 48
-              73:     38(ptr) AccessChain 36 37
-              74:     33(int) Load 73
-              75:     33(int) CopyObject 74
-              76:     41(ptr) AccessChain 30(accEXT0) 75
-              77:          27 Load 76
-              78:      6(int) Load 8(lx)
-              79:      6(int) Load 16(ly)
-              80:      6(int) Load 20(sx)
-              81:      6(int) Load 24(sy)
-              82:     49(ptr) AccessChain 36 48
-              83:   32(fvec3) Load 82
-              84:     49(ptr) AccessChain 36 53
-              85:   32(fvec3) Load 84
-                              TraceRayKHR 77 78 79 80 81 12 83 52 85 56 48
+              41:     40(ptr) AccessChain 38 39
+              42:     33(int) Load 41
+              44:     43(ptr) AccessChain 30(accEXT0) 42
+              45:          27 Load 44
+              46:      6(int) Load 8(lx)
+              47:      6(int) Load 16(ly)
+              48:      6(int) Load 20(sx)
+              49:      6(int) Load 24(sy)
+              52:     51(ptr) AccessChain 38 50
+              53:   32(fvec3) Load 52
+              56:     51(ptr) AccessChain 38 55
+              57:   32(fvec3) Load 56
+                              TraceRayKHR 45 46 47 48 49 12 53 54 57 58 61(payload)
+              66:     40(ptr) AccessChain 38 39
+              67:     33(int) Load 66
+              68:     43(ptr) AccessChain 65(accEXT1) 67
+              69:          27 Load 68
+              70:      6(int) Load 8(lx)
+              71:      6(int) Load 16(ly)
+              72:      6(int) Load 20(sx)
+              73:      6(int) Load 24(sy)
+              74:     51(ptr) AccessChain 38 50
+              75:   32(fvec3) Load 74
+              76:     51(ptr) AccessChain 38 55
+              77:   32(fvec3) Load 76
+                              TraceRayKHR 69 70 71 72 73 12 75 54 77 58 61(payload)
+              78:     40(ptr) AccessChain 38 39
+              79:     33(int) Load 78
+              80:     33(int) CopyObject 79
+              81:     43(ptr) AccessChain 30(accEXT0) 80
+              82:          27 Load 81
+              83:      6(int) Load 8(lx)
+              84:      6(int) Load 16(ly)
+              85:      6(int) Load 20(sx)
+              86:      6(int) Load 24(sy)
+              87:     51(ptr) AccessChain 38 50
+              88:   32(fvec3) Load 87
+              89:     51(ptr) AccessChain 38 55
+              90:   32(fvec3) Load 89
+                              TraceRayKHR 82 83 84 85 86 12 88 54 90 58 61(payload)
+              93:     92(ptr) AccessChain 38 91
+              94:   34(ivec2) Load 93
+              95:          27 ConvertUToAccelerationStructureKHR 94
+              96:      6(int) Load 8(lx)
+              97:      6(int) Load 16(ly)
+              98:      6(int) Load 20(sx)
+              99:      6(int) Load 24(sy)
+             100:     51(ptr) AccessChain 38 50
+             101:   32(fvec3) Load 100
+             102:     51(ptr) AccessChain 38 55
+             103:   32(fvec3) Load 102
+                              TraceRayKHR 95 96 97 98 99 12 101 54 103 58 61(payload)
+             106:    105(ptr) AccessChain 38 104
+             107: 35(int64_t) Load 106
+             108:          27 ConvertUToAccelerationStructureKHR 107
+             109:      6(int) Load 8(lx)
+             110:      6(int) Load 16(ly)
+             111:      6(int) Load 20(sx)
+             112:      6(int) Load 24(sy)
+             113:     51(ptr) AccessChain 38 50
+             114:   32(fvec3) Load 113
+             115:     51(ptr) AccessChain 38 55
+             116:   32(fvec3) Load 115
+                              TraceRayKHR 108 109 110 111 112 12 114 54 116 58 61(payload)
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out b/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
index 6dc7480..3f336bb 100644
--- a/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader_Errors.rgen.out
@@ -4,8 +4,9 @@
 ERROR: 0:5: 'shaderRecordNV' : can only be used with a buffer 
 ERROR: 0:9: 'binding' : cannot be used with shaderRecordNV 
 ERROR: 0:12: 'set' : cannot be used with shaderRecordNV 
+ERROR: 0:23: ' temp accelerationStructureNV' : cannot construct with these arguments 
 ERROR: 0:23: 'accelerationStructureNV' : accelerationStructureNV can only be used in uniform variables or function parameters: a
-ERROR: 0:23: '=' :  cannot convert from ' const int' to ' temp accelerationStructureNV'
+ERROR: 0:23: '=' :  cannot convert from ' const float' to ' temp accelerationStructureNV'
 ERROR: 0:24: 'gl_PrimitiveID' : undeclared identifier 
 ERROR: 0:24: '=' :  cannot convert from ' temp float' to ' temp highp int'
 ERROR: 0:25: 'gl_InstanceID' : undeclared identifier (Did you mean gl_InstanceIndex?)
@@ -28,11 +29,13 @@
 ERROR: 0:34: '=' :  cannot convert from ' temp float' to ' temp highp 4X3 matrix of float'
 ERROR: 0:35: 'gl_HitTEXT' : undeclared identifier 
 ERROR: 0:36: 'gl_HitKindEXT' : undeclared identifier 
-ERROR: 0:37: 'reportIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:38: 'ignoreIntersectionEXT' : no matching overloaded function found 
-ERROR: 0:39: 'terminateRayEXT' : no matching overloaded function found 
-ERROR: 0:40: 'assign' :  l-value required "anon@3" (can't modify a shaderrecordnv qualified buffer)
-ERROR: 33 compilation errors.  No code generated.
+ERROR: 0:37: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling
+ERROR: 0:37: '=' :  cannot convert from ' const uint' to ' temp highp int'
+ERROR: 0:38: 'reportIntersectionEXT' : no matching overloaded function found 
+ERROR: 0:39: 'ignoreIntersectionEXT' : not supported in this stage: ray-generation
+ERROR: 0:40: 'terminateRayEXT' : not supported in this stage: ray-generation
+ERROR: 0:41: 'assign' :  l-value required "anon@3" (can't modify a shaderrecordnv qualified buffer)
+ERROR: 36 compilation errors.  No code generated.
 
 
 ERROR: Linking ray-generation stage: Only one shaderRecordNV buffer block is allowed per stage
diff --git a/Test/baseResults/spv.ext.RayPrimCull_Errors.rgen.out b/Test/baseResults/spv.ext.RayPrimCull_Errors.rgen.out
new file mode 100644
index 0000000..23d1acf
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayPrimCull_Errors.rgen.out
@@ -0,0 +1,9 @@
+spv.ext.RayPrimCull_Errors.rgen
+ERROR: 0:3: 'primitive culling' : required extension not requested: GL_EXT_ray_flags_primitive_culling
+ERROR: 0:5: 'primitive_culling' : layout qualifier can not have storage qualifiers 
+ERROR: 0:6: 'primitive_culling' : can only be applied as standalone 
+ERROR: 0:7: 'primitive_culling' : can only be applied as standalone 
+ERROR: 4 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.ext.RayQueryDecl.frag.out b/Test/baseResults/spv.ext.RayQueryDecl.frag.out
new file mode 100644
index 0000000..97681e9
--- /dev/null
+++ b/Test/baseResults/spv.ext.RayQueryDecl.frag.out
@@ -0,0 +1,39 @@
+spv.ext.RayQueryDecl.frag
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability RayQueryKHR
+                              Extension  "SPV_KHR_ray_query"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 14
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              SourceExtension  "GL_ARB_separate_shader_objects"
+                              SourceExtension  "GL_EXT_nonuniform_qualifier"
+                              SourceExtension  "GL_EXT_ray_query"
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_GOOGLE_cpp_style_line_directive"
+                              SourceExtension  "GL_GOOGLE_include_directive"
+                              Name 4  "main"
+                              Name 9  "outColor"
+                              Name 14  "rq"
+                              Decorate 9(outColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+     9(outColor):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeRayQueryKHR
+              13:             TypePointer Private 12
+          14(rq):     13(ptr) Variable Private
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(outColor) 11
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.ext.World3x4.rahit.out b/Test/baseResults/spv.ext.World3x4.rahit.out
new file mode 100644
index 0000000..40d73d1
--- /dev/null
+++ b/Test/baseResults/spv.ext.World3x4.rahit.out
@@ -0,0 +1,145 @@
+spv.ext.World3x4.rahit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 90
+
+                              Capability RayTracingKHR
+                              Extension  "SPV_KHR_ray_tracing"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint AnyHitKHR 4  "main" 43 60 78 87 89
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              Name 4  "main"
+                              Name 8  "k"
+                              Name 12  "ndx"
+                              Name 14  "col"
+                              Name 25  "row"
+                              Name 39  "p"
+                              Name 43  "gl_LaunchIDEXT"
+                              Name 53  "r"
+                              Name 60  "gl_WorldToObject3x4EXT"
+                              Name 66  "indexable"
+                              Name 72  "c"
+                              Name 78  "result"
+                              Name 87  "attribs"
+                              Name 89  "hitValue"
+                              Decorate 43(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 60(gl_WorldToObject3x4EXT) BuiltIn WorldToObjectKHR
+                              Decorate 78(result) DescriptorSet 0
+                              Decorate 78(result) Binding 0
+                              Decorate 89(hitValue) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:    6(float) Constant 1233125376
+              10:             TypeInt 32 1
+              11:             TypePointer Function 10(int)
+              13:     10(int) Constant 4294967295
+              15:     10(int) Constant 0
+              22:     10(int) Constant 3
+              23:             TypeBool
+              32:     10(int) Constant 4
+              35:     10(int) Constant 1
+              37:             TypeVector 10(int) 3
+              38:             TypePointer Function 37(ivec3)
+              40:             TypeInt 32 0
+              41:             TypeVector 40(int) 3
+              42:             TypePointer Input 41(ivec3)
+43(gl_LaunchIDEXT):     42(ptr) Variable Input
+              44:             TypeVector 40(int) 2
+              47:             TypeVector 10(int) 2
+              55:             TypeVector 6(float) 3
+              56:             TypeMatrix 55(fvec3) 4
+              57:             TypeVector 6(float) 4
+              58:             TypeMatrix 57(fvec4) 3
+              59:             TypePointer Input 56
+60(gl_WorldToObject3x4EXT):     59(ptr) Variable Input
+              65:             TypePointer Function 58
+              70:             TypeVector 10(int) 4
+              71:             TypePointer Function 70(ivec4)
+              76:             TypeImage 10(int) 3D nonsampled format:R32i
+              77:             TypePointer UniformConstant 76
+      78(result):     77(ptr) Variable UniformConstant
+              86:             TypePointer HitAttributeKHR 55(fvec3)
+     87(attribs):     86(ptr) Variable HitAttributeKHR
+              88:             TypePointer IncomingRayPayloadKHR 55(fvec3)
+    89(hitValue):     88(ptr) Variable IncomingRayPayloadKHR
+         4(main):           2 Function None 3
+               5:             Label
+            8(k):      7(ptr) Variable Function
+         12(ndx):     11(ptr) Variable Function
+         14(col):     11(ptr) Variable Function
+         25(row):     11(ptr) Variable Function
+           39(p):     38(ptr) Variable Function
+           53(r):      7(ptr) Variable Function
+   66(indexable):     65(ptr) Variable Function
+           72(c):     71(ptr) Variable Function
+                              Store 8(k) 9
+                              Store 12(ndx) 13
+                              Store 14(col) 15
+                              Branch 16
+              16:             Label
+                              LoopMerge 18 19 None
+                              Branch 20
+              20:             Label
+              21:     10(int) Load 14(col)
+              24:    23(bool) SLessThan 21 22
+                              BranchConditional 24 17 18
+              17:               Label
+                                Store 25(row) 15
+                                Branch 26
+              26:               Label
+                                LoopMerge 28 29 None
+                                Branch 30
+              30:               Label
+              31:     10(int)   Load 25(row)
+              33:    23(bool)   SLessThan 31 32
+                                BranchConditional 33 27 28
+              27:                 Label
+              34:     10(int)     Load 12(ndx)
+              36:     10(int)     IAdd 34 35
+                                  Store 12(ndx) 36
+              45:   41(ivec3)     Load 43(gl_LaunchIDEXT)
+              46:   44(ivec2)     VectorShuffle 45 45 0 1
+              48:   47(ivec2)     Bitcast 46
+              49:     10(int)     Load 12(ndx)
+              50:     10(int)     CompositeExtract 48 0
+              51:     10(int)     CompositeExtract 48 1
+              52:   37(ivec3)     CompositeConstruct 50 51 49
+                                  Store 39(p) 52
+              54:    6(float)     Load 8(k)
+              61:          56     Load 60(gl_WorldToObject3x4EXT)
+              62:          58     Transpose 61
+              63:     10(int)     Load 14(col)
+              64:     10(int)     Load 25(row)
+                                  Store 66(indexable) 62
+              67:      7(ptr)     AccessChain 66(indexable) 63 64
+              68:    6(float)     Load 67
+              69:    6(float)     FMul 54 68
+                                  Store 53(r) 69
+              73:    6(float)     Load 53(r)
+              74:     10(int)     ConvertFToS 73
+              75:   70(ivec4)     CompositeConstruct 74 15 15 35
+                                  Store 72(c) 75
+              79:          76     Load 78(result)
+              80:   37(ivec3)     Load 39(p)
+              81:   70(ivec4)     Load 72(c)
+                                  ImageWrite 79 80 81 SignExtend 
+                                  Branch 29
+              29:                 Label
+              82:     10(int)     Load 25(row)
+              83:     10(int)     IAdd 82 35
+                                  Store 25(row) 83
+                                  Branch 26
+              28:               Label
+                                Branch 19
+              19:               Label
+              84:     10(int)   Load 14(col)
+              85:     10(int)   IAdd 84 35
+                                Store 14(col) 85
+                                Branch 16
+              18:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.extPostDepthCoverage.frag.out b/Test/baseResults/spv.extPostDepthCoverage.frag.out
index 28d207b..cc96fb4 100644
--- a/Test/baseResults/spv.extPostDepthCoverage.frag.out
+++ b/Test/baseResults/spv.extPostDepthCoverage.frag.out
@@ -1,6 +1,6 @@
 spv.extPostDepthCoverage.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 6
 
                               Capability Shader
diff --git a/Test/baseResults/spv.float16.frag.out b/Test/baseResults/spv.float16.frag.out
index ca1bca1..dd677b4 100644
--- a/Test/baseResults/spv.float16.frag.out
+++ b/Test/baseResults/spv.float16.frag.out
@@ -1,7 +1,7 @@
 spv.float16.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 534
 
                               Capability Shader
@@ -115,6 +115,7 @@
                               Name 531  "f16_to_d"
                               Name 532  "f_to_f16"
                               Name 533  "d_to_f16"
+                              Decorate 465(if16v) Location 0
                               Decorate 512 ArrayStride 16
                               Decorate 513 ArrayStride 32
                               MemberDecorate 514(S) 0 Offset 0
@@ -340,7 +341,7 @@
              112:     35(ptr) AccessChain 42(f16v) 34
              113:28(float16_t) Load 112
              114:28(float16_t) Load 87(f16)
-             115:   109(bool) FOrdNotEqual 113 114
+             115:   109(bool) FUnordNotEqual 113 114
                               Store 111(b) 115
              116:     35(ptr) AccessChain 42(f16v) 90
              117:28(float16_t) Load 116
@@ -403,7 +404,7 @@
              161:151(f16vec3) Select 157 160 159
                               Store 153(f16v) 161
              162:151(f16vec3) Load 153(f16v)
-             163:  154(bvec3) FOrdNotEqual 162 159
+             163:  154(bvec3) FUnordNotEqual 162 159
                               Store 156(bv) 163
              168:  165(fvec3) Load 167(fv)
              169:151(f16vec3) FConvert 168
@@ -780,7 +781,7 @@
                               Store 442(bv) 459
              460:151(f16vec3) Load 443(f16v1)
              461:151(f16vec3) Load 445(f16v2)
-             462:  154(bvec3) FOrdNotEqual 460 461
+             462:  154(bvec3) FUnordNotEqual 460 461
                               Store 442(bv) 462
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.float16Fetch.frag.out b/Test/baseResults/spv.float16Fetch.frag.out
index 92ff631..38c5478 100644
--- a/Test/baseResults/spv.float16Fetch.frag.out
+++ b/Test/baseResults/spv.float16Fetch.frag.out
@@ -1,7 +1,7 @@
 spv.float16Fetch.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 5923
 
                               Capability Shader
diff --git a/Test/baseResults/spv.float16convertonlyarith.comp.out b/Test/baseResults/spv.float16convertonlyarith.comp.out
index 5c8c292..1666f79 100644
--- a/Test/baseResults/spv.float16convertonlyarith.comp.out
+++ b/Test/baseResults/spv.float16convertonlyarith.comp.out
@@ -1,6 +1,6 @@
 spv.float16convertonlyarith.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.float16convertonlystorage.comp.out b/Test/baseResults/spv.float16convertonlystorage.comp.out
index b37bb6b..8eb42f6 100644
--- a/Test/baseResults/spv.float16convertonlystorage.comp.out
+++ b/Test/baseResults/spv.float16convertonlystorage.comp.out
@@ -1,6 +1,6 @@
 spv.float16convertonlystorage.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.float32.frag.out b/Test/baseResults/spv.float32.frag.out
index db413c4..df73497 100644
--- a/Test/baseResults/spv.float32.frag.out
+++ b/Test/baseResults/spv.float32.frag.out
@@ -1,6 +1,6 @@
 spv.float32.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 533
 
                               Capability Shader
@@ -104,6 +104,7 @@
                               Name 530  "f16_to_d"
                               Name 531  "f_to_f16"
                               Name 532  "d_to_f16"
+                              Decorate 471(if32v) Location 0
                               Decorate 518 ArrayStride 16
                               Decorate 519 ArrayStride 32
                               MemberDecorate 520(S) 0 Offset 0
@@ -312,7 +313,7 @@
              110:     33(ptr) AccessChain 40(f32v) 32
              111:   26(float) Load 110
              112:   26(float) Load 85(f32)
-             113:   107(bool) FOrdNotEqual 111 112
+             113:   107(bool) FUnordNotEqual 111 112
                               Store 109(b) 113
              114:     33(ptr) AccessChain 40(f32v) 88
              115:   26(float) Load 114
@@ -382,7 +383,7 @@
              165:  153(fvec3) Select 161 164 163
                               Store 155(f32v) 165
              166:  153(fvec3) Load 155(f32v)
-             167:  158(bvec3) FOrdNotEqual 166 163
+             167:  158(bvec3) FUnordNotEqual 166 163
                               Store 160(bv) 167
              168:150(f64vec3) Load 152(f64v)
              169:  153(fvec3) FConvert 168
@@ -744,7 +745,7 @@
                               Store 448(bv) 465
              466:  153(fvec3) Load 449(f32v1)
              467:  153(fvec3) Load 451(f32v2)
-             468:  158(bvec3) FOrdNotEqual 466 467
+             468:  158(bvec3) FUnordNotEqual 466 467
                               Store 448(bv) 468
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.float64.frag.out b/Test/baseResults/spv.float64.frag.out
index b98c870..8a69367 100644
--- a/Test/baseResults/spv.float64.frag.out
+++ b/Test/baseResults/spv.float64.frag.out
@@ -1,7 +1,7 @@
 spv.float64.frag
 Validation failed
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 524
 
                               Capability Shader
@@ -105,6 +105,7 @@
                               Name 522  "f_to_f16"
                               Name 523  "d_to_f16"
                               Decorate 461(if64v) Flat
+                              Decorate 461(if64v) Location 0
                               Decorate 508 ArrayStride 16
                               Decorate 509 ArrayStride 64
                               MemberDecorate 510(S) 0 Offset 0
@@ -311,7 +312,7 @@
              110:     33(ptr) AccessChain 40(f64v) 32
              111:26(float64_t) Load 110
              112:26(float64_t) Load 85(f64)
-             113:   107(bool) FOrdNotEqual 111 112
+             113:   107(bool) FUnordNotEqual 111 112
                               Store 109(b) 113
              114:     33(ptr) AccessChain 40(f64v) 88
              115:26(float64_t) Load 114
@@ -377,7 +378,7 @@
              159:149(f64vec3) Select 155 158 157
                               Store 151(f64v) 159
              160:149(f64vec3) Load 151(f64v)
-             161:  152(bvec3) FOrdNotEqual 160 157
+             161:  152(bvec3) FUnordNotEqual 160 157
                               Store 154(bv) 161
              166:163(f16vec3) Load 165(f16v)
              167:149(f64vec3) FConvert 166
@@ -733,7 +734,7 @@
                               Store 438(bv) 455
              456:149(f64vec3) Load 439(f64v1)
              457:149(f64vec3) Load 441(f64v2)
-             458:  152(bvec3) FOrdNotEqual 456 457
+             458:  152(bvec3) FUnordNotEqual 456 457
                               Store 438(bv) 458
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.flowControl.frag.out b/Test/baseResults/spv.flowControl.frag.out
index fc68306..efbe63e 100644
--- a/Test/baseResults/spv.flowControl.frag.out
+++ b/Test/baseResults/spv.flowControl.frag.out
@@ -1,6 +1,6 @@
 spv.flowControl.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
@@ -19,6 +19,12 @@
                               Name 25  "bigColor"
                               Name 30  "smallColor"
                               Name 35  "gl_FragColor"
+                              Decorate 11(BaseColor) Location 5
+                              Decorate 14(otherColor) Location 3
+                              Decorate 17(c) Location 4
+                              Decorate 19(d) Location 0
+                              Decorate 25(bigColor) Location 1
+                              Decorate 30(smallColor) Location 2
                               Decorate 35(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.for-complex-condition.vert.out b/Test/baseResults/spv.for-complex-condition.vert.out
index 78252ee..ca971fd 100644
--- a/Test/baseResults/spv.for-complex-condition.vert.out
+++ b/Test/baseResults/spv.for-complex-condition.vert.out
@@ -1,6 +1,6 @@
 spv.for-complex-condition.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-continue-break.vert.out b/Test/baseResults/spv.for-continue-break.vert.out
index 50c034e..4ba1cb9 100644
--- a/Test/baseResults/spv.for-continue-break.vert.out
+++ b/Test/baseResults/spv.for-continue-break.vert.out
@@ -1,6 +1,6 @@
 spv.for-continue-break.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 45
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-nobody.vert.out b/Test/baseResults/spv.for-nobody.vert.out
index 26844c2..b965a58 100644
--- a/Test/baseResults/spv.for-nobody.vert.out
+++ b/Test/baseResults/spv.for-nobody.vert.out
@@ -1,6 +1,6 @@
 spv.for-nobody.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-notest.vert.out b/Test/baseResults/spv.for-notest.vert.out
index ff85cb4..d3e9603 100644
--- a/Test/baseResults/spv.for-notest.vert.out
+++ b/Test/baseResults/spv.for-notest.vert.out
@@ -1,6 +1,6 @@
 spv.for-notest.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.for-simple.vert.out b/Test/baseResults/spv.for-simple.vert.out
index a3e5d86..c4de996 100644
--- a/Test/baseResults/spv.for-simple.vert.out
+++ b/Test/baseResults/spv.for-simple.vert.out
@@ -1,6 +1,6 @@
 spv.for-simple.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.forLoop.frag.out b/Test/baseResults/spv.forLoop.frag.out
index b4b0f5d..1aac9a6 100644
--- a/Test/baseResults/spv.forLoop.frag.out
+++ b/Test/baseResults/spv.forLoop.frag.out
@@ -1,6 +1,6 @@
 spv.forLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 131
 
                               Capability Shader
@@ -25,9 +25,14 @@
                               Name 94  "i"
                               Name 104  "f"
                               Name 117  "i"
+                              Decorate 11(BaseColor) Location 1
                               Decorate 24(Count) Flat
+                              Decorate 24(Count) Location 3
+                              Decorate 28(bigColor) Location 0
                               Decorate 36(gl_FragColor) Location 0
                               Decorate 53(v4) Flat
+                              Decorate 53(v4) Location 4
+                              Decorate 104(f) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.forwardFun.frag.out b/Test/baseResults/spv.forwardFun.frag.out
index 26140af..f166286 100644
--- a/Test/baseResults/spv.forwardFun.frag.out
+++ b/Test/baseResults/spv.forwardFun.frag.out
@@ -1,6 +1,6 @@
 spv.forwardFun.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
@@ -26,6 +26,8 @@
                               Decorate 15(bar) RelaxedPrecision
                               Decorate 18(color) RelaxedPrecision
                               Decorate 20(BaseColor) RelaxedPrecision
+                              Decorate 20(BaseColor) Location 1
+                              Decorate 21(param) RelaxedPrecision
                               Decorate 22 RelaxedPrecision
                               Decorate 23 RelaxedPrecision
                               Decorate 24 RelaxedPrecision
@@ -37,11 +39,13 @@
                               Decorate 32 RelaxedPrecision
                               Decorate 33 RelaxedPrecision
                               Decorate 36(d) RelaxedPrecision
+                              Decorate 36(d) Location 2
                               Decorate 37 RelaxedPrecision
                               Decorate 52 RelaxedPrecision
                               Decorate 55 RelaxedPrecision
                               Decorate 56 RelaxedPrecision
                               Decorate 59(bigColor) RelaxedPrecision
+                              Decorate 59(bigColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
diff --git a/Test/baseResults/spv.fragmentDensity-es.frag.out b/Test/baseResults/spv.fragmentDensity-es.frag.out
index 69f92c8..253ce2e 100644
--- a/Test/baseResults/spv.fragmentDensity-es.frag.out
+++ b/Test/baseResults/spv.fragmentDensity-es.frag.out
@@ -1,6 +1,6 @@
 spv.fragmentDensity-es.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/spv.fragmentDensity.frag.out b/Test/baseResults/spv.fragmentDensity.frag.out
index 5bdb43a..4c831f2 100644
--- a/Test/baseResults/spv.fragmentDensity.frag.out
+++ b/Test/baseResults/spv.fragmentDensity.frag.out
@@ -1,6 +1,6 @@
 spv.fragmentDensity.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.fragmentShaderBarycentric.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric.frag.out
index fbded6e..2ea8f35 100644
--- a/Test/baseResults/spv.fragmentShaderBarycentric.frag.out
+++ b/Test/baseResults/spv.fragmentShaderBarycentric.frag.out
@@ -1,6 +1,6 @@
 spv.fragmentShaderBarycentric.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
diff --git a/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out
index 22b84ba..74a3498 100644
--- a/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out
+++ b/Test/baseResults/spv.fragmentShaderBarycentric2.frag.out
@@ -1,6 +1,6 @@
 spv.fragmentShaderBarycentric2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/spv.fsi.frag.out b/Test/baseResults/spv.fsi.frag.out
index b0c9713..3e06aed 100644
--- a/Test/baseResults/spv.fsi.frag.out
+++ b/Test/baseResults/spv.fsi.frag.out
@@ -1,6 +1,6 @@
 spv.fsi.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.fullyCovered.frag.out b/Test/baseResults/spv.fullyCovered.frag.out
index 4dbea15..ae7b426 100644
--- a/Test/baseResults/spv.fullyCovered.frag.out
+++ b/Test/baseResults/spv.fullyCovered.frag.out
@@ -1,6 +1,6 @@
 spv.fullyCovered.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
@@ -15,6 +15,7 @@
                               Name 4  "main"
                               Name 9  "color"
                               Name 12  "gl_FragFullyCoveredNV"
+                              Decorate 9(color) Location 0
                               Decorate 12(gl_FragFullyCoveredNV) BuiltIn FullyCoveredEXT
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.functionCall.frag.out b/Test/baseResults/spv.functionCall.frag.out
index 4fa7863..58b0461 100644
--- a/Test/baseResults/spv.functionCall.frag.out
+++ b/Test/baseResults/spv.functionCall.frag.out
@@ -4,7 +4,7 @@
 WARNING: 0:5: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 76
 
                               Capability Shader
@@ -28,7 +28,10 @@
                               Name 66  "g"
                               Name 69  "gl_FragColor"
                               Name 75  "bigColor"
+                              Decorate 35(d) Location 2
+                              Decorate 58(BaseColor) Location 1
                               Decorate 69(gl_FragColor) Location 0
+                              Decorate 75(bigColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.functionNestedOpaque.vert.out b/Test/baseResults/spv.functionNestedOpaque.vert.out
index 4543895..96a64aa 100644
--- a/Test/baseResults/spv.functionNestedOpaque.vert.out
+++ b/Test/baseResults/spv.functionNestedOpaque.vert.out
@@ -1,7 +1,7 @@
 spv.functionNestedOpaque.vert
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
@@ -19,6 +19,8 @@
                               Name 21  "bar(struct-S-s211;"
                               Name 20  "p"
                               Name 36  "si"
+                              Decorate 36(si) DescriptorSet 0
+                              Decorate 36(si) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.functionParameterTypes.frag.out b/Test/baseResults/spv.functionParameterTypes.frag.out
index decc190..65a33da 100644
--- a/Test/baseResults/spv.functionParameterTypes.frag.out
+++ b/Test/baseResults/spv.functionParameterTypes.frag.out
@@ -1,6 +1,6 @@
 spv.functionParameterTypes.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 34
 
                               Capability Shader
diff --git a/Test/baseResults/spv.functionSemantics.frag.out b/Test/baseResults/spv.functionSemantics.frag.out
index 000a7bc..f12aae0 100644
--- a/Test/baseResults/spv.functionSemantics.frag.out
+++ b/Test/baseResults/spv.functionSemantics.frag.out
@@ -1,6 +1,6 @@
 spv.functionSemantics.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 156
 
                               Capability Shader
@@ -42,6 +42,7 @@
                               Name 133  "param"
                               Name 136  "arg"
                               Name 152  "gl_FragColor"
+                              Decorate 76(u) Location 0
                               Decorate 152(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.glFragColor.frag.out b/Test/baseResults/spv.glFragColor.frag.out
index af25280..df39129 100644
--- a/Test/baseResults/spv.glFragColor.frag.out
+++ b/Test/baseResults/spv.glFragColor.frag.out
@@ -1,6 +1,6 @@
 spv.glFragColor.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 12
 
                               Capability Shader
diff --git a/Test/baseResults/spv.glsl.register.autoassign.frag.out b/Test/baseResults/spv.glsl.register.autoassign.frag.out
index 9872f4a..01df400 100644
--- a/Test/baseResults/spv.glsl.register.autoassign.frag.out
+++ b/Test/baseResults/spv.glsl.register.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.glsl.register.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 142
 
                               Capability Shader
diff --git a/Test/baseResults/spv.glsl.register.noautoassign.frag.out b/Test/baseResults/spv.glsl.register.noautoassign.frag.out
index b52e220..e475a00 100644
--- a/Test/baseResults/spv.glsl.register.noautoassign.frag.out
+++ b/Test/baseResults/spv.glsl.register.noautoassign.frag.out
@@ -1,6 +1,6 @@
 spv.glsl.register.noautoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 142
 
                               Capability Shader
diff --git a/Test/baseResults/spv.hlslDebugInfo.frag.out b/Test/baseResults/spv.hlslDebugInfo.frag.out
index 1d2e6b4..40089e7 100644
--- a/Test/baseResults/spv.hlslDebugInfo.frag.out
+++ b/Test/baseResults/spv.hlslDebugInfo.frag.out
@@ -1,6 +1,6 @@
 spv.hlslDebugInfo.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 19
 
                               Capability Shader
diff --git a/Test/baseResults/spv.hlslOffsets.vert.out b/Test/baseResults/spv.hlslOffsets.vert.out
index b1cdb6b..cc71283 100644
--- a/Test/baseResults/spv.hlslOffsets.vert.out
+++ b/Test/baseResults/spv.hlslOffsets.vert.out
@@ -18,7 +18,7 @@
 0:?     'anon@0' (layout( binding=0 column_major std430) buffer block{layout( column_major std430) buffer highp float m0, layout( column_major std430) buffer highp 3-component vector of float m4, layout( column_major std430) buffer highp float m16, layout( column_major std430 offset=20) buffer highp 3-component vector of float m20, layout( column_major std430) buffer highp 3-component vector of float m32, layout( column_major std430) buffer highp 2-component vector of float m48, layout( column_major std430) buffer highp 2-component vector of float m56, layout( column_major std430) buffer highp float m64, layout( column_major std430) buffer highp 2-component vector of float m68, layout( column_major std430) buffer highp float m76, layout( column_major std430) buffer highp float m80, layout( column_major std430 offset=88) buffer highp 2-component vector of float m88, layout( column_major std430) buffer highp 2-component vector of float m96, layout( column_major std430) buffer 2-component vector of double m112})
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 14
 
                               Capability Shader
diff --git a/Test/baseResults/spv.image.frag.out b/Test/baseResults/spv.image.frag.out
index 63d26d8..3e2096d 100644
--- a/Test/baseResults/spv.image.frag.out
+++ b/Test/baseResults/spv.image.frag.out
@@ -1,7 +1,7 @@
 spv.image.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 395
 
                               Capability Shader
@@ -68,13 +68,17 @@
                               Decorate 108(i2DMSArray) DescriptorSet 0
                               Decorate 108(i2DMSArray) Binding 10
                               Decorate 132(ic1D) Flat
+                              Decorate 132(ic1D) Location 0
                               Decorate 142(ic2D) Flat
+                              Decorate 142(ic2D) Location 1
                               Decorate 152(ic3D) Flat
+                              Decorate 152(ic3D) Location 2
                               Decorate 232(ii1D) DescriptorSet 0
                               Decorate 232(ii1D) Binding 11
                               Decorate 245(ui2D) DescriptorSet 0
                               Decorate 245(ui2D) Binding 12
                               Decorate 248(value) Flat
+                              Decorate 248(value) Location 4
                               Decorate 357(ii2DMS) DescriptorSet 0
                               Decorate 357(ii2DMS) Binding 13
                               Decorate 367(ui2DMSArray) DescriptorSet 0
@@ -82,7 +86,9 @@
                               Decorate 376(wo2D) DescriptorSet 0
                               Decorate 376(wo2D) Binding 1
                               Decorate 376(wo2D) NonReadable
+                              Decorate 381(fragData) Location 0
                               Decorate 394(ic4D) Flat
+                              Decorate 394(ic4D) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.imageAtomic64.frag.out b/Test/baseResults/spv.imageAtomic64.frag.out
new file mode 100644
index 0000000..3083697
--- /dev/null
+++ b/Test/baseResults/spv.imageAtomic64.frag.out
@@ -0,0 +1,634 @@
+spv.imageAtomic64.frag
+Validation failed
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 503
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+                              Capability StorageImageMultisample
+                              Capability ImageCubeArray
+                              Capability ImageRect
+                              Capability SparseResidency
+                              Capability Image1D
+                              Capability ImageBuffer
+                              Capability ImageMSArray
+                              Capability Int64ImageEXT
+                              Extension  "SPV_EXT_shader_image_int64"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_ARB_sparse_texture2"
+                              SourceExtension  "GL_EXT_shader_image_int64"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 12  "Buf"
+                              MemberName 12(Buf) 0  "i64"
+                              MemberName 12(Buf) 1  "u64"
+                              MemberName 12(Buf) 2  "i64v4"
+                              MemberName 12(Buf) 3  "u64v4"
+                              MemberName 12(Buf) 4  "i32v4"
+                              Name 14  ""
+                              Name 18  "i1D"
+                              Name 35  "i3D"
+                              Name 48  "iBuf"
+                              Name 58  "i2DArray"
+                              Name 69  "i2DRect"
+                              Name 81  "i2DMSArray"
+                              Name 194  "u2D"
+                              Name 207  "uCube"
+                              Name 218  "u1DArray"
+                              Name 229  "uCubeArray"
+                              Name 240  "u2DMS"
+                              Name 458  "ResType"
+                              Name 483  "ResType"
+                              MemberDecorate 12(Buf) 0 Offset 0
+                              MemberDecorate 12(Buf) 1 Offset 8
+                              MemberDecorate 12(Buf) 2 Offset 32
+                              MemberDecorate 12(Buf) 3 Offset 64
+                              MemberDecorate 12(Buf) 4 Offset 96
+                              Decorate 12(Buf) BufferBlock
+                              Decorate 14 DescriptorSet 0
+                              Decorate 14 Binding 11
+                              Decorate 18(i1D) DescriptorSet 0
+                              Decorate 18(i1D) Binding 0
+                              Decorate 35(i3D) DescriptorSet 0
+                              Decorate 35(i3D) Binding 2
+                              Decorate 48(iBuf) DescriptorSet 0
+                              Decorate 48(iBuf) Binding 4
+                              Decorate 58(i2DArray) DescriptorSet 0
+                              Decorate 58(i2DArray) Binding 6
+                              Decorate 69(i2DRect) DescriptorSet 0
+                              Decorate 69(i2DRect) Binding 8
+                              Decorate 81(i2DMSArray) DescriptorSet 0
+                              Decorate 81(i2DMSArray) Binding 10
+                              Decorate 194(u2D) DescriptorSet 0
+                              Decorate 194(u2D) Binding 1
+                              Decorate 207(uCube) DescriptorSet 0
+                              Decorate 207(uCube) Binding 3
+                              Decorate 218(u1DArray) DescriptorSet 0
+                              Decorate 218(u1DArray) Binding 5
+                              Decorate 229(uCubeArray) DescriptorSet 0
+                              Decorate 229(uCubeArray) Binding 7
+                              Decorate 240(u2DMS) DescriptorSet 0
+                              Decorate 240(u2DMS) Binding 9
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 1
+               7:             TypeInt 64 0
+               8:             TypeVector 6(int64_t) 4
+               9:             TypeVector 7(int64_t) 4
+              10:             TypeInt 32 1
+              11:             TypeVector 10(int) 4
+         12(Buf):             TypeStruct 6(int64_t) 7(int64_t) 8(i64vec4) 9(i64vec4) 11(ivec4)
+              13:             TypePointer Uniform 12(Buf)
+              14:     13(ptr) Variable Uniform
+              15:     10(int) Constant 0
+              16:             TypeImage 6(int64_t) 1D nonsampled format:R64i
+              17:             TypePointer UniformConstant 16
+         18(i1D):     17(ptr) Variable UniformConstant
+              19:     10(int) Constant 4
+              20:             TypeInt 32 0
+              21:     20(int) Constant 0
+              22:             TypePointer Uniform 10(int)
+              25:             TypePointer Uniform 6(int64_t)
+              28:             TypePointer Image 6(int64_t)
+              30:     20(int) Constant 1
+              33:             TypeImage 6(int64_t) 3D nonsampled format:R64i
+              34:             TypePointer UniformConstant 33
+         35(i3D):     34(ptr) Variable UniformConstant
+              36:             TypeVector 10(int) 3
+              37:             TypePointer Uniform 11(ivec4)
+              46:             TypeImage 6(int64_t) Buffer nonsampled format:R64i
+              47:             TypePointer UniformConstant 46
+        48(iBuf):     47(ptr) Variable UniformConstant
+              56:             TypeImage 6(int64_t) 2D array nonsampled format:R64i
+              57:             TypePointer UniformConstant 56
+    58(i2DArray):     57(ptr) Variable UniformConstant
+              67:             TypeImage 6(int64_t) Rect nonsampled format:R64i
+              68:             TypePointer UniformConstant 67
+     69(i2DRect):     68(ptr) Variable UniformConstant
+              70:             TypeVector 10(int) 2
+              79:             TypeImage 6(int64_t) 2D array multi-sampled nonsampled format:R64i
+              80:             TypePointer UniformConstant 79
+  81(i2DMSArray):     80(ptr) Variable UniformConstant
+              85:     20(int) Constant 3
+             107:  6(int64_t) Constant 1 0
+             116:     10(int) Constant 1
+             117:     10(int) Constant 2048
+             119:     20(int) Constant 2048
+             192:             TypeImage 7(int64_t) 2D nonsampled format:R64ui
+             193:             TypePointer UniformConstant 192
+        194(u2D):    193(ptr) Variable UniformConstant
+             198:             TypePointer Uniform 7(int64_t)
+             201:             TypePointer Image 7(int64_t)
+             205:             TypeImage 7(int64_t) Cube nonsampled format:R64ui
+             206:             TypePointer UniformConstant 205
+      207(uCube):    206(ptr) Variable UniformConstant
+             216:             TypeImage 7(int64_t) 1D array nonsampled format:R64ui
+             217:             TypePointer UniformConstant 216
+   218(u1DArray):    217(ptr) Variable UniformConstant
+             227:             TypeImage 7(int64_t) Cube array nonsampled format:R64ui
+             228:             TypePointer UniformConstant 227
+ 229(uCubeArray):    228(ptr) Variable UniformConstant
+             238:             TypeImage 7(int64_t) 2D multi-sampled nonsampled format:R64ui
+             239:             TypePointer UniformConstant 238
+      240(u2DMS):    239(ptr) Variable UniformConstant
+             244:     20(int) Constant 2
+             275:  7(int64_t) Constant 1 0
+             363:     10(int) Constant 2
+             368:             TypePointer Uniform 8(i64vec4)
+             423:     10(int) Constant 3
+             424:             TypePointer Uniform 9(i64vec4)
+    458(ResType):             TypeStruct 10(int) 8(i64vec4)
+    483(ResType):             TypeStruct 10(int) 9(i64vec4)
+         4(main):           2 Function None 3
+               5:             Label
+              23:     22(ptr) AccessChain 14 19 21
+              24:     10(int) Load 23
+              26:     25(ptr) AccessChain 14 15
+              27:  6(int64_t) Load 26
+              29:     28(ptr) ImageTexelPointer 18(i1D) 24 21
+              31:  6(int64_t) AtomicIAdd 29 30 21 27
+              32:     25(ptr) AccessChain 14 15
+                              Store 32 31
+              38:     37(ptr) AccessChain 14 19
+              39:   11(ivec4) Load 38
+              40:   36(ivec3) VectorShuffle 39 39 0 1 2
+              41:     25(ptr) AccessChain 14 15
+              42:  6(int64_t) Load 41
+              43:     28(ptr) ImageTexelPointer 35(i3D) 40 21
+              44:  6(int64_t) AtomicSMin 43 30 21 42
+              45:     25(ptr) AccessChain 14 15
+                              Store 45 44
+              49:     22(ptr) AccessChain 14 19 21
+              50:     10(int) Load 49
+              51:     25(ptr) AccessChain 14 15
+              52:  6(int64_t) Load 51
+              53:     28(ptr) ImageTexelPointer 48(iBuf) 50 21
+              54:  6(int64_t) AtomicSMax 53 30 21 52
+              55:     25(ptr) AccessChain 14 15
+                              Store 55 54
+              59:     37(ptr) AccessChain 14 19
+              60:   11(ivec4) Load 59
+              61:   36(ivec3) VectorShuffle 60 60 0 1 2
+              62:     25(ptr) AccessChain 14 15
+              63:  6(int64_t) Load 62
+              64:     28(ptr) ImageTexelPointer 58(i2DArray) 61 21
+              65:  6(int64_t) AtomicAnd 64 30 21 63
+              66:     25(ptr) AccessChain 14 15
+                              Store 66 65
+              71:     37(ptr) AccessChain 14 19
+              72:   11(ivec4) Load 71
+              73:   70(ivec2) VectorShuffle 72 72 0 1
+              74:     25(ptr) AccessChain 14 15
+              75:  6(int64_t) Load 74
+              76:     28(ptr) ImageTexelPointer 69(i2DRect) 73 21
+              77:  6(int64_t) AtomicOr 76 30 21 75
+              78:     25(ptr) AccessChain 14 15
+                              Store 78 77
+              82:     37(ptr) AccessChain 14 19
+              83:   11(ivec4) Load 82
+              84:   36(ivec3) VectorShuffle 83 83 0 1 2
+              86:     22(ptr) AccessChain 14 19 85
+              87:     10(int) Load 86
+              88:     25(ptr) AccessChain 14 15
+              89:  6(int64_t) Load 88
+              90:     28(ptr) ImageTexelPointer 81(i2DMSArray) 84 87
+              91:  6(int64_t) AtomicXor 90 30 21 89
+              92:     25(ptr) AccessChain 14 15
+                              Store 92 91
+              93:     22(ptr) AccessChain 14 19 21
+              94:     10(int) Load 93
+              95:     25(ptr) AccessChain 14 15
+              96:  6(int64_t) Load 95
+              97:     28(ptr) ImageTexelPointer 18(i1D) 94 21
+              98:  6(int64_t) AtomicExchange 97 30 21 96
+              99:     25(ptr) AccessChain 14 15
+                              Store 99 98
+             100:     37(ptr) AccessChain 14 19
+             101:   11(ivec4) Load 100
+             102:   36(ivec3) VectorShuffle 101 101 0 1 2
+             103:     25(ptr) AccessChain 14 15
+             104:  6(int64_t) Load 103
+             105:     25(ptr) AccessChain 14 15
+             106:  6(int64_t) Load 105
+             108:  6(int64_t) IAdd 106 107
+             109:     28(ptr) ImageTexelPointer 35(i3D) 102 21
+             110:  6(int64_t) AtomicCompareExchange 109 30 21 21 108 104
+             111:     25(ptr) AccessChain 14 15
+                              Store 111 110
+             112:     22(ptr) AccessChain 14 19 21
+             113:     10(int) Load 112
+             114:     25(ptr) AccessChain 14 15
+             115:  6(int64_t) Load 114
+             118:     28(ptr) ImageTexelPointer 18(i1D) 113 21
+             120:  6(int64_t) AtomicIAdd 118 116 119 115
+             121:     25(ptr) AccessChain 14 15
+                              Store 121 120
+             122:     37(ptr) AccessChain 14 19
+             123:   11(ivec4) Load 122
+             124:   36(ivec3) VectorShuffle 123 123 0 1 2
+             125:     25(ptr) AccessChain 14 15
+             126:  6(int64_t) Load 125
+             127:     28(ptr) ImageTexelPointer 35(i3D) 124 21
+             128:  6(int64_t) AtomicSMin 127 116 119 126
+             129:     25(ptr) AccessChain 14 15
+                              Store 129 128
+             130:     22(ptr) AccessChain 14 19 21
+             131:     10(int) Load 130
+             132:     25(ptr) AccessChain 14 15
+             133:  6(int64_t) Load 132
+             134:     28(ptr) ImageTexelPointer 48(iBuf) 131 21
+             135:  6(int64_t) AtomicSMax 134 116 119 133
+             136:     25(ptr) AccessChain 14 15
+                              Store 136 135
+             137:     37(ptr) AccessChain 14 19
+             138:   11(ivec4) Load 137
+             139:   36(ivec3) VectorShuffle 138 138 0 1 2
+             140:     25(ptr) AccessChain 14 15
+             141:  6(int64_t) Load 140
+             142:     28(ptr) ImageTexelPointer 58(i2DArray) 139 21
+             143:  6(int64_t) AtomicAnd 142 116 119 141
+             144:     25(ptr) AccessChain 14 15
+                              Store 144 143
+             145:     37(ptr) AccessChain 14 19
+             146:   11(ivec4) Load 145
+             147:   70(ivec2) VectorShuffle 146 146 0 1
+             148:     25(ptr) AccessChain 14 15
+             149:  6(int64_t) Load 148
+             150:     28(ptr) ImageTexelPointer 69(i2DRect) 147 21
+             151:  6(int64_t) AtomicOr 150 116 119 149
+             152:     25(ptr) AccessChain 14 15
+                              Store 152 151
+             153:     37(ptr) AccessChain 14 19
+             154:   11(ivec4) Load 153
+             155:   36(ivec3) VectorShuffle 154 154 0 1 2
+             156:     22(ptr) AccessChain 14 19 85
+             157:     10(int) Load 156
+             158:     25(ptr) AccessChain 14 15
+             159:  6(int64_t) Load 158
+             160:     28(ptr) ImageTexelPointer 81(i2DMSArray) 155 157
+             161:  6(int64_t) AtomicXor 160 116 119 159
+             162:     25(ptr) AccessChain 14 15
+                              Store 162 161
+             163:     22(ptr) AccessChain 14 19 21
+             164:     10(int) Load 163
+             165:     25(ptr) AccessChain 14 15
+             166:  6(int64_t) Load 165
+             167:     28(ptr) ImageTexelPointer 18(i1D) 164 21
+             168:  6(int64_t) AtomicExchange 167 116 119 166
+             169:     25(ptr) AccessChain 14 15
+                              Store 169 168
+             170:     37(ptr) AccessChain 14 19
+             171:   11(ivec4) Load 170
+             172:   36(ivec3) VectorShuffle 171 171 0 1 2
+             173:     25(ptr) AccessChain 14 15
+             174:  6(int64_t) Load 173
+             175:     25(ptr) AccessChain 14 15
+             176:  6(int64_t) Load 175
+             177:  6(int64_t) IAdd 176 107
+             178:     28(ptr) ImageTexelPointer 35(i3D) 172 21
+             179:  6(int64_t) AtomicCompareExchange 178 116 119 119 177 174
+             180:     25(ptr) AccessChain 14 15
+                              Store 180 179
+             181:     22(ptr) AccessChain 14 19 21
+             182:     10(int) Load 181
+             183:     28(ptr) ImageTexelPointer 48(iBuf) 182 21
+             184:  6(int64_t) AtomicLoad 183 116 119
+             185:     25(ptr) AccessChain 14 15
+                              Store 185 184
+             186:     37(ptr) AccessChain 14 19
+             187:   11(ivec4) Load 186
+             188:   36(ivec3) VectorShuffle 187 187 0 1 2
+             189:     25(ptr) AccessChain 14 15
+             190:  6(int64_t) Load 189
+             191:     28(ptr) ImageTexelPointer 58(i2DArray) 188 21
+                              AtomicStore 191 116 119 190
+             195:     37(ptr) AccessChain 14 19
+             196:   11(ivec4) Load 195
+             197:   70(ivec2) VectorShuffle 196 196 0 1
+             199:    198(ptr) AccessChain 14 116
+             200:  7(int64_t) Load 199
+             202:    201(ptr) ImageTexelPointer 194(u2D) 197 21
+             203:  7(int64_t) AtomicIAdd 202 30 21 200
+             204:    198(ptr) AccessChain 14 116
+                              Store 204 203
+             208:     37(ptr) AccessChain 14 19
+             209:   11(ivec4) Load 208
+             210:   36(ivec3) VectorShuffle 209 209 0 1 2
+             211:    198(ptr) AccessChain 14 116
+             212:  7(int64_t) Load 211
+             213:    201(ptr) ImageTexelPointer 207(uCube) 210 21
+             214:  7(int64_t) AtomicUMin 213 30 21 212
+             215:    198(ptr) AccessChain 14 116
+                              Store 215 214
+             219:     37(ptr) AccessChain 14 19
+             220:   11(ivec4) Load 219
+             221:   70(ivec2) VectorShuffle 220 220 0 1
+             222:    198(ptr) AccessChain 14 116
+             223:  7(int64_t) Load 222
+             224:    201(ptr) ImageTexelPointer 218(u1DArray) 221 21
+             225:  7(int64_t) AtomicUMax 224 30 21 223
+             226:    198(ptr) AccessChain 14 116
+                              Store 226 225
+             230:     37(ptr) AccessChain 14 19
+             231:   11(ivec4) Load 230
+             232:   36(ivec3) VectorShuffle 231 231 0 1 2
+             233:    198(ptr) AccessChain 14 116
+             234:  7(int64_t) Load 233
+             235:    201(ptr) ImageTexelPointer 229(uCubeArray) 232 21
+             236:  7(int64_t) AtomicAnd 235 30 21 234
+             237:    198(ptr) AccessChain 14 116
+                              Store 237 236
+             241:     37(ptr) AccessChain 14 19
+             242:   11(ivec4) Load 241
+             243:   70(ivec2) VectorShuffle 242 242 0 1
+             245:     22(ptr) AccessChain 14 19 244
+             246:     10(int) Load 245
+             247:    198(ptr) AccessChain 14 116
+             248:  7(int64_t) Load 247
+             249:    201(ptr) ImageTexelPointer 240(u2DMS) 243 246
+             250:  7(int64_t) AtomicOr 249 30 21 248
+             251:    198(ptr) AccessChain 14 116
+                              Store 251 250
+             252:     37(ptr) AccessChain 14 19
+             253:   11(ivec4) Load 252
+             254:   70(ivec2) VectorShuffle 253 253 0 1
+             255:    198(ptr) AccessChain 14 116
+             256:  7(int64_t) Load 255
+             257:    201(ptr) ImageTexelPointer 194(u2D) 254 21
+             258:  7(int64_t) AtomicXor 257 30 21 256
+             259:    198(ptr) AccessChain 14 116
+                              Store 259 258
+             260:     37(ptr) AccessChain 14 19
+             261:   11(ivec4) Load 260
+             262:   36(ivec3) VectorShuffle 261 261 0 1 2
+             263:    198(ptr) AccessChain 14 116
+             264:  7(int64_t) Load 263
+             265:    201(ptr) ImageTexelPointer 207(uCube) 262 21
+             266:  7(int64_t) AtomicExchange 265 30 21 264
+             267:    198(ptr) AccessChain 14 116
+                              Store 267 266
+             268:     37(ptr) AccessChain 14 19
+             269:   11(ivec4) Load 268
+             270:   70(ivec2) VectorShuffle 269 269 0 1
+             271:    198(ptr) AccessChain 14 116
+             272:  7(int64_t) Load 271
+             273:    198(ptr) AccessChain 14 116
+             274:  7(int64_t) Load 273
+             276:  7(int64_t) IAdd 274 275
+             277:    201(ptr) ImageTexelPointer 218(u1DArray) 270 21
+             278:  7(int64_t) AtomicCompareExchange 277 30 21 21 276 272
+             279:    198(ptr) AccessChain 14 116
+                              Store 279 278
+             280:     37(ptr) AccessChain 14 19
+             281:   11(ivec4) Load 280
+             282:   70(ivec2) VectorShuffle 281 281 0 1
+             283:    198(ptr) AccessChain 14 116
+             284:  7(int64_t) Load 283
+             285:    201(ptr) ImageTexelPointer 194(u2D) 282 21
+             286:  7(int64_t) AtomicIAdd 285 116 119 284
+             287:    198(ptr) AccessChain 14 116
+                              Store 287 286
+             288:     37(ptr) AccessChain 14 19
+             289:   11(ivec4) Load 288
+             290:   36(ivec3) VectorShuffle 289 289 0 1 2
+             291:    198(ptr) AccessChain 14 116
+             292:  7(int64_t) Load 291
+             293:    201(ptr) ImageTexelPointer 207(uCube) 290 21
+             294:  7(int64_t) AtomicUMin 293 116 119 292
+             295:    198(ptr) AccessChain 14 116
+                              Store 295 294
+             296:     37(ptr) AccessChain 14 19
+             297:   11(ivec4) Load 296
+             298:   70(ivec2) VectorShuffle 297 297 0 1
+             299:    198(ptr) AccessChain 14 116
+             300:  7(int64_t) Load 299
+             301:    201(ptr) ImageTexelPointer 218(u1DArray) 298 21
+             302:  7(int64_t) AtomicUMax 301 116 119 300
+             303:    198(ptr) AccessChain 14 116
+                              Store 303 302
+             304:     37(ptr) AccessChain 14 19
+             305:   11(ivec4) Load 304
+             306:   36(ivec3) VectorShuffle 305 305 0 1 2
+             307:    198(ptr) AccessChain 14 116
+             308:  7(int64_t) Load 307
+             309:    201(ptr) ImageTexelPointer 229(uCubeArray) 306 21
+             310:  7(int64_t) AtomicAnd 309 116 119 308
+             311:    198(ptr) AccessChain 14 116
+                              Store 311 310
+             312:     37(ptr) AccessChain 14 19
+             313:   11(ivec4) Load 312
+             314:   70(ivec2) VectorShuffle 313 313 0 1
+             315:     22(ptr) AccessChain 14 19 244
+             316:     10(int) Load 315
+             317:    198(ptr) AccessChain 14 116
+             318:  7(int64_t) Load 317
+             319:    201(ptr) ImageTexelPointer 240(u2DMS) 314 316
+             320:  7(int64_t) AtomicOr 319 116 119 318
+             321:    198(ptr) AccessChain 14 116
+                              Store 321 320
+             322:     37(ptr) AccessChain 14 19
+             323:   11(ivec4) Load 322
+             324:   70(ivec2) VectorShuffle 323 323 0 1
+             325:    198(ptr) AccessChain 14 116
+             326:  7(int64_t) Load 325
+             327:    201(ptr) ImageTexelPointer 194(u2D) 324 21
+             328:  7(int64_t) AtomicXor 327 116 119 326
+             329:    198(ptr) AccessChain 14 116
+                              Store 329 328
+             330:     37(ptr) AccessChain 14 19
+             331:   11(ivec4) Load 330
+             332:   36(ivec3) VectorShuffle 331 331 0 1 2
+             333:    198(ptr) AccessChain 14 116
+             334:  7(int64_t) Load 333
+             335:    201(ptr) ImageTexelPointer 207(uCube) 332 21
+             336:  7(int64_t) AtomicExchange 335 116 119 334
+             337:    198(ptr) AccessChain 14 116
+                              Store 337 336
+             338:     37(ptr) AccessChain 14 19
+             339:   11(ivec4) Load 338
+             340:   70(ivec2) VectorShuffle 339 339 0 1
+             341:    198(ptr) AccessChain 14 116
+             342:  7(int64_t) Load 341
+             343:    198(ptr) AccessChain 14 116
+             344:  7(int64_t) Load 343
+             345:  7(int64_t) IAdd 344 275
+             346:    201(ptr) ImageTexelPointer 218(u1DArray) 340 21
+             347:  7(int64_t) AtomicCompareExchange 346 116 119 119 345 342
+             348:    198(ptr) AccessChain 14 116
+                              Store 348 347
+             349:     37(ptr) AccessChain 14 19
+             350:   11(ivec4) Load 349
+             351:   36(ivec3) VectorShuffle 350 350 0 1 2
+             352:    201(ptr) ImageTexelPointer 229(uCubeArray) 351 21
+             353:  7(int64_t) AtomicLoad 352 116 119
+             354:    198(ptr) AccessChain 14 116
+                              Store 354 353
+             355:     37(ptr) AccessChain 14 19
+             356:   11(ivec4) Load 355
+             357:   70(ivec2) VectorShuffle 356 356 0 1
+             358:     22(ptr) AccessChain 14 19 244
+             359:     10(int) Load 358
+             360:    198(ptr) AccessChain 14 116
+             361:  7(int64_t) Load 360
+             362:    201(ptr) ImageTexelPointer 240(u2DMS) 357 359
+                              AtomicStore 362 116 119 361
+             364:          16 Load 18(i1D)
+             365:     22(ptr) AccessChain 14 19 21
+             366:     10(int) Load 365
+             367:  8(i64vec4) ImageRead 364 366
+             369:    368(ptr) AccessChain 14 363
+             370:  8(i64vec4) Load 369
+             371:  8(i64vec4) IAdd 370 367
+             372:    368(ptr) AccessChain 14 363
+                              Store 372 371
+             373:          33 Load 35(i3D)
+             374:     37(ptr) AccessChain 14 19
+             375:   11(ivec4) Load 374
+             376:   36(ivec3) VectorShuffle 375 375 0 1 2
+             377:  8(i64vec4) ImageRead 373 376
+             378:    368(ptr) AccessChain 14 363
+             379:  8(i64vec4) Load 378
+             380:  8(i64vec4) IAdd 379 377
+             381:    368(ptr) AccessChain 14 363
+                              Store 381 380
+             382:          46 Load 48(iBuf)
+             383:     22(ptr) AccessChain 14 19 21
+             384:     10(int) Load 383
+             385:  8(i64vec4) ImageRead 382 384
+             386:    368(ptr) AccessChain 14 363
+             387:  8(i64vec4) Load 386
+             388:  8(i64vec4) IAdd 387 385
+             389:    368(ptr) AccessChain 14 363
+                              Store 389 388
+             390:          56 Load 58(i2DArray)
+             391:     37(ptr) AccessChain 14 19
+             392:   11(ivec4) Load 391
+             393:   36(ivec3) VectorShuffle 392 392 0 1 2
+             394:  8(i64vec4) ImageRead 390 393
+             395:    368(ptr) AccessChain 14 363
+             396:  8(i64vec4) Load 395
+             397:  8(i64vec4) IAdd 396 394
+             398:    368(ptr) AccessChain 14 363
+                              Store 398 397
+             399:          67 Load 69(i2DRect)
+             400:     37(ptr) AccessChain 14 19
+             401:   11(ivec4) Load 400
+             402:   70(ivec2) VectorShuffle 401 401 0 1
+             403:  8(i64vec4) ImageRead 399 402
+             404:    368(ptr) AccessChain 14 363
+             405:  8(i64vec4) Load 404
+             406:  8(i64vec4) IAdd 405 403
+             407:    368(ptr) AccessChain 14 363
+                              Store 407 406
+             408:          79 Load 81(i2DMSArray)
+             409:     37(ptr) AccessChain 14 19
+             410:   11(ivec4) Load 409
+             411:   36(ivec3) VectorShuffle 410 410 0 1 2
+             412:     22(ptr) AccessChain 14 19 85
+             413:     10(int) Load 412
+             414:  8(i64vec4) ImageRead 408 411 Sample 413
+             415:    368(ptr) AccessChain 14 363
+             416:  8(i64vec4) Load 415
+             417:  8(i64vec4) IAdd 416 414
+             418:    368(ptr) AccessChain 14 363
+                              Store 418 417
+             419:         192 Load 194(u2D)
+             420:     37(ptr) AccessChain 14 19
+             421:   11(ivec4) Load 420
+             422:   70(ivec2) VectorShuffle 421 421 0 1
+             425:    424(ptr) AccessChain 14 423
+             426:  9(i64vec4) Load 425
+                              ImageWrite 419 422 426
+             427:         205 Load 207(uCube)
+             428:     37(ptr) AccessChain 14 19
+             429:   11(ivec4) Load 428
+             430:   36(ivec3) VectorShuffle 429 429 0 1 2
+             431:    424(ptr) AccessChain 14 423
+             432:  9(i64vec4) Load 431
+                              ImageWrite 427 430 432
+             433:         216 Load 218(u1DArray)
+             434:     37(ptr) AccessChain 14 19
+             435:   11(ivec4) Load 434
+             436:   70(ivec2) VectorShuffle 435 435 0 1
+             437:    424(ptr) AccessChain 14 423
+             438:  9(i64vec4) Load 437
+                              ImageWrite 433 436 438
+             439:         227 Load 229(uCubeArray)
+             440:     37(ptr) AccessChain 14 19
+             441:   11(ivec4) Load 440
+             442:   36(ivec3) VectorShuffle 441 441 0 1 2
+             443:    424(ptr) AccessChain 14 423
+             444:  9(i64vec4) Load 443
+                              ImageWrite 439 442 444
+             445:         238 Load 240(u2DMS)
+             446:     37(ptr) AccessChain 14 19
+             447:   11(ivec4) Load 446
+             448:   70(ivec2) VectorShuffle 447 447 0 1
+             449:     22(ptr) AccessChain 14 19 244
+             450:     10(int) Load 449
+             451:    424(ptr) AccessChain 14 423
+             452:  9(i64vec4) Load 451
+                              ImageWrite 445 448 452 Sample 450
+             453:          33 Load 35(i3D)
+             454:     37(ptr) AccessChain 14 19
+             455:   11(ivec4) Load 454
+             456:   36(ivec3) VectorShuffle 455 455 0 1 2
+             457:    368(ptr) AccessChain 14 363
+             459:458(ResType) ImageSparseRead 453 456
+             460:  8(i64vec4) CompositeExtract 459 1
+                              Store 457 460
+             461:     10(int) CompositeExtract 459 0
+             462:          56 Load 58(i2DArray)
+             463:     37(ptr) AccessChain 14 19
+             464:   11(ivec4) Load 463
+             465:   36(ivec3) VectorShuffle 464 464 0 1 2
+             466:    368(ptr) AccessChain 14 363
+             467:458(ResType) ImageSparseRead 462 465
+             468:  8(i64vec4) CompositeExtract 467 1
+                              Store 466 468
+             469:     10(int) CompositeExtract 467 0
+             470:          67 Load 69(i2DRect)
+             471:     37(ptr) AccessChain 14 19
+             472:   11(ivec4) Load 471
+             473:   70(ivec2) VectorShuffle 472 472 0 1
+             474:    368(ptr) AccessChain 14 363
+             475:458(ResType) ImageSparseRead 470 473
+             476:  8(i64vec4) CompositeExtract 475 1
+                              Store 474 476
+             477:     10(int) CompositeExtract 475 0
+             478:         192 Load 194(u2D)
+             479:     37(ptr) AccessChain 14 19
+             480:   11(ivec4) Load 479
+             481:   70(ivec2) VectorShuffle 480 480 0 1
+             482:    424(ptr) AccessChain 14 423
+             484:483(ResType) ImageSparseRead 478 481
+             485:  9(i64vec4) CompositeExtract 484 1
+                              Store 482 485
+             486:     10(int) CompositeExtract 484 0
+             487:         205 Load 207(uCube)
+             488:     37(ptr) AccessChain 14 19
+             489:   11(ivec4) Load 488
+             490:   36(ivec3) VectorShuffle 489 489 0 1 2
+             491:    424(ptr) AccessChain 14 423
+             492:483(ResType) ImageSparseRead 487 490
+             493:  9(i64vec4) CompositeExtract 492 1
+                              Store 491 493
+             494:     10(int) CompositeExtract 492 0
+             495:         227 Load 229(uCubeArray)
+             496:     37(ptr) AccessChain 14 19
+             497:   11(ivec4) Load 496
+             498:   36(ivec3) VectorShuffle 497 497 0 1 2
+             499:    424(ptr) AccessChain 14 423
+             500:483(ResType) ImageSparseRead 495 498
+             501:  9(i64vec4) CompositeExtract 500 1
+                              Store 499 501
+             502:     10(int) CompositeExtract 500 0
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.imageLoadStoreLod.frag.out b/Test/baseResults/spv.imageLoadStoreLod.frag.out
index ec16d90..b809474 100644
--- a/Test/baseResults/spv.imageLoadStoreLod.frag.out
+++ b/Test/baseResults/spv.imageLoadStoreLod.frag.out
@@ -1,20 +1,25 @@
 spv.imageLoadStoreLod.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 82
+// Generated by (magic number): 8000a
+// Id's are bound by 148
 
                               Capability Shader
+                              Capability Int64
                               Capability ImageCubeArray
                               Capability SparseResidency
                               Capability Image1D
                               Capability ImageReadWriteLodAMD
+                              Capability Int64ImageEXT
                               Extension  "SPV_AMD_shader_image_load_store_lod"
+                              Extension  "SPV_EXT_shader_image_int64"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint Fragment 4  "main" 77
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_AMD_shader_image_load_store_lod"
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_shader_image_int64"
                               Name 4  "main"
                               Name 9  "f4"
                               Name 14  "i1D"
@@ -27,6 +32,18 @@
                               Name 65  "ResType"
                               Name 71  "uiCubeArray"
                               Name 77  "fragColor"
+                              Name 86  "Buf"
+                              MemberName 86(Buf) 0  "i64v4"
+                              MemberName 86(Buf) 1  "u64v4"
+                              Name 88  ""
+                              Name 92  "i64i1D"
+                              Name 102  "i64i2D"
+                              Name 111  "i64i3D"
+                              Name 120  "u64iCube"
+                              Name 127  "u64i1DArray"
+                              Name 133  "u64i2DArray"
+                              Name 136  "ResType"
+                              Name 142  "u64iCubeArray"
                               Decorate 14(i1D) DescriptorSet 0
                               Decorate 14(i1D) Binding 0
                               Decorate 24(i2D) DescriptorSet 0
@@ -42,6 +59,25 @@
                               Decorate 71(uiCubeArray) DescriptorSet 0
                               Decorate 71(uiCubeArray) Binding 6
                               Decorate 77(fragColor) Location 0
+                              MemberDecorate 86(Buf) 0 Offset 0
+                              MemberDecorate 86(Buf) 1 Offset 32
+                              Decorate 86(Buf) BufferBlock
+                              Decorate 88 DescriptorSet 0
+                              Decorate 88 Binding 14
+                              Decorate 92(i64i1D) DescriptorSet 0
+                              Decorate 92(i64i1D) Binding 7
+                              Decorate 102(i64i2D) DescriptorSet 0
+                              Decorate 102(i64i2D) Binding 8
+                              Decorate 111(i64i3D) DescriptorSet 0
+                              Decorate 111(i64i3D) Binding 9
+                              Decorate 120(u64iCube) DescriptorSet 0
+                              Decorate 120(u64iCube) Binding 10
+                              Decorate 127(u64i1DArray) DescriptorSet 0
+                              Decorate 127(u64i1DArray) Binding 11
+                              Decorate 133(u64i2DArray) DescriptorSet 0
+                              Decorate 133(u64i2DArray) Binding 12
+                              Decorate 142(u64iCubeArray) DescriptorSet 0
+                              Decorate 142(u64iCubeArray) Binding 13
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -88,6 +124,38 @@
  71(uiCubeArray):     70(ptr) Variable UniformConstant
               76:             TypePointer Output 7(fvec4)
    77(fragColor):     76(ptr) Variable Output
+              82:             TypeInt 64 1
+              83:             TypeVector 82(int64_t) 4
+              84:             TypeInt 64 0
+              85:             TypeVector 84(int64_t) 4
+         86(Buf):             TypeStruct 83(i64vec4) 85(i64vec4)
+              87:             TypePointer Uniform 86(Buf)
+              88:     87(ptr) Variable Uniform
+              89:     16(int) Constant 0
+              90:             TypeImage 82(int64_t) 1D nonsampled format:R64i
+              91:             TypePointer UniformConstant 90
+      92(i64i1D):     91(ptr) Variable UniformConstant
+              95:             TypePointer Uniform 83(i64vec4)
+             100:             TypeImage 82(int64_t) 2D nonsampled format:R64i
+             101:             TypePointer UniformConstant 100
+     102(i64i2D):    101(ptr) Variable UniformConstant
+             109:             TypeImage 82(int64_t) 3D nonsampled format:R64i
+             110:             TypePointer UniformConstant 109
+     111(i64i3D):    110(ptr) Variable UniformConstant
+             118:             TypeImage 84(int64_t) Cube nonsampled format:R64ui
+             119:             TypePointer UniformConstant 118
+   120(u64iCube):    119(ptr) Variable UniformConstant
+             122:             TypePointer Uniform 85(i64vec4)
+             125:             TypeImage 84(int64_t) 1D array nonsampled format:R64ui
+             126:             TypePointer UniformConstant 125
+127(u64i1DArray):    126(ptr) Variable UniformConstant
+             131:             TypeImage 84(int64_t) 2D array nonsampled format:R64ui
+             132:             TypePointer UniformConstant 131
+133(u64i2DArray):    132(ptr) Variable UniformConstant
+    136(ResType):             TypeStruct 16(int) 85(i64vec4)
+             140:             TypeImage 84(int64_t) Cube array nonsampled format:R64ui
+             141:             TypePointer UniformConstant 140
+142(u64iCubeArray):    141(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
            9(f4):      8(ptr) Variable Function
@@ -131,5 +199,46 @@
               80:    7(fvec4) ConvertUToF 79
               81:    7(fvec4) FAdd 78 80
                               Store 77(fragColor) 81
+              93:          90 Load 92(i64i1D)
+              94: 83(i64vec4) ImageRead 93 17 Lod 18
+              96:     95(ptr) AccessChain 88 89
+              97: 83(i64vec4) Load 96
+              98: 83(i64vec4) IAdd 97 94
+              99:     95(ptr) AccessChain 88 89
+                              Store 99 98
+             103:         100 Load 102(i64i2D)
+             104: 83(i64vec4) ImageRead 103 28 Lod 18
+             105:     95(ptr) AccessChain 88 89
+             106: 83(i64vec4) Load 105
+             107: 83(i64vec4) IAdd 106 104
+             108:     95(ptr) AccessChain 88 89
+                              Store 108 107
+             112:         109 Load 111(i64i3D)
+             113: 83(i64vec4) ImageRead 112 40 Lod 18
+             114:     95(ptr) AccessChain 88 89
+             115: 83(i64vec4) Load 114
+             116: 83(i64vec4) IAdd 115 113
+             117:     95(ptr) AccessChain 88 89
+                              Store 117 116
+             121:         118 Load 120(u64iCube)
+             123:    122(ptr) AccessChain 88 17
+             124: 85(i64vec4) Load 123
+                              ImageWrite 121 40 124 Lod 18
+             128:         125 Load 127(u64i1DArray)
+             129:    122(ptr) AccessChain 88 17
+             130: 85(i64vec4) Load 129
+                              ImageWrite 128 28 130 Lod 18
+             134:         131 Load 133(u64i2DArray)
+             135:    122(ptr) AccessChain 88 17
+             137:136(ResType) ImageSparseRead 134 40 Lod 18
+             138: 85(i64vec4) CompositeExtract 137 1
+                              Store 135 138
+             139:     16(int) CompositeExtract 137 0
+             143:         140 Load 142(u64iCubeArray)
+             144:    122(ptr) AccessChain 88 17
+             145:136(ResType) ImageSparseRead 143 40 Lod 18
+             146: 85(i64vec4) CompositeExtract 145 1
+                              Store 144 146
+             147:     16(int) CompositeExtract 145 0
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.int16.amd.frag.out b/Test/baseResults/spv.int16.amd.frag.out
index 3f6179b..50dbe6c 100644
--- a/Test/baseResults/spv.int16.amd.frag.out
+++ b/Test/baseResults/spv.int16.amd.frag.out
@@ -1,6 +1,6 @@
 spv.int16.amd.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 560
 
                               Capability Shader
diff --git a/Test/baseResults/spv.int16.frag.out b/Test/baseResults/spv.int16.frag.out
index ff8a446..b58e718 100644
--- a/Test/baseResults/spv.int16.frag.out
+++ b/Test/baseResults/spv.int16.frag.out
@@ -1,6 +1,6 @@
 spv.int16.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 523
 
                               Capability Shader
diff --git a/Test/baseResults/spv.int32.frag.out b/Test/baseResults/spv.int32.frag.out
index 1e8cd70..0ef51e8 100644
--- a/Test/baseResults/spv.int32.frag.out
+++ b/Test/baseResults/spv.int32.frag.out
@@ -1,6 +1,6 @@
 spv.int32.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 493
 
                               Capability Shader
diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out
index 4510134..4b5e450 100644
--- a/Test/baseResults/spv.int64.frag.out
+++ b/Test/baseResults/spv.int64.frag.out
@@ -1,7 +1,7 @@
 spv.int64.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 489
 
                               Capability Shader
diff --git a/Test/baseResults/spv.int8.frag.out b/Test/baseResults/spv.int8.frag.out
index c84ca7e..e88707d 100644
--- a/Test/baseResults/spv.int8.frag.out
+++ b/Test/baseResults/spv.int8.frag.out
@@ -1,6 +1,6 @@
 spv.int8.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 518
 
                               Capability Shader
diff --git a/Test/baseResults/spv.intOps.vert.out b/Test/baseResults/spv.intOps.vert.out
index 272233e..d57c306 100644
--- a/Test/baseResults/spv.intOps.vert.out
+++ b/Test/baseResults/spv.intOps.vert.out
@@ -1,6 +1,6 @@
 spv.intOps.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 268
 
                               Capability Shader
@@ -38,6 +38,21 @@
                               Name 173  "u3"
                               Name 182  "i3"
                               Name 247  "v4"
+                              Decorate 9(iout) Location 1
+                              Decorate 15(uout) Location 0
+                              Decorate 21(fout) Location 2
+                              Decorate 26(u2) Location 1
+                              Decorate 47(u1) Location 0
+                              Decorate 67(u4) Location 3
+                              Decorate 83(i4) Location 11
+                              Decorate 100(v3) Location 6
+                              Decorate 121(v1) Location 4
+                              Decorate 142(v2) Location 5
+                              Decorate 146(i2) Location 9
+                              Decorate 156(i1) Location 8
+                              Decorate 173(u3) Location 2
+                              Decorate 182(i3) Location 10
+                              Decorate 247(v4) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.intcoopmat.comp.out b/Test/baseResults/spv.intcoopmat.comp.out
index 940ba33..e74f44e 100644
--- a/Test/baseResults/spv.intcoopmat.comp.out
+++ b/Test/baseResults/spv.intcoopmat.comp.out
@@ -1,6 +1,6 @@
 spv.intcoopmat.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 262
 
                               Capability Shader
diff --git a/Test/baseResults/spv.interpOps.frag.out b/Test/baseResults/spv.interpOps.frag.out
index 7ec4f9f..6c285e7 100644
--- a/Test/baseResults/spv.interpOps.frag.out
+++ b/Test/baseResults/spv.interpOps.frag.out
@@ -1,6 +1,6 @@
 spv.interpOps.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 100
 
                               Capability Shader
@@ -19,8 +19,15 @@
                               Name 47  "samp"
                               Name 72  "offset"
                               Name 98  "fragColor"
+                              Decorate 13(if1) Location 0
+                              Decorate 24(if2) Location 1
+                              Decorate 33(if3) Location 2
+                              Decorate 41(if4) Location 3
                               Decorate 47(samp) Flat
+                              Decorate 47(samp) Location 4
                               Decorate 72(offset) Flat
+                              Decorate 72(offset) Location 5
+                              Decorate 98(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.layer.tese.out b/Test/baseResults/spv.layer.tese.out
new file mode 100644
index 0000000..906340f
--- /dev/null
+++ b/Test/baseResults/spv.layer.tese.out
@@ -0,0 +1,30 @@
+spv.layer.tese
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 10
+
+                              Capability Tessellation
+                              Capability ShaderViewportIndexLayerNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationEvaluation 4  "main" 8
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCcw
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_viewport_layer_array"
+                              Name 4  "main"
+                              Name 8  "gl_Layer"
+                              Decorate 8(gl_Layer) BuiltIn Layer
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+     8(gl_Layer):      7(ptr) Variable Output
+               9:      6(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(gl_Layer) 9
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.layoutNested.vert.out b/Test/baseResults/spv.layoutNested.vert.out
index 44d58ab..7de04d4 100644
--- a/Test/baseResults/spv.layoutNested.vert.out
+++ b/Test/baseResults/spv.layoutNested.vert.out
@@ -1,6 +1,6 @@
 spv.layoutNested.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 66
 
                               Capability Shader
@@ -167,11 +167,13 @@
                               Decorate 60(bBtn3) DescriptorSet 1
                               Decorate 60(bBtn3) Binding 0
                               Decorate 62(sout) Flat
+                              Decorate 62(sout) Location 0
                               MemberDecorate 63(S) 0 Invariant
                               MemberDecorate 63(S) 1 RelaxedPrecision
                               MemberDecorate 63(S) 1 Invariant
                               MemberDecorate 63(S) 2 RelaxedPrecision
                               MemberDecorate 63(S) 2 Invariant
+                              Decorate 65(soutinv) Location 10
                               Decorate 65(soutinv) Invariant
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.length.frag.out b/Test/baseResults/spv.length.frag.out
index de391bc..8957a3c 100644
--- a/Test/baseResults/spv.length.frag.out
+++ b/Test/baseResults/spv.length.frag.out
@@ -1,6 +1,6 @@
 spv.length.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               Name 14  "v"
                               Name 26  "gl_FragColor"
                               Name 32  "u"
+                              Decorate 14(v) Location 0
                               Decorate 26(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.localAggregates.frag.out b/Test/baseResults/spv.localAggregates.frag.out
index adfa0fd..637fb6d 100644
--- a/Test/baseResults/spv.localAggregates.frag.out
+++ b/Test/baseResults/spv.localAggregates.frag.out
@@ -1,6 +1,6 @@
 spv.localAggregates.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 136
 
                               Capability Shader
@@ -39,12 +39,18 @@
                               Name 134  "foo"
                               Name 135  "foo2"
                               Decorate 15(foo3) Flat
+                              Decorate 15(foo3) Location 9
+                              Decorate 40(coord) Location 0
                               Decorate 90(condition) Flat
+                              Decorate 90(condition) Location 18
+                              Decorate 98(color) Location 1
                               Decorate 108(gl_FragColor) Location 0
                               Decorate 128(samp2D) DescriptorSet 0
                               Decorate 128(samp2D) Binding 0
                               Decorate 134(foo) Flat
+                              Decorate 134(foo) Location 2
                               Decorate 135(foo2) Flat
+                              Decorate 135(foo2) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.loops.frag.out b/Test/baseResults/spv.loops.frag.out
index a3a3423..7178f35 100644
--- a/Test/baseResults/spv.loops.frag.out
+++ b/Test/baseResults/spv.loops.frag.out
@@ -1,6 +1,6 @@
 spv.loops.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 725
 
                               Capability Shader
@@ -48,8 +48,38 @@
                               Name 649  "d16"
                               Name 687  "d18"
                               Name 698  "d17"
+                              Decorate 11(BaseColor) Location 11
+                              Decorate 54(d) Location 12
+                              Decorate 57(bigColor) Location 0
+                              Decorate 71(bigColor1_1) Location 1
+                              Decorate 106(d2) Location 13
+                              Decorate 114(d3) Location 14
+                              Decorate 118(bigColor1_2) Location 2
+                              Decorate 131(bigColor1_3) Location 3
+                              Decorate 137(d4) Location 15
                               Decorate 157(Count) Flat
+                              Decorate 157(Count) Location 29
+                              Decorate 160(bigColor2) Location 4
+                              Decorate 171(bigColor3) Location 5
+                              Decorate 308(bigColor4) Location 6
+                              Decorate 344(bigColor5) Location 7
+                              Decorate 350(d5) Location 16
+                              Decorate 366(d6) Location 17
+                              Decorate 380(bigColor6) Location 8
+                              Decorate 418(d7) Location 18
+                              Decorate 450(bigColor7) Location 9
+                              Decorate 469(d8) Location 19
+                              Decorate 512(d9) Location 20
+                              Decorate 544(d10) Location 21
+                              Decorate 552(d11) Location 22
+                              Decorate 562(d12) Location 23
+                              Decorate 588(bigColor8) Location 10
                               Decorate 615(gl_FragColor) Location 0
+                              Decorate 624(d14) Location 24
+                              Decorate 629(d15) Location 25
+                              Decorate 649(d16) Location 26
+                              Decorate 687(d18) Location 28
+                              Decorate 698(d17) Location 27
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.loopsArtificial.frag.out b/Test/baseResults/spv.loopsArtificial.frag.out
index 65329d4..4de834d 100644
--- a/Test/baseResults/spv.loopsArtificial.frag.out
+++ b/Test/baseResults/spv.loopsArtificial.frag.out
@@ -1,6 +1,6 @@
 spv.loopsArtificial.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 158
 
                               Capability Shader
@@ -30,8 +30,26 @@
                               Name 153  "d2"
                               Name 154  "d3"
                               Name 157  "Count"
+                              Decorate 11(BaseColor) Location 11
+                              Decorate 17(bigColor4) Location 6
+                              Decorate 27(d4) Location 15
+                              Decorate 80(d13) Location 16
                               Decorate 140(gl_FragColor) Location 0
+                              Decorate 142(bigColor) Location 0
+                              Decorate 143(bigColor1_1) Location 1
+                              Decorate 144(bigColor1_2) Location 2
+                              Decorate 145(bigColor1_3) Location 3
+                              Decorate 146(bigColor2) Location 4
+                              Decorate 147(bigColor3) Location 5
+                              Decorate 148(bigColor5) Location 7
+                              Decorate 149(bigColor6) Location 8
+                              Decorate 150(bigColor7) Location 9
+                              Decorate 151(bigColor8) Location 10
+                              Decorate 152(d) Location 12
+                              Decorate 153(d2) Location 13
+                              Decorate 154(d3) Location 14
                               Decorate 157(Count) Flat
+                              Decorate 157(Count) Location 17
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.matFun.vert.out b/Test/baseResults/spv.matFun.vert.out
index d39160d..932018f 100644
--- a/Test/baseResults/spv.matFun.vert.out
+++ b/Test/baseResults/spv.matFun.vert.out
@@ -1,6 +1,6 @@
 spv.matFun.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 103
 
                               Capability Shader
@@ -45,6 +45,7 @@
                               Decorate 77(bl) Block
                               Decorate 79(bName) DescriptorSet 0
                               Decorate 79(bName) Binding 0
+                              Decorate 81(v3) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.matrix.frag.out b/Test/baseResults/spv.matrix.frag.out
index f7b6ce3..a287cda 100644
--- a/Test/baseResults/spv.matrix.frag.out
+++ b/Test/baseResults/spv.matrix.frag.out
@@ -1,6 +1,6 @@
 spv.matrix.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 286
 
                               Capability Shader
@@ -23,6 +23,12 @@
                               Name 174  "m43"
                               Name 179  "m4"
                               Name 187  "color"
+                              Decorate 12(m1) Location 0
+                              Decorate 14(m2) Location 3
+                              Decorate 28(f) Location 6
+                              Decorate 161(v4) Location 8
+                              Decorate 169(v3) Location 7
+                              Decorate 187(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.matrix2.frag.out b/Test/baseResults/spv.matrix2.frag.out
index 77a098a..13f2708 100644
--- a/Test/baseResults/spv.matrix2.frag.out
+++ b/Test/baseResults/spv.matrix2.frag.out
@@ -1,6 +1,6 @@
 spv.matrix2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 221
 
                               Capability Shader
@@ -27,6 +27,18 @@
                               Name 218  "colorTransform"
                               Name 219  "m"
                               Name 220  "n"
+                              Decorate 12(v) Location 28
+                              Decorate 16(u) Location 29
+                              Decorate 37(FragColor) Location 0
+                              Decorate 38(Color) Location 3
+                              Decorate 65(un34) Location 16
+                              Decorate 87(um43) Location 12
+                              Decorate 147(um4) Location 24
+                              Decorate 158(um2) Location 19
+                              Decorate 181(um3) Location 21
+                              Decorate 218(colorTransform) Location 0
+                              Decorate 219(m) Location 4
+                              Decorate 220(n) Location 8
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.memoryQualifier.frag.out b/Test/baseResults/spv.memoryQualifier.frag.out
index 737e862..5f0647b 100644
--- a/Test/baseResults/spv.memoryQualifier.frag.out
+++ b/Test/baseResults/spv.memoryQualifier.frag.out
@@ -1,7 +1,7 @@
 spv.memoryQualifier.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 97
 
                               Capability Shader
@@ -67,7 +67,7 @@
                               MemberDecorate 50(Buffer) 5 Offset 56
                               Decorate 50(Buffer) BufferBlock
                               Decorate 52 DescriptorSet 0
-                              Decorate 52 Binding 0
+                              Decorate 52 Binding 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.memoryScopeSemantics.comp.out b/Test/baseResults/spv.memoryScopeSemantics.comp.out
index b8721f2..56c8470 100644
--- a/Test/baseResults/spv.memoryScopeSemantics.comp.out
+++ b/Test/baseResults/spv.memoryScopeSemantics.comp.out
@@ -1,6 +1,6 @@
 spv.memoryScopeSemantics.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 169
 
                               Capability Shader
diff --git a/Test/baseResults/spv.merge-unreachable.frag.out b/Test/baseResults/spv.merge-unreachable.frag.out
index 3eab4ec..dedec9c 100644
--- a/Test/baseResults/spv.merge-unreachable.frag.out
+++ b/Test/baseResults/spv.merge-unreachable.frag.out
@@ -1,6 +1,6 @@
 spv.merge-unreachable.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25
 
                               Capability Shader
diff --git a/Test/baseResults/spv.meshShaderBuiltins.mesh.out b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
index cea7e4d..b26122e 100644
--- a/Test/baseResults/spv.meshShaderBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
@@ -1,11 +1,10 @@
 spv.meshShaderBuiltins.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 148
 
                               Capability ClipDistance
                               Capability CullDistance
-                              Capability MultiViewport
                               Capability DrawParameters
                               Capability ShaderViewportMaskNV
                               Capability MeshShadingNV
diff --git a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
index 75f8c63..86a4fd2 100644
--- a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
@@ -1,9 +1,8 @@
 spv.meshShaderPerViewBuiltins.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 126
 
-                              Capability MultiViewport
                               Capability PerViewAttributesNV
                               Capability MeshShadingNV
                               Extension  "SPV_NVX_multiview_per_view_attributes"
diff --git a/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out b/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
index de019a2..e9eaed3 100644
--- a/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
+++ b/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
@@ -1,6 +1,6 @@
 spv.meshShaderPerViewUserDefined.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 108
 
                               Capability MeshShadingNV
diff --git a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
index e9ebd44..bfd2d85 100644
--- a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
@@ -1,11 +1,10 @@
 spv.meshShaderRedeclBuiltins.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 129
 
                               Capability ClipDistance
                               Capability CullDistance
-                              Capability MultiViewport
                               Capability ShaderViewportMaskNV
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
diff --git a/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
index 38542d5..9f881e6 100644
--- a/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderRedeclPerViewBuiltins.mesh.out
@@ -1,6 +1,6 @@
 spv.meshShaderRedeclPerViewBuiltins.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 120
 
                               Capability PerViewAttributesNV
diff --git a/Test/baseResults/spv.meshShaderSharedMem.mesh.out b/Test/baseResults/spv.meshShaderSharedMem.mesh.out
index adac07f..7960ffa 100644
--- a/Test/baseResults/spv.meshShaderSharedMem.mesh.out
+++ b/Test/baseResults/spv.meshShaderSharedMem.mesh.out
@@ -1,6 +1,6 @@
 spv.meshShaderSharedMem.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 77
 
                               Capability StorageImageWriteWithoutFormat
@@ -31,7 +31,7 @@
                               MemberDecorate 37(block0) 0 Offset 0
                               Decorate 37(block0) Block
                               Decorate 39 DescriptorSet 0
-                              Decorate 39 Binding 0
+                              Decorate 39 Binding 1
                               Decorate 55(uni_image) DescriptorSet 0
                               Decorate 55(uni_image) Binding 0
                               Decorate 55(uni_image) NonReadable
diff --git a/Test/baseResults/spv.meshShaderTaskMem.mesh.out b/Test/baseResults/spv.meshShaderTaskMem.mesh.out
index 057e0fd..be80439 100644
--- a/Test/baseResults/spv.meshShaderTaskMem.mesh.out
+++ b/Test/baseResults/spv.meshShaderTaskMem.mesh.out
@@ -1,6 +1,6 @@
 spv.meshShaderTaskMem.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 58
 
                               Capability MeshShadingNV
@@ -38,6 +38,7 @@
                               MemberDecorate 28(taskBlock) 1 PerTaskNV
                               MemberDecorate 28(taskBlock) 1 Offset 16
                               Decorate 28(taskBlock) Block
+                              Decorate 30(mytask) Location 0
                               Decorate 35 ArrayStride 4
                               MemberDecorate 36(bufferBlock) 0 Offset 0
                               MemberDecorate 36(bufferBlock) 1 Offset 16
diff --git a/Test/baseResults/spv.meshShaderUserDefined.mesh.out b/Test/baseResults/spv.meshShaderUserDefined.mesh.out
index 43579bb..fc2730c 100644
--- a/Test/baseResults/spv.meshShaderUserDefined.mesh.out
+++ b/Test/baseResults/spv.meshShaderUserDefined.mesh.out
@@ -1,6 +1,6 @@
 spv.meshShaderUserDefined.mesh
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 138
 
                               Capability MeshShadingNV
diff --git a/Test/baseResults/spv.meshTaskShader.task.out b/Test/baseResults/spv.meshTaskShader.task.out
index 96d37c4..9fed191 100644
--- a/Test/baseResults/spv.meshTaskShader.task.out
+++ b/Test/baseResults/spv.meshTaskShader.task.out
@@ -1,6 +1,6 @@
 spv.meshTaskShader.task
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 116
 
                               Capability StorageImageWriteWithoutFormat
@@ -39,7 +39,7 @@
                               MemberDecorate 47(block0) 0 Offset 0
                               Decorate 47(block0) Block
                               Decorate 49 DescriptorSet 0
-                              Decorate 49 Binding 0
+                              Decorate 49 Binding 1
                               Decorate 65(uni_image) DescriptorSet 0
                               Decorate 65(uni_image) Binding 0
                               Decorate 65(uni_image) NonReadable
@@ -51,6 +51,7 @@
                               MemberDecorate 88(Task) 2 PerTaskNV
                               MemberDecorate 88(Task) 2 Offset 32
                               Decorate 88(Task) Block
+                              Decorate 90(mytask) Location 0
                               Decorate 113(gl_TaskCountNV) BuiltIn TaskCountNV
                               Decorate 115 BuiltIn WorkgroupSize
                2:             TypeVoid
diff --git a/Test/baseResults/spv.multiStruct.comp.out b/Test/baseResults/spv.multiStruct.comp.out
index 679a4bd..13a3528 100644
--- a/Test/baseResults/spv.multiStruct.comp.out
+++ b/Test/baseResults/spv.multiStruct.comp.out
@@ -1,6 +1,6 @@
 spv.multiStruct.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 161
 
                               Capability Shader
diff --git a/Test/baseResults/spv.multiStructFuncall.frag.out b/Test/baseResults/spv.multiStructFuncall.frag.out
index 9312fe9..dd57cd1 100644
--- a/Test/baseResults/spv.multiStructFuncall.frag.out
+++ b/Test/baseResults/spv.multiStructFuncall.frag.out
@@ -1,6 +1,6 @@
 spv.multiStructFuncall.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 66
 
                               Capability Shader
diff --git a/Test/baseResults/spv.multiView.frag.out b/Test/baseResults/spv.multiView.frag.out
index 5363352..a1575d9 100644
--- a/Test/baseResults/spv.multiView.frag.out
+++ b/Test/baseResults/spv.multiView.frag.out
@@ -1,6 +1,6 @@
 spv.multiView.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 17
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               Name 4  "main"
                               Name 9  "color"
                               Name 12  "gl_ViewIndex"
+                              Decorate 9(color) Location 0
                               Decorate 12(gl_ViewIndex) Flat
                               Decorate 12(gl_ViewIndex) BuiltIn ViewIndex
                2:             TypeVoid
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
index 16e81a1..b1c29f9 100644
--- a/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
@@ -1,6 +1,6 @@
 spv.multiviewPerViewAttributes.tesc
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 41
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.multiviewPerViewAttributes.vert.out b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
index acca44e..0a4e1f0 100644
--- a/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
+++ b/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
@@ -1,6 +1,6 @@
 spv.multiviewPerViewAttributes.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.newTexture.frag.out b/Test/baseResults/spv.newTexture.frag.out
index 6bbb032..332ca66 100644
--- a/Test/baseResults/spv.newTexture.frag.out
+++ b/Test/baseResults/spv.newTexture.frag.out
@@ -1,7 +1,7 @@
 spv.newTexture.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 284
 
                               Capability Shader
@@ -46,33 +46,41 @@
                               Name 283  "ic4D"
                               Decorate 13(s2D) DescriptorSet 0
                               Decorate 13(s2D) Binding 0
+                              Decorate 17(c2D) Location 1
                               Decorate 23(sCubeArrayShadow) DescriptorSet 0
-                              Decorate 23(sCubeArrayShadow) Binding 0
+                              Decorate 23(sCubeArrayShadow) Binding 5
+                              Decorate 26(c4D) Location 3
+                              Decorate 29(c1D) Location 0
                               Decorate 42(s3D) DescriptorSet 0
-                              Decorate 42(s3D) Binding 0
+                              Decorate 42(s3D) Binding 2
                               Decorate 51(s2DArray) DescriptorSet 0
-                              Decorate 51(s2DArray) Binding 0
+                              Decorate 51(s2DArray) Binding 7
+                              Decorate 55(c3D) Location 2
                               Decorate 64(s2DShadow) DescriptorSet 0
-                              Decorate 64(s2DShadow) Binding 0
+                              Decorate 64(s2DShadow) Binding 6
                               Decorate 81(ic3D) Flat
+                              Decorate 81(ic3D) Location 6
                               Decorate 84(ic1D) Flat
+                              Decorate 84(ic1D) Location 4
                               Decorate 92(ic2D) Flat
+                              Decorate 92(ic2D) Location 5
                               Decorate 102(sr) DescriptorSet 0
-                              Decorate 102(sr) Binding 0
+                              Decorate 102(sr) Binding 1
                               Decorate 128(sCube) DescriptorSet 0
-                              Decorate 128(sCube) Binding 0
+                              Decorate 128(sCube) Binding 3
                               Decorate 139(s2DArrayShadow) DescriptorSet 0
-                              Decorate 139(s2DArrayShadow) Binding 0
+                              Decorate 139(s2DArrayShadow) Binding 8
                               Decorate 171(is2D) DescriptorSet 0
-                              Decorate 171(is2D) Binding 0
+                              Decorate 171(is2D) Binding 9
                               Decorate 208(is3D) DescriptorSet 0
-                              Decorate 208(is3D) Binding 0
+                              Decorate 208(is3D) Binding 10
                               Decorate 220(isCube) DescriptorSet 0
-                              Decorate 220(isCube) Binding 0
+                              Decorate 220(isCube) Binding 11
                               Decorate 232(is2DArray) DescriptorSet 0
-                              Decorate 232(is2DArray) Binding 0
+                              Decorate 232(is2DArray) Binding 12
                               Decorate 247(sCubeShadow) DescriptorSet 0
-                              Decorate 247(sCubeShadow) Binding 0
+                              Decorate 247(sCubeShadow) Binding 4
+                              Decorate 253(FragData) Location 0
                               Decorate 265(is2Dms) DescriptorSet 0
                               Decorate 265(is2Dms) Binding 0
                               Decorate 269(us2D) DescriptorSet 0
@@ -84,6 +92,7 @@
                               Decorate 281(us2DArray) DescriptorSet 0
                               Decorate 281(us2DArray) Binding 0
                               Decorate 283(ic4D) Flat
+                              Decorate 283(ic4D) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.noBuiltInLoc.vert.out b/Test/baseResults/spv.noBuiltInLoc.vert.out
index 7a45e72..6322052 100644
--- a/Test/baseResults/spv.noBuiltInLoc.vert.out
+++ b/Test/baseResults/spv.noBuiltInLoc.vert.out
@@ -1,6 +1,6 @@
 spv.noBuiltInLoc.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/spv.noDeadDecorations.vert.out b/Test/baseResults/spv.noDeadDecorations.vert.out
index a555ba2..4a4d7b3 100644
--- a/Test/baseResults/spv.noDeadDecorations.vert.out
+++ b/Test/baseResults/spv.noDeadDecorations.vert.out
@@ -1,6 +1,6 @@
 spv.noDeadDecorations.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
@@ -23,6 +23,7 @@
                               MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
                               Decorate 20(gl_PerVertex) Block
+                              Decorate 26(param) RelaxedPrecision
                               Decorate 27 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.noWorkgroup.comp.out b/Test/baseResults/spv.noWorkgroup.comp.out
index 92ae670..9cd130c 100644
--- a/Test/baseResults/spv.noWorkgroup.comp.out
+++ b/Test/baseResults/spv.noWorkgroup.comp.out
@@ -1,6 +1,6 @@
 spv.noWorkgroup.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 12
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nonSquare.vert.out b/Test/baseResults/spv.nonSquare.vert.out
index 9746fe0..3728dd5 100644
--- a/Test/baseResults/spv.nonSquare.vert.out
+++ b/Test/baseResults/spv.nonSquare.vert.out
@@ -1,6 +1,6 @@
 spv.nonSquare.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 90
 
                               Capability Shader
@@ -16,7 +16,10 @@
                               Name 22  "m32"
                               Name 28  "gl_Position"
                               Name 55  "v4"
+                              Decorate 12(v3) Location 0
+                              Decorate 22(m32) Location 0
                               Decorate 28(gl_Position) BuiltIn Position
+                              Decorate 55(v4) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.nonuniform.frag.out b/Test/baseResults/spv.nonuniform.frag.out
index 6b7d407..f6febc9 100644
--- a/Test/baseResults/spv.nonuniform.frag.out
+++ b/Test/baseResults/spv.nonuniform.frag.out
@@ -1,7 +1,7 @@
 spv.nonuniform.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 212
+// Generated by (magic number): 8000a
+// Id's are bound by 289
 
                               Capability Shader
                               Capability InputAttachment
@@ -22,7 +22,7 @@
                               Extension  "SPV_EXT_descriptor_indexing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 35 92
+                              EntryPoint Fragment 4  "main" 41 98 188
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_EXT_nonuniform_qualifier"
@@ -34,217 +34,268 @@
                               Name 17  "nu_li"
                               Name 18  "param"
                               Name 20  "param"
-                              Name 32  "b"
-                              Name 35  "nu_inv4"
-                              Name 41  "nu_gf"
-                              Name 47  "inputAttachmentDyn"
-                              Name 48  "dyn_i"
-                              Name 64  "uniformTexelBufferDyn"
-                              Name 78  "storageTexelBufferDyn"
-                              Name 87  "uname"
-                              MemberName 87(uname) 0  "a"
-                              Name 90  "uniformBuffer"
-                              Name 92  "nu_ii"
-                              Name 99  "bname"
-                              MemberName 99(bname) 0  "b"
-                              Name 102  "storageBuffer"
-                              Name 112  "sampledImage"
-                              Name 127  "storageImage"
-                              Name 139  "inputAttachment"
-                              Name 149  "uniformTexelBuffer"
-                              Name 160  "storageTexelBuffer"
-                              Name 170  "v"
-                              Name 185  "uv"
-                              Name 195  "m"
-                              Name 203  "S"
-                              MemberName 203(S) 0  "a"
-                              Name 205  "s"
-                              Decorate 9(nupi) DecorationNonUniformEXT
+                              Name 30  "nu_li2"
+                              Name 38  "b"
+                              Name 41  "nu_inv4"
+                              Name 47  "nu_gf"
+                              Name 53  "inputAttachmentDyn"
+                              Name 54  "dyn_i"
+                              Name 70  "uniformTexelBufferDyn"
+                              Name 84  "storageTexelBufferDyn"
+                              Name 93  "uname"
+                              MemberName 93(uname) 0  "a"
+                              Name 96  "uniformBuffer"
+                              Name 98  "nu_ii"
+                              Name 105  "bname"
+                              MemberName 105(bname) 0  "b"
+                              Name 108  "storageBuffer"
+                              Name 118  "sampledImage"
+                              Name 133  "storageImage"
+                              Name 145  "inputAttachment"
+                              Name 155  "uniformTexelBuffer"
+                              Name 166  "storageTexelBuffer"
+                              Name 177  "uniformTexArr"
+                              Name 184  "uniformSampler"
+                              Name 188  "inTexcoord"
+                              Name 207  "v"
+                              Name 222  "uv"
+                              Name 232  "m"
+                              Name 240  "S"
+                              MemberName 240(S) 0  "a"
+                              Name 242  "s"
+                              Name 252  "arr"
+                              Name 259  "um"
+                              Name 268  "US"
+                              MemberName 268(US) 0  "a"
+                              Name 270  "us"
+                              Name 278  "uarr"
                               Decorate 13 DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
-                              Decorate 17(nu_li) DecorationNonUniformEXT
                               Decorate 19 DecorationNonUniformEXT
+                              Decorate 21 DecorationNonUniformEXT
+                              Decorate 22 DecorationNonUniformEXT
                               Decorate 24 DecorationNonUniformEXT
                               Decorate 28 DecorationNonUniformEXT
                               Decorate 29 DecorationNonUniformEXT
-                              Decorate 35(nu_inv4) Location 0
-                              Decorate 35(nu_inv4) DecorationNonUniformEXT
-                              Decorate 39 DecorationNonUniformEXT
-                              Decorate 40 DecorationNonUniformEXT
-                              Decorate 41(nu_gf) DecorationNonUniformEXT
-                              Decorate 41(nu_gf) DecorationNonUniformEXT
-                              Decorate 42 DecorationNonUniformEXT
-                              Decorate 43 DecorationNonUniformEXT
-                              Decorate 47(inputAttachmentDyn) DescriptorSet 0
-                              Decorate 47(inputAttachmentDyn) Binding 0
-                              Decorate 47(inputAttachmentDyn) InputAttachmentIndex 0
-                              Decorate 64(uniformTexelBufferDyn) DescriptorSet 0
-                              Decorate 64(uniformTexelBufferDyn) Binding 1
-                              Decorate 78(storageTexelBufferDyn) DescriptorSet 0
-                              Decorate 78(storageTexelBufferDyn) Binding 2
-                              MemberDecorate 87(uname) 0 Offset 0
-                              Decorate 87(uname) Block
-                              Decorate 90(uniformBuffer) DescriptorSet 0
-                              Decorate 90(uniformBuffer) Binding 3
-                              Decorate 92(nu_ii) Flat
-                              Decorate 92(nu_ii) Location 1
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 93 DecorationNonUniformEXT
-                              Decorate 95 DecorationNonUniformEXT
-                              Decorate 96 DecorationNonUniformEXT
-                              MemberDecorate 99(bname) 0 Offset 0
-                              Decorate 99(bname) BufferBlock
-                              Decorate 102(storageBuffer) DescriptorSet 0
-                              Decorate 102(storageBuffer) Binding 4
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 103 DecorationNonUniformEXT
+                              Decorate 34 DecorationNonUniformEXT
+                              Decorate 35 DecorationNonUniformEXT
+                              Decorate 41(nu_inv4) Location 0
+                              Decorate 46 DecorationNonUniformEXT
+                              Decorate 48 DecorationNonUniformEXT
+                              Decorate 49 DecorationNonUniformEXT
+                              Decorate 53(inputAttachmentDyn) DescriptorSet 0
+                              Decorate 53(inputAttachmentDyn) Binding 0
+                              Decorate 53(inputAttachmentDyn) InputAttachmentIndex 0
+                              Decorate 70(uniformTexelBufferDyn) DescriptorSet 0
+                              Decorate 70(uniformTexelBufferDyn) Binding 1
+                              Decorate 84(storageTexelBufferDyn) DescriptorSet 0
+                              Decorate 84(storageTexelBufferDyn) Binding 2
+                              MemberDecorate 93(uname) 0 Offset 0
+                              Decorate 93(uname) Block
+                              Decorate 96(uniformBuffer) DescriptorSet 0
+                              Decorate 96(uniformBuffer) Binding 3
+                              Decorate 98(nu_ii) Flat
+                              Decorate 98(nu_ii) Location 1
+                              Decorate 99 DecorationNonUniformEXT
+                              Decorate 101 DecorationNonUniformEXT
+                              Decorate 102 DecorationNonUniformEXT
                               Decorate 104 DecorationNonUniformEXT
-                              Decorate 105 DecorationNonUniformEXT
-                              Decorate 112(sampledImage) DescriptorSet 0
-                              Decorate 112(sampledImage) Binding 5
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
+                              MemberDecorate 105(bname) 0 Offset 0
+                              Decorate 105(bname) BufferBlock
+                              Decorate 108(storageBuffer) DescriptorSet 0
+                              Decorate 108(storageBuffer) Binding 4
+                              Decorate 109 DecorationNonUniformEXT
+                              Decorate 110 DecorationNonUniformEXT
+                              Decorate 111 DecorationNonUniformEXT
                               Decorate 113 DecorationNonUniformEXT
-                              Decorate 115 DecorationNonUniformEXT
-                              Decorate 116 DecorationNonUniformEXT
-                              Decorate 127(storageImage) DescriptorSet 0
-                              Decorate 127(storageImage) Binding 6
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 128 DecorationNonUniformEXT
-                              Decorate 130 DecorationNonUniformEXT
-                              Decorate 131 DecorationNonUniformEXT
-                              Decorate 139(inputAttachment) DescriptorSet 0
-                              Decorate 139(inputAttachment) Binding 7
-                              Decorate 139(inputAttachment) InputAttachmentIndex 1
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 140 DecorationNonUniformEXT
-                              Decorate 141 DecorationNonUniformEXT
-                              Decorate 142 DecorationNonUniformEXT
-                              Decorate 149(uniformTexelBuffer) DescriptorSet 0
-                              Decorate 149(uniformTexelBuffer) Binding 8
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 150 DecorationNonUniformEXT
-                              Decorate 151 DecorationNonUniformEXT
-                              Decorate 152 DecorationNonUniformEXT
-                              Decorate 160(storageTexelBuffer) DescriptorSet 0
-                              Decorate 160(storageTexelBuffer) Binding 9
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 161 DecorationNonUniformEXT
-                              Decorate 162 DecorationNonUniformEXT
-                              Decorate 163 DecorationNonUniformEXT
-                              Decorate 170(v) DecorationNonUniformEXT
-                              Decorate 172 DecorationNonUniformEXT
-                              Decorate 173 DecorationNonUniformEXT
-                              Decorate 174 DecorationNonUniformEXT
-                              Decorate 175 DecorationNonUniformEXT
-                              Decorate 179 DecorationNonUniformEXT
+                              Decorate 118(sampledImage) DescriptorSet 0
+                              Decorate 118(sampledImage) Binding 5
+                              Decorate 119 DecorationNonUniformEXT
+                              Decorate 121 DecorationNonUniformEXT
+                              Decorate 122 DecorationNonUniformEXT
+                              Decorate 133(storageImage) DescriptorSet 0
+                              Decorate 133(storageImage) Binding 6
+                              Decorate 134 DecorationNonUniformEXT
+                              Decorate 136 DecorationNonUniformEXT
+                              Decorate 137 DecorationNonUniformEXT
+                              Decorate 145(inputAttachment) DescriptorSet 0
+                              Decorate 145(inputAttachment) Binding 7
+                              Decorate 145(inputAttachment) InputAttachmentIndex 1
+                              Decorate 146 DecorationNonUniformEXT
+                              Decorate 147 DecorationNonUniformEXT
+                              Decorate 148 DecorationNonUniformEXT
+                              Decorate 155(uniformTexelBuffer) DescriptorSet 0
+                              Decorate 155(uniformTexelBuffer) Binding 8
+                              Decorate 156 DecorationNonUniformEXT
+                              Decorate 157 DecorationNonUniformEXT
+                              Decorate 158 DecorationNonUniformEXT
+                              Decorate 159 DecorationNonUniformEXT
+                              Decorate 166(storageTexelBuffer) DescriptorSet 0
+                              Decorate 166(storageTexelBuffer) Binding 9
+                              Decorate 167 DecorationNonUniformEXT
+                              Decorate 168 DecorationNonUniformEXT
+                              Decorate 169 DecorationNonUniformEXT
+                              Decorate 177(uniformTexArr) DescriptorSet 0
+                              Decorate 177(uniformTexArr) Binding 10
+                              Decorate 178 DecorationNonUniformEXT
                               Decorate 180 DecorationNonUniformEXT
                               Decorate 181 DecorationNonUniformEXT
-                              Decorate 182 DecorationNonUniformEXT
-                              Decorate 92(nu_ii) DecorationNonUniformEXT
-                              Decorate 186 DecorationNonUniformEXT
-                              Decorate 187 DecorationNonUniformEXT
-                              Decorate 188 DecorationNonUniformEXT
-                              Decorate 189 DecorationNonUniformEXT
-                              Decorate 190 DecorationNonUniformEXT
-                              Decorate 195(m) DecorationNonUniformEXT
+                              Decorate 184(uniformSampler) DescriptorSet 0
+                              Decorate 184(uniformSampler) Binding 11
+                              Decorate 188(inTexcoord) Location 2
+                              Decorate 194 DecorationNonUniformEXT
+                              Decorate 195 DecorationNonUniformEXT
                               Decorate 196 DecorationNonUniformEXT
-                              Decorate 197 DecorationNonUniformEXT
-                              Decorate 205(s) DecorationNonUniformEXT
-                              Decorate 206 DecorationNonUniformEXT
-                              Decorate 207 DecorationNonUniformEXT
-                              Decorate 208 DecorationNonUniformEXT
-                              Decorate 209 DecorationNonUniformEXT
+                              Decorate 199 DecorationNonUniformEXT
+                              Decorate 210 DecorationNonUniformEXT
+                              Decorate 211 DecorationNonUniformEXT
+                              Decorate 212 DecorationNonUniformEXT
+                              Decorate 214 DecorationNonUniformEXT
+                              Decorate 217 DecorationNonUniformEXT
+                              Decorate 218 DecorationNonUniformEXT
+                              Decorate 219 DecorationNonUniformEXT
+                              Decorate 221 DecorationNonUniformEXT
+                              Decorate 223 DecorationNonUniformEXT
+                              Decorate 224 DecorationNonUniformEXT
+                              Decorate 225 DecorationNonUniformEXT
+                              Decorate 226 DecorationNonUniformEXT
+                              Decorate 227 DecorationNonUniformEXT
+                              Decorate 229 DecorationNonUniformEXT
+                              Decorate 234 DecorationNonUniformEXT
+                              Decorate 244 DecorationNonUniformEXT
+                              Decorate 245 DecorationNonUniformEXT
+                              Decorate 246 DecorationNonUniformEXT
+                              Decorate 248 DecorationNonUniformEXT
+                              Decorate 254 DecorationNonUniformEXT
+                              Decorate 255 DecorationNonUniformEXT
+                              Decorate 256 DecorationNonUniformEXT
+                              Decorate 258 DecorationNonUniformEXT
+                              Decorate 260 DecorationNonUniformEXT
+                              Decorate 261 DecorationNonUniformEXT
+                              Decorate 262 DecorationNonUniformEXT
+                              Decorate 271 DecorationNonUniformEXT
+                              Decorate 272 DecorationNonUniformEXT
+                              Decorate 273 DecorationNonUniformEXT
+                              Decorate 274 DecorationNonUniformEXT
+                              Decorate 275 DecorationNonUniformEXT
+                              Decorate 277 DecorationNonUniformEXT
+                              Decorate 279 DecorationNonUniformEXT
+                              Decorate 280 DecorationNonUniformEXT
+                              Decorate 281 DecorationNonUniformEXT
+                              Decorate 282 DecorationNonUniformEXT
+                              Decorate 283 DecorationNonUniformEXT
+                              Decorate 285 DecorationNonUniformEXT
+                              Decorate 286 DecorationNonUniformEXT
+                              Decorate 288 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:             TypePointer Function 6(int)
                8:             TypeFunction 6(int) 7(ptr) 7(ptr)
               26:      6(int) Constant 2
-              30:             TypeFloat 32
-              31:             TypePointer Function 30(float)
-              33:             TypeVector 30(float) 4
-              34:             TypePointer Input 33(fvec4)
-     35(nu_inv4):     34(ptr) Variable Input
-              36:             TypeInt 32 0
-              37:     36(int) Constant 0
-              38:             TypePointer Input 30(float)
-              44:             TypeImage 30(float) SubpassData nonsampled format:Unknown
-              45:             TypeRuntimeArray 44
-              46:             TypePointer UniformConstant 45
-47(inputAttachmentDyn):     46(ptr) Variable UniformConstant
-              50:             TypePointer UniformConstant 44
-              53:      6(int) Constant 0
-              54:             TypeVector 6(int) 2
-              55:   54(ivec2) ConstantComposite 53 53
-              60:             TypeImage 30(float) Buffer sampled format:Unknown
-              61:             TypeSampledImage 60
-              62:             TypeRuntimeArray 61
-              63:             TypePointer UniformConstant 62
-64(uniformTexelBufferDyn):     63(ptr) Variable UniformConstant
-              66:             TypePointer UniformConstant 61
-              69:      6(int) Constant 1
-              75:             TypeImage 30(float) Buffer nonsampled format:R32f
-              76:             TypeRuntimeArray 75
-              77:             TypePointer UniformConstant 76
-78(storageTexelBufferDyn):     77(ptr) Variable UniformConstant
-              80:             TypePointer UniformConstant 75
-       87(uname):             TypeStruct 30(float)
-              88:             TypeRuntimeArray 87(uname)
-              89:             TypePointer Uniform 88
-90(uniformBuffer):     89(ptr) Variable Uniform
-              91:             TypePointer Input 6(int)
-       92(nu_ii):     91(ptr) Variable Input
-              94:             TypePointer Uniform 30(float)
-       99(bname):             TypeStruct 30(float)
-             100:             TypeRuntimeArray 99(bname)
-             101:             TypePointer Uniform 100
-102(storageBuffer):    101(ptr) Variable Uniform
-             108:             TypeImage 30(float) 2D sampled format:Unknown
-             109:             TypeSampledImage 108
-             110:             TypeRuntimeArray 109
-             111:             TypePointer UniformConstant 110
-112(sampledImage):    111(ptr) Variable UniformConstant
-             114:             TypePointer UniformConstant 109
-             117:             TypeVector 30(float) 2
-             118:   30(float) Constant 1056964608
-             119:  117(fvec2) ConstantComposite 118 118
-             124:             TypeImage 30(float) 2D nonsampled format:R32f
-             125:             TypeRuntimeArray 124
-             126:             TypePointer UniformConstant 125
-127(storageImage):    126(ptr) Variable UniformConstant
-             129:             TypePointer UniformConstant 124
-             132:   54(ivec2) ConstantComposite 69 69
-             137:             TypeRuntimeArray 44
-             138:             TypePointer UniformConstant 137
-139(inputAttachment):    138(ptr) Variable UniformConstant
-             147:             TypeRuntimeArray 61
-             148:             TypePointer UniformConstant 147
-149(uniformTexelBuffer):    148(ptr) Variable UniformConstant
-             158:             TypeRuntimeArray 75
-             159:             TypePointer UniformConstant 158
-160(storageTexelBuffer):    159(ptr) Variable UniformConstant
-             168:             TypeVector 6(int) 4
-             169:             TypePointer Function 168(ivec4)
-             171:     36(int) Constant 1
-             178:     36(int) Constant 2
-             193:             TypeMatrix 33(fvec4) 4
-             194:             TypePointer Function 193
-          203(S):             TypeStruct 6(int)
-             204:             TypePointer Function 203(S)
+              36:             TypeFloat 32
+              37:             TypePointer Function 36(float)
+              39:             TypeVector 36(float) 4
+              40:             TypePointer Input 39(fvec4)
+     41(nu_inv4):     40(ptr) Variable Input
+              42:             TypeInt 32 0
+              43:     42(int) Constant 0
+              44:             TypePointer Input 36(float)
+              50:             TypeImage 36(float) SubpassData nonsampled format:Unknown
+              51:             TypeRuntimeArray 50
+              52:             TypePointer UniformConstant 51
+53(inputAttachmentDyn):     52(ptr) Variable UniformConstant
+              56:             TypePointer UniformConstant 50
+              59:      6(int) Constant 0
+              60:             TypeVector 6(int) 2
+              61:   60(ivec2) ConstantComposite 59 59
+              66:             TypeImage 36(float) Buffer sampled format:Unknown
+              67:             TypeSampledImage 66
+              68:             TypeRuntimeArray 67
+              69:             TypePointer UniformConstant 68
+70(uniformTexelBufferDyn):     69(ptr) Variable UniformConstant
+              72:             TypePointer UniformConstant 67
+              75:      6(int) Constant 1
+              81:             TypeImage 36(float) Buffer nonsampled format:R32f
+              82:             TypeRuntimeArray 81
+              83:             TypePointer UniformConstant 82
+84(storageTexelBufferDyn):     83(ptr) Variable UniformConstant
+              86:             TypePointer UniformConstant 81
+       93(uname):             TypeStruct 36(float)
+              94:             TypeRuntimeArray 93(uname)
+              95:             TypePointer Uniform 94
+96(uniformBuffer):     95(ptr) Variable Uniform
+              97:             TypePointer Input 6(int)
+       98(nu_ii):     97(ptr) Variable Input
+             100:             TypePointer Uniform 36(float)
+      105(bname):             TypeStruct 36(float)
+             106:             TypeRuntimeArray 105(bname)
+             107:             TypePointer Uniform 106
+108(storageBuffer):    107(ptr) Variable Uniform
+             114:             TypeImage 36(float) 2D sampled format:Unknown
+             115:             TypeSampledImage 114
+             116:             TypeRuntimeArray 115
+             117:             TypePointer UniformConstant 116
+118(sampledImage):    117(ptr) Variable UniformConstant
+             120:             TypePointer UniformConstant 115
+             123:             TypeVector 36(float) 2
+             124:   36(float) Constant 1056964608
+             125:  123(fvec2) ConstantComposite 124 124
+             130:             TypeImage 36(float) 2D nonsampled format:R32f
+             131:             TypeRuntimeArray 130
+             132:             TypePointer UniformConstant 131
+133(storageImage):    132(ptr) Variable UniformConstant
+             135:             TypePointer UniformConstant 130
+             138:   60(ivec2) ConstantComposite 75 75
+             143:             TypeRuntimeArray 50
+             144:             TypePointer UniformConstant 143
+145(inputAttachment):    144(ptr) Variable UniformConstant
+             153:             TypeRuntimeArray 67
+             154:             TypePointer UniformConstant 153
+155(uniformTexelBuffer):    154(ptr) Variable UniformConstant
+             164:             TypeRuntimeArray 81
+             165:             TypePointer UniformConstant 164
+166(storageTexelBuffer):    165(ptr) Variable UniformConstant
+             174:     42(int) Constant 8
+             175:             TypeArray 114 174
+             176:             TypePointer UniformConstant 175
+177(uniformTexArr):    176(ptr) Variable UniformConstant
+             179:             TypePointer UniformConstant 114
+             182:             TypeSampler
+             183:             TypePointer UniformConstant 182
+184(uniformSampler):    183(ptr) Variable UniformConstant
+             187:             TypePointer Input 123(fvec2)
+ 188(inTexcoord):    187(ptr) Variable Input
+             205:             TypeVector 6(int) 4
+             206:             TypePointer Function 205(ivec4)
+             208:     42(int) Constant 1
+             215:     42(int) Constant 2
+             230:             TypeMatrix 39(fvec4) 4
+             231:             TypePointer Function 230
+          240(S):             TypeStruct 6(int)
+             241:             TypePointer Function 240(S)
+             249:     42(int) Constant 10
+             250:             TypeArray 6(int) 249
+             251:             TypePointer Function 250
+         268(US):             TypeStruct 250
+             269:             TypePointer Function 268(US)
          4(main):           2 Function None 3
                5:             Label
            16(a):      7(ptr) Variable Function
        17(nu_li):      7(ptr) Variable Function
        18(param):      7(ptr) Variable Function
        20(param):      7(ptr) Variable Function
-           32(b):     31(ptr) Variable Function
-       41(nu_gf):     31(ptr) Variable Function
-       48(dyn_i):      7(ptr) Variable Function
-          170(v):    169(ptr) Variable Function
-         185(uv):    169(ptr) Variable Function
-          195(m):    194(ptr) Variable Function
-          205(s):    204(ptr) Variable Function
+      30(nu_li2):      7(ptr) Variable Function
+           38(b):     37(ptr) Variable Function
+       47(nu_gf):     37(ptr) Variable Function
+       54(dyn_i):      7(ptr) Variable Function
+          207(v):    206(ptr) Variable Function
+         222(uv):    206(ptr) Variable Function
+          232(m):    231(ptr) Variable Function
+          242(s):    241(ptr) Variable Function
+        252(arr):    251(ptr) Variable Function
+         259(um):    231(ptr) Variable Function
+         270(us):    269(ptr) Variable Function
+       278(uarr):    251(ptr) Variable Function
               19:      6(int) Load 17(nu_li)
                               Store 18(param) 19
               21:      6(int) FunctionCall 11(foo(i1;i1;) 18(param) 20(param)
@@ -258,126 +309,191 @@
               28:      6(int) CopyObject 27
               29:      6(int) IAdd 24 28
                               Store 17(nu_li) 29
-              39:     38(ptr) AccessChain 35(nu_inv4) 37
-              40:   30(float) Load 39
-              42:   30(float) Load 41(nu_gf)
-              43:   30(float) FMul 40 42
-                              Store 32(b) 43
-              49:      6(int) Load 48(dyn_i)
-              51:     50(ptr) AccessChain 47(inputAttachmentDyn) 49
-              52:          44 Load 51
-              56:   33(fvec4) ImageRead 52 55
-              57:   30(float) CompositeExtract 56 0
-              58:   30(float) Load 32(b)
-              59:   30(float) FAdd 58 57
-                              Store 32(b) 59
-              65:      6(int) Load 48(dyn_i)
-              67:     66(ptr) AccessChain 64(uniformTexelBufferDyn) 65
-              68:          61 Load 67
-              70:          60 Image 68
-              71:   33(fvec4) ImageFetch 70 69
-              72:   30(float) CompositeExtract 71 0
-              73:   30(float) Load 32(b)
-              74:   30(float) FAdd 73 72
-                              Store 32(b) 74
-              79:      6(int) Load 48(dyn_i)
-              81:     80(ptr) AccessChain 78(storageTexelBufferDyn) 79
-              82:          75 Load 81
-              83:   33(fvec4) ImageRead 82 69
-              84:   30(float) CompositeExtract 83 0
-              85:   30(float) Load 32(b)
-              86:   30(float) FAdd 85 84
-                              Store 32(b) 86
-              93:      6(int) Load 92(nu_ii)
-              95:     94(ptr) AccessChain 90(uniformBuffer) 93 53
-              96:   30(float) Load 95
-              97:   30(float) Load 32(b)
-              98:   30(float) FAdd 97 96
-                              Store 32(b) 98
-             103:      6(int) Load 92(nu_ii)
-             104:     94(ptr) AccessChain 102(storageBuffer) 103 53
-             105:   30(float) Load 104
-             106:   30(float) Load 32(b)
-             107:   30(float) FAdd 106 105
-                              Store 32(b) 107
-             113:      6(int) Load 92(nu_ii)
-             115:    114(ptr) AccessChain 112(sampledImage) 113
-             116:         109 Load 115
-             120:   33(fvec4) ImageSampleImplicitLod 116 119
-             121:   30(float) CompositeExtract 120 0
-             122:   30(float) Load 32(b)
-             123:   30(float) FAdd 122 121
-                              Store 32(b) 123
-             128:      6(int) Load 92(nu_ii)
-             130:    129(ptr) AccessChain 127(storageImage) 128
-             131:         124 Load 130
-             133:   33(fvec4) ImageRead 131 132
-             134:   30(float) CompositeExtract 133 0
-             135:   30(float) Load 32(b)
-             136:   30(float) FAdd 135 134
-                              Store 32(b) 136
-             140:      6(int) Load 92(nu_ii)
-             141:     50(ptr) AccessChain 139(inputAttachment) 140
-             142:          44 Load 141
-             143:   33(fvec4) ImageRead 142 55
-             144:   30(float) CompositeExtract 143 0
-             145:   30(float) Load 32(b)
-             146:   30(float) FAdd 145 144
-                              Store 32(b) 146
-             150:      6(int) Load 92(nu_ii)
-             151:     66(ptr) AccessChain 149(uniformTexelBuffer) 150
-             152:          61 Load 151
-             153:          60 Image 152
-             154:   33(fvec4) ImageFetch 153 69
-             155:   30(float) CompositeExtract 154 0
-             156:   30(float) Load 32(b)
-             157:   30(float) FAdd 156 155
-                              Store 32(b) 157
-             161:      6(int) Load 92(nu_ii)
-             162:     80(ptr) AccessChain 160(storageTexelBuffer) 161
-             163:          75 Load 162
-             164:   33(fvec4) ImageRead 163 69
-             165:   30(float) CompositeExtract 164 0
-             166:   30(float) Load 32(b)
-             167:   30(float) FAdd 166 165
-                              Store 32(b) 167
-             172:      7(ptr) AccessChain 170(v) 171
-             173:      6(int) Load 172
-             174:     94(ptr) AccessChain 90(uniformBuffer) 173 53
-             175:   30(float) Load 174
-             176:   30(float) Load 32(b)
-             177:   30(float) FAdd 176 175
-                              Store 32(b) 177
-             179:      7(ptr) AccessChain 170(v) 178
-             180:      6(int) Load 179
-             181:     94(ptr) AccessChain 90(uniformBuffer) 180 53
-             182:   30(float) Load 181
-             183:   30(float) Load 32(b)
-             184:   30(float) FAdd 183 182
-                              Store 32(b) 184
-             186:      6(int) Load 92(nu_ii)
-             187:      7(ptr) AccessChain 185(uv) 186
-             188:      6(int) Load 187
-             189:     94(ptr) AccessChain 90(uniformBuffer) 188 53
-             190:   30(float) Load 189
-             191:   30(float) Load 32(b)
-             192:   30(float) FAdd 191 190
-                              Store 32(b) 192
-             196:     31(ptr) AccessChain 195(m) 26 178
-             197:   30(float) Load 196
-             198:      6(int) ConvertFToS 197
-             199:     94(ptr) AccessChain 90(uniformBuffer) 198 53
-             200:   30(float) Load 199
-             201:   30(float) Load 32(b)
-             202:   30(float) FAdd 201 200
-                              Store 32(b) 202
-             206:      7(ptr) AccessChain 205(s) 53
-             207:      6(int) Load 206
-             208:     94(ptr) AccessChain 90(uniformBuffer) 207 53
-             209:   30(float) Load 208
-             210:   30(float) Load 32(b)
-             211:   30(float) FAdd 210 209
-                              Store 32(b) 211
+              31:      6(int) Load 16(a)
+              32:      6(int) Load 16(a)
+              33:      6(int) IMul 32 26
+              34:      6(int) CopyObject 33
+              35:      6(int) IAdd 31 34
+                              Store 30(nu_li2) 35
+              45:     44(ptr) AccessChain 41(nu_inv4) 43
+              46:   36(float) Load 45
+              48:   36(float) Load 47(nu_gf)
+              49:   36(float) FMul 46 48
+                              Store 38(b) 49
+              55:      6(int) Load 54(dyn_i)
+              57:     56(ptr) AccessChain 53(inputAttachmentDyn) 55
+              58:          50 Load 57
+              62:   39(fvec4) ImageRead 58 61
+              63:   36(float) CompositeExtract 62 0
+              64:   36(float) Load 38(b)
+              65:   36(float) FAdd 64 63
+                              Store 38(b) 65
+              71:      6(int) Load 54(dyn_i)
+              73:     72(ptr) AccessChain 70(uniformTexelBufferDyn) 71
+              74:          67 Load 73
+              76:          66 Image 74
+              77:   39(fvec4) ImageFetch 76 75
+              78:   36(float) CompositeExtract 77 0
+              79:   36(float) Load 38(b)
+              80:   36(float) FAdd 79 78
+                              Store 38(b) 80
+              85:      6(int) Load 54(dyn_i)
+              87:     86(ptr) AccessChain 84(storageTexelBufferDyn) 85
+              88:          81 Load 87
+              89:   39(fvec4) ImageRead 88 75
+              90:   36(float) CompositeExtract 89 0
+              91:   36(float) Load 38(b)
+              92:   36(float) FAdd 91 90
+                              Store 38(b) 92
+              99:      6(int) Load 98(nu_ii)
+             101:    100(ptr) AccessChain 96(uniformBuffer) 99 59
+             102:   36(float) Load 101
+             103:   36(float) Load 38(b)
+             104:   36(float) FAdd 103 102
+                              Store 38(b) 104
+             109:      6(int) Load 98(nu_ii)
+             110:    100(ptr) AccessChain 108(storageBuffer) 109 59
+             111:   36(float) Load 110
+             112:   36(float) Load 38(b)
+             113:   36(float) FAdd 112 111
+                              Store 38(b) 113
+             119:      6(int) Load 98(nu_ii)
+             121:    120(ptr) AccessChain 118(sampledImage) 119
+             122:         115 Load 121
+             126:   39(fvec4) ImageSampleImplicitLod 122 125
+             127:   36(float) CompositeExtract 126 0
+             128:   36(float) Load 38(b)
+             129:   36(float) FAdd 128 127
+                              Store 38(b) 129
+             134:      6(int) Load 98(nu_ii)
+             136:    135(ptr) AccessChain 133(storageImage) 134
+             137:         130 Load 136
+             139:   39(fvec4) ImageRead 137 138
+             140:   36(float) CompositeExtract 139 0
+             141:   36(float) Load 38(b)
+             142:   36(float) FAdd 141 140
+                              Store 38(b) 142
+             146:      6(int) Load 98(nu_ii)
+             147:     56(ptr) AccessChain 145(inputAttachment) 146
+             148:          50 Load 147
+             149:   39(fvec4) ImageRead 148 61
+             150:   36(float) CompositeExtract 149 0
+             151:   36(float) Load 38(b)
+             152:   36(float) FAdd 151 150
+                              Store 38(b) 152
+             156:      6(int) Load 98(nu_ii)
+             157:     72(ptr) AccessChain 155(uniformTexelBuffer) 156
+             158:          67 Load 157
+             159:          66 Image 158
+             160:   39(fvec4) ImageFetch 159 75
+             161:   36(float) CompositeExtract 160 0
+             162:   36(float) Load 38(b)
+             163:   36(float) FAdd 162 161
+                              Store 38(b) 163
+             167:      6(int) Load 98(nu_ii)
+             168:     86(ptr) AccessChain 166(storageTexelBuffer) 167
+             169:          81 Load 168
+             170:   39(fvec4) ImageRead 169 75
+             171:   36(float) CompositeExtract 170 0
+             172:   36(float) Load 38(b)
+             173:   36(float) FAdd 172 171
+                              Store 38(b) 173
+             178:      6(int) Load 98(nu_ii)
+             180:    179(ptr) AccessChain 177(uniformTexArr) 178
+             181:         114 Load 180
+             185:         182 Load 184(uniformSampler)
+             186:         115 SampledImage 181 185
+             189:  123(fvec2) Load 188(inTexcoord)
+             190:   39(fvec4) ImageSampleImplicitLod 186 189
+             191:   36(float) CompositeExtract 190 0
+             192:   36(float) Load 38(b)
+             193:   36(float) FAdd 192 191
+                              Store 38(b) 193
+             194:      6(int) Load 98(nu_ii)
+             195:    179(ptr) AccessChain 177(uniformTexArr) 194
+             196:         114 Load 195
+             197:         182 Load 184(uniformSampler)
+             198:         115 SampledImage 196 197
+             199:         115 CopyObject 198
+             200:  123(fvec2) Load 188(inTexcoord)
+             201:   39(fvec4) ImageSampleImplicitLod 199 200
+             202:   36(float) CompositeExtract 201 0
+             203:   36(float) Load 38(b)
+             204:   36(float) FAdd 203 202
+                              Store 38(b) 204
+             209:      7(ptr) AccessChain 207(v) 208
+             210:      6(int) Load 209
+             211:    100(ptr) AccessChain 96(uniformBuffer) 210 59
+             212:   36(float) Load 211
+             213:   36(float) Load 38(b)
+             214:   36(float) FAdd 213 212
+                              Store 38(b) 214
+             216:      7(ptr) AccessChain 207(v) 215
+             217:      6(int) Load 216
+             218:    100(ptr) AccessChain 96(uniformBuffer) 217 59
+             219:   36(float) Load 218
+             220:   36(float) Load 38(b)
+             221:   36(float) FAdd 220 219
+                              Store 38(b) 221
+             223:      6(int) Load 98(nu_ii)
+             224:      7(ptr) AccessChain 222(uv) 223
+             225:      6(int) Load 224
+             226:    100(ptr) AccessChain 96(uniformBuffer) 225 59
+             227:   36(float) Load 226
+             228:   36(float) Load 38(b)
+             229:   36(float) FAdd 228 227
+                              Store 38(b) 229
+             233:     37(ptr) AccessChain 232(m) 26 215
+             234:   36(float) Load 233
+             235:      6(int) ConvertFToS 234
+             236:    100(ptr) AccessChain 96(uniformBuffer) 235 59
+             237:   36(float) Load 236
+             238:   36(float) Load 38(b)
+             239:   36(float) FAdd 238 237
+                              Store 38(b) 239
+             243:      7(ptr) AccessChain 242(s) 59
+             244:      6(int) Load 243
+             245:    100(ptr) AccessChain 96(uniformBuffer) 244 59
+             246:   36(float) Load 245
+             247:   36(float) Load 38(b)
+             248:   36(float) FAdd 247 246
+                              Store 38(b) 248
+             253:      7(ptr) AccessChain 252(arr) 26
+             254:      6(int) Load 253
+             255:    100(ptr) AccessChain 96(uniformBuffer) 254 59
+             256:   36(float) Load 255
+             257:   36(float) Load 38(b)
+             258:   36(float) FAdd 257 256
+                              Store 38(b) 258
+             260:      6(int) Load 98(nu_ii)
+             261:     37(ptr) AccessChain 259(um) 260 215
+             262:   36(float) Load 261
+             263:      6(int) ConvertFToS 262
+             264:    100(ptr) AccessChain 96(uniformBuffer) 263 59
+             265:   36(float) Load 264
+             266:   36(float) Load 38(b)
+             267:   36(float) FAdd 266 265
+                              Store 38(b) 267
+             271:      6(int) Load 98(nu_ii)
+             272:      7(ptr) AccessChain 270(us) 59 271
+             273:      6(int) Load 272
+             274:    100(ptr) AccessChain 96(uniformBuffer) 273 59
+             275:   36(float) Load 274
+             276:   36(float) Load 38(b)
+             277:   36(float) FAdd 276 275
+                              Store 38(b) 277
+             279:      6(int) Load 98(nu_ii)
+             280:      7(ptr) AccessChain 278(uarr) 279
+             281:      6(int) Load 280
+             282:    100(ptr) AccessChain 96(uniformBuffer) 281 59
+             283:   36(float) Load 282
+             284:   36(float) Load 38(b)
+             285:   36(float) FAdd 284 283
+                              Store 38(b) 285
+             286:      6(int) Load 98(nu_ii)
+             287:   36(float) Load 38(b)
+             288:    100(ptr) AccessChain 108(storageBuffer) 286 59
+                              Store 288 287
                               Return
                               FunctionEnd
   11(foo(i1;i1;):      6(int) Function None 8
diff --git a/Test/baseResults/spv.nonuniform2.frag.out b/Test/baseResults/spv.nonuniform2.frag.out
index 759f4c4..bb89ba7 100644
--- a/Test/baseResults/spv.nonuniform2.frag.out
+++ b/Test/baseResults/spv.nonuniform2.frag.out
@@ -1,6 +1,6 @@
 spv.nonuniform2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nonuniform3.frag.out b/Test/baseResults/spv.nonuniform3.frag.out
index 9314261..b48916c 100644
--- a/Test/baseResults/spv.nonuniform3.frag.out
+++ b/Test/baseResults/spv.nonuniform3.frag.out
@@ -1,6 +1,6 @@
 spv.nonuniform3.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 32
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nonuniform4.frag.out b/Test/baseResults/spv.nonuniform4.frag.out
index a9dd520..6bfc957 100644
--- a/Test/baseResults/spv.nonuniform4.frag.out
+++ b/Test/baseResults/spv.nonuniform4.frag.out
@@ -1,6 +1,6 @@
 spv.nonuniform4.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
@@ -23,6 +23,7 @@
                               Decorate 13(rIndex) Flat
                               Decorate 13(rIndex) Location 3
                               Decorate 15 DecorationNonUniformEXT
+                              Decorate 17 DecorationNonUniformEXT
                               Decorate 21 DecorationNonUniformEXT
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.nonuniform5.frag.out b/Test/baseResults/spv.nonuniform5.frag.out
index 8ce131a..ebbb6f4 100644
--- a/Test/baseResults/spv.nonuniform5.frag.out
+++ b/Test/baseResults/spv.nonuniform5.frag.out
@@ -1,6 +1,6 @@
 spv.nonuniform5.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23
 
                               Capability Shader
diff --git a/Test/baseResults/spv.nullInit.comp.out b/Test/baseResults/spv.nullInit.comp.out
new file mode 100755
index 0000000..b7908b5
--- /dev/null
+++ b/Test/baseResults/spv.nullInit.comp.out
@@ -0,0 +1,65 @@
+spv.nullInit.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 37
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_null_initializer"
+                              Name 4  "main"
+                              Name 12  "S"
+                              MemberName 12(S) 0  "v"
+                              MemberName 12(S) 1  "a"
+                              Name 15  "local"
+                              Name 23  "f"
+                              Name 24  "T"
+                              MemberName 24(T) 0  "b"
+                              MemberName 24(T) 1  "s"
+                              Name 27  "t1"
+                              Name 28  "t2"
+                              Name 30  "s"
+                              Name 31  "g"
+                              Name 34  "i"
+                              Name 36  "global"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 3
+               8:             TypeInt 32 0
+               9:      8(int) Constant 4
+              10:             TypeArray 7(fvec3) 9
+              11:             TypeInt 32 1
+           12(S):             TypeStruct 10 11(int)
+              13:       12(S) ConstantNull
+              14:             TypePointer Function 12(S)
+              16:     11(int) Constant 1
+              17:             TypePointer Function 11(int)
+              21:    6(float) ConstantNull
+              22:             TypePointer Workgroup 6(float)
+           23(f):     22(ptr) Variable Workgroup 21
+           24(T):             TypeStruct 11(int) 12(S)
+              25:       24(T) ConstantNull
+              26:             TypePointer Workgroup 24(T)
+          27(t1):     26(ptr) Variable Workgroup 25
+          28(t2):     26(ptr) Variable Workgroup 25
+              29:             TypePointer Workgroup 12(S)
+           30(s):     29(ptr) Variable Workgroup 13
+           31(g):     22(ptr) Variable Workgroup 21
+              32:     11(int) ConstantNull
+              33:             TypePointer Workgroup 11(int)
+           34(i):     33(ptr) Variable Workgroup 32
+              35:             TypePointer Private 12(S)
+      36(global):     35(ptr) Variable Private 13
+         4(main):           2 Function None 3
+               5:             Label
+       15(local):     14(ptr) Variable Function 13
+              18:     17(ptr) AccessChain 15(local) 16
+              19:     11(int) Load 18
+              20:     11(int) IAdd 19 16
+                              Store 18 20
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.offsets.frag.out b/Test/baseResults/spv.offsets.frag.out
index 08a75e9..a1a9f31 100644
--- a/Test/baseResults/spv.offsets.frag.out
+++ b/Test/baseResults/spv.offsets.frag.out
@@ -1,6 +1,6 @@
 spv.offsets.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 15
 
                               Capability Shader
diff --git a/Test/baseResults/spv.paramMemory.420.frag.out b/Test/baseResults/spv.paramMemory.420.frag.out
new file mode 100644
index 0000000..4cdc35f
--- /dev/null
+++ b/Test/baseResults/spv.paramMemory.420.frag.out
@@ -0,0 +1,139 @@
+spv.paramMemory.420.frag
+Validation failed
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 69
+
+                              Capability Shader
+                              Capability StorageImageReadWithoutFormat
+                              Capability StorageImageWriteWithoutFormat
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 27 66
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 420
+                              SourceExtension  "GL_EXT_shader_image_load_formatted"
+                              Name 4  "main"
+                              Name 16  "image_load(I21;vi2;"
+                              Name 14  "image"
+                              Name 15  "coords"
+                              Name 23  "image_store(I21;vi2;vf4;"
+                              Name 20  "image"
+                              Name 21  "coords"
+                              Name 22  "data"
+                              Name 27  "in_coords"
+                              Name 35  "read1"
+                              Name 36  "image1"
+                              Name 37  "param"
+                              Name 40  "read2"
+                              Name 41  "image2"
+                              Name 42  "param"
+                              Name 47  "image3"
+                              Name 51  "param"
+                              Name 53  "param"
+                              Name 57  "image4"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Name 66  "out_color"
+                              Decorate 14(image) Coherent
+                              Decorate 14(image) NonWritable
+                              Decorate 20(image) Coherent
+                              Decorate 20(image) NonReadable
+                              Decorate 27(in_coords) Flat
+                              Decorate 27(in_coords) Location 0
+                              Decorate 36(image1) DescriptorSet 0
+                              Decorate 36(image1) Binding 0
+                              Decorate 36(image1) Coherent
+                              Decorate 36(image1) NonWritable
+                              Decorate 41(image2) DescriptorSet 0
+                              Decorate 41(image2) Binding 2
+                              Decorate 41(image2) NonWritable
+                              Decorate 47(image3) DescriptorSet 0
+                              Decorate 47(image3) Binding 1
+                              Decorate 47(image3) Coherent
+                              Decorate 47(image3) NonReadable
+                              Decorate 57(image4) DescriptorSet 0
+                              Decorate 57(image4) Binding 3
+                              Decorate 57(image4) NonReadable
+                              Decorate 66(out_color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeImage 6(float) 2D nonsampled format:Unknown
+               8:             TypePointer UniformConstant 7
+               9:             TypeInt 32 1
+              10:             TypeVector 9(int) 2
+              11:             TypePointer Function 10(ivec2)
+              12:             TypeVector 6(float) 4
+              13:             TypeFunction 12(fvec4) 8(ptr) 11(ptr)
+              18:             TypePointer Function 12(fvec4)
+              19:             TypeFunction 2 8(ptr) 11(ptr) 18(ptr)
+              26:             TypePointer Input 10(ivec2)
+   27(in_coords):     26(ptr) Variable Input
+      36(image1):      8(ptr) Variable UniformConstant
+      41(image2):      8(ptr) Variable UniformConstant
+              45:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              46:             TypePointer UniformConstant 45
+      47(image3):     46(ptr) Variable UniformConstant
+              49:    6(float) Constant 1056964608
+              55:             TypeImage 6(float) 2D nonsampled format:Rgba16f
+              56:             TypePointer UniformConstant 55
+      57(image4):     56(ptr) Variable UniformConstant
+              59:    6(float) Constant 1073741824
+              65:             TypePointer Output 12(fvec4)
+   66(out_color):     65(ptr) Variable Output
+              67:    6(float) Constant 0
+              68:   12(fvec4) ConstantComposite 67 67 67 67
+         4(main):           2 Function None 3
+               5:             Label
+       35(read1):     18(ptr) Variable Function
+       37(param):     11(ptr) Variable Function
+       40(read2):     18(ptr) Variable Function
+       42(param):     11(ptr) Variable Function
+       51(param):     11(ptr) Variable Function
+       53(param):     18(ptr) Variable Function
+       61(param):     11(ptr) Variable Function
+       63(param):     18(ptr) Variable Function
+              38:   10(ivec2) Load 27(in_coords)
+                              Store 37(param) 38
+              39:   12(fvec4) FunctionCall 16(image_load(I21;vi2;) 36(image1) 37(param)
+                              Store 35(read1) 39
+              43:   10(ivec2) Load 27(in_coords)
+                              Store 42(param) 43
+              44:   12(fvec4) FunctionCall 16(image_load(I21;vi2;) 41(image2) 42(param)
+                              Store 40(read2) 44
+              48:   12(fvec4) Load 35(read1)
+              50:   12(fvec4) VectorTimesScalar 48 49
+              52:   10(ivec2) Load 27(in_coords)
+                              Store 51(param) 52
+                              Store 53(param) 50
+              54:           2 FunctionCall 23(image_store(I21;vi2;vf4;) 47(image3) 51(param) 53(param)
+              58:   12(fvec4) Load 40(read2)
+              60:   12(fvec4) VectorTimesScalar 58 59
+              62:   10(ivec2) Load 27(in_coords)
+                              Store 61(param) 62
+                              Store 63(param) 60
+              64:           2 FunctionCall 23(image_store(I21;vi2;vf4;) 57(image4) 61(param) 63(param)
+                              Store 66(out_color) 68
+                              Return
+                              FunctionEnd
+16(image_load(I21;vi2;):   12(fvec4) Function None 13
+       14(image):      8(ptr) FunctionParameter
+      15(coords):     11(ptr) FunctionParameter
+              17:             Label
+              25:           7 Load 14(image)
+              28:   10(ivec2) Load 27(in_coords)
+              29:   12(fvec4) ImageRead 25 28
+                              ReturnValue 29
+                              FunctionEnd
+23(image_store(I21;vi2;vf4;):           2 Function None 19
+       20(image):      8(ptr) FunctionParameter
+      21(coords):     11(ptr) FunctionParameter
+        22(data):     18(ptr) FunctionParameter
+              24:             Label
+              32:           7 Load 20(image)
+              33:   10(ivec2) Load 27(in_coords)
+              34:   12(fvec4) Load 22(data)
+                              ImageWrite 32 33 34
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.paramMemory.frag.out b/Test/baseResults/spv.paramMemory.frag.out
index df13c65..a535cd3 100644
--- a/Test/baseResults/spv.paramMemory.frag.out
+++ b/Test/baseResults/spv.paramMemory.frag.out
@@ -1,7 +1,7 @@
 spv.paramMemory.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 64
 
                               Capability Shader
diff --git a/Test/baseResults/spv.perprimitiveNV.frag.out b/Test/baseResults/spv.perprimitiveNV.frag.out
index 9943ee9..2a37f2b 100644
--- a/Test/baseResults/spv.perprimitiveNV.frag.out
+++ b/Test/baseResults/spv.perprimitiveNV.frag.out
@@ -1,6 +1,6 @@
 spv.perprimitiveNV.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23
 
                               Capability Shader
diff --git a/Test/baseResults/spv.pp.line.frag.out b/Test/baseResults/spv.pp.line.frag.out
index 12c5fa5..549ae91 100644
--- a/Test/baseResults/spv.pp.line.frag.out
+++ b/Test/baseResults/spv.pp.line.frag.out
@@ -3,7 +3,7 @@
 WARNING: spv.pp.line.frag:7: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 65
 
                               Capability Shader
@@ -60,8 +60,11 @@
                               Decorate 22(texSampler1D) DescriptorSet 0
                               Decorate 22(texSampler1D) Binding 0
                               Decorate 37(texSampler2D) DescriptorSet 0
-                              Decorate 37(texSampler2D) Binding 0
+                              Decorate 37(texSampler2D) Binding 1
+                              Decorate 41(coords2D) Location 2
                               Decorate 53(gl_FragColor) Location 0
+                              Decorate 56(u) Location 1
+                              Decorate 59(blend) Location 0
                3:             TypeVoid
                4:             TypeFunction 3
                7:             TypeFloat 32
diff --git a/Test/baseResults/spv.precise.tesc.out b/Test/baseResults/spv.precise.tesc.out
index 840e7b3..e13c612 100644
--- a/Test/baseResults/spv.precise.tesc.out
+++ b/Test/baseResults/spv.precise.tesc.out
@@ -1,6 +1,6 @@
 spv.precise.tesc
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 72
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.precise.tese.out b/Test/baseResults/spv.precise.tese.out
index b59ac0e..a23b073 100644
--- a/Test/baseResults/spv.precise.tese.out
+++ b/Test/baseResults/spv.precise.tese.out
@@ -1,6 +1,6 @@
 spv.precise.tese
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 119
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.precision.frag.out b/Test/baseResults/spv.precision.frag.out
index ac4c0aa..973147d 100644
--- a/Test/baseResults/spv.precision.frag.out
+++ b/Test/baseResults/spv.precision.frag.out
@@ -1,12 +1,12 @@
 spv.precision.frag
 // Module Version 10000
-// Generated by (magic number): 80008
-// Id's are bound by 127
+// Generated by (magic number): 8000a
+// Id's are bound by 146
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 23 59 61 73 116
+                              EntryPoint Fragment 4  "main" 23 62 64 76 119
                               ExecutionMode 4 OriginUpperLeft
                               Source ESSL 310
                               Name 4  "main"
@@ -15,72 +15,88 @@
                               Name 19  "boolfun(vb2;"
                               Name 18  "bv2"
                               Name 23  "highfin"
-                              Name 38  "sum"
-                              Name 40  "uniform_medium"
-                              Name 42  "uniform_high"
-                              Name 48  "uniform_low"
-                              Name 53  "arg1"
-                              Name 55  "arg2"
-                              Name 57  "d"
-                              Name 59  "lowfin"
-                              Name 61  "mediumfin"
-                              Name 65  "global_highp"
-                              Name 69  "local_highp"
-                              Name 73  "mediumfout"
-                              Name 104  "ub2"
-                              Name 105  "param"
-                              Name 114  "S"
-                              MemberName 114(S) 0  "a"
-                              MemberName 114(S) 1  "b"
-                              Name 116  "s"
+                              Name 41  "sum"
+                              Name 43  "uniform_medium"
+                              Name 45  "uniform_high"
+                              Name 51  "uniform_low"
+                              Name 56  "arg1"
+                              Name 58  "arg2"
+                              Name 60  "d"
+                              Name 62  "lowfin"
+                              Name 64  "mediumfin"
+                              Name 68  "global_highp"
+                              Name 72  "local_highp"
+                              Name 76  "mediumfout"
+                              Name 107  "ub2"
+                              Name 108  "param"
+                              Name 117  "S"
+                              MemberName 117(S) 0  "a"
+                              MemberName 117(S) 1  "b"
+                              Name 119  "s"
                               Decorate 12(foo(vf3;) RelaxedPrecision
                               Decorate 11(mv3) RelaxedPrecision
-                              Decorate 38(sum) RelaxedPrecision
-                              Decorate 40(uniform_medium) RelaxedPrecision
-                              Decorate 41 RelaxedPrecision
-                              Decorate 46 RelaxedPrecision
-                              Decorate 48(uniform_low) RelaxedPrecision
+                              Decorate 23(highfin) Location 2
+                              Decorate 27 RelaxedPrecision
+                              Decorate 28 RelaxedPrecision
+                              Decorate 41(sum) RelaxedPrecision
+                              Decorate 43(uniform_medium) RelaxedPrecision
+                              Decorate 44 RelaxedPrecision
                               Decorate 49 RelaxedPrecision
-                              Decorate 50 RelaxedPrecision
-                              Decorate 51 RelaxedPrecision
-                              Decorate 53(arg1) RelaxedPrecision
-                              Decorate 55(arg2) RelaxedPrecision
-                              Decorate 57(d) RelaxedPrecision
-                              Decorate 59(lowfin) RelaxedPrecision
-                              Decorate 60 RelaxedPrecision
-                              Decorate 61(mediumfin) RelaxedPrecision
-                              Decorate 62 RelaxedPrecision
+                              Decorate 51(uniform_low) RelaxedPrecision
+                              Decorate 52 RelaxedPrecision
+                              Decorate 53 RelaxedPrecision
+                              Decorate 54 RelaxedPrecision
+                              Decorate 56(arg1) RelaxedPrecision
+                              Decorate 58(arg2) RelaxedPrecision
+                              Decorate 60(d) RelaxedPrecision
+                              Decorate 62(lowfin) RelaxedPrecision
+                              Decorate 62(lowfin) Location 0
                               Decorate 63 RelaxedPrecision
-                              Decorate 73(mediumfout) RelaxedPrecision
-                              Decorate 74 RelaxedPrecision
-                              Decorate 75 RelaxedPrecision
-                              Decorate 76 RelaxedPrecision
+                              Decorate 64(mediumfin) RelaxedPrecision
+                              Decorate 64(mediumfin) Location 1
+                              Decorate 65 RelaxedPrecision
+                              Decorate 66 RelaxedPrecision
+                              Decorate 76(mediumfout) RelaxedPrecision
+                              Decorate 76(mediumfout) Location 0
                               Decorate 77 RelaxedPrecision
                               Decorate 78 RelaxedPrecision
                               Decorate 79 RelaxedPrecision
-                              Decorate 83 RelaxedPrecision
-                              Decorate 85 RelaxedPrecision
-                              Decorate 87 RelaxedPrecision
+                              Decorate 80 RelaxedPrecision
+                              Decorate 81 RelaxedPrecision
+                              Decorate 82 RelaxedPrecision
+                              Decorate 86 RelaxedPrecision
                               Decorate 88 RelaxedPrecision
                               Decorate 90 RelaxedPrecision
                               Decorate 91 RelaxedPrecision
+                              Decorate 93 RelaxedPrecision
                               Decorate 94 RelaxedPrecision
-                              Decorate 95 RelaxedPrecision
-                              Decorate 96 RelaxedPrecision
                               Decorate 97 RelaxedPrecision
                               Decorate 98 RelaxedPrecision
                               Decorate 99 RelaxedPrecision
                               Decorate 100 RelaxedPrecision
                               Decorate 101 RelaxedPrecision
                               Decorate 102 RelaxedPrecision
-                              Decorate 110 RelaxedPrecision
-                              Decorate 112 RelaxedPrecision
+                              Decorate 103 RelaxedPrecision
+                              Decorate 104 RelaxedPrecision
+                              Decorate 105 RelaxedPrecision
                               Decorate 113 RelaxedPrecision
-                              MemberDecorate 114(S) 1 RelaxedPrecision
-                              Decorate 120 RelaxedPrecision
-                              Decorate 124 RelaxedPrecision
-                              Decorate 125 RelaxedPrecision
-                              Decorate 126 RelaxedPrecision
+                              Decorate 115 RelaxedPrecision
+                              Decorate 116 RelaxedPrecision
+                              MemberDecorate 117(S) 1 RelaxedPrecision
+                              Decorate 119(s) Location 3
+                              Decorate 123 RelaxedPrecision
+                              Decorate 127 RelaxedPrecision
+                              Decorate 128 RelaxedPrecision
+                              Decorate 129 RelaxedPrecision
+                              Decorate 130 RelaxedPrecision
+                              Decorate 131 RelaxedPrecision
+                              Decorate 132 RelaxedPrecision
+                              Decorate 135 RelaxedPrecision
+                              Decorate 139 RelaxedPrecision
+                              Decorate 140 RelaxedPrecision
+                              Decorate 143 RelaxedPrecision
+                              Decorate 144 RelaxedPrecision
+                              Decorate 145 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -95,134 +111,161 @@
               21:             TypeVector 6(float) 4
               22:             TypePointer Input 21(fvec4)
      23(highfin):     22(ptr) Variable Input
-              29:    14(bool) ConstantFalse
-              30:    14(bool) ConstantTrue
-              31:   15(bvec2) ConstantComposite 29 30
-              36:             TypeInt 32 1
-              37:             TypePointer Function 36(int)
-              39:             TypePointer Private 36(int)
-40(uniform_medium):     39(ptr) Variable Private
-42(uniform_high):     39(ptr) Variable Private
- 48(uniform_low):     39(ptr) Variable Private
-              52:             TypePointer Function 6(float)
-              54:    6(float) Constant 1078774989
-              56:    6(float) Constant 1232730691
-              58:             TypePointer Input 6(float)
-      59(lowfin):     58(ptr) Variable Input
-   61(mediumfin):     58(ptr) Variable Input
-              64:             TypePointer Private 6(float)
-65(global_highp):     64(ptr) Variable Private
-              68:             TypePointer Function 21(fvec4)
-              72:             TypePointer Output 21(fvec4)
-  73(mediumfout):     72(ptr) Variable Output
-              82:     36(int) Constant 4
-              84:             TypeVector 36(int) 2
-              92:             TypeInt 32 0
-              93:     92(int) Constant 0
-             103:             TypePointer Private 15(bvec2)
-        104(ub2):    103(ptr) Variable Private
-             111:    6(float) Constant 1065353216
-          114(S):             TypeStruct 6(float) 6(float)
-             115:             TypePointer Input 114(S)
-          116(s):    115(ptr) Variable Input
-             117:     36(int) Constant 0
-             122:     36(int) Constant 1
+              26:             TypePointer Function 9(fvec2)
+              32:    14(bool) ConstantFalse
+              33:    14(bool) ConstantTrue
+              34:   15(bvec2) ConstantComposite 32 33
+              39:             TypeInt 32 1
+              40:             TypePointer Function 39(int)
+              42:             TypePointer Private 39(int)
+43(uniform_medium):     42(ptr) Variable Private
+45(uniform_high):     42(ptr) Variable Private
+ 51(uniform_low):     42(ptr) Variable Private
+              55:             TypePointer Function 6(float)
+              57:    6(float) Constant 1078774989
+              59:    6(float) Constant 1232730691
+              61:             TypePointer Input 6(float)
+      62(lowfin):     61(ptr) Variable Input
+   64(mediumfin):     61(ptr) Variable Input
+              67:             TypePointer Private 6(float)
+68(global_highp):     67(ptr) Variable Private
+              71:             TypePointer Function 21(fvec4)
+              75:             TypePointer Output 21(fvec4)
+  76(mediumfout):     75(ptr) Variable Output
+              85:     39(int) Constant 4
+              87:             TypeVector 39(int) 2
+              95:             TypeInt 32 0
+              96:     95(int) Constant 0
+             106:             TypePointer Private 15(bvec2)
+        107(ub2):    106(ptr) Variable Private
+             114:    6(float) Constant 1065353216
+          117(S):             TypeStruct 6(float) 6(float)
+             118:             TypePointer Input 117(S)
+          119(s):    118(ptr) Variable Input
+             120:     39(int) Constant 0
+             125:     39(int) Constant 1
+             133:    6(float) Constant 1082549862
+             138:    6(float) Constant 1073741824
+             142:    6(float) Constant 1077936128
          4(main):           2 Function None 3
                5:             Label
-         38(sum):     37(ptr) Variable Function
-        53(arg1):     52(ptr) Variable Function
-        55(arg2):     52(ptr) Variable Function
-           57(d):     52(ptr) Variable Function
- 69(local_highp):     68(ptr) Variable Function
-      105(param):     16(ptr) Variable Function
-              41:     36(int) Load 40(uniform_medium)
-              43:     36(int) Load 42(uniform_high)
-              44:     36(int) IAdd 41 43
-                              Store 38(sum) 44
-              45:     36(int) Load 42(uniform_high)
-              46:     36(int) Load 38(sum)
-              47:     36(int) IAdd 46 45
-                              Store 38(sum) 47
-              49:     36(int) Load 48(uniform_low)
-              50:     36(int) Load 38(sum)
-              51:     36(int) IAdd 50 49
-                              Store 38(sum) 51
-                              Store 53(arg1) 54
-                              Store 55(arg2) 56
-              60:    6(float) Load 59(lowfin)
-              62:    6(float) Load 61(mediumfin)
-              63:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 60 62
-                              Store 57(d) 63
-              66:   21(fvec4) Load 23(highfin)
-              67:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 66
-                              Store 65(global_highp) 67
-              70:    6(float) Load 65(global_highp)
-              71:   21(fvec4) CompositeConstruct 70 70 70 70
-                              Store 69(local_highp) 71
-              74:    6(float) Load 57(d)
-              75:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 74
-              76:   21(fvec4) CompositeConstruct 75 75 75 75
-              77:    6(float) Load 55(arg2)
-              78:   21(fvec4) CompositeConstruct 77 77 77 77
-              79:   21(fvec4) FAdd 76 78
-              80:   21(fvec4) Load 69(local_highp)
-              81:   21(fvec4) FAdd 79 80
-                              Store 73(mediumfout) 81
-              83:     36(int) Load 48(uniform_low)
-              85:   84(ivec2) CompositeConstruct 83 83
-              86:     36(int) Load 42(uniform_high)
-              87:   84(ivec2) CompositeConstruct 86 86
-              88:   84(ivec2) IMul 85 87
-              89:     36(int) Load 42(uniform_high)
-              90:   84(ivec2) CompositeConstruct 89 89
-              91:   84(ivec2) IAdd 88 90
-              94:     36(int) CompositeExtract 91 0
-              95:     36(int) IAdd 82 94
-              96:     36(int) Load 38(sum)
-              97:     36(int) IAdd 96 95
-                              Store 38(sum) 97
-              98:     36(int) Load 38(sum)
-              99:    6(float) ConvertSToF 98
-             100:   21(fvec4) CompositeConstruct 99 99 99 99
-             101:   21(fvec4) Load 73(mediumfout)
-             102:   21(fvec4) FAdd 101 100
-                              Store 73(mediumfout) 102
-             106:   15(bvec2) Load 104(ub2)
-                              Store 105(param) 106
-             107:    14(bool) FunctionCall 19(boolfun(vb2;) 105(param)
-                              SelectionMerge 109 None
-                              BranchConditional 107 108 109
-             108:               Label
-             110:   21(fvec4)   Load 73(mediumfout)
-             112:   21(fvec4)   CompositeConstruct 111 111 111 111
-             113:   21(fvec4)   FAdd 110 112
-                                Store 73(mediumfout) 113
-                                Branch 109
-             109:             Label
-             118:     58(ptr) AccessChain 116(s) 117
-             119:    6(float) Load 118
-             120:   21(fvec4) Load 73(mediumfout)
-             121:   21(fvec4) VectorTimesScalar 120 119
-                              Store 73(mediumfout) 121
-             123:     58(ptr) AccessChain 116(s) 122
-             124:    6(float) Load 123
-             125:   21(fvec4) Load 73(mediumfout)
-             126:   21(fvec4) VectorTimesScalar 125 124
-                              Store 73(mediumfout) 126
+         41(sum):     40(ptr) Variable Function
+        56(arg1):     55(ptr) Variable Function
+        58(arg2):     55(ptr) Variable Function
+           60(d):     55(ptr) Variable Function
+ 72(local_highp):     71(ptr) Variable Function
+      108(param):     16(ptr) Variable Function
+             135:     71(ptr) Variable Function
+              44:     39(int) Load 43(uniform_medium)
+              46:     39(int) Load 45(uniform_high)
+              47:     39(int) IAdd 44 46
+                              Store 41(sum) 47
+              48:     39(int) Load 45(uniform_high)
+              49:     39(int) Load 41(sum)
+              50:     39(int) IAdd 49 48
+                              Store 41(sum) 50
+              52:     39(int) Load 51(uniform_low)
+              53:     39(int) Load 41(sum)
+              54:     39(int) IAdd 53 52
+                              Store 41(sum) 54
+                              Store 56(arg1) 57
+                              Store 58(arg2) 59
+              63:    6(float) Load 62(lowfin)
+              65:    6(float) Load 64(mediumfin)
+              66:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 63 65
+                              Store 60(d) 66
+              69:   21(fvec4) Load 23(highfin)
+              70:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 69
+                              Store 68(global_highp) 70
+              73:    6(float) Load 68(global_highp)
+              74:   21(fvec4) CompositeConstruct 73 73 73 73
+                              Store 72(local_highp) 74
+              77:    6(float) Load 60(d)
+              78:    6(float) ExtInst 1(GLSL.std.450) 13(Sin) 77
+              79:   21(fvec4) CompositeConstruct 78 78 78 78
+              80:    6(float) Load 58(arg2)
+              81:   21(fvec4) CompositeConstruct 80 80 80 80
+              82:   21(fvec4) FAdd 79 81
+              83:   21(fvec4) Load 72(local_highp)
+              84:   21(fvec4) FAdd 82 83
+                              Store 76(mediumfout) 84
+              86:     39(int) Load 51(uniform_low)
+              88:   87(ivec2) CompositeConstruct 86 86
+              89:     39(int) Load 45(uniform_high)
+              90:   87(ivec2) CompositeConstruct 89 89
+              91:   87(ivec2) IMul 88 90
+              92:     39(int) Load 45(uniform_high)
+              93:   87(ivec2) CompositeConstruct 92 92
+              94:   87(ivec2) IAdd 91 93
+              97:     39(int) CompositeExtract 94 0
+              98:     39(int) IAdd 85 97
+              99:     39(int) Load 41(sum)
+             100:     39(int) IAdd 99 98
+                              Store 41(sum) 100
+             101:     39(int) Load 41(sum)
+             102:    6(float) ConvertSToF 101
+             103:   21(fvec4) CompositeConstruct 102 102 102 102
+             104:   21(fvec4) Load 76(mediumfout)
+             105:   21(fvec4) FAdd 104 103
+                              Store 76(mediumfout) 105
+             109:   15(bvec2) Load 107(ub2)
+                              Store 108(param) 109
+             110:    14(bool) FunctionCall 19(boolfun(vb2;) 108(param)
+                              SelectionMerge 112 None
+                              BranchConditional 110 111 112
+             111:               Label
+             113:   21(fvec4)   Load 76(mediumfout)
+             115:   21(fvec4)   CompositeConstruct 114 114 114 114
+             116:   21(fvec4)   FAdd 113 115
+                                Store 76(mediumfout) 116
+                                Branch 112
+             112:             Label
+             121:     61(ptr) AccessChain 119(s) 120
+             122:    6(float) Load 121
+             123:   21(fvec4) Load 76(mediumfout)
+             124:   21(fvec4) VectorTimesScalar 123 122
+                              Store 76(mediumfout) 124
+             126:     61(ptr) AccessChain 119(s) 125
+             127:    6(float) Load 126
+             128:   21(fvec4) Load 76(mediumfout)
+             129:   21(fvec4) VectorTimesScalar 128 127
+                              Store 76(mediumfout) 129
+             130:    6(float) Load 64(mediumfin)
+             131:    6(float) Load 64(mediumfin)
+             132:    6(float) FMul 130 131
+             134:    14(bool) FOrdGreaterThan 132 133
+                              SelectionMerge 137 None
+                              BranchConditional 134 136 141
+             136:               Label
+             139:   21(fvec4)   Load 76(mediumfout)
+             140:   21(fvec4)   VectorTimesScalar 139 138
+                                Store 135 140
+                                Branch 137
+             141:               Label
+             143:   21(fvec4)   Load 76(mediumfout)
+             144:   21(fvec4)   VectorTimesScalar 143 142
+                                Store 135 144
+                                Branch 137
+             137:             Label
+             145:   21(fvec4) Load 135
+                              Store 76(mediumfout) 145
                               Return
                               FunctionEnd
     12(foo(vf3;):    9(fvec2) Function None 10
          11(mv3):      8(ptr) FunctionParameter
               13:             Label
+              27:     26(ptr) Variable Function
               24:   21(fvec4) Load 23(highfin)
               25:    9(fvec2) VectorShuffle 24 24 0 1
-                              ReturnValue 25
+                              Store 27 25
+              28:    9(fvec2) Load 27
+                              ReturnValue 28
                               FunctionEnd
 19(boolfun(vb2;):    14(bool) Function None 17
          18(bv2):     16(ptr) FunctionParameter
               20:             Label
-              28:   15(bvec2) Load 18(bv2)
-              32:   15(bvec2) LogicalEqual 28 31
-              33:    14(bool) All 32
-                              ReturnValue 33
+              31:   15(bvec2) Load 18(bv2)
+              35:   15(bvec2) LogicalEqual 31 34
+              36:    14(bool) All 35
+                              ReturnValue 36
                               FunctionEnd
diff --git a/Test/baseResults/spv.precisionArgs.frag.out b/Test/baseResults/spv.precisionArgs.frag.out
new file mode 100644
index 0000000..ae54a58
--- /dev/null
+++ b/Test/baseResults/spv.precisionArgs.frag.out
@@ -0,0 +1,165 @@
+spv.precisionArgs.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 83
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              Name 4  "main"
+                              Name 10  "fooConst(f1;f1;"
+                              Name 8  "f"
+                              Name 9  "g"
+                              Name 16  "foo(f1;f1;"
+                              Name 14  "f"
+                              Name 15  "g"
+                              Name 20  "retM(f1;"
+                              Name 19  "x"
+                              Name 23  "retH(f1;"
+                              Name 22  "x"
+                              Name 26  "retHM(f1;"
+                              Name 25  "x"
+                              Name 29  "retMH(f1;"
+                              Name 28  "x"
+                              Name 47  "aM"
+                              Name 49  "bM"
+                              Name 51  "arg"
+                              Name 54  "aH"
+                              Name 56  "bH"
+                              Name 58  "arg"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Name 66  "param"
+                              Name 68  "param"
+                              Name 71  "param"
+                              Name 74  "param"
+                              Name 77  "param"
+                              Name 80  "param"
+                              Decorate 8(f) RelaxedPrecision
+                              Decorate 14(f) RelaxedPrecision
+                              Decorate 20(retM(f1;) RelaxedPrecision
+                              Decorate 19(x) RelaxedPrecision
+                              Decorate 26(retHM(f1;) RelaxedPrecision
+                              Decorate 28(x) RelaxedPrecision
+                              Decorate 31 RelaxedPrecision
+                              Decorate 38 RelaxedPrecision
+                              Decorate 39 RelaxedPrecision
+                              Decorate 42 RelaxedPrecision
+                              Decorate 47(aM) RelaxedPrecision
+                              Decorate 48 RelaxedPrecision
+                              Decorate 49(bM) RelaxedPrecision
+                              Decorate 50 RelaxedPrecision
+                              Decorate 58(arg) RelaxedPrecision
+                              Decorate 59 RelaxedPrecision
+                              Decorate 61(param) RelaxedPrecision
+                              Decorate 62 RelaxedPrecision
+                              Decorate 64 RelaxedPrecision
+                              Decorate 66(param) RelaxedPrecision
+                              Decorate 71(param) RelaxedPrecision
+                              Decorate 72 RelaxedPrecision
+                              Decorate 73 RelaxedPrecision
+                              Decorate 79 RelaxedPrecision
+                              Decorate 80(param) RelaxedPrecision
+                              Decorate 81 RelaxedPrecision
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeFunction 2 6(float) 6(float)
+              12:             TypePointer Function 6(float)
+              13:             TypeFunction 2 12(ptr) 12(ptr)
+              18:             TypeFunction 6(float) 12(ptr)
+         4(main):           2 Function None 3
+               5:             Label
+          47(aM):     12(ptr) Variable Function
+          49(bM):     12(ptr) Variable Function
+         51(arg):     12(ptr) Variable Function
+          54(aH):     12(ptr) Variable Function
+          56(bH):     12(ptr) Variable Function
+         58(arg):     12(ptr) Variable Function
+       61(param):     12(ptr) Variable Function
+       63(param):     12(ptr) Variable Function
+       66(param):     12(ptr) Variable Function
+       68(param):     12(ptr) Variable Function
+       71(param):     12(ptr) Variable Function
+       74(param):     12(ptr) Variable Function
+       77(param):     12(ptr) Variable Function
+       80(param):     12(ptr) Variable Function
+              48:    6(float) Load 47(aM)
+              50:    6(float) Load 49(bM)
+                              Store 51(arg) 50
+              52:    6(float) Load 51(arg)
+              53:           2 FunctionCall 10(fooConst(f1;f1;) 48 52
+              55:    6(float) Load 54(aH)
+              57:    6(float) Load 56(bH)
+                              Store 58(arg) 55
+              59:    6(float) Load 58(arg)
+              60:           2 FunctionCall 10(fooConst(f1;f1;) 59 57
+              62:    6(float) Load 47(aM)
+                              Store 61(param) 62
+              64:    6(float) Load 49(bM)
+                              Store 63(param) 64
+              65:           2 FunctionCall 16(foo(f1;f1;) 61(param) 63(param)
+              67:    6(float) Load 54(aH)
+                              Store 66(param) 67
+              69:    6(float) Load 56(bH)
+                              Store 68(param) 69
+              70:           2 FunctionCall 16(foo(f1;f1;) 66(param) 68(param)
+              72:    6(float) Load 47(aM)
+                              Store 71(param) 72
+              73:    6(float) FunctionCall 20(retM(f1;) 71(param)
+              75:    6(float) Load 54(aH)
+                              Store 74(param) 75
+              76:    6(float) FunctionCall 23(retH(f1;) 74(param)
+              78:    6(float) Load 54(aH)
+                              Store 77(param) 78
+              79:    6(float) FunctionCall 26(retHM(f1;) 77(param)
+              81:    6(float) Load 47(aM)
+                              Store 80(param) 81
+              82:    6(float) FunctionCall 29(retMH(f1;) 80(param)
+                              Return
+                              FunctionEnd
+10(fooConst(f1;f1;):           2 Function None 7
+            8(f):    6(float) FunctionParameter
+            9(g):    6(float) FunctionParameter
+              11:             Label
+                              Return
+                              FunctionEnd
+  16(foo(f1;f1;):           2 Function None 13
+           14(f):     12(ptr) FunctionParameter
+           15(g):     12(ptr) FunctionParameter
+              17:             Label
+                              Return
+                              FunctionEnd
+    20(retM(f1;):    6(float) Function None 18
+           19(x):     12(ptr) FunctionParameter
+              21:             Label
+              31:    6(float) Load 19(x)
+                              ReturnValue 31
+                              FunctionEnd
+    23(retH(f1;):    6(float) Function None 18
+           22(x):     12(ptr) FunctionParameter
+              24:             Label
+              34:    6(float) Load 22(x)
+                              ReturnValue 34
+                              FunctionEnd
+   26(retHM(f1;):    6(float) Function None 18
+           25(x):     12(ptr) FunctionParameter
+              27:             Label
+              38:     12(ptr) Variable Function
+              37:    6(float) Load 25(x)
+                              Store 38 37
+              39:    6(float) Load 38
+                              ReturnValue 39
+                              FunctionEnd
+   29(retMH(f1;):    6(float) Function None 18
+           28(x):     12(ptr) FunctionParameter
+              30:             Label
+              43:     12(ptr) Variable Function
+              42:    6(float) Load 28(x)
+                              Store 43 42
+              44:    6(float) Load 43
+                              ReturnValue 44
+                              FunctionEnd
diff --git a/Test/baseResults/spv.precisionNonESSamp.frag.out b/Test/baseResults/spv.precisionNonESSamp.frag.out
index 97681f3..c4cd1eb 100644
--- a/Test/baseResults/spv.precisionNonESSamp.frag.out
+++ b/Test/baseResults/spv.precisionNonESSamp.frag.out
@@ -1,6 +1,6 @@
 spv.precisionNonESSamp.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 47
 
                               Capability Shader
@@ -31,14 +31,14 @@
                               Decorate 18 RelaxedPrecision
                               Decorate 19 RelaxedPrecision
                               Decorate 23(t) DescriptorSet 0
-                              Decorate 23(t) Binding 0
+                              Decorate 23(t) Binding 1
                               Decorate 27(v3) RelaxedPrecision
                               Decorate 27(v3) Location 1
                               Decorate 28 RelaxedPrecision
                               Decorate 31(vi1) RelaxedPrecision
                               Decorate 34(i1) RelaxedPrecision
                               Decorate 34(i1) DescriptorSet 0
-                              Decorate 34(i1) Binding 0
+                              Decorate 34(i1) Binding 2
                               Decorate 35 RelaxedPrecision
                               Decorate 39(iv2) RelaxedPrecision
                               Decorate 39(iv2) Flat
@@ -47,7 +47,7 @@
                               Decorate 41 RelaxedPrecision
                               Decorate 42(vi2) RelaxedPrecision
                               Decorate 43(i2) DescriptorSet 0
-                              Decorate 43(i2) Binding 0
+                              Decorate 43(i2) Binding 3
                               Decorate 45 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.precisionTexture.frag.out b/Test/baseResults/spv.precisionTexture.frag.out
new file mode 100644
index 0000000..d5e21b6
--- /dev/null
+++ b/Test/baseResults/spv.precisionTexture.frag.out
@@ -0,0 +1,120 @@
+spv.precisionTexture.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 66
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 16 57 65
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              Name 4  "main"
+                              Name 9  "v"
+                              Name 13  "texM"
+                              Name 16  "vertex"
+                              Name 21  "texH"
+                              Name 52  "imageM"
+                              Name 57  "coord"
+                              Name 60  "imageH"
+                              Name 65  "fragColor"
+                              Decorate 9(v) RelaxedPrecision
+                              Decorate 13(texM) RelaxedPrecision
+                              Decorate 13(texM) DescriptorSet 0
+                              Decorate 13(texM) Binding 0
+                              Decorate 14 RelaxedPrecision
+                              Decorate 16(vertex) Location 0
+                              Decorate 20 RelaxedPrecision
+                              Decorate 21(texH) DescriptorSet 0
+                              Decorate 21(texH) Binding 1
+                              Decorate 26 RelaxedPrecision
+                              Decorate 34 RelaxedPrecision
+                              Decorate 41 RelaxedPrecision
+                              Decorate 45 RelaxedPrecision
+                              Decorate 52(imageM) RelaxedPrecision
+                              Decorate 52(imageM) DescriptorSet 0
+                              Decorate 52(imageM) Binding 0
+                              Decorate 52(imageM) NonWritable
+                              Decorate 53 RelaxedPrecision
+                              Decorate 57(coord) Flat
+                              Decorate 57(coord) Location 1
+                              Decorate 59 RelaxedPrecision
+                              Decorate 60(imageH) DescriptorSet 0
+                              Decorate 60(imageH) Binding 1
+                              Decorate 60(imageH) NonWritable
+                              Decorate 65(fragColor) RelaxedPrecision
+                              Decorate 65(fragColor) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypeImage 6(float) 2D sampled format:Unknown
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+        13(texM):     12(ptr) Variable UniformConstant
+              15:             TypePointer Input 7(fvec4)
+      16(vertex):     15(ptr) Variable Input
+              17:             TypeVector 6(float) 2
+        21(texH):     12(ptr) Variable UniformConstant
+              29:             TypeInt 32 0
+              30:     29(int) Constant 2
+              31:             TypePointer Input 6(float)
+              42:             TypeVector 6(float) 3
+              50:             TypeImage 6(float) 2D nonsampled format:Rgba32f
+              51:             TypePointer UniformConstant 50
+      52(imageM):     51(ptr) Variable UniformConstant
+              54:             TypeInt 32 1
+              55:             TypeVector 54(int) 2
+              56:             TypePointer Input 55(ivec2)
+       57(coord):     56(ptr) Variable Input
+      60(imageH):     51(ptr) Variable UniformConstant
+              64:             TypePointer Output 7(fvec4)
+   65(fragColor):     64(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+            9(v):      8(ptr) Variable Function
+              14:          11 Load 13(texM)
+              18:    7(fvec4) Load 16(vertex)
+              19:   17(fvec2) VectorShuffle 18 18 0 1
+              20:    7(fvec4) ImageSampleImplicitLod 14 19
+                              Store 9(v) 20
+              22:          11 Load 21(texH)
+              23:    7(fvec4) Load 16(vertex)
+              24:   17(fvec2) VectorShuffle 23 23 0 1
+              25:    7(fvec4) ImageSampleImplicitLod 22 24
+                              Store 9(v) 25
+              26:          11 Load 13(texM)
+              27:    7(fvec4) Load 16(vertex)
+              28:   17(fvec2) VectorShuffle 27 27 0 1
+              32:     31(ptr) AccessChain 16(vertex) 30
+              33:    6(float) Load 32
+              34:    7(fvec4) ImageSampleExplicitLod 26 28 Lod 33
+                              Store 9(v) 34
+              35:          11 Load 21(texH)
+              36:    7(fvec4) Load 16(vertex)
+              37:   17(fvec2) VectorShuffle 36 36 0 1
+              38:     31(ptr) AccessChain 16(vertex) 30
+              39:    6(float) Load 38
+              40:    7(fvec4) ImageSampleExplicitLod 35 37 Lod 39
+                              Store 9(v) 40
+              41:          11 Load 13(texM)
+              43:    7(fvec4) Load 16(vertex)
+              44:   42(fvec3) VectorShuffle 43 43 0 1 2
+              45:    7(fvec4) ImageSampleProjImplicitLod 41 44
+                              Store 9(v) 45
+              46:          11 Load 21(texH)
+              47:    7(fvec4) Load 16(vertex)
+              48:   42(fvec3) VectorShuffle 47 47 0 1 2
+              49:    7(fvec4) ImageSampleProjImplicitLod 46 48
+                              Store 9(v) 49
+              53:          50 Load 52(imageM)
+              58:   55(ivec2) Load 57(coord)
+              59:    7(fvec4) ImageRead 53 58
+                              Store 9(v) 59
+              61:          50 Load 60(imageH)
+              62:   55(ivec2) Load 57(coord)
+              63:    7(fvec4) ImageRead 61 62
+                              Store 9(v) 63
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.prepost.frag.out b/Test/baseResults/spv.prepost.frag.out
index a0dbbd4..5fd6b37 100644
--- a/Test/baseResults/spv.prepost.frag.out
+++ b/Test/baseResults/spv.prepost.frag.out
@@ -1,6 +1,6 @@
 spv.prepost.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 94
 
                               Capability Shader
diff --git a/Test/baseResults/spv.privateVariableTypes.frag.out b/Test/baseResults/spv.privateVariableTypes.frag.out
index 1b8e1a5..d5ad68a 100644
--- a/Test/baseResults/spv.privateVariableTypes.frag.out
+++ b/Test/baseResults/spv.privateVariableTypes.frag.out
@@ -1,6 +1,6 @@
 spv.privateVariableTypes.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.pushConstant.vert.out b/Test/baseResults/spv.pushConstant.vert.out
index 5348edb..888d134 100644
--- a/Test/baseResults/spv.pushConstant.vert.out
+++ b/Test/baseResults/spv.pushConstant.vert.out
@@ -1,6 +1,6 @@
 spv.pushConstant.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               MemberDecorate 11(Material) 0 Offset 0
                               MemberDecorate 11(Material) 1 Offset 4
                               Decorate 11(Material) Block
+                              Decorate 24(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.pushConstantAnon.vert.out b/Test/baseResults/spv.pushConstantAnon.vert.out
index 3932b42..75efdbc 100644
--- a/Test/baseResults/spv.pushConstantAnon.vert.out
+++ b/Test/baseResults/spv.pushConstantAnon.vert.out
@@ -1,6 +1,6 @@
 spv.pushConstantAnon.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
@@ -18,6 +18,7 @@
                               MemberDecorate 11(Material) 0 Offset 0
                               MemberDecorate 11(Material) 1 Offset 4
                               Decorate 11(Material) Block
+                              Decorate 24(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.qualifiers.vert.out b/Test/baseResults/spv.qualifiers.vert.out
index 47f73a0..4180e17 100644
--- a/Test/baseResults/spv.qualifiers.vert.out
+++ b/Test/baseResults/spv.qualifiers.vert.out
@@ -1,6 +1,6 @@
 spv.qualifiers.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
@@ -16,10 +16,16 @@
                               Name 17  "outVn"
                               Name 19  "outVcn"
                               Decorate 9(outVc) Centroid
+                              Decorate 9(outVc) Location 0
+                              Decorate 11(inV) Location 0
+                              Decorate 13(outVs) Location 1
                               Decorate 15(outVf) Flat
+                              Decorate 15(outVf) Location 2
                               Decorate 17(outVn) NoPerspective
+                              Decorate 17(outVn) Location 3
                               Decorate 19(outVcn) NoPerspective
                               Decorate 19(outVcn) Centroid
+                              Decorate 19(outVcn) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.queryL.frag.out b/Test/baseResults/spv.queryL.frag.out
index 97d845a..1e38661 100644
--- a/Test/baseResults/spv.queryL.frag.out
+++ b/Test/baseResults/spv.queryL.frag.out
@@ -1,7 +1,7 @@
 spv.queryL.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 224
 
                               Capability Shader
@@ -44,39 +44,39 @@
                               Decorate 13(samp1D) DescriptorSet 0
                               Decorate 13(samp1D) Binding 0
                               Decorate 23(isamp2D) DescriptorSet 0
-                              Decorate 23(isamp2D) Binding 0
+                              Decorate 23(isamp2D) Binding 1
                               Decorate 34(usamp3D) DescriptorSet 0
-                              Decorate 34(usamp3D) Binding 0
+                              Decorate 34(usamp3D) Binding 4
                               Decorate 46(sampCube) DescriptorSet 0
-                              Decorate 46(sampCube) Binding 0
+                              Decorate 46(sampCube) Binding 5
                               Decorate 55(isamp1DA) DescriptorSet 0
-                              Decorate 55(isamp1DA) Binding 0
+                              Decorate 55(isamp1DA) Binding 7
                               Decorate 64(usamp2DA) DescriptorSet 0
-                              Decorate 64(usamp2DA) Binding 0
+                              Decorate 64(usamp2DA) Binding 9
                               Decorate 73(isampCubeA) DescriptorSet 0
-                              Decorate 73(isampCubeA) Binding 0
+                              Decorate 73(isampCubeA) Binding 10
                               Decorate 82(samp1Ds) DescriptorSet 0
-                              Decorate 82(samp1Ds) Binding 0
+                              Decorate 82(samp1Ds) Binding 12
                               Decorate 91(samp2Ds) DescriptorSet 0
-                              Decorate 91(samp2Ds) Binding 0
+                              Decorate 91(samp2Ds) Binding 13
                               Decorate 100(sampCubes) DescriptorSet 0
-                              Decorate 100(sampCubes) Binding 0
+                              Decorate 100(sampCubes) Binding 14
                               Decorate 109(samp1DAs) DescriptorSet 0
-                              Decorate 109(samp1DAs) Binding 0
+                              Decorate 109(samp1DAs) Binding 15
                               Decorate 118(samp2DAs) DescriptorSet 0
-                              Decorate 118(samp2DAs) Binding 0
+                              Decorate 118(samp2DAs) Binding 16
                               Decorate 127(sampCubeAs) DescriptorSet 0
-                              Decorate 127(sampCubeAs) Binding 0
+                              Decorate 127(sampCubeAs) Binding 17
                               Decorate 141(usamp2D) DescriptorSet 0
-                              Decorate 141(usamp2D) Binding 0
+                              Decorate 141(usamp2D) Binding 2
                               Decorate 150(isamp3D) DescriptorSet 0
-                              Decorate 150(isamp3D) Binding 0
+                              Decorate 150(isamp3D) Binding 3
                               Decorate 159(isampCube) DescriptorSet 0
-                              Decorate 159(isampCube) Binding 0
+                              Decorate 159(isampCube) Binding 6
                               Decorate 173(samp2DA) DescriptorSet 0
-                              Decorate 173(samp2DA) Binding 0
+                              Decorate 173(samp2DA) Binding 8
                               Decorate 182(usampCubeA) DescriptorSet 0
-                              Decorate 182(usampCubeA) Binding 0
+                              Decorate 182(usampCubeA) Binding 11
                               Decorate 219(sampBuf) DescriptorSet 0
                               Decorate 219(sampBuf) Binding 0
                               Decorate 223(sampRect) DescriptorSet 0
diff --git a/Test/baseResults/spv.queueFamilyScope.comp.out b/Test/baseResults/spv.queueFamilyScope.comp.out
new file mode 100644
index 0000000..9c239df
--- /dev/null
+++ b/Test/baseResults/spv.queueFamilyScope.comp.out
@@ -0,0 +1,43 @@
+spv.queueFamilyScope.comp
+// Module Version 10300
+// Generated by (magic number): 8000a
+// Id's are bound by 21
+
+                              Capability Shader
+                              Capability VulkanMemoryModelKHR
+                              Extension  "SPV_KHR_vulkan_memory_model"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical VulkanKHR
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 7  "Buffer"
+                              MemberName 7(Buffer) 0  "a"
+                              Name 9  "A"
+                              MemberDecorate 7(Buffer) 0 Offset 0
+                              Decorate 7(Buffer) Block
+                              Decorate 9(A) DescriptorSet 0
+                              Decorate 9(A) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+       7(Buffer):             TypeStruct 6(int)
+               8:             TypePointer StorageBuffer 7(Buffer)
+            9(A):      8(ptr) Variable StorageBuffer
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+              12:             TypePointer StorageBuffer 6(int)
+              14:     10(int) Constant 5
+              15:     10(int) Constant 64
+              16:     10(int) Constant 2
+              17:      6(int) Constant 1
+              18:      6(int) Constant 0
+              19:      6(int) Constant 66
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9(A) 11
+              20:      6(int) AtomicLoad 13 14 19
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.rankShift.comp.out b/Test/baseResults/spv.rankShift.comp.out
index e0fba77..1a725c1 100644
--- a/Test/baseResults/spv.rankShift.comp.out
+++ b/Test/baseResults/spv.rankShift.comp.out
@@ -1,6 +1,6 @@
 spv.rankShift.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
@@ -16,7 +16,11 @@
                               Name 11  "arg0"
                               Name 15  "arg1"
                               Decorate 11(arg0) Location 4
+                              Decorate 11(arg0) DescriptorSet 0
+                              Decorate 11(arg0) Binding 0
                               Decorate 15(arg1) Location 5
+                              Decorate 15(arg1) DescriptorSet 0
+                              Decorate 15(arg1) Binding 1
                               Decorate 32 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.register.autoassign-2.frag.out b/Test/baseResults/spv.register.autoassign-2.frag.out
index 9fd317e..26b149b 100644
--- a/Test/baseResults/spv.register.autoassign-2.frag.out
+++ b/Test/baseResults/spv.register.autoassign-2.frag.out
@@ -1,6 +1,6 @@
 spv.register.autoassign-2.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 47
 
                               Capability Shader
diff --git a/Test/baseResults/spv.register.autoassign.frag.out b/Test/baseResults/spv.register.autoassign.frag.out
index 74118ef..e347ce2 100644
--- a/Test/baseResults/spv.register.autoassign.frag.out
+++ b/Test/baseResults/spv.register.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.register.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 155
 
                               Capability Shader
diff --git a/Test/baseResults/spv.register.autoassign.rangetest.frag.out b/Test/baseResults/spv.register.autoassign.rangetest.frag.out
index 8eb76c9..4381dab 100644
--- a/Test/baseResults/spv.register.autoassign.rangetest.frag.out
+++ b/Test/baseResults/spv.register.autoassign.rangetest.frag.out
@@ -2,4 +2,85 @@
 INTERNAL ERROR: mapped binding out of range: g_tSamp
 INTERNAL ERROR: mapped binding out of range: g_tScene
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 52
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 49
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 8  "PS_OUTPUT"
+                              MemberName 8(PS_OUTPUT) 0  "Color"
+                              Name 12  "@main(struct-PS_OUTPUT-vf41;"
+                              Name 11  "psout"
+                              Name 21  "g_tScene"
+                              Name 27  "g_tSamp"
+                              Name 44  "psout"
+                              Name 45  "param"
+                              Name 49  "psout.Color"
+                              Decorate 21(g_tScene) DescriptorSet 0
+                              Decorate 21(g_tScene) Binding 5
+                              Decorate 27(g_tSamp) DescriptorSet 0
+                              Decorate 27(g_tSamp) Binding 5
+                              Decorate 49(psout.Color) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(PS_OUTPUT):             TypeStruct 7(fvec4)
+               9:             TypePointer Function 8(PS_OUTPUT)
+              10:             TypeFunction 2 9(ptr)
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypeImage 6(float) 2D sampled format:Unknown
+              17:             TypeInt 32 0
+              18:     17(int) Constant 2
+              19:             TypeArray 16 18
+              20:             TypePointer UniformConstant 19
+    21(g_tScene):     20(ptr) Variable UniformConstant
+              22:             TypePointer UniformConstant 16
+              25:             TypeSampler
+              26:             TypePointer UniformConstant 25
+     27(g_tSamp):     26(ptr) Variable UniformConstant
+              29:             TypeSampledImage 16
+              31:             TypeVector 6(float) 2
+              32:    6(float) Constant 1050253722
+              33:   31(fvec2) ConstantComposite 32 32
+              35:     14(int) Constant 1
+              42:             TypePointer Function 7(fvec4)
+              48:             TypePointer Output 7(fvec4)
+ 49(psout.Color):     48(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+       44(psout):      9(ptr) Variable Function
+       45(param):      9(ptr) Variable Function
+              46:           2 FunctionCall 12(@main(struct-PS_OUTPUT-vf41;) 45(param)
+              47:8(PS_OUTPUT) Load 45(param)
+                              Store 44(psout) 47
+              50:     42(ptr) AccessChain 44(psout) 15
+              51:    7(fvec4) Load 50
+                              Store 49(psout.Color) 51
+                              Return
+                              FunctionEnd
+12(@main(struct-PS_OUTPUT-vf41;):           2 Function None 10
+       11(psout):      9(ptr) FunctionParameter
+              13:             Label
+              23:     22(ptr) AccessChain 21(g_tScene) 15
+              24:          16 Load 23
+              28:          25 Load 27(g_tSamp)
+              30:          29 SampledImage 24 28
+              34:    7(fvec4) ImageSampleImplicitLod 30 33
+              36:     22(ptr) AccessChain 21(g_tScene) 35
+              37:          16 Load 36
+              38:          25 Load 27(g_tSamp)
+              39:          29 SampledImage 37 38
+              40:    7(fvec4) ImageSampleImplicitLod 39 33
+              41:    7(fvec4) FAdd 34 40
+              43:     42(ptr) AccessChain 11(psout) 15
+                              Store 43 41
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.register.noautoassign.frag.out b/Test/baseResults/spv.register.noautoassign.frag.out
index 1292b0b..ed8d507 100644
--- a/Test/baseResults/spv.register.noautoassign.frag.out
+++ b/Test/baseResults/spv.register.noautoassign.frag.out
@@ -1,6 +1,6 @@
 spv.register.noautoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 155
 
                               Capability Shader
diff --git a/Test/baseResults/spv.register.subpass.frag.out b/Test/baseResults/spv.register.subpass.frag.out
index 21f7955..acd447d 100644
--- a/Test/baseResults/spv.register.subpass.frag.out
+++ b/Test/baseResults/spv.register.subpass.frag.out
@@ -1,6 +1,6 @@
 spv.register.subpass.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/spv.rw.autoassign.frag.out b/Test/baseResults/spv.rw.autoassign.frag.out
index a575e78..c696c52 100644
--- a/Test/baseResults/spv.rw.autoassign.frag.out
+++ b/Test/baseResults/spv.rw.autoassign.frag.out
@@ -1,6 +1,7 @@
 spv.rw.autoassign.frag
+Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
diff --git a/Test/baseResults/spv.sample.frag.out b/Test/baseResults/spv.sample.frag.out
index 57fbf31..f43fc98 100644
--- a/Test/baseResults/spv.sample.frag.out
+++ b/Test/baseResults/spv.sample.frag.out
@@ -1,6 +1,6 @@
 spv.sample.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 13
 
                               Capability Shader
diff --git a/Test/baseResults/spv.sampleId.frag.out b/Test/baseResults/spv.sampleId.frag.out
index 1412da2..8f9bc38 100644
--- a/Test/baseResults/spv.sampleId.frag.out
+++ b/Test/baseResults/spv.sampleId.frag.out
@@ -1,6 +1,6 @@
 spv.sampleId.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out b/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
index 2892325..9b401d8 100644
--- a/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
+++ b/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out
@@ -1,6 +1,6 @@
 spv.sampleMaskOverrideCoverage.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
@@ -17,6 +17,7 @@
                               Name 19  "color"
                               Decorate 11(gl_SampleMask) BuiltIn SampleMask
                               Decorate 11(gl_SampleMask) OverrideCoverageNV
+                              Decorate 19(color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.samplePosition.frag.out b/Test/baseResults/spv.samplePosition.frag.out
index b06c768..8012830 100644
--- a/Test/baseResults/spv.samplePosition.frag.out
+++ b/Test/baseResults/spv.samplePosition.frag.out
@@ -1,6 +1,6 @@
 spv.samplePosition.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 30
 
                               Capability Shader
diff --git a/Test/baseResults/spv.samplerlessTextureFunctions.frag.out b/Test/baseResults/spv.samplerlessTextureFunctions.frag.out
index c12201e..c2c431d 100644
--- a/Test/baseResults/spv.samplerlessTextureFunctions.frag.out
+++ b/Test/baseResults/spv.samplerlessTextureFunctions.frag.out
@@ -1,6 +1,6 @@
 spv.samplerlessTextureFunctions.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 51
 
                               Capability Shader
diff --git a/Test/baseResults/spv.scalarlayout.frag.out b/Test/baseResults/spv.scalarlayout.frag.out
index 1b26242..e08721f 100644
--- a/Test/baseResults/spv.scalarlayout.frag.out
+++ b/Test/baseResults/spv.scalarlayout.frag.out
@@ -1,7 +1,6 @@
 spv.scalarlayout.frag
-Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.scalarlayoutfloat16.frag.out b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
index c88fa7f..4f22730 100644
--- a/Test/baseResults/spv.scalarlayoutfloat16.frag.out
+++ b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
@@ -1,7 +1,6 @@
 spv.scalarlayoutfloat16.frag
-Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/spv.separate.frag.out b/Test/baseResults/spv.separate.frag.out
index 690ab2f..d31f897 100644
--- a/Test/baseResults/spv.separate.frag.out
+++ b/Test/baseResults/spv.separate.frag.out
@@ -1,7 +1,7 @@
 spv.separate.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 319
 
                               Capability Shader
@@ -56,15 +56,17 @@
                               Name 283  "tex1D"
                               Name 293  "tex3D"
                               Name 304  "tex2DRect"
+                              Decorate 11(color) Location 0
                               Decorate 14(t2d) DescriptorSet 0
-                              Decorate 14(t2d) Binding 0
+                              Decorate 14(t2d) Binding 2
                               Decorate 18(s) DescriptorSet 0
                               Decorate 18(s) Binding 0
                               Decorate 31(t3d) DescriptorSet 0
-                              Decorate 31(t3d) Binding 0
+                              Decorate 31(t3d) Binding 3
                               Decorate 34(i) Flat
+                              Decorate 34(i) Location 0
                               Decorate 41(sA) DescriptorSet 0
-                              Decorate 41(sA) Binding 0
+                              Decorate 41(sA) Binding 1
                               Decorate 58(tex2D) DescriptorSet 0
                               Decorate 58(tex2D) Binding 0
                               Decorate 64(texCube) DescriptorSet 0
diff --git a/Test/baseResults/spv.set.vert.out b/Test/baseResults/spv.set.vert.out
index fe4326f..245b4bd 100644
--- a/Test/baseResults/spv.set.vert.out
+++ b/Test/baseResults/spv.set.vert.out
@@ -1,6 +1,6 @@
 spv.set.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               MemberName 10(setBuf) 0  "color"
                               Name 12  "setBufInst"
                               Name 21  "samp2D"
+                              Decorate 9(color) Location 0
                               MemberDecorate 10(setBuf) 0 Offset 0
                               Decorate 10(setBuf) BufferBlock
                               Decorate 12(setBufInst) DescriptorSet 0
diff --git a/Test/baseResults/spv.shaderBallot.comp.out b/Test/baseResults/spv.shaderBallot.comp.out
index 3ddee0f..bdbf10f 100644
--- a/Test/baseResults/spv.shaderBallot.comp.out
+++ b/Test/baseResults/spv.shaderBallot.comp.out
@@ -1,6 +1,6 @@
 spv.shaderBallot.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 318
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderBallotAMD.comp.out b/Test/baseResults/spv.shaderBallotAMD.comp.out
index eb8f404..9ea5ba0 100644
--- a/Test/baseResults/spv.shaderBallotAMD.comp.out
+++ b/Test/baseResults/spv.shaderBallotAMD.comp.out
@@ -1,6 +1,6 @@
 spv.shaderBallotAMD.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1343
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderDrawParams.vert.out b/Test/baseResults/spv.shaderDrawParams.vert.out
index ad51de1..5baabbf 100644
--- a/Test/baseResults/spv.shaderDrawParams.vert.out
+++ b/Test/baseResults/spv.shaderDrawParams.vert.out
@@ -1,6 +1,6 @@
 spv.shaderDrawParams.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderFragMaskAMD.frag.out b/Test/baseResults/spv.shaderFragMaskAMD.frag.out
index b1e5c0d..ab48e04 100644
--- a/Test/baseResults/spv.shaderFragMaskAMD.frag.out
+++ b/Test/baseResults/spv.shaderFragMaskAMD.frag.out
@@ -1,6 +1,6 @@
 spv.shaderFragMaskAMD.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 80
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderGroupVote.comp.out b/Test/baseResults/spv.shaderGroupVote.comp.out
index a09e798..4c45e33 100644
--- a/Test/baseResults/spv.shaderGroupVote.comp.out
+++ b/Test/baseResults/spv.shaderGroupVote.comp.out
@@ -1,6 +1,6 @@
 spv.shaderGroupVote.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shaderImageFootprint.frag.out b/Test/baseResults/spv.shaderImageFootprint.frag.out
index 7559564..ea8873c 100644
--- a/Test/baseResults/spv.shaderImageFootprint.frag.out
+++ b/Test/baseResults/spv.shaderImageFootprint.frag.out
@@ -1,6 +1,6 @@
 spv.shaderImageFootprint.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 622
 
                               Capability Shader
@@ -74,7 +74,7 @@
                               MemberDecorate 8(result2D) 5 Offset 36
                               Decorate 8(result2D) BufferBlock
                               Decorate 10 DescriptorSet 0
-                              Decorate 10 Binding 0
+                              Decorate 10 Binding 2
                               Decorate 17(sample2D) DescriptorSet 0
                               Decorate 17(sample2D) Binding 0
                               Decorate 21(P2) Location 0
@@ -93,9 +93,9 @@
                               MemberDecorate 377(result3D) 5 Offset 60
                               Decorate 377(result3D) BufferBlock
                               Decorate 379 DescriptorSet 0
-                              Decorate 379 Binding 0
+                              Decorate 379 Binding 3
                               Decorate 383(sample3D) DescriptorSet 0
-                              Decorate 383(sample3D) Binding 0
+                              Decorate 383(sample3D) Binding 1
                               Decorate 387(P3) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.shaderStencilExport.frag.out b/Test/baseResults/spv.shaderStencilExport.frag.out
index 37fce5f..f73349c 100644
--- a/Test/baseResults/spv.shaderStencilExport.frag.out
+++ b/Test/baseResults/spv.shaderStencilExport.frag.out
@@ -1,6 +1,6 @@
 spv.shaderStencilExport.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 10
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shadingRate.frag.out b/Test/baseResults/spv.shadingRate.frag.out
index ce56113..866ae60 100644
--- a/Test/baseResults/spv.shadingRate.frag.out
+++ b/Test/baseResults/spv.shadingRate.frag.out
@@ -1,6 +1,6 @@
 spv.shadingRate.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 21
 
                               Capability Shader
diff --git a/Test/baseResults/spv.shiftOps.frag.out b/Test/baseResults/spv.shiftOps.frag.out
index 15df236..03f7546 100644
--- a/Test/baseResults/spv.shiftOps.frag.out
+++ b/Test/baseResults/spv.shiftOps.frag.out
@@ -1,6 +1,6 @@
 spv.shiftOps.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 38
 
                               Capability Shader
@@ -16,10 +16,16 @@
                               Name 25  "ucolor"
                               Name 27  "u3"
                               Name 30  "i1"
+                              Decorate 9(icolor) Location 0
                               Decorate 11(i3) Flat
+                              Decorate 11(i3) Location 2
                               Decorate 15(u1) Flat
+                              Decorate 15(u1) Location 1
+                              Decorate 25(ucolor) Location 1
                               Decorate 27(u3) Flat
+                              Decorate 27(u3) Location 3
                               Decorate 30(i1) Flat
+                              Decorate 30(i1) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.shortCircuit.frag.out b/Test/baseResults/spv.shortCircuit.frag.out
index 6104b04..3c706f7 100644
--- a/Test/baseResults/spv.shortCircuit.frag.out
+++ b/Test/baseResults/spv.shortCircuit.frag.out
@@ -1,6 +1,6 @@
 spv.shortCircuit.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 147
 
                               Capability Shader
@@ -21,8 +21,14 @@
                               Name 142  "uv4"
                               Name 145  "ub41"
                               Name 146  "ub42"
+                              Decorate 12(of1) Location 0
+                              Decorate 24(of4) Location 1
                               Decorate 34(ui) Flat
+                              Decorate 34(ui) Location 3
+                              Decorate 113(uf) Location 2
                               Decorate 140(uiv4) Flat
+                              Decorate 140(uiv4) Location 0
+                              Decorate 142(uv4) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
diff --git a/Test/baseResults/spv.simpleFunctionCall.frag.out b/Test/baseResults/spv.simpleFunctionCall.frag.out
index 8e666a6..bda91b7 100644
--- a/Test/baseResults/spv.simpleFunctionCall.frag.out
+++ b/Test/baseResults/spv.simpleFunctionCall.frag.out
@@ -1,6 +1,6 @@
 spv.simpleFunctionCall.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 19
 
                               Capability Shader
@@ -13,6 +13,7 @@
                               Name 9  "foo("
                               Name 12  "BaseColor"
                               Name 17  "gl_FragColor"
+                              Decorate 12(BaseColor) Location 0
                               Decorate 17(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.simpleMat.vert.out b/Test/baseResults/spv.simpleMat.vert.out
index ff51dc0..cc9b2b2 100644
--- a/Test/baseResults/spv.simpleMat.vert.out
+++ b/Test/baseResults/spv.simpleMat.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:3: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
@@ -17,6 +17,12 @@
                               Name 19  "f"
                               Name 23  "am3"
                               Name 34  "arraym"
+                              Decorate 9(glPos) Location 5
+                              Decorate 12(mvp) Location 0
+                              Decorate 15(v) Location 0
+                              Decorate 19(f) Location 4
+                              Decorate 23(am3) Location 1
+                              Decorate 34(arraym) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.smBuiltins.frag.out b/Test/baseResults/spv.smBuiltins.frag.out
index 9f4cc60..3fafa04 100644
--- a/Test/baseResults/spv.smBuiltins.frag.out
+++ b/Test/baseResults/spv.smBuiltins.frag.out
@@ -1,6 +1,6 @@
 spv.smBuiltins.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
diff --git a/Test/baseResults/spv.smBuiltins.vert.out b/Test/baseResults/spv.smBuiltins.vert.out
index 0453b0c..91ad637 100644
--- a/Test/baseResults/spv.smBuiltins.vert.out
+++ b/Test/baseResults/spv.smBuiltins.vert.out
@@ -1,6 +1,6 @@
 spv.smBuiltins.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 29
 
                               Capability Shader
diff --git a/Test/baseResults/spv.sparseTexture.frag.out b/Test/baseResults/spv.sparseTexture.frag.out
index 3414200..0f7c687 100644
--- a/Test/baseResults/spv.sparseTexture.frag.out
+++ b/Test/baseResults/spv.sparseTexture.frag.out
@@ -1,7 +1,7 @@
 spv.sparseTexture.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 438
 
                               Capability Shader
@@ -49,37 +49,44 @@
                               Name 423  "outColor"
                               Decorate 29(s2D) DescriptorSet 0
                               Decorate 29(s2D) Binding 0
+                              Decorate 33(c2) Location 0
                               Decorate 44(s3D) DescriptorSet 0
-                              Decorate 44(s3D) Binding 0
+                              Decorate 44(s3D) Binding 1
+                              Decorate 48(c3) Location 1
                               Decorate 59(isCube) DescriptorSet 0
-                              Decorate 59(isCube) Binding 0
+                              Decorate 59(isCube) Binding 8
                               Decorate 71(s2DShadow) DescriptorSet 0
-                              Decorate 71(s2DShadow) Binding 0
+                              Decorate 71(s2DShadow) Binding 2
                               Decorate 86(sCubeArrayShadow) DescriptorSet 0
-                              Decorate 86(sCubeArrayShadow) Binding 0
+                              Decorate 86(sCubeArrayShadow) Binding 6
+                              Decorate 89(c4) Location 2
                               Decorate 108(usCubeArray) DescriptorSet 0
-                              Decorate 108(usCubeArray) Binding 0
+                              Decorate 108(usCubeArray) Binding 10
                               Decorate 140(us2DRect) DescriptorSet 0
-                              Decorate 140(us2DRect) Binding 0
+                              Decorate 140(us2DRect) Binding 11
                               Decorate 154(s2DArrayShadow) DescriptorSet 0
-                              Decorate 154(s2DArrayShadow) Binding 0
+                              Decorate 154(s2DArrayShadow) Binding 4
                               Decorate 188(s2DMS) DescriptorSet 0
-                              Decorate 188(s2DMS) Binding 0
+                              Decorate 188(s2DMS) Binding 7
                               Decorate 228(is2DArray) DescriptorSet 0
-                              Decorate 228(is2DArray) Binding 0
+                              Decorate 228(is2DArray) Binding 9
                               Decorate 261(sCubeShadow) DescriptorSet 0
-                              Decorate 261(sCubeShadow) Binding 0
+                              Decorate 261(sCubeShadow) Binding 3
                               Decorate 294(s2DRectShadow) DescriptorSet 0
-                              Decorate 294(s2DRectShadow) Binding 0
+                              Decorate 294(s2DRectShadow) Binding 5
                               Decorate 365(offsets) Flat
+                              Decorate 365(offsets) Location 5
                               Decorate 390(i2D) DescriptorSet 0
-                              Decorate 390(i2D) Binding 0
+                              Decorate 390(i2D) Binding 12
                               Decorate 393(ic2) Flat
+                              Decorate 393(ic2) Location 3
                               Decorate 402(ii3D) DescriptorSet 0
-                              Decorate 402(ii3D) Binding 0
+                              Decorate 402(ii3D) Binding 13
                               Decorate 405(ic3) Flat
+                              Decorate 405(ic3) Location 4
                               Decorate 414(i2DMS) DescriptorSet 0
-                              Decorate 414(i2DMS) Binding 0
+                              Decorate 414(i2DMS) Binding 14
+                              Decorate 423(outColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.sparseTextureClamp.frag.out b/Test/baseResults/spv.sparseTextureClamp.frag.out
index fedd64a..f42326d 100644
--- a/Test/baseResults/spv.sparseTextureClamp.frag.out
+++ b/Test/baseResults/spv.sparseTextureClamp.frag.out
@@ -1,7 +1,7 @@
 spv.sparseTextureClamp.frag
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 360
 
                               Capability Shader
@@ -42,26 +42,31 @@
                               Name 345  "outColor"
                               Decorate 29(s2D) DescriptorSet 0
                               Decorate 29(s2D) Binding 0
+                              Decorate 33(c2) Location 0
+                              Decorate 36(lodClamp) Location 3
                               Decorate 47(s3D) DescriptorSet 0
-                              Decorate 47(s3D) Binding 0
+                              Decorate 47(s3D) Binding 1
+                              Decorate 51(c3) Location 1
                               Decorate 63(isCube) DescriptorSet 0
-                              Decorate 63(isCube) Binding 0
+                              Decorate 63(isCube) Binding 7
                               Decorate 76(s2DShadow) DescriptorSet 0
-                              Decorate 76(s2DShadow) Binding 0
+                              Decorate 76(s2DShadow) Binding 2
                               Decorate 92(sCubeArrayShadow) DescriptorSet 0
-                              Decorate 92(sCubeArrayShadow) Binding 0
+                              Decorate 92(sCubeArrayShadow) Binding 6
+                              Decorate 95(c4) Location 2
                               Decorate 154(us2DRect) DescriptorSet 0
-                              Decorate 154(us2DRect) Binding 0
+                              Decorate 154(us2DRect) Binding 10
                               Decorate 170(s2DArrayShadow) DescriptorSet 0
-                              Decorate 170(s2DArrayShadow) Binding 0
+                              Decorate 170(s2DArrayShadow) Binding 4
                               Decorate 218(sCubeShadow) DescriptorSet 0
-                              Decorate 218(sCubeShadow) Binding 0
+                              Decorate 218(sCubeShadow) Binding 3
                               Decorate 235(usCubeArray) DescriptorSet 0
-                              Decorate 235(usCubeArray) Binding 0
+                              Decorate 235(usCubeArray) Binding 9
                               Decorate 286(s2DRectShadow) DescriptorSet 0
-                              Decorate 286(s2DRectShadow) Binding 0
+                              Decorate 286(s2DRectShadow) Binding 5
                               Decorate 305(is2DArray) DescriptorSet 0
-                              Decorate 305(is2DArray) Binding 0
+                              Decorate 305(is2DArray) Binding 8
+                              Decorate 345(outColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.specConst.vert.out b/Test/baseResults/spv.specConst.vert.out
index 116c136..a510dc9 100644
--- a/Test/baseResults/spv.specConst.vert.out
+++ b/Test/baseResults/spv.specConst.vert.out
@@ -1,6 +1,6 @@
 spv.specConst.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.specConstArrayCheck.vert.out b/Test/baseResults/spv.specConstArrayCheck.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.specConstant.comp.out b/Test/baseResults/spv.specConstant.comp.out
index e0ad699..a4e769f 100644
--- a/Test/baseResults/spv.specConstant.comp.out
+++ b/Test/baseResults/spv.specConstant.comp.out
@@ -1,6 +1,6 @@
 spv.specConstant.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
diff --git a/Test/baseResults/spv.specConstant.float16.comp.out b/Test/baseResults/spv.specConstant.float16.comp.out
new file mode 100644
index 0000000..be02057
--- /dev/null
+++ b/Test/baseResults/spv.specConstant.float16.comp.out
@@ -0,0 +1,51 @@
+spv.specConstant.float16.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability Float16
+                              Capability StorageUniformBufferBlock16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_float16"
+                              Name 4  "main"
+                              Name 7  "Output"
+                              MemberName 7(Output) 0  "r0"
+                              MemberName 7(Output) 1  "r1"
+                              Name 9  "sb_out"
+                              Name 12  "sc0"
+                              Name 16  "sc1"
+                              MemberDecorate 7(Output) 0 NonReadable
+                              MemberDecorate 7(Output) 0 Offset 0
+                              MemberDecorate 7(Output) 1 NonReadable
+                              MemberDecorate 7(Output) 1 Offset 2
+                              Decorate 7(Output) BufferBlock
+                              Decorate 9(sb_out) DescriptorSet 0
+                              Decorate 9(sb_out) Binding 0
+                              Decorate 12(sc0) SpecId 1
+                              Decorate 16(sc1) SpecId 2
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+       7(Output):             TypeStruct 6(float16_t) 6(float16_t)
+               8:             TypePointer Uniform 7(Output)
+       9(sb_out):      8(ptr) Variable Uniform
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+         12(sc0):6(float16_t) SpecConstant 18624
+              13:             TypePointer Uniform 6(float16_t)
+              15:     10(int) Constant 1
+         16(sc1):6(float16_t) SpecConstant 52000
+         4(main):           2 Function None 3
+               5:             Label
+              14:     13(ptr) AccessChain 9(sb_out) 11
+                              Store 14 12(sc0)
+              17:     13(ptr) AccessChain 9(sb_out) 15
+                              Store 17 16(sc1)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.specConstant.int16.comp.out b/Test/baseResults/spv.specConstant.int16.comp.out
new file mode 100644
index 0000000..7bb4c8f
--- /dev/null
+++ b/Test/baseResults/spv.specConstant.int16.comp.out
@@ -0,0 +1,51 @@
+spv.specConstant.int16.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability Int16
+                              Capability StorageUniformBufferBlock16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int16"
+                              Name 4  "main"
+                              Name 7  "Output"
+                              MemberName 7(Output) 0  "r0"
+                              MemberName 7(Output) 1  "r1"
+                              Name 9  "sb_out"
+                              Name 12  "sc0"
+                              Name 16  "sc1"
+                              MemberDecorate 7(Output) 0 NonReadable
+                              MemberDecorate 7(Output) 0 Offset 0
+                              MemberDecorate 7(Output) 1 NonReadable
+                              MemberDecorate 7(Output) 1 Offset 2
+                              Decorate 7(Output) BufferBlock
+                              Decorate 9(sb_out) DescriptorSet 0
+                              Decorate 9(sb_out) Binding 0
+                              Decorate 12(sc0) SpecId 1
+                              Decorate 16(sc1) SpecId 2
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 16 1
+       7(Output):             TypeStruct 6(int16_t) 6(int16_t)
+               8:             TypePointer Uniform 7(Output)
+       9(sb_out):      8(ptr) Variable Uniform
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+         12(sc0):  6(int16_t) SpecConstant 20000
+              13:             TypePointer Uniform 6(int16_t)
+              15:     10(int) Constant 1
+         16(sc1):  6(int16_t) SpecConstant 4294947296
+         4(main):           2 Function None 3
+               5:             Label
+              14:     13(ptr) AccessChain 9(sb_out) 11
+                              Store 14 12(sc0)
+              17:     13(ptr) AccessChain 9(sb_out) 15
+                              Store 17 16(sc1)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.specConstant.int8.comp.out b/Test/baseResults/spv.specConstant.int8.comp.out
new file mode 100644
index 0000000..0ab3bdc
--- /dev/null
+++ b/Test/baseResults/spv.specConstant.int8.comp.out
@@ -0,0 +1,51 @@
+spv.specConstant.int8.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability Int8
+                              Capability UniformAndStorageBuffer8BitAccess
+                              Extension  "SPV_KHR_8bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int8"
+                              Name 4  "main"
+                              Name 7  "Output"
+                              MemberName 7(Output) 0  "r0"
+                              MemberName 7(Output) 1  "r1"
+                              Name 9  "sb_out"
+                              Name 12  "sc0"
+                              Name 16  "sc1"
+                              MemberDecorate 7(Output) 0 NonReadable
+                              MemberDecorate 7(Output) 0 Offset 0
+                              MemberDecorate 7(Output) 1 NonReadable
+                              MemberDecorate 7(Output) 1 Offset 1
+                              Decorate 7(Output) BufferBlock
+                              Decorate 9(sb_out) DescriptorSet 0
+                              Decorate 9(sb_out) Binding 0
+                              Decorate 12(sc0) SpecId 1
+                              Decorate 16(sc1) SpecId 2
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 8 1
+       7(Output):             TypeStruct 6(int8_t) 6(int8_t)
+               8:             TypePointer Uniform 7(Output)
+       9(sb_out):      8(ptr) Variable Uniform
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+         12(sc0):   6(int8_t) SpecConstant 127
+              13:             TypePointer Uniform 6(int8_t)
+              15:     10(int) Constant 1
+         16(sc1):   6(int8_t) SpecConstant 4294967169
+         4(main):           2 Function None 3
+               5:             Label
+              14:     13(ptr) AccessChain 9(sb_out) 11
+                              Store 14 12(sc0)
+              17:     13(ptr) AccessChain 9(sb_out) 15
+                              Store 17 16(sc1)
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out
index 206e30a..76f3de6 100644
--- a/Test/baseResults/spv.specConstant.vert.out
+++ b/Test/baseResults/spv.specConstant.vert.out
@@ -1,6 +1,6 @@
 spv.specConstant.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 81
 
                               Capability Shader
@@ -11,7 +11,7 @@
                               Source GLSL 400
                               Name 4  "main"
                               Name 9  "arraySize"
-                              Name 14  "foo(vf4[s4546];"
+                              Name 14  "foo(vf4[s805310914];"
                               Name 13  "p"
                               Name 17  "builtin_spec_constant("
                               Name 20  "color"
@@ -31,11 +31,15 @@
                               Name 76  "result"
                               Name 77  "gl_MaxImageUnits"
                               Decorate 9(arraySize) SpecId 16
+                              Decorate 20(color) Location 0
+                              Decorate 22(ucol) Location 0
+                              Decorate 28(size) Location 1
                               Decorate 30(spBool) SpecId 17
                               Decorate 34(scale) SpecId 22
                               Decorate 39(spDouble) SpecId 19
                               Decorate 40(spFloat) SpecId 18
                               Decorate 50(dupArraySize) SpecId 116
+                              Decorate 53(dupUcol) Location 5
                               Decorate 60(spDupBool) SpecId 117
                               Decorate 63(dupScale) SpecId 122
                               Decorate 67(spDupDouble) SpecId 119
@@ -102,10 +106,10 @@
                               Store 20(color) 46
               48:          10 Load 22(ucol)
                               Store 47(param) 48
-              49:           2 FunctionCall 14(foo(vf4[s4546];) 47(param)
+              49:           2 FunctionCall 14(foo(vf4[s805310914];) 47(param)
                               Return
                               FunctionEnd
-14(foo(vf4[s4546];):           2 Function None 12
+14(foo(vf4[s805310914];):           2 Function None 12
            13(p):     11(ptr) FunctionParameter
               15:             Label
               54:     24(ptr) AccessChain 53(dupUcol) 23
diff --git a/Test/baseResults/spv.specConstantComposite.vert.out b/Test/baseResults/spv.specConstantComposite.vert.out
index 20a071b..15777d8 100644
--- a/Test/baseResults/spv.specConstantComposite.vert.out
+++ b/Test/baseResults/spv.specConstantComposite.vert.out
@@ -1,6 +1,6 @@
 spv.specConstantComposite.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
@@ -24,9 +24,11 @@
                               Name 39  "spec_double"
                               Name 42  "global_vec4_array_with_spec_length"
                               Decorate 21(spec_bool) SpecId 203
+                              Decorate 27(color) Location 0
                               Decorate 28(spec_int) SpecId 200
                               Decorate 37(spec_float) SpecId 201
                               Decorate 39(spec_double) SpecId 202
+                              Decorate 42(global_vec4_array_with_spec_length) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 32 1
diff --git a/Test/baseResults/spv.specConstantOperations.vert.out b/Test/baseResults/spv.specConstantOperations.vert.out
index 747d50b..5366460 100644
--- a/Test/baseResults/spv.specConstantOperations.vert.out
+++ b/Test/baseResults/spv.specConstantOperations.vert.out
@@ -1,6 +1,6 @@
 spv.specConstantOperations.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 162
 
                               Capability Shader
diff --git a/Test/baseResults/spv.specTexture.frag.out b/Test/baseResults/spv.specTexture.frag.out
old mode 100755
new mode 100644
index a4cf47d..4ca488e
--- a/Test/baseResults/spv.specTexture.frag.out
+++ b/Test/baseResults/spv.specTexture.frag.out
@@ -1,6 +1,6 @@
 spv.specTexture.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 23
 
                               Capability Shader
@@ -14,6 +14,7 @@
                               Name 13  "tex"
                               Name 19  "offs"
                               Decorate 9(color_out) Location 0
+                              Decorate 13(tex) Location 0
                               Decorate 13(tex) DescriptorSet 0
                               Decorate 13(tex) Binding 0
                               Decorate 19(offs) SpecId 1
diff --git a/Test/baseResults/spv.ssbo.autoassign.frag.out b/Test/baseResults/spv.ssbo.autoassign.frag.out
index 7d64847..e2db863 100644
--- a/Test/baseResults/spv.ssbo.autoassign.frag.out
+++ b/Test/baseResults/spv.ssbo.autoassign.frag.out
@@ -1,6 +1,6 @@
 spv.ssbo.autoassign.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 99
 
                               Capability Shader
diff --git a/Test/baseResults/spv.ssboAlias.frag.out b/Test/baseResults/spv.ssboAlias.frag.out
index 1711d9d..cdcd222 100644
--- a/Test/baseResults/spv.ssboAlias.frag.out
+++ b/Test/baseResults/spv.ssboAlias.frag.out
@@ -1,6 +1,6 @@
 spv.ssboAlias.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 44
 
                               Capability Shader
diff --git a/Test/baseResults/spv.stereoViewRendering.tesc.out b/Test/baseResults/spv.stereoViewRendering.tesc.out
index 2cab064..f01e53b 100644
--- a/Test/baseResults/spv.stereoViewRendering.tesc.out
+++ b/Test/baseResults/spv.stereoViewRendering.tesc.out
@@ -1,9 +1,8 @@
 spv.stereoViewRendering.tesc
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
-                              Capability Geometry
                               Capability Tessellation
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
diff --git a/Test/baseResults/spv.stereoViewRendering.vert.out b/Test/baseResults/spv.stereoViewRendering.vert.out
index acb8338..e74921a 100644
--- a/Test/baseResults/spv.stereoViewRendering.vert.out
+++ b/Test/baseResults/spv.stereoViewRendering.vert.out
@@ -1,10 +1,9 @@
 spv.stereoViewRendering.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 27
 
                               Capability Shader
-                              Capability Geometry
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Capability ShaderStereoViewNV
diff --git a/Test/baseResults/spv.storageBuffer.vert.out b/Test/baseResults/spv.storageBuffer.vert.out
index 79cf9f1..2411d2f 100644
--- a/Test/baseResults/spv.storageBuffer.vert.out
+++ b/Test/baseResults/spv.storageBuffer.vert.out
@@ -1,6 +1,6 @@
 spv.storageBuffer.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
@@ -34,7 +34,7 @@
                               MemberDecorate 22(bb) 0 Offset 0
                               Decorate 22(bb) Block
                               Decorate 24(bbi) DescriptorSet 0
-                              Decorate 24(bbi) Binding 0
+                              Decorate 24(bbi) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.structAssignment.frag.out b/Test/baseResults/spv.structAssignment.frag.out
index d61c0e4..8e82cac 100644
--- a/Test/baseResults/spv.structAssignment.frag.out
+++ b/Test/baseResults/spv.structAssignment.frag.out
@@ -3,7 +3,7 @@
          "precision mediump int; precision highp float;" 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
@@ -40,6 +40,7 @@
                               Decorate 40(samp2D) DescriptorSet 0
                               Decorate 40(samp2D) Binding 0
                               Decorate 44(coord) RelaxedPrecision
+                              Decorate 44(coord) Location 0
                               Decorate 45 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.structDeref.frag.out b/Test/baseResults/spv.structDeref.frag.out
index 2a114d7..94fc4e2 100644
--- a/Test/baseResults/spv.structDeref.frag.out
+++ b/Test/baseResults/spv.structDeref.frag.out
@@ -1,6 +1,6 @@
 spv.structDeref.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 123
 
                               Capability Shader
@@ -40,6 +40,7 @@
                               Name 99  "gl_FragColor"
                               Name 116  "samp2D"
                               Name 122  "foo2"
+                              Decorate 61(coord) Location 0
                               Decorate 99(gl_FragColor) Location 0
                               Decorate 116(samp2D) DescriptorSet 0
                               Decorate 116(samp2D) Binding 0
diff --git a/Test/baseResults/spv.structure.frag.out b/Test/baseResults/spv.structure.frag.out
index e8f8b39..00fed0e 100644
--- a/Test/baseResults/spv.structure.frag.out
+++ b/Test/baseResults/spv.structure.frag.out
@@ -1,6 +1,6 @@
 spv.structure.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 60
 
                               Capability Shader
@@ -27,6 +27,7 @@
                               Decorate 45(gl_FragColor) Location 0
                               Decorate 50(samp2D) DescriptorSet 0
                               Decorate 50(samp2D) Binding 0
+                              Decorate 54(coord) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.subgroup.frag.out b/Test/baseResults/spv.subgroup.frag.out
index ee932bf..ad11586 100644
--- a/Test/baseResults/spv.subgroup.frag.out
+++ b/Test/baseResults/spv.subgroup.frag.out
@@ -1,6 +1,6 @@
 spv.subgroup.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 17
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroup.geom.out b/Test/baseResults/spv.subgroup.geom.out
index 279e646..c866f8e 100644
--- a/Test/baseResults/spv.subgroup.geom.out
+++ b/Test/baseResults/spv.subgroup.geom.out
@@ -1,6 +1,6 @@
 spv.subgroup.geom
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Geometry
diff --git a/Test/baseResults/spv.subgroup.tesc.out b/Test/baseResults/spv.subgroup.tesc.out
index bc55b4e..ed6b5c1 100644
--- a/Test/baseResults/spv.subgroup.tesc.out
+++ b/Test/baseResults/spv.subgroup.tesc.out
@@ -1,6 +1,6 @@
 spv.subgroup.tesc
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.subgroup.tese.out b/Test/baseResults/spv.subgroup.tese.out
index 6b0a5ce..70cdc96 100644
--- a/Test/baseResults/spv.subgroup.tese.out
+++ b/Test/baseResults/spv.subgroup.tese.out
@@ -1,6 +1,6 @@
 spv.subgroup.tese
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Tessellation
diff --git a/Test/baseResults/spv.subgroup.vert.out b/Test/baseResults/spv.subgroup.vert.out
index 6deaf55..34b090d 100644
--- a/Test/baseResults/spv.subgroup.vert.out
+++ b/Test/baseResults/spv.subgroup.vert.out
@@ -1,6 +1,6 @@
 spv.subgroup.vert
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 26
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupArithmetic.comp.out b/Test/baseResults/spv.subgroupArithmetic.comp.out
index 29ea9ec..e531f6f 100644
--- a/Test/baseResults/spv.subgroupArithmetic.comp.out
+++ b/Test/baseResults/spv.subgroupArithmetic.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupArithmetic.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 2085
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupBallot.comp.out b/Test/baseResults/spv.subgroupBallot.comp.out
index 9fe1964..0e83773 100644
--- a/Test/baseResults/spv.subgroupBallot.comp.out
+++ b/Test/baseResults/spv.subgroupBallot.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupBallot.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 397
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupBasic.comp.out b/Test/baseResults/spv.subgroupBasic.comp.out
index 2f6571b..fb9fa0c 100644
--- a/Test/baseResults/spv.subgroupBasic.comp.out
+++ b/Test/baseResults/spv.subgroupBasic.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupBasic.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupClustered.comp.out b/Test/baseResults/spv.subgroupClustered.comp.out
index 3971281..297fcec 100644
--- a/Test/baseResults/spv.subgroupClustered.comp.out
+++ b/Test/baseResults/spv.subgroupClustered.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupClustered.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 737
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out b/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
index 263f48d..1406bd1 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesArithmetic.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 3665
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out b/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
index 9f6a8c0..f503f8c 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesBallot.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 441
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out b/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
index af3385e..2f4393a 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesClustered.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1273
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out b/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
index 9de4b98..ccfbacc 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesPartitioned.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 1558
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out b/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
index ebd6132..beec1ac 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesQuad.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 806
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out b/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
index f241389..b798bae 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesShuffle.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 497
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out b/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
index 06150b0..d847be5 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesShuffleRelative.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 497
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupExtendedTypesVote.comp.out b/Test/baseResults/spv.subgroupExtendedTypesVote.comp.out
index 63cc844..6fde1f9 100644
--- a/Test/baseResults/spv.subgroupExtendedTypesVote.comp.out
+++ b/Test/baseResults/spv.subgroupExtendedTypesVote.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupExtendedTypesVote.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 277
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupPartitioned.comp.out b/Test/baseResults/spv.subgroupPartitioned.comp.out
index e16e309..7c7a0f9 100644
--- a/Test/baseResults/spv.subgroupPartitioned.comp.out
+++ b/Test/baseResults/spv.subgroupPartitioned.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupPartitioned.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 2506
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupQuad.comp.out b/Test/baseResults/spv.subgroupQuad.comp.out
index 1c5e963..644fa72 100644
--- a/Test/baseResults/spv.subgroupQuad.comp.out
+++ b/Test/baseResults/spv.subgroupQuad.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupQuad.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 616
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupShuffle.comp.out b/Test/baseResults/spv.subgroupShuffle.comp.out
index 532b0d2..b160c5f 100644
--- a/Test/baseResults/spv.subgroupShuffle.comp.out
+++ b/Test/baseResults/spv.subgroupShuffle.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupShuffle.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 379
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupShuffleRelative.comp.out b/Test/baseResults/spv.subgroupShuffleRelative.comp.out
index ae5589a..68cd101 100644
--- a/Test/baseResults/spv.subgroupShuffleRelative.comp.out
+++ b/Test/baseResults/spv.subgroupShuffleRelative.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupShuffleRelative.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 379
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subgroupVote.comp.out b/Test/baseResults/spv.subgroupVote.comp.out
index 6f6f8cf..ad8ffaa 100644
--- a/Test/baseResults/spv.subgroupVote.comp.out
+++ b/Test/baseResults/spv.subgroupVote.comp.out
@@ -1,6 +1,6 @@
 spv.subgroupVote.comp
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 216
 
                               Capability Shader
diff --git a/Test/baseResults/spv.subpass.frag.out b/Test/baseResults/spv.subpass.frag.out
index 4bc556a..6b534a6 100644
--- a/Test/baseResults/spv.subpass.frag.out
+++ b/Test/baseResults/spv.subpass.frag.out
@@ -1,6 +1,6 @@
 spv.subpass.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 67
 
                               Capability Shader
@@ -22,23 +22,26 @@
                               Name 53  "ucolor"
                               Name 56  "usub"
                               Name 61  "usubMS"
+                              Decorate 15(icolor) Location 1
+                              Decorate 27(color) Location 0
                               Decorate 30(sub) DescriptorSet 0
                               Decorate 30(sub) Binding 0
                               Decorate 30(sub) InputAttachmentIndex 1
                               Decorate 35(subMS) DescriptorSet 0
-                              Decorate 35(subMS) Binding 0
+                              Decorate 35(subMS) Binding 1
                               Decorate 35(subMS) InputAttachmentIndex 2
                               Decorate 42(isub) DescriptorSet 0
-                              Decorate 42(isub) Binding 0
+                              Decorate 42(isub) Binding 2
                               Decorate 42(isub) InputAttachmentIndex 3
                               Decorate 45(isubMS) DescriptorSet 0
-                              Decorate 45(isubMS) Binding 0
+                              Decorate 45(isubMS) Binding 3
                               Decorate 45(isubMS) InputAttachmentIndex 4
+                              Decorate 53(ucolor) Location 2
                               Decorate 56(usub) DescriptorSet 0
-                              Decorate 56(usub) Binding 0
+                              Decorate 56(usub) Binding 4
                               Decorate 56(usub) InputAttachmentIndex 5
                               Decorate 61(usubMS) DescriptorSet 0
-                              Decorate 61(usubMS) Binding 0
+                              Decorate 61(usubMS) Binding 5
                               Decorate 61(usubMS) InputAttachmentIndex 6
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.switch.frag.out b/Test/baseResults/spv.switch.frag.out
index 729257c..9c68657 100644
--- a/Test/baseResults/spv.switch.frag.out
+++ b/Test/baseResults/spv.switch.frag.out
@@ -4,7 +4,7 @@
 WARNING: 0:139: 'switch' : last case/default label not followed by statements 
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 269
 
                               Capability Shader
@@ -60,12 +60,14 @@
                               Decorate 60(local) RelaxedPrecision
                               Decorate 62(c) RelaxedPrecision
                               Decorate 62(c) Flat
+                              Decorate 62(c) Location 0
                               Decorate 63 RelaxedPrecision
                               Decorate 64 RelaxedPrecision
                               Decorate 66 RelaxedPrecision
                               Decorate 67 RelaxedPrecision
                               Decorate 73(f) RelaxedPrecision
                               Decorate 75(x) RelaxedPrecision
+                              Decorate 75(x) Location 2
                               Decorate 76 RelaxedPrecision
                               Decorate 77 RelaxedPrecision
                               Decorate 79 RelaxedPrecision
@@ -101,6 +103,7 @@
                               Decorate 127 RelaxedPrecision
                               Decorate 129(d) RelaxedPrecision
                               Decorate 129(d) Flat
+                              Decorate 129(d) Location 1
                               Decorate 130 RelaxedPrecision
                               Decorate 134 RelaxedPrecision
                               Decorate 135 RelaxedPrecision
@@ -149,20 +152,28 @@
                               Decorate 221 RelaxedPrecision
                               Decorate 222 RelaxedPrecision
                               Decorate 227(color) RelaxedPrecision
+                              Decorate 227(color) Location 0
                               Decorate 228 RelaxedPrecision
                               Decorate 229 RelaxedPrecision
                               Decorate 230 RelaxedPrecision
                               Decorate 231 RelaxedPrecision
                               Decorate 233(v) RelaxedPrecision
+                              Decorate 233(v) Location 3
+                              Decorate 234(param) RelaxedPrecision
                               Decorate 235 RelaxedPrecision
+                              Decorate 236(param) RelaxedPrecision
                               Decorate 237 RelaxedPrecision
+                              Decorate 238(param) RelaxedPrecision
                               Decorate 239 RelaxedPrecision
                               Decorate 240 RelaxedPrecision
                               Decorate 243 RelaxedPrecision
                               Decorate 244 RelaxedPrecision
                               Decorate 245 RelaxedPrecision
+                              Decorate 246(param) RelaxedPrecision
                               Decorate 247 RelaxedPrecision
+                              Decorate 248(param) RelaxedPrecision
                               Decorate 249 RelaxedPrecision
+                              Decorate 250(param) RelaxedPrecision
                               Decorate 251 RelaxedPrecision
                               Decorate 252 RelaxedPrecision
                               Decorate 254 RelaxedPrecision
diff --git a/Test/baseResults/spv.swizzle.frag.out b/Test/baseResults/spv.swizzle.frag.out
index 9b31a26..7e42c3e 100644
--- a/Test/baseResults/spv.swizzle.frag.out
+++ b/Test/baseResults/spv.swizzle.frag.out
@@ -1,6 +1,6 @@
 spv.swizzle.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 108
 
                               Capability Shader
@@ -24,7 +24,10 @@
                               Name 81  "c"
                               Name 83  "rep"
                               Name 107  "blend"
+                              Decorate 14(u) Location 1
+                              Decorate 30(t) Location 2
                               Decorate 69(gl_FragColor) Location 0
+                              Decorate 107(blend) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.swizzleInversion.frag.out b/Test/baseResults/spv.swizzleInversion.frag.out
index 7964360..8d09934 100644
--- a/Test/baseResults/spv.swizzleInversion.frag.out
+++ b/Test/baseResults/spv.swizzleInversion.frag.out
@@ -1,6 +1,6 @@
 spv.swizzleInversion.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 46
 
                               Capability Shader
@@ -20,6 +20,8 @@
                               Name 37  "in3"
                               Name 40  "v32"
                               Name 43  "v31"
+                              Decorate 12(in4) Location 0
+                              Decorate 37(in3) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.terminate.frag.out b/Test/baseResults/spv.terminate.frag.out
new file mode 100755
index 0000000..39cb151
--- /dev/null
+++ b/Test/baseResults/spv.terminate.frag.out
@@ -0,0 +1,20 @@
+spv.terminate.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 7
+
+                              Capability Shader
+                              Extension  "SPV_KHR_terminate_invocation"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 400
+                              SourceExtension  "GL_EXT_terminate_invocation"
+                              Name 4  "main"
+               2:             TypeVoid
+               3:             TypeFunction 2
+         4(main):           2 Function None 3
+               5:             Label
+                              TerminateInvocation
+                              FunctionEnd
diff --git a/Test/baseResults/spv.test.frag.out b/Test/baseResults/spv.test.frag.out
index db77cbb..fddcdb8 100644
--- a/Test/baseResults/spv.test.frag.out
+++ b/Test/baseResults/spv.test.frag.out
@@ -1,6 +1,6 @@
 spv.test.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 55
 
                               Capability Shader
@@ -23,9 +23,14 @@
                               Name 49  "blend"
                               Decorate 16(texSampler2D) DescriptorSet 0
                               Decorate 16(texSampler2D) Binding 0
+                              Decorate 20(t) Location 3
+                              Decorate 22(scale) Location 1
                               Decorate 33(texSampler3D) DescriptorSet 0
-                              Decorate 33(texSampler3D) Binding 0
+                              Decorate 33(texSampler3D) Binding 1
+                              Decorate 37(coords) Location 4
                               Decorate 43(gl_FragColor) Location 0
+                              Decorate 46(u) Location 2
+                              Decorate 49(blend) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.test.vert.out b/Test/baseResults/spv.test.vert.out
index 3b06c66..3eb6435 100644
--- a/Test/baseResults/spv.test.vert.out
+++ b/Test/baseResults/spv.test.vert.out
@@ -2,7 +2,7 @@
 WARNING: 0:5: attribute deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 24
 
                               Capability Shader
@@ -16,7 +16,11 @@
                               Name 15  "gl_Position"
                               Name 18  "transform"
                               Name 21  "position"
+                              Decorate 9(uv) Location 0
+                              Decorate 11(uv_in) Location 5
                               Decorate 15(gl_Position) BuiltIn Position
+                              Decorate 18(transform) Location 0
+                              Decorate 21(position) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.texture.frag.out b/Test/baseResults/spv.texture.frag.out
index 3ea7338..841bbd3 100644
--- a/Test/baseResults/spv.texture.frag.out
+++ b/Test/baseResults/spv.texture.frag.out
@@ -4,7 +4,7 @@
 WARNING: 0:12: varying deprecated in version 130; may be removed in future release
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 305
 
                               Capability Shader
@@ -41,17 +41,22 @@
                               Name 304  "t"
                               Decorate 32(texSampler1D) DescriptorSet 0
                               Decorate 32(texSampler1D) Binding 0
+                              Decorate 47(coords2D) Location 4
                               Decorate 76(texSampler2D) DescriptorSet 0
-                              Decorate 76(texSampler2D) Binding 0
+                              Decorate 76(texSampler2D) Binding 1
                               Decorate 104(texSampler3D) DescriptorSet 0
-                              Decorate 104(texSampler3D) Binding 0
+                              Decorate 104(texSampler3D) Binding 2
                               Decorate 130(texSamplerCube) DescriptorSet 0
-                              Decorate 130(texSamplerCube) Binding 0
+                              Decorate 130(texSamplerCube) Binding 3
                               Decorate 145(shadowSampler1D) DescriptorSet 0
-                              Decorate 145(shadowSampler1D) Binding 0
+                              Decorate 145(shadowSampler1D) Binding 4
                               Decorate 164(shadowSampler2D) DescriptorSet 0
-                              Decorate 164(shadowSampler2D) Binding 0
+                              Decorate 164(shadowSampler2D) Binding 5
                               Decorate 291(gl_FragColor) Location 0
+                              Decorate 294(u) Location 2
+                              Decorate 297(blend) Location 0
+                              Decorate 303(scale) Location 1
+                              Decorate 304(t) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.texture.sampler.transform.frag.out b/Test/baseResults/spv.texture.sampler.transform.frag.out
index f2306e7..a297ea7 100644
--- a/Test/baseResults/spv.texture.sampler.transform.frag.out
+++ b/Test/baseResults/spv.texture.sampler.transform.frag.out
@@ -1,6 +1,6 @@
 spv.texture.sampler.transform.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 20
 
                               Capability Shader
@@ -13,8 +13,10 @@
                               Name 9  "color"
                               Name 13  "tex"
                               Name 17  "coord"
+                              Decorate 9(color) Location 0
                               Decorate 13(tex) DescriptorSet 0
                               Decorate 13(tex) Binding 0
+                              Decorate 17(coord) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.texture.vert.out b/Test/baseResults/spv.texture.vert.out
index 3f9336b..544a0f3 100644
--- a/Test/baseResults/spv.texture.vert.out
+++ b/Test/baseResults/spv.texture.vert.out
@@ -1,6 +1,6 @@
 spv.texture.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 150
 
                               Capability Shader
@@ -25,16 +25,17 @@
                               Name 148  "gl_Position"
                               Decorate 29(texSampler1D) DescriptorSet 0
                               Decorate 29(texSampler1D) Binding 0
+                              Decorate 39(coords2D) Location 0
                               Decorate 56(texSampler2D) DescriptorSet 0
-                              Decorate 56(texSampler2D) Binding 0
+                              Decorate 56(texSampler2D) Binding 1
                               Decorate 80(texSampler3D) DescriptorSet 0
-                              Decorate 80(texSampler3D) Binding 0
+                              Decorate 80(texSampler3D) Binding 2
                               Decorate 96(texSamplerCube) DescriptorSet 0
-                              Decorate 96(texSamplerCube) Binding 0
+                              Decorate 96(texSamplerCube) Binding 3
                               Decorate 106(shadowSampler1D) DescriptorSet 0
-                              Decorate 106(shadowSampler1D) Binding 0
+                              Decorate 106(shadowSampler1D) Binding 4
                               Decorate 118(shadowSampler2D) DescriptorSet 0
-                              Decorate 118(shadowSampler2D) Binding 0
+                              Decorate 118(shadowSampler2D) Binding 5
                               Decorate 148(gl_Position) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.textureBuffer.vert.out b/Test/baseResults/spv.textureBuffer.vert.out
index 4631290..d18c656 100644
--- a/Test/baseResults/spv.textureBuffer.vert.out
+++ b/Test/baseResults/spv.textureBuffer.vert.out
@@ -1,6 +1,6 @@
 spv.textureBuffer.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 42
 
                               Capability Shader
@@ -18,13 +18,13 @@
                               Decorate 9(tBuf) DescriptorSet 0
                               Decorate 9(tBuf) Binding 0
                               Decorate 13(s) DescriptorSet 0
-                              Decorate 13(s) Binding 0
+                              Decorate 13(s) Binding 1
                               Decorate 23(sBuf) DescriptorSet 0
-                              Decorate 23(sBuf) Binding 0
+                              Decorate 23(sBuf) Binding 2
                               Decorate 32(utBuf) DescriptorSet 0
-                              Decorate 32(utBuf) Binding 0
+                              Decorate 32(utBuf) Binding 3
                               Decorate 38(itBuf) DescriptorSet 0
-                              Decorate 38(itBuf) Binding 0
+                              Decorate 38(itBuf) Binding 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.textureGatherBiasLod.frag.out b/Test/baseResults/spv.textureGatherBiasLod.frag.out
index aada70d..3a9bb80 100644
--- a/Test/baseResults/spv.textureGatherBiasLod.frag.out
+++ b/Test/baseResults/spv.textureGatherBiasLod.frag.out
@@ -1,7 +1,6 @@
 spv.textureGatherBiasLod.frag
-Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 298
 
                               Capability Shader
@@ -33,12 +32,18 @@
                               Name 296  "fragColor"
                               Decorate 16(s2D) DescriptorSet 0
                               Decorate 16(s2D) Binding 0
+                              Decorate 20(c2) Location 0
+                              Decorate 25(bias) Location 4
                               Decorate 33(s2DArray) DescriptorSet 0
-                              Decorate 33(s2DArray) Binding 0
+                              Decorate 33(s2DArray) Binding 1
+                              Decorate 37(c3) Location 1
                               Decorate 47(sCube) DescriptorSet 0
-                              Decorate 47(sCube) Binding 0
+                              Decorate 47(sCube) Binding 2
                               Decorate 58(sCubeArray) DescriptorSet 0
-                              Decorate 58(sCubeArray) Binding 0
+                              Decorate 58(sCubeArray) Binding 3
+                              Decorate 61(c4) Location 2
+                              Decorate 176(lod) Location 3
+                              Decorate 296(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.types.frag.out b/Test/baseResults/spv.types.frag.out
index 3f7fd12..3e35da2 100644
--- a/Test/baseResults/spv.types.frag.out
+++ b/Test/baseResults/spv.types.frag.out
@@ -1,6 +1,6 @@
 spv.types.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 260
 
                               Capability Shader
@@ -48,13 +48,29 @@
                               Name 161  "i_f4"
                               Name 165  "gl_FragColor"
                               Decorate 96(u_i) Flat
+                              Decorate 96(u_i) Location 0
                               Decorate 98(i_i) Flat
+                              Decorate 98(i_i) Location 8
                               Decorate 105(u_i2) Flat
+                              Decorate 105(u_i2) Location 1
                               Decorate 107(i_i2) Flat
+                              Decorate 107(i_i2) Location 9
                               Decorate 114(u_i3) Flat
+                              Decorate 114(u_i3) Location 2
                               Decorate 116(i_i3) Flat
+                              Decorate 116(i_i3) Location 10
                               Decorate 123(u_i4) Flat
+                              Decorate 123(u_i4) Location 3
                               Decorate 125(i_i4) Flat
+                              Decorate 125(i_i4) Location 11
+                              Decorate 132(u_f) Location 4
+                              Decorate 134(i_f) Location 12
+                              Decorate 141(u_f2) Location 5
+                              Decorate 143(i_f2) Location 13
+                              Decorate 150(u_f3) Location 6
+                              Decorate 152(i_f3) Location 14
+                              Decorate 159(u_f4) Location 7
+                              Decorate 161(i_f4) Location 15
                               Decorate 165(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.uint.frag.out b/Test/baseResults/spv.uint.frag.out
index 612b323..c19064d 100644
--- a/Test/baseResults/spv.uint.frag.out
+++ b/Test/baseResults/spv.uint.frag.out
@@ -1,6 +1,6 @@
 spv.uint.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 213
 
                               Capability Shader
@@ -35,6 +35,7 @@
                               Decorate 12(u) RelaxedPrecision
                               Decorate 15(t) RelaxedPrecision
                               Decorate 15(t) Flat
+                              Decorate 15(t) Location 0
                               Decorate 19 RelaxedPrecision
                               Decorate 21 RelaxedPrecision
                               Decorate 27 RelaxedPrecision
@@ -56,11 +57,13 @@
                               Decorate 61 RelaxedPrecision
                               Decorate 62 RelaxedPrecision
                               Decorate 68(c) RelaxedPrecision
+                              Decorate 68(c) Location 0
                               Decorate 72(usampler) RelaxedPrecision
                               Decorate 72(usampler) DescriptorSet 0
                               Decorate 72(usampler) Binding 0
                               Decorate 73 RelaxedPrecision
                               Decorate 77(tc) RelaxedPrecision
+                              Decorate 77(tc) Location 2
                               Decorate 78 RelaxedPrecision
                               Decorate 79 RelaxedPrecision
                               Decorate 80 RelaxedPrecision
@@ -136,10 +139,13 @@
                               Decorate 202 RelaxedPrecision
                               Decorate 203 RelaxedPrecision
                               Decorate 206(f) RelaxedPrecision
+                              Decorate 206(f) Location 1
                               Decorate 208(v) RelaxedPrecision
                               Decorate 208(v) Flat
+                              Decorate 208(v) Location 3
                               Decorate 210(i) RelaxedPrecision
                               Decorate 210(i) Flat
+                              Decorate 210(i) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.uniformArray.frag.out b/Test/baseResults/spv.uniformArray.frag.out
index 339d1de..8134383 100644
--- a/Test/baseResults/spv.uniformArray.frag.out
+++ b/Test/baseResults/spv.uniformArray.frag.out
@@ -1,6 +1,6 @@
 spv.uniformArray.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 53
 
                               Capability Shader
@@ -16,6 +16,9 @@
                               Name 35  "alpha"
                               Name 47  "gl_FragColor"
                               Name 52  "texSampler2D"
+                              Decorate 14(color) Location 1
+                              Decorate 25(inColor) Location 0
+                              Decorate 35(alpha) Location 7
                               Decorate 47(gl_FragColor) Location 0
                               Decorate 52(texSampler2D) DescriptorSet 0
                               Decorate 52(texSampler2D) Binding 0
diff --git a/Test/baseResults/spv.uniformInitializer.frag.out b/Test/baseResults/spv.uniformInitializer.frag.out
new file mode 100644
index 0000000..63595ae
--- /dev/null
+++ b/Test/baseResults/spv.uniformInitializer.frag.out
@@ -0,0 +1,35 @@
+spv.uniformInitializer.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 16
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 14  "in_color"
+                              Decorate 9(color) Location 0
+                              Decorate 14(in_color) Location 0
+                              Decorate 14(in_color) DescriptorSet 0
+                              Decorate 14(in_color) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    6(float) Constant 1065353216
+              12:    7(fvec4) ConstantComposite 10 11 10 11
+              13:             TypePointer UniformConstant 7(fvec4)
+    14(in_color):     13(ptr) Variable UniformConstant 12
+         4(main):           2 Function None 3
+               5:             Label
+              15:    7(fvec4) Load 14(in_color)
+                              Store 9(color) 15
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.uniformInitializerSpecConstant.frag.out b/Test/baseResults/spv.uniformInitializerSpecConstant.frag.out
new file mode 100644
index 0000000..1cd053c
--- /dev/null
+++ b/Test/baseResults/spv.uniformInitializerSpecConstant.frag.out
@@ -0,0 +1,6 @@
+spv.uniformInitializerSpecConstant.frag
+ERROR: 0:9: '=' : uniform initializers must be constant 'layout( location=4) uniform float'
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.uniformInitializerStruct.frag.out b/Test/baseResults/spv.uniformInitializerStruct.frag.out
new file mode 100644
index 0000000..5ce854d
--- /dev/null
+++ b/Test/baseResults/spv.uniformInitializerStruct.frag.out
@@ -0,0 +1,98 @@
+spv.uniformInitializerStruct.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 63
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 15  "i"
+                              Name 26  ""
+                              MemberName 26 0  "r"
+                              MemberName 26 1  "g"
+                              MemberName 26 2  "b"
+                              Name 34  "parts"
+                              Decorate 9(color) Location 0
+                              Decorate 34(parts) Location 0
+                              Decorate 34(parts) DescriptorSet 0
+                              Decorate 34(parts) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    6(float) Constant 1065353216
+              12:    7(fvec4) ConstantComposite 10 10 10 11
+              13:             TypeInt 32 1
+              14:             TypePointer Function 13(int)
+              16:     13(int) Constant 0
+              23:     13(int) Constant 2
+              24:             TypeBool
+              26:             TypeStruct 6(float) 6(float) 6(float)
+              27:             TypeInt 32 0
+              28:     27(int) Constant 2
+              29:             TypeArray 26(struct) 28
+              30:  26(struct) ConstantComposite 11 11 11
+              31:  26(struct) ConstantComposite 10 11 10
+              32:          29 ConstantComposite 30 31
+              33:             TypePointer UniformConstant 29
+       34(parts):     33(ptr) Variable UniformConstant 32
+              36:             TypePointer UniformConstant 6(float)
+              39:     27(int) Constant 0
+              40:             TypePointer Output 6(float)
+              46:     13(int) Constant 1
+              49:     27(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+           15(i):     14(ptr) Variable Function
+                              Store 9(color) 12
+                              Store 15(i) 16
+                              Branch 17
+              17:             Label
+                              LoopMerge 19 20 None
+                              Branch 21
+              21:             Label
+              22:     13(int) Load 15(i)
+              25:    24(bool) SLessThan 22 23
+                              BranchConditional 25 18 19
+              18:               Label
+              35:     13(int)   Load 15(i)
+              37:     36(ptr)   AccessChain 34(parts) 35 16
+              38:    6(float)   Load 37
+              41:     40(ptr)   AccessChain 9(color) 39
+              42:    6(float)   Load 41
+              43:    6(float)   FAdd 42 38
+              44:     40(ptr)   AccessChain 9(color) 39
+                                Store 44 43
+              45:     13(int)   Load 15(i)
+              47:     36(ptr)   AccessChain 34(parts) 45 46
+              48:    6(float)   Load 47
+              50:     40(ptr)   AccessChain 9(color) 49
+              51:    6(float)   Load 50
+              52:    6(float)   FAdd 51 48
+              53:     40(ptr)   AccessChain 9(color) 49
+                                Store 53 52
+              54:     13(int)   Load 15(i)
+              55:     36(ptr)   AccessChain 34(parts) 54 23
+              56:    6(float)   Load 55
+              57:     40(ptr)   AccessChain 9(color) 28
+              58:    6(float)   Load 57
+              59:    6(float)   FAdd 58 56
+              60:     40(ptr)   AccessChain 9(color) 28
+                                Store 60 59
+                                Branch 20
+              20:               Label
+              61:     13(int)   Load 15(i)
+              62:     13(int)   IAdd 61 46
+                                Store 15(i) 62
+                                Branch 17
+              19:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.unit1.frag.out b/Test/baseResults/spv.unit1.frag.out
index b2ec724..02ddfec 100644
--- a/Test/baseResults/spv.unit1.frag.out
+++ b/Test/baseResults/spv.unit1.frag.out
@@ -193,7 +193,7 @@
 0:?     'h3' ( global highp float)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 69
 
                               Capability Shader
@@ -217,6 +217,8 @@
                               Name 67  "a1"
                               Name 68  "a2"
                               Decorate 25(gl_FragCoord) BuiltIn FragCoord
+                              Decorate 37(cin) Location 0
+                              Decorate 57(cout) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.variableArrayIndex.frag.out b/Test/baseResults/spv.variableArrayIndex.frag.out
index cc6d96b..ee57d43 100644
--- a/Test/baseResults/spv.variableArrayIndex.frag.out
+++ b/Test/baseResults/spv.variableArrayIndex.frag.out
@@ -1,6 +1,6 @@
 spv.variableArrayIndex.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 93
 
                               Capability Shader
@@ -33,12 +33,17 @@
                               Name 63  "coord"
                               Name 69  "constructed"
                               Decorate 10(Count) Flat
+                              Decorate 10(Count) Location 39
                               Decorate 20(foo3) Flat
+                              Decorate 20(foo3) Location 23
                               Decorate 34(foo2) Flat
+                              Decorate 34(foo2) Location 3
                               Decorate 36(foo) Flat
+                              Decorate 36(foo) Location 1
                               Decorate 54(gl_FragColor) Location 0
                               Decorate 59(samp2D) DescriptorSet 0
                               Decorate 59(samp2D) Binding 0
+                              Decorate 63(coord) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
diff --git a/Test/baseResults/spv.varyingArray.frag.out b/Test/baseResults/spv.varyingArray.frag.out
index d5a59ae..1e6334a 100644
--- a/Test/baseResults/spv.varyingArray.frag.out
+++ b/Test/baseResults/spv.varyingArray.frag.out
@@ -1,6 +1,6 @@
 spv.varyingArray.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 61
 
                               Capability Shader
@@ -19,7 +19,11 @@
                               Name 48  "foo"
                               Decorate 13(texSampler2D) DescriptorSet 0
                               Decorate 13(texSampler2D) Binding 0
+                              Decorate 19(TexCoord) Location 2
+                              Decorate 34(color) Location 0
+                              Decorate 39(alpha) Location 1
                               Decorate 45(gl_FragColor) Location 0
+                              Decorate 48(foo) Location 8
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.varyingArrayIndirect.frag.out b/Test/baseResults/spv.varyingArrayIndirect.frag.out
index 799def9..ac9d192 100644
--- a/Test/baseResults/spv.varyingArrayIndirect.frag.out
+++ b/Test/baseResults/spv.varyingArrayIndirect.frag.out
@@ -1,6 +1,6 @@
 spv.varyingArrayIndirect.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 70
 
                               Capability Shader
@@ -21,8 +21,14 @@
                               Name 56  "gl_FragColor"
                               Decorate 13(texSampler2D) DescriptorSet 0
                               Decorate 13(texSampler2D) Binding 0
+                              Decorate 19(userIn) Location 8
                               Decorate 22(b) Flat
+                              Decorate 22(b) Location 11
+                              Decorate 30(TexCoord) Location 2
                               Decorate 31(a) Flat
+                              Decorate 31(a) Location 10
+                              Decorate 45(color) Location 0
+                              Decorate 50(alpha) Location 1
                               Decorate 56(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.vecMatConstruct.frag.out b/Test/baseResults/spv.vecMatConstruct.frag.out
index 004b2bc..bfe5ae7 100644
--- a/Test/baseResults/spv.vecMatConstruct.frag.out
+++ b/Test/baseResults/spv.vecMatConstruct.frag.out
@@ -1,6 +1,6 @@
 spv.vecMatConstruct.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 62
 
                               Capability Shader
diff --git a/Test/baseResults/spv.viewportArray2.tesc.out b/Test/baseResults/spv.viewportArray2.tesc.out
index 78ee00d..74235a5 100644
--- a/Test/baseResults/spv.viewportArray2.tesc.out
+++ b/Test/baseResults/spv.viewportArray2.tesc.out
@@ -1,12 +1,10 @@
 spv.viewportArray2.tesc
 Validation failed
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 25
 
-                              Capability Geometry
                               Capability Tessellation
-                              Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Extension  "SPV_EXT_shader_viewport_index_layer"
diff --git a/Test/baseResults/spv.viewportArray2.vert.out b/Test/baseResults/spv.viewportArray2.vert.out
index 6d419a6..cf29cd7 100644
--- a/Test/baseResults/spv.viewportArray2.vert.out
+++ b/Test/baseResults/spv.viewportArray2.vert.out
@@ -1,11 +1,9 @@
 spv.viewportArray2.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 19
 
                               Capability Shader
-                              Capability Geometry
-                              Capability MultiViewport
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Extension  "SPV_EXT_shader_viewport_index_layer"
diff --git a/Test/baseResults/spv.viewportindex.tese.out b/Test/baseResults/spv.viewportindex.tese.out
new file mode 100644
index 0000000..12a30cf
--- /dev/null
+++ b/Test/baseResults/spv.viewportindex.tese.out
@@ -0,0 +1,30 @@
+spv.viewportindex.tese
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 10
+
+                              Capability Tessellation
+                              Capability ShaderViewportIndexLayerNV
+                              Extension  "SPV_EXT_shader_viewport_index_layer"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationEvaluation 4  "main" 8
+                              ExecutionMode 4 Triangles
+                              ExecutionMode 4 SpacingEqual
+                              ExecutionMode 4 VertexOrderCcw
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_viewport_layer_array"
+                              Name 4  "main"
+                              Name 8  "gl_ViewportIndex"
+                              Decorate 8(gl_ViewportIndex) BuiltIn ViewportIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+8(gl_ViewportIndex):      7(ptr) Variable Output
+               9:      6(int) Constant 1
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 8(gl_ViewportIndex) 9
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.voidFunction.frag.out b/Test/baseResults/spv.voidFunction.frag.out
index 804b32c..c77285b 100644
--- a/Test/baseResults/spv.voidFunction.frag.out
+++ b/Test/baseResults/spv.voidFunction.frag.out
@@ -1,6 +1,6 @@
 spv.voidFunction.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 43
 
                               Capability Shader
@@ -18,7 +18,10 @@
                               Name 37  "gl_FragColor"
                               Name 40  "BaseColor"
                               Name 42  "d"
+                              Decorate 24(bigColor) Location 0
                               Decorate 37(gl_FragColor) Location 0
+                              Decorate 40(BaseColor) Location 1
+                              Decorate 42(d) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
diff --git a/Test/baseResults/spv.volatileAtomic.comp.out b/Test/baseResults/spv.volatileAtomic.comp.out
index 8326374..0364d90 100644
--- a/Test/baseResults/spv.volatileAtomic.comp.out
+++ b/Test/baseResults/spv.volatileAtomic.comp.out
@@ -1,6 +1,6 @@
 spv.volatileAtomic.comp
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 18
 
                               Capability Shader
diff --git a/Test/baseResults/spv.vulkan110.int16.frag.out b/Test/baseResults/spv.vulkan110.int16.frag.out
index b94593c..39b36cb 100644
--- a/Test/baseResults/spv.vulkan110.int16.frag.out
+++ b/Test/baseResults/spv.vulkan110.int16.frag.out
@@ -1,6 +1,6 @@
 spv.vulkan110.int16.frag
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 523
 
                               Capability Shader
diff --git a/Test/baseResults/spv.vulkan110.storageBuffer.vert.out b/Test/baseResults/spv.vulkan110.storageBuffer.vert.out
index 7592cf7..0774960 100644
--- a/Test/baseResults/spv.vulkan110.storageBuffer.vert.out
+++ b/Test/baseResults/spv.vulkan110.storageBuffer.vert.out
@@ -1,6 +1,6 @@
 spv.vulkan110.storageBuffer.vert
 // Module Version 10300
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 31
 
                               Capability Shader
@@ -33,7 +33,7 @@
                               MemberDecorate 22(bb) 0 Offset 0
                               Decorate 22(bb) Block
                               Decorate 24(bbi) DescriptorSet 0
-                              Decorate 24(bbi) Binding 0
+                              Decorate 24(bbi) Binding 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.while-continue-break.vert.out b/Test/baseResults/spv.while-continue-break.vert.out
index 132f503..246e5fd 100644
--- a/Test/baseResults/spv.while-continue-break.vert.out
+++ b/Test/baseResults/spv.while-continue-break.vert.out
@@ -1,6 +1,6 @@
 spv.while-continue-break.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 41
 
                               Capability Shader
diff --git a/Test/baseResults/spv.while-simple.vert.out b/Test/baseResults/spv.while-simple.vert.out
index ea9a980..894dea1 100644
--- a/Test/baseResults/spv.while-simple.vert.out
+++ b/Test/baseResults/spv.while-simple.vert.out
@@ -1,6 +1,6 @@
 spv.while-simple.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 22
 
                               Capability Shader
diff --git a/Test/baseResults/spv.whileLoop.frag.out b/Test/baseResults/spv.whileLoop.frag.out
index 67d44f4..6155f7b 100644
--- a/Test/baseResults/spv.whileLoop.frag.out
+++ b/Test/baseResults/spv.whileLoop.frag.out
@@ -1,6 +1,6 @@
 spv.whileLoop.frag
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
@@ -15,6 +15,9 @@
                               Name 24  "d"
                               Name 28  "bigColor"
                               Name 33  "gl_FragColor"
+                              Decorate 11(BaseColor) Location 1
+                              Decorate 24(d) Location 2
+                              Decorate 28(bigColor) Location 0
                               Decorate 33(gl_FragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.xfb.vert.out b/Test/baseResults/spv.xfb.vert.out
index 7eb38b3..3fdc60b 100644
--- a/Test/baseResults/spv.xfb.vert.out
+++ b/Test/baseResults/spv.xfb.vert.out
@@ -1,6 +1,6 @@
 spv.xfb.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 16
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfb2.vert.out b/Test/baseResults/spv.xfb2.vert.out
index 0f593da..cbb8fc6 100644
--- a/Test/baseResults/spv.xfb2.vert.out
+++ b/Test/baseResults/spv.xfb2.vert.out
@@ -1,6 +1,6 @@
 spv.xfb2.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfb3.vert.out b/Test/baseResults/spv.xfb3.vert.out
index 77894b4..ef53b9a 100644
--- a/Test/baseResults/spv.xfb3.vert.out
+++ b/Test/baseResults/spv.xfb3.vert.out
@@ -1,6 +1,6 @@
 spv.xfb3.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 35
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out b/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out
index 52ce965..e2c6093 100644
--- a/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out
+++ b/Test/baseResults/spv.xfbOffsetOnBlockMembersAssignment.vert.out
@@ -1,6 +1,6 @@
 spv.xfbOffsetOnBlockMembersAssignment.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out b/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out
index 13be843..499ac8c 100644
--- a/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out
+++ b/Test/baseResults/spv.xfbOffsetOnStructMembersAssignment.vert.out
@@ -1,6 +1,6 @@
 spv.xfbOffsetOnStructMembersAssignment.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 40
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out b/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out
index 7159f4a..f7476c7 100644
--- a/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out
+++ b/Test/baseResults/spv.xfbOverlapOffsetCheckWithBlockAndMember.vert.out
@@ -1,6 +1,6 @@
 spv.xfbOverlapOffsetCheckWithBlockAndMember.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 39
 
                               Capability Shader
diff --git a/Test/baseResults/spv.xfbStrideJustOnce.vert.out b/Test/baseResults/spv.xfbStrideJustOnce.vert.out
index 270d17a..bbd7768 100644
--- a/Test/baseResults/spv.xfbStrideJustOnce.vert.out
+++ b/Test/baseResults/spv.xfbStrideJustOnce.vert.out
@@ -1,6 +1,6 @@
 spv.xfbStrideJustOnce.vert
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 33
 
                               Capability Shader
diff --git a/Test/baseResults/terminate.frag.out b/Test/baseResults/terminate.frag.out
new file mode 100755
index 0000000..4f72c9b
--- /dev/null
+++ b/Test/baseResults/terminate.frag.out
@@ -0,0 +1,24 @@
+terminate.frag
+ERROR: 0:3: 'terminateInvocation' : undeclared identifier 
+ERROR: 0:9: '' :  syntax error, unexpected TERMINATE_INVOCATION, expecting COMMA or SEMICOLON
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:3  Function Definition: foo( ( global void)
+0:3    Function Parameters: 
+0:3    Sequence
+0:3      'terminateInvocation' ( temp float)
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
diff --git a/Test/baseResults/terminate.vert.out b/Test/baseResults/terminate.vert.out
new file mode 100755
index 0000000..cd984af
--- /dev/null
+++ b/Test/baseResults/terminate.vert.out
@@ -0,0 +1,36 @@
+terminate.vert
+ERROR: 0:3: 'terminateInvocation' : undeclared identifier 
+ERROR: 0:9: 'terminateInvocation' : not supported in this stage: vertex
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:3  Function Definition: foo( ( global void)
+0:3    Function Parameters: 
+0:3    Sequence
+0:3      'terminateInvocation' ( temp float)
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Branch: TerminateInvocation
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 400
+Requested GL_EXT_terminate_invocation
+ERROR: node is still EOpNull!
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Branch: TerminateInvocation
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/baseResults/tokenPaste.vert.out b/Test/baseResults/tokenPaste.vert.out
index b5ba9a5..5ae1f75 100644
--- a/Test/baseResults/tokenPaste.vert.out
+++ b/Test/baseResults/tokenPaste.vert.out
@@ -3,11 +3,11 @@
 ERROR: 0:40: '##' : unexpected location; end of replacement list 
 ERROR: 0:49: '##' : combined tokens are too long 
 ERROR: 0:52: '##' : not supported for these tokens 
-ERROR: 0:69: '##' : combined token is invalid 
-ERROR: 0:82: 'macro expansion' : Too few args in Macro rec
-ERROR: 0:82: '##' : unexpected location 
-ERROR: 0:82: '##' : unexpected location 
-ERROR: 0:86: '##' : unexpected location; end of argument 
+ERROR: 0:81: '##' : combined token is invalid 
+ERROR: 0:94: 'macro expansion' : Too few args in Macro rec
+ERROR: 0:94: '##' : unexpected location 
+ERROR: 0:94: '##' : unexpected location 
+ERROR: 0:98: '##' : unexpected location; end of argument 
 ERROR: 9 compilation errors.  No code generated.
 
 
@@ -18,35 +18,35 @@
 0:52      'a' ( global int)
 0:52      Constant:
 0:52        11 (const int)
-0:58  Sequence
-0:58    move second child to first child ( temp int)
-0:58      'cop' ( global int)
-0:58      Constant:
-0:58        160 (const int)
-0:59  Sequence
-0:59    move second child to first child ( temp bool)
-0:59      'dop' ( global bool)
-0:59      Constant:
-0:59        true (const bool)
-0:63  Function Definition: ShouldntExpandToThis( ( global void)
-0:63    Function Parameters: 
-0:65    Sequence
-0:65      Sequence
-0:65        move second child to first child ( temp int)
-0:65          'e' ( temp int)
-0:65          Constant:
-0:65            16 (const int)
-0:66      right shift second child into first child ( temp int)
-0:66        'e' ( temp int)
-0:66        Constant:
-0:66          2 (const int)
-0:69      Sequence
-0:69        move second child to first child ( temp bool)
-0:69          'f' ( temp bool)
-0:69          Compare Greater Than ( temp bool)
-0:69            'e' ( temp int)
-0:69            Constant:
-0:69              5 (const int)
+0:70  Sequence
+0:70    move second child to first child ( temp int)
+0:70      'cop' ( global int)
+0:70      Constant:
+0:70        160 (const int)
+0:71  Sequence
+0:71    move second child to first child ( temp bool)
+0:71      'dop' ( global bool)
+0:71      Constant:
+0:71        true (const bool)
+0:75  Function Definition: ShouldntExpandToThis( ( global void)
+0:75    Function Parameters: 
+0:77    Sequence
+0:77      Sequence
+0:77        move second child to first child ( temp int)
+0:77          'e' ( temp int)
+0:77          Constant:
+0:77            16 (const int)
+0:78      right shift second child into first child ( temp int)
+0:78        'e' ( temp int)
+0:78        Constant:
+0:78          2 (const int)
+0:81      Sequence
+0:81        move second child to first child ( temp bool)
+0:81          'f' ( temp bool)
+0:81          Compare Greater Than ( temp bool)
+0:81            'e' ( temp int)
+0:81            Constant:
+0:81              5 (const int)
 0:?   Linker Objects
 0:?     'SecondExpansion' ( global int)
 0:?     'PostPasteExpansion' ( global int)
@@ -60,6 +60,8 @@
 0:?     'foo875' ( uniform float)
 0:?     'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' ( global float)
 0:?     'a' ( global int)
+0:?     'seahorse_var' ( uniform float)
+0:?     'sealion_var' ( uniform float)
 0:?     'aop' ( const int)
 0:?       10 (const int)
 0:?     'bop' ( const int)
@@ -83,16 +85,16 @@
 0:52      'a' ( global int)
 0:52      Constant:
 0:52        11 (const int)
-0:58  Sequence
-0:58    move second child to first child ( temp int)
-0:58      'cop' ( global int)
-0:58      Constant:
-0:58        160 (const int)
-0:59  Sequence
-0:59    move second child to first child ( temp bool)
-0:59      'dop' ( global bool)
-0:59      Constant:
-0:59        true (const bool)
+0:70  Sequence
+0:70    move second child to first child ( temp int)
+0:70      'cop' ( global int)
+0:70      Constant:
+0:70        160 (const int)
+0:71  Sequence
+0:71    move second child to first child ( temp bool)
+0:71      'dop' ( global bool)
+0:71      Constant:
+0:71        true (const bool)
 0:?   Linker Objects
 0:?     'SecondExpansion' ( global int)
 0:?     'PostPasteExpansion' ( global int)
@@ -106,6 +108,8 @@
 0:?     'foo875' ( uniform float)
 0:?     'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' ( global float)
 0:?     'a' ( global int)
+0:?     'seahorse_var' ( uniform float)
+0:?     'sealion_var' ( uniform float)
 0:?     'aop' ( const int)
 0:?       10 (const int)
 0:?     'bop' ( const int)
diff --git a/Test/baseResults/versionsErrors.frag.out b/Test/baseResults/versionsErrors.frag.out
index b072669..dbeb941 100644
--- a/Test/baseResults/versionsErrors.frag.out
+++ b/Test/baseResults/versionsErrors.frag.out
@@ -7,7 +7,6 @@
 
 
 Shader version: 110
-Requested GL_ARB_texture_rectangle
 ERROR: node is still EOpNull!
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
@@ -28,7 +27,6 @@
 
 
 Shader version: 110
-Requested GL_ARB_texture_rectangle
 ERROR: node is still EOpNull!
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
diff --git a/Test/baseResults/vulkan.ast.vert.out b/Test/baseResults/vulkan.ast.vert.out
index 2bf2065..d19c963 100644
--- a/Test/baseResults/vulkan.ast.vert.out
+++ b/Test/baseResults/vulkan.ast.vert.out
@@ -258,7 +258,7 @@
 0:?       2 (const int)
 
 // Module Version 10000
-// Generated by (magic number): 80008
+// Generated by (magic number): 8000a
 // Id's are bound by 50
 
                               Capability Shader
@@ -306,7 +306,7 @@
               48:             TypeArray 44(fvec2) 41
          4(main):           2 Function None 3
                5:             Label
-              10:     8(bool) FOrdNotEqual 7(scf1) 9
+              10:     8(bool) FUnordNotEqual 7(scf1) 9
               18:    6(float) Select 11(scbt) 17 9
               19:    6(float) ConvertSToF 13(sci2)
               20:     12(int) ConvertFToS 7(scf1)
@@ -315,7 +315,7 @@
               28:    6(float) FAdd 7(scf1) 27
               29:    6(float) FNegate 7(scf1)
               32:     8(bool) FOrdGreaterThan 7(scf1) 7(scf1)
-              34:     8(bool) FOrdNotEqual 7(scf1) 7(scf1)
+              34:     8(bool) FUnordNotEqual 7(scf1) 7(scf1)
               43:          42 CompositeConstruct 39 40
               45:   44(fvec2) CompositeConstruct 7(scf1) 7(scf1)
               46:   44(fvec2) CompositeConstruct 7(scf1) 7(scf1)
diff --git a/Test/baseResults/vulkan.comp.out b/Test/baseResults/vulkan.comp.out
index e56dca4..3edb619 100644
--- a/Test/baseResults/vulkan.comp.out
+++ b/Test/baseResults/vulkan.comp.out
@@ -1,6 +1,17 @@
 vulkan.comp
 ERROR: 0:5: 'local_size' : cannot change previously set size 
-ERROR: 1 compilation errors.  No code generated.
+ERROR: 0:10: 'empty { } initializer' : not supported for this version or the enabled extensions 
+ERROR: 0:15: 'empty { } initializer' : not supported for this version or the enabled extensions 
+ERROR: 0:15: 'initialization with shared qualifier' : not supported for this version or the enabled extensions 
+ERROR: 0:16: 'empty { } initializer' : not supported for this version or the enabled extensions 
+ERROR: 0:26: '{}' : null initializers can't size unsized arrays 
+ERROR: 0:31: 'structure' : non-uniform struct contains a sampler or image: sampVar
+ERROR: 0:31: '{}' : null initializers can't be used on opaque values 
+ERROR: 0:33: 'atomic counter types' : not allowed when using GLSL for Vulkan 
+ERROR: 0:33: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: a
+ERROR: 0:33: '{}' : null initializers can't be used on opaque values 
+ERROR: 0:33: 'atomic_uint' : layout(binding=X) is required 
+ERROR: 12 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/web.operations.frag.out b/Test/baseResults/web.operations.frag.out
index d7e4d6e..b08480f 100644
--- a/Test/baseResults/web.operations.frag.out
+++ b/Test/baseResults/web.operations.frag.out
@@ -205,21 +205,21 @@
          %70 = OpLoad %mat4v4float %m4
          %72 = OpCompositeExtract %v4float %69 0
          %73 = OpCompositeExtract %v4float %70 0
-         %75 = OpFOrdNotEqual %v4bool %72 %73
+         %75 = OpFUnordNotEqual %v4bool %72 %73
          %76 = OpAny %bool %75
          %77 = OpCompositeExtract %v4float %69 1
          %78 = OpCompositeExtract %v4float %70 1
-         %79 = OpFOrdNotEqual %v4bool %77 %78
+         %79 = OpFUnordNotEqual %v4bool %77 %78
          %80 = OpAny %bool %79
          %81 = OpLogicalOr %bool %76 %80
          %82 = OpCompositeExtract %v4float %69 2
          %83 = OpCompositeExtract %v4float %70 2
-         %84 = OpFOrdNotEqual %v4bool %82 %83
+         %84 = OpFUnordNotEqual %v4bool %82 %83
          %85 = OpAny %bool %84
          %86 = OpLogicalOr %bool %81 %85
          %87 = OpCompositeExtract %v4float %69 3
          %88 = OpCompositeExtract %v4float %70 3
-         %89 = OpFOrdNotEqual %v4bool %87 %88
+         %89 = OpFUnordNotEqual %v4bool %87 %88
          %90 = OpAny %bool %89
          %91 = OpLogicalOr %bool %86 %90
          %92 = OpLoad %mat2v2float %m2
diff --git a/Test/baseResults/xfbUnsizedArray.error.vert.out b/Test/baseResults/xfbUnsizedArray.error.vert.out
new file mode 100644
index 0000000..3604141
--- /dev/null
+++ b/Test/baseResults/xfbUnsizedArray.error.vert.out
@@ -0,0 +1,69 @@
+xfbUnsizedArray.error.vert
+ERROR: 0:4: 'xfb_offset' : unsized array in buffer 0
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 430
+Requested GL_ARB_enhanced_layouts
+in xfb mode
+ERROR: node is still EOpNull!
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          'result' ( temp 4-component vector of float)
+0:11          'in_vs' ( in 4-component vector of float)
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index (layout( xfb_buffer=0 xfb_offset=0) smooth temp 4-component vector of float)
+0:13          'xfb_buffer' (layout( xfb_buffer=0 xfb_offset=0) smooth out unsized 1-element array of 4-component vector of float)
+0:13          Constant:
+0:13            0 (const int)
+0:13        divide ( temp 4-component vector of float)
+0:13          'result' ( temp 4-component vector of float)
+0:13          Constant:
+0:13            2.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        'out_vs' ( smooth out 4-component vector of float)
+0:15        'result' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'xfb_buffer' (layout( xfb_buffer=0 xfb_offset=0) smooth out unsized 1-element array of 4-component vector of float)
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 430
+Requested GL_ARB_enhanced_layouts
+in xfb mode
+ERROR: node is still EOpNull!
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:11    Sequence
+0:11      Sequence
+0:11        move second child to first child ( temp 4-component vector of float)
+0:11          'result' ( temp 4-component vector of float)
+0:11          'in_vs' ( in 4-component vector of float)
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index (layout( xfb_buffer=0 xfb_offset=0) smooth temp 4-component vector of float)
+0:13          'xfb_buffer' (layout( xfb_buffer=0 xfb_offset=0) smooth out 1-element array of 4-component vector of float)
+0:13          Constant:
+0:13            0 (const int)
+0:13        divide ( temp 4-component vector of float)
+0:13          'result' ( temp 4-component vector of float)
+0:13          Constant:
+0:13            2.000000
+0:15      move second child to first child ( temp 4-component vector of float)
+0:15        'out_vs' ( smooth out 4-component vector of float)
+0:15        'result' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'xfb_buffer' (layout( xfb_buffer=0 xfb_offset=0) smooth out 1-element array of 4-component vector of float)
+0:?     'in_vs' ( in 4-component vector of float)
+0:?     'out_vs' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/Test/contradict_0.geom b/Test/contradict_0.geom
new file mode 100644
index 0000000..04f9fd5
--- /dev/null
+++ b/Test/contradict_0.geom
@@ -0,0 +1,13 @@
+#version 330

+

+layout(points) in;

+layout(triangle_strip, max_vertices = 4) out;

+

+float getV();

+

+void main (void)

+{

+    float v = getV();

+    EndPrimitive();

+    EndPrimitive();

+}

diff --git a/Test/contradict_1.geom b/Test/contradict_1.geom
new file mode 100644
index 0000000..4cc8919
--- /dev/null
+++ b/Test/contradict_1.geom
@@ -0,0 +1,9 @@
+#version 330

+

+layout(lines) in;

+layout(line_strip, max_vertices = 6) out;

+

+float getV()

+{

+    return 1.0;

+}

diff --git a/Test/cppBad4.vert b/Test/cppBad4.vert
old mode 100755
new mode 100644
diff --git a/Test/cppBad5.vert b/Test/cppBad5.vert
old mode 100755
new mode 100644
diff --git a/Test/cppMerge.frag b/Test/cppMerge.frag
old mode 100755
new mode 100644
diff --git a/Test/glsl.140.layoutOffset.error.vert b/Test/glsl.140.layoutOffset.error.vert
new file mode 100644
index 0000000..c57b5bc
--- /dev/null
+++ b/Test/glsl.140.layoutOffset.error.vert
@@ -0,0 +1,14 @@
+#version 140

+

+layout (std140) uniform UBO // offset can't use under version 140

+{

+    layout(offset = 0) vec4 a;

+};

+

+in  vec4 in_vs;

+out vec4 out_vs;

+

+void main()

+{

+    out_vs = in_vs + a;

+}

diff --git a/Test/glsl.430.layoutOffset.error.vert b/Test/glsl.430.layoutOffset.error.vert
new file mode 100644
index 0000000..831d002
--- /dev/null
+++ b/Test/glsl.430.layoutOffset.error.vert
@@ -0,0 +1,14 @@
+#version 430 core

+

+layout (std140) uniform UBO // offset can't use on 430 core with out extension require

+{

+    layout(offset = 0) vec4 a;

+};

+

+in  vec4 in_vs;

+out vec4 out_vs;

+

+void main()

+{

+    out_vs = in_vs + a;

+}

diff --git a/Test/glsl.es300.layoutOffset.error.vert b/Test/glsl.es300.layoutOffset.error.vert
new file mode 100644
index 0000000..c966f94
--- /dev/null
+++ b/Test/glsl.es300.layoutOffset.error.vert
@@ -0,0 +1,14 @@
+#version 300 es

+

+layout (binding = 0, offset = 0) uniform UBO // offset can't use on under version es 300

+{

+    vec4 a;

+};

+

+in  vec4 in_vs;

+out vec4 out_vs;

+

+void main()

+{

+    out_vs = in_vs + a;

+}

diff --git a/Test/hlsl.hull.6.tesc b/Test/hlsl.hull.6.tesc
new file mode 100644
index 0000000..13edfa8
--- /dev/null
+++ b/Test/hlsl.hull.6.tesc
@@ -0,0 +1,48 @@
+// Test tesselation factor output as PCF arg
+
+struct VSOutput
+{
+    float4 f4Position : SV_Position;
+    float3 f3Color	  : COLOR;
+};
+
+struct HS_CONSTANT_DATA_OUTPUT
+{
+    float Edges[4]  : SV_TessFactor;
+};
+
+HS_CONSTANT_DATA_OUTPUT ConstantHS(InputPatch<VSOutput, 1> p, 
+                                   uint BlockID        : SV_PrimitiveID,
+                                   out float Inside[2] : SV_InsideTessFactor)
+{
+    HS_CONSTANT_DATA_OUTPUT Factors;
+    Factors.Edges[0] = 2.5;
+    Factors.Edges[1] = 4.25;
+    Factors.Edges[2] = 5.75;
+    Factors.Edges[3] = 7.5;
+
+    Inside[0] = 6.75;
+    Inside[1] = 7.25;
+
+    return Factors;
+}
+
+struct HSOutput
+{
+    float4 Position : POS;
+    float3 Color    : COL;
+};
+
+[domain("quad")]
+[partitioning("fractional_even")]
+[outputtopology("triangle_ccw")]
+[outputcontrolpoints(1)]
+[patchconstantfunc("ConstantHS")]
+HSOutput main(InputPatch<VSOutput, 1> inputPatch, uint uCPID : SV_OutputControlPointID)
+{
+    HSOutput Out;
+    Out.Position = inputPatch[uCPID].f4Position;
+    Out.Color    = inputPatch[uCPID].f3Color;
+    return Out;
+}
+
diff --git a/Test/hlsl.inoutquals.negative.frag b/Test/hlsl.inoutquals.negative.frag
new file mode 100644
index 0000000..380dc2c
--- /dev/null
+++ b/Test/hlsl.inoutquals.negative.frag
@@ -0,0 +1,7 @@
+in float invalid1;
+in out float invalid2;
+inout float invalid3;
+out float invalid4;
+
+void main() {
+}
diff --git a/Test/hlsl.intrinsics.frag b/Test/hlsl.intrinsics.frag
old mode 100755
new mode 100644
diff --git a/Test/hlsl.matpack-pragma-global.frag b/Test/hlsl.matpack-pragma-global.frag
new file mode 100644
index 0000000..2a0ff45
--- /dev/null
+++ b/Test/hlsl.matpack-pragma-global.frag
@@ -0,0 +1,8 @@
+#pragma pack_matrix(row_major)
+
+float4x4 g_GlobalMat1;
+
+float4 main() : SV_Target0
+{
+    return g_GlobalMat1[0];
+}
diff --git a/Test/hlsl.printf.comp b/Test/hlsl.printf.comp
new file mode 100644
index 0000000..d117299
--- /dev/null
+++ b/Test/hlsl.printf.comp
@@ -0,0 +1,11 @@
+const string first = "first string";

+

+[numthreads(1,1,1)]

+void main() {

+    printf(first);

+    printf("please print this message.");

+    printf("Variables are: %d %d %.2f", 1u, 2u, 1.5f);

+    printf("Integers are: %d %d %d", 1, 2, 3);

+    printf("More: %d %d %d %d %d %d %d %d %d %d", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

+}

+

diff --git a/Test/hlsl.round.dx10.frag b/Test/hlsl.round.dx10.frag
new file mode 100644
index 0000000..cd88334
--- /dev/null
+++ b/Test/hlsl.round.dx10.frag
@@ -0,0 +1,4 @@
+float4 PixelShaderFunction(float4 input) : COLOR0
+{
+    return round(input);
+}
diff --git a/Test/hlsl.round.dx9.frag b/Test/hlsl.round.dx9.frag
new file mode 100644
index 0000000..cd88334
--- /dev/null
+++ b/Test/hlsl.round.dx9.frag
@@ -0,0 +1,4 @@
+float4 PixelShaderFunction(float4 input) : COLOR0
+{
+    return round(input);
+}
diff --git a/Test/hlsl.sample.dx9.frag b/Test/hlsl.sample.dx9.frag
index 2609419..ed82c52 100644
--- a/Test/hlsl.sample.dx9.frag
+++ b/Test/hlsl.sample.dx9.frag
@@ -3,7 +3,7 @@
 sampler1D          g_sam1D   : register(t1);
 sampler2D          g_sam2D   : register(t2);
 sampler3D          g_sam3D	 : register(t3);
-samplerCube        g_samCube : register(t4);
+samplerCUBE        g_samCube : register(t4);
 
 struct PS_OUTPUT
 {
diff --git a/Test/hlsl.singleArgIntPromo.vert b/Test/hlsl.singleArgIntPromo.vert
old mode 100755
new mode 100644
diff --git a/Test/hlsl.specConstant.frag b/Test/hlsl.specConstant.frag
old mode 100755
new mode 100644
diff --git a/Test/link.multiAnonBlocksInvalid.0.0.vert b/Test/link.multiAnonBlocksInvalid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiAnonBlocksInvalid.0.1.vert b/Test/link.multiAnonBlocksInvalid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiAnonBlocksValid.0.0.vert b/Test/link.multiAnonBlocksValid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiAnonBlocksValid.0.1.vert b/Test/link.multiAnonBlocksValid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiBlocksInvalid.0.0.vert b/Test/link.multiBlocksInvalid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiBlocksInvalid.0.1.vert b/Test/link.multiBlocksInvalid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiBlocksValid.1.0.vert b/Test/link.multiBlocksValid.1.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.multiBlocksValid.1.1.vert b/Test/link.multiBlocksValid.1.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.0.0.frag b/Test/link.vk.differentPC.0.0.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.0.1.frag b/Test/link.vk.differentPC.0.1.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.0.2.frag b/Test/link.vk.differentPC.0.2.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.1.0.frag b/Test/link.vk.differentPC.1.0.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.1.1.frag b/Test/link.vk.differentPC.1.1.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.differentPC.1.2.frag b/Test/link.vk.differentPC.1.2.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.matchingPC.0.0.frag b/Test/link.vk.matchingPC.0.0.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.matchingPC.0.1.frag b/Test/link.vk.matchingPC.0.1.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.matchingPC.0.2.frag b/Test/link.vk.matchingPC.0.2.frag
old mode 100755
new mode 100644
diff --git a/Test/link.vk.multiBlocksValid.0.0.vert b/Test/link.vk.multiBlocksValid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.multiBlocksValid.0.1.vert b/Test/link.vk.multiBlocksValid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.multiBlocksValid.1.0.geom b/Test/link.vk.multiBlocksValid.1.0.geom
old mode 100755
new mode 100644
diff --git a/Test/link.vk.multiBlocksValid.1.1.geom b/Test/link.vk.multiBlocksValid.1.1.geom
old mode 100755
new mode 100644
diff --git a/Test/link.vk.pcNamingInvalid.0.0.vert b/Test/link.vk.pcNamingInvalid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.pcNamingInvalid.0.1.vert b/Test/link.vk.pcNamingInvalid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.pcNamingValid.0.0.vert b/Test/link.vk.pcNamingValid.0.0.vert
old mode 100755
new mode 100644
diff --git a/Test/link.vk.pcNamingValid.0.1.vert b/Test/link.vk.pcNamingValid.0.1.vert
old mode 100755
new mode 100644
diff --git a/Test/rayQuery-allOps.comp b/Test/rayQuery-allOps.comp
index 80f2593..3a2a8d0 100644
--- a/Test/rayQuery-allOps.comp
+++ b/Test/rayQuery-allOps.comp
@@ -2,6 +2,7 @@
 #extension GL_EXT_ray_query : enable
 #extension GL_EXT_ray_flags_primitive_culling : enable
 
+layout(primitive_culling);
 struct Ray
 {
     vec3 pos;
diff --git a/Test/rayQuery-global.rgen b/Test/rayQuery-global.rgen
new file mode 100644
index 0000000..3a57e74
--- /dev/null
+++ b/Test/rayQuery-global.rgen
@@ -0,0 +1,31 @@
+#version 460
+#extension GL_EXT_ray_query : enable
+#extension GL_EXT_ray_flags_primitive_culling : enable
+
+layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas;
+
+rayQueryEXT rqGlobal;
+
+void otherWrapper(rayQueryEXT rq) {
+    rayQueryProceedEXT(rq);
+    rayQueryProceedEXT(rqGlobal);
+}
+
+void wrapper(rayQueryEXT rq) {
+    rayQueryEXT rq2;
+    rayQueryProceedEXT(rq);
+    rayQueryProceedEXT(rqGlobal);
+    otherWrapper(rq);
+    otherWrapper(rq2);
+    otherWrapper(rqGlobal);
+}
+
+void main() {
+    rayQueryInitializeEXT(rqGlobal, rtas, gl_RayFlagsNoneEXT, 0xFF, vec3(0,0,0), 0.0, vec3(1,0,0), 1.0);
+    wrapper(rqGlobal);
+    otherWrapper(rqGlobal);
+    rayQueryEXT rq2;
+    rayQueryInitializeEXT(rq2, rtas, gl_RayFlagsNoneEXT, 0xFF, vec3(0,0,0), 0.0, vec3(1,0,0), 1.0);
+    wrapper(rq2);
+    otherWrapper(rq2);
+}
diff --git a/Test/rayQuery-initialization.Error.comp b/Test/rayQuery-initialization.Error.comp
new file mode 100644
index 0000000..1c7757c
--- /dev/null
+++ b/Test/rayQuery-initialization.Error.comp
@@ -0,0 +1,8 @@
+#version 460

+

+#extension GL_EXT_ray_query : enable

+

+void main () {

+    rayQueryEXT foo;

+    rayQueryEXT bar = foo;

+}
\ No newline at end of file
diff --git a/Test/rayQuery-types.comp b/Test/rayQuery-types.comp
new file mode 100644
index 0000000..c70a3fc
--- /dev/null
+++ b/Test/rayQuery-types.comp
@@ -0,0 +1,45 @@
+#version 460
+#extension GL_EXT_ray_query : require
+
+layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
+
+layout(binding = 0, set = 0) uniform accelerationStructureEXT tlas;
+
+void main()
+{
+  rayQueryEXT rayQuery;
+  rayQueryInitializeEXT(rayQuery,       // Ray query
+                        tlas,           // Top-level acceleration structure
+                        0,              // Ray flags
+                        0xFF,           // 8-bit instance mask
+                        vec3(0),        // Ray origin
+                        0.0,            // Minimum t-value
+                        vec3(1, 0, 0),  // Ray direction
+                        10000.0);       // Maximum t-value
+
+  // yes this is silly, just want to verify the return types
+  bool rq_proceed = rayQueryProceedEXT(rayQuery);
+  while(rq_proceed)
+  {
+    rq_proceed = rayQueryProceedEXT(rayQuery);
+  }
+
+  const uint intersectionType = rayQueryGetIntersectionTypeEXT(rayQuery, true);
+  const float rayTMin = rayQueryGetRayTMinEXT(rayQuery);
+  const uint rayFlags = rayQueryGetRayFlagsEXT(rayQuery);
+  const vec3 worldRayOrigin = rayQueryGetWorldRayOriginEXT(rayQuery);
+  const vec3 worldDirection = rayQueryGetWorldRayDirectionEXT(rayQuery);
+  const float intersectionT = rayQueryGetIntersectionTEXT(rayQuery, true);
+  const int customIndex = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);
+  const int instanceId = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);
+  const uint sbtOffset = rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true);
+  const int geometryIndex = rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true);
+  const int primitiveIndex = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);
+  const vec2 barys = rayQueryGetIntersectionBarycentricsEXT(rayQuery, true);
+  const bool frontface = rayQueryGetIntersectionFrontFaceEXT(rayQuery, true);
+  const bool aabbOpaque = rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery);
+  const vec3 objRayDirection = rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true);
+  const vec3 objRayOrigin = rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true);
+  const mat4x3 objToWorld = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true);
+  const mat4x3 worldToObj = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
+}
diff --git a/Test/runtests b/Test/runtests
index 1a7c7c9..51f1a6a 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -12,12 +12,30 @@
 HASERROR=0
 mkdir -p $TARGETDIR
 
+LIBPATH="$(cd "$(dirname "$(dirname $EXE)")" && pwd)/lib"
+if [ -d "${LIBPATH}" ]; then
+    export LD_LIBRARY_PATH="${LIBPATH}:${LD_LIBRARY_PATH}" 
+fi
+
+function run {
+    $EXE $@
+    result=$?
+    case "$result" in
+    [0-6]) # Valid success and error codes
+        return
+    ;;
+    *)
+        echo "$EXE returned $result"
+        HASERROR=1
+    esac
+}
+
 if [ -a localtestlist ]
   then
     while read t; do
         echo Running $t...
         b=`basename $t`
-        $EXE -i -l $t > $TARGETDIR/$b.out
+        run -i -l $t > $TARGETDIR/$b.out
         diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
     done < localtestlist
 fi
@@ -28,40 +46,40 @@
 # special tests
 #
 
-$EXE badMacroArgs.frag > $TARGETDIR/badMacroArgs.frag.out
+run badMacroArgs.frag > $TARGETDIR/badMacroArgs.frag.out
 diff -b $BASEDIR/badMacroArgs.frag.out $TARGETDIR/badMacroArgs.frag.out || HASERROR=1
 
 #
 # reflection tests
 #
 echo Running reflection...
-$EXE -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
+run -l -q -C reflection.vert > $TARGETDIR/reflection.vert.out
 diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1
-$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks reflection.options.vert > $TARGETDIR/reflection.options.vert.out
+run -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks --reflect-all-io-variables --reflect-shared-std140-ubo --reflect-shared-std140-ssbo reflection.options.vert > $TARGETDIR/reflection.options.vert.out
 diff -b $BASEDIR/reflection.options.vert.out $TARGETDIR/reflection.options.vert.out || HASERROR=1
-$EXE -l -q -C reflection.frag > $TARGETDIR/reflection.frag.out
+run -l -q -C reflection.frag > $TARGETDIR/reflection.frag.out
 diff -b $BASEDIR/reflection.frag.out $TARGETDIR/reflection.frag.out || HASERROR=1
-$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks reflection.frag > $TARGETDIR/reflection.options.frag.out
+run -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks --reflect-all-io-variables --reflect-shared-std140-ubo --reflect-shared-std140-ssbo reflection.frag > $TARGETDIR/reflection.options.frag.out
 diff -b $BASEDIR/reflection.options.frag.out $TARGETDIR/reflection.options.frag.out || HASERROR=1
-$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks reflection.options.geom > $TARGETDIR/reflection.options.geom.out
+run -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks --reflect-all-io-variables --reflect-shared-std140-ubo --reflect-shared-std140-ssbo reflection.options.geom > $TARGETDIR/reflection.options.geom.out
 diff -b $BASEDIR/reflection.options.geom.out $TARGETDIR/reflection.options.geom.out || HASERROR=1
-$EXE -l -q -C reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.out
+run -l -q -C reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.out
 diff -b $BASEDIR/reflection.linked.out $TARGETDIR/reflection.linked.out || HASERROR=1
-$EXE -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.options.out
+run -l -q -C --reflect-strict-array-suffix --reflect-basic-array-suffix --reflect-intermediate-io --reflect-separate-buffers --reflect-all-block-variables --reflect-unwrap-io-blocks --reflect-all-io-variables --reflect-shared-std140-ubo --reflect-shared-std140-ssbo reflection.linked.vert reflection.linked.frag > $TARGETDIR/reflection.linked.options.out
 diff -b $BASEDIR/reflection.linked.options.out $TARGETDIR/reflection.linked.options.out || HASERROR=1
-$EXE -D -Od -e flizv -l -q -C -V -Od hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
+run -D -Od -e flizv -l -q -C -V -Od hlsl.reflection.vert > $TARGETDIR/hlsl.reflection.vert.out
 diff -b $BASEDIR/hlsl.reflection.vert.out $TARGETDIR/hlsl.reflection.vert.out || HASERROR=1
-$EXE -D -Od -e main -l -q -C -V -Od hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
+run -D -Od -e main -l -q -C -V -Od hlsl.reflection.binding.frag > $TARGETDIR/hlsl.reflection.binding.frag.out
 diff -b $BASEDIR/hlsl.reflection.binding.frag.out $TARGETDIR/hlsl.reflection.binding.frag.out || HASERROR=1
-$EXE -D -Od -e main -l -q --hlsl-iomap --auto-map-bindings --stb 10 --sbb 20 --ssb 30 --suavb 40 --scb 50 -D -V -e main -Od hlsl.automap.frag > $TARGETDIR/hlsl.automap.frag.out
+run -D -Od -e main -l -q --hlsl-iomap --auto-map-bindings --stb 10 --sbb 20 --ssb 30 --suavb 40 --scb 50 -D -V -e main -Od hlsl.automap.frag > $TARGETDIR/hlsl.automap.frag.out
 diff -b $BASEDIR/hlsl.automap.frag.out $TARGETDIR/hlsl.automap.frag.out || HASERROR=1
 
 #
 # multi-threaded test
 #
 echo Comparing single thread to multithread for all tests in current directory...
-$EXE -i -C *.vert *.geom *.frag *.tesc *.tese *.comp > $TARGETDIR/singleThread.out
-$EXE -i -C *.vert *.geom *.frag *.tesc *.tese *.comp -t > $TARGETDIR/multiThread.out
+run -i -C *.vert *.geom *.frag *.tesc *.tese *.comp > $TARGETDIR/singleThread.out
+run -i -C *.vert *.geom *.frag *.tesc *.tese *.comp -t > $TARGETDIR/multiThread.out
 diff $TARGETDIR/singleThread.out $TARGETDIR/multiThread.out || HASERROR=1
 if [ $HASERROR -eq 0 ]
 then
@@ -73,14 +91,14 @@
 # entry point renaming tests
 #
 echo Running entry-point renaming tests
-$EXE -i -H -V -D -Od --entry-point main_in_spv --ku --source-entrypoint main -Od hlsl.entry.rename.frag > $TARGETDIR/hlsl.entry.rename.frag.out
+run -i -H -V -D -Od --entry-point main_in_spv --ku --source-entrypoint main -Od hlsl.entry.rename.frag > $TARGETDIR/hlsl.entry.rename.frag.out
 diff -b $BASEDIR/hlsl.entry.rename.frag.out $TARGETDIR/hlsl.entry.rename.frag.out || HASERROR=1
 
 #
 # Testing ill-defined uncalled function
 #
 echo Running ill-defined uncalled function
-$EXE -D -Od -e main -H -Od hlsl.deadFunctionMissingBody.vert > $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out
+run -D -Od -e main -H -Od hlsl.deadFunctionMissingBody.vert > $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out
 diff -b $BASEDIR/hlsl.deadFunctionMissingBody.vert.out $TARGETDIR/hlsl.deadFunctionMissingBody.vert.out || HASERROR=1
 
 if [ $HASERROR -eq 0 ]
@@ -94,66 +112,66 @@
 # Testing -S and compound suffixes
 #
 echo Running explicit stage test and compound suffix tests
-$EXE -Od -i -S vert nosuffix > $TARGETDIR/nosuffix.out
+run -Od -i -S vert nosuffix > $TARGETDIR/nosuffix.out
 diff -b $BASEDIR/nosuffix.out $TARGETDIR/nosuffix.out || HASERROR=1
-$EXE -Od -i compoundsuffix.vert.glsl > $TARGETDIR/compoundsuffix.vert.glsl
+run -Od -i compoundsuffix.vert.glsl > $TARGETDIR/compoundsuffix.vert.glsl
 diff -b $BASEDIR/compoundsuffix.vert.glsl $TARGETDIR/compoundsuffix.vert.glsl || HASERROR=1
-$EXE -Od -e main -H compoundsuffix.frag.hlsl > $TARGETDIR/compoundsuffix.frag.hlsl
+run -Od -e main -H compoundsuffix.frag.hlsl > $TARGETDIR/compoundsuffix.frag.hlsl
 diff -b $BASEDIR/compoundsuffix.frag.hlsl $TARGETDIR/compoundsuffix.frag.hlsl || HASERROR=1
 
 #
 # Testing --hlsl-offsets
 #
 echo Running hlsl offsets
-$EXE -i --hlsl-offsets -H spv.hlslOffsets.vert > $TARGETDIR/spv.hlslOffsets.vert.out
+run -i --hlsl-offsets -H spv.hlslOffsets.vert > $TARGETDIR/spv.hlslOffsets.vert.out
 diff -b $BASEDIR/spv.hlslOffsets.vert.out $TARGETDIR/spv.hlslOffsets.vert.out || HASERROR=1
 
 echo Running hlsl offsets
-$EXE -i  --hlsl-offsets -D -Od -e main -H -Od hlsl.hlslOffset.vert > $TARGETDIR/hlsl.hlslOffset.vert.out
+run -i  --hlsl-offsets -D -Od -e main -H -Od hlsl.hlslOffset.vert > $TARGETDIR/hlsl.hlslOffset.vert.out
 diff -b $BASEDIR/hlsl.hlslOffset.vert.out $TARGETDIR/hlsl.hlslOffset.vert.out || HASERROR=1
 
 #
 # Testing --resource-set-binding
 #
 echo Configuring HLSL descriptor set and binding number manually
-$EXE -V -D -Od -e main -H -Od hlsl.multiDescriptorSet.frag --rsb frag t0 0 0 t1 1 0 s0 0 1 s1 1 1 b0 2 0 b1 2 1 b2 2 2 > $TARGETDIR/hlsl.multiDescriptorSet.frag.out
+run -V -D -Od -e main -H -Od hlsl.multiDescriptorSet.frag --rsb frag t0 0 0 t1 1 0 s0 0 1 s1 1 1 b0 2 0 b1 2 1 b2 2 2 > $TARGETDIR/hlsl.multiDescriptorSet.frag.out
 diff -b $BASEDIR/hlsl.multiDescriptorSet.frag.out $TARGETDIR/hlsl.multiDescriptorSet.frag.out || HASERROR=1
 
-$EXE -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb 4 > $TARGETDIR/hlsl.explicitDescriptorSet.frag.out
+run -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb 4 > $TARGETDIR/hlsl.explicitDescriptorSet.frag.out
 diff -b $BASEDIR/hlsl.explicitDescriptorSet.frag.out $TARGETDIR/hlsl.explicitDescriptorSet.frag.out || HASERROR=1
 
-$EXE -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb frag 3 > $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out
+run -V -D -Od -e main -H -Od hlsl.explicitDescriptorSet.frag --hlsl-iomap --amb --ssb 10 --stb 20 --rsb frag 3 > $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out
 diff -b $BASEDIR/hlsl.explicitDescriptorSet-2.frag.out $TARGETDIR/hlsl.explicitDescriptorSet-2.frag.out || HASERROR=1
 
 #
 # Testing per-descriptor-set IO map shift
 #
 echo 'Testing per-descriptor-set IO map shift'
-$EXE -e main --hlsl-iomap --ssb 10 1 15 2 --stb 20 --stb 25 2 --stb 70 6 --suavb 30 --suavb 40 2 --sub 50 6 -i -q -D -Od -V hlsl.shift.per-set.frag > $TARGETDIR/hlsl.shift.per-set.frag.out || HASERROR=1
+run -e main --hlsl-iomap --ssb 10 1 15 2 --stb 20 --stb 25 2 --stb 70 6 --suavb 30 --suavb 40 2 --sub 50 6 -i -q -D -Od -V hlsl.shift.per-set.frag > $TARGETDIR/hlsl.shift.per-set.frag.out || HASERROR=1
 diff -b $BASEDIR/hlsl.shift.per-set.frag.out $TARGETDIR/hlsl.shift.per-set.frag.out || HASERROR=1
 
 #
 # Testing location error
 #
 echo Testing SPV no location
-$EXE -V -C spv.noLocation.vert > $TARGETDIR/spv.noLocation.vert.out
+run -V -C spv.noLocation.vert > $TARGETDIR/spv.noLocation.vert.out
 diff -b $BASEDIR/spv.noLocation.vert.out $TARGETDIR/spv.noLocation.vert.out || HASERROR=1
-$EXE -G -H --aml spv.noBuiltInLoc.vert > $TARGETDIR/spv.noBuiltInLoc.vert.out
+run -G -H --aml spv.noBuiltInLoc.vert > $TARGETDIR/spv.noBuiltInLoc.vert.out
 diff -b $BASEDIR/spv.noBuiltInLoc.vert.out $TARGETDIR/spv.noBuiltInLoc.vert.out || HASERROR=1
-$EXE -G spv.looseUniformNoLoc.vert > $TARGETDIR/spv.looseUniformNoLoc.vert.out
+run -G spv.looseUniformNoLoc.vert > $TARGETDIR/spv.looseUniformNoLoc.vert.out
 diff -b $BASEDIR/spv.looseUniformNoLoc.vert.out $TARGETDIR/spv.looseUniformNoLoc.vert.out || HASERROR=1
 
 #
 # Testing debug information
 #
 echo Testing SPV Debug Information
-$EXE -g --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf --spirv-val \
+run -g --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf --spirv-val \
      -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.frag.out
 diff -b $BASEDIR/spv.debugInfo.frag.out $TARGETDIR/spv.debugInfo.frag.out || HASERROR=1
-$EXE -g -Od --target-env vulkan1.1 --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf --spirv-val \
-     -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.1.1.frag.out
+run -g -Od --target-env vulkan1.1 --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf --spirv-val \
+     -V -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.1.1.frag.out
 diff -b $BASEDIR/spv.debugInfo.1.1.frag.out $TARGETDIR/spv.debugInfo.1.1.frag.out || HASERROR=1
-$EXE -g -D -Od -e newMain -g --amb --aml --fua --hlsl-iomap --nsf --spirv-val --sib 1 --ssb 2 --sbb 3 --stb 4 --suavb 5 --sub 6 \
+run -g -D -Od -e newMain -g --amb --aml --fua --hlsl-iomap --nsf --spirv-val --sib 1 --ssb 2 --sbb 3 --stb 4 --suavb 5 --sub 6 \
      --sep origMain -H -Od spv.hlslDebugInfo.vert --rsb vert t0 0 0 > $TARGETDIR/spv.hlslDebugInfo.frag.out
 diff -b $BASEDIR/spv.hlslDebugInfo.frag.out $TARGETDIR/spv.hlslDebugInfo.frag.out || HASERROR=1
 
@@ -161,49 +179,49 @@
 # Testing Includer
 #
 echo Testing Includer
-$EXE -D -Od -e main -H -Od ../Test/hlsl.include.vert > $TARGETDIR/hlsl.include.vert.out
+run -D -Od -e main -H -Od ../Test/hlsl.include.vert > $TARGETDIR/hlsl.include.vert.out
 diff -b $BASEDIR/hlsl.include.vert.out $TARGETDIR/hlsl.include.vert.out || HASERROR=1
-$EXE -D -Od -e main -H -Od hlsl.includeNegative.vert > $TARGETDIR/hlsl.includeNegative.vert.out
+run -D -Od -e main -H -Od hlsl.includeNegative.vert > $TARGETDIR/hlsl.includeNegative.vert.out
 diff -b $BASEDIR/hlsl.includeNegative.vert.out $TARGETDIR/hlsl.includeNegative.vert.out || HASERROR=1
-$EXE -l -i include.vert > $TARGETDIR/include.vert.out
+run -l -i include.vert > $TARGETDIR/include.vert.out
 diff -b $BASEDIR/include.vert.out $TARGETDIR/include.vert.out || HASERROR=1
-$EXE -D -Od -e main -H -Od -Iinc1/path1 -Iinc1/path2 hlsl.dashI.vert > $TARGETDIR/hlsl.dashI.vert.out
+run -D -Od -e main -H -Od -Iinc1/path1 -Iinc1/path2 hlsl.dashI.vert > $TARGETDIR/hlsl.dashI.vert.out
 diff -b $BASEDIR/hlsl.dashI.vert.out $TARGETDIR/hlsl.dashI.vert.out || HASERROR=1
-$EXE -D -Od -e MainPs -H -Od -g hlsl.pp.line3.frag > $TARGETDIR/hlsl.pp.line3.frag.out
+run -D -Od -e MainPs -H -Od -g hlsl.pp.line3.frag > $TARGETDIR/hlsl.pp.line3.frag.out
 diff -b $BASEDIR/hlsl.pp.line3.frag.out $TARGETDIR/hlsl.pp.line3.frag.out || HASERROR=1
 
 #
 # Testing -D and -U
 #
 echo "Testing -D and -U"
-$EXE -DUNDEFED -UIN_SHADER -DFOO=200 -i -l --U UNDEFED --define-macro MUL=FOO*2 glsl.-D-U.frag > $TARGETDIR/glsl.-D-U.frag.out
+run -DUNDEFED -UIN_SHADER -DFOO=200 -i -l --U UNDEFED --define-macro MUL=FOO*2 glsl.-D-U.frag > $TARGETDIR/glsl.-D-U.frag.out
 diff -b $BASEDIR/glsl.-D-U.frag.out $TARGETDIR/glsl.-D-U.frag.out || HASERROR=1
-$EXE -D -Od -e main -V -i -DUNDEFED -UIN_SHADER --D FOO=200 --undef-macro UNDEFED -Od hlsl.-D-U.frag > $TARGETDIR/hlsl.-D-U.frag.out
+run -D -Od -e main -V -i -DUNDEFED -UIN_SHADER --D FOO=200 --undef-macro UNDEFED -Od hlsl.-D-U.frag > $TARGETDIR/hlsl.-D-U.frag.out
 diff -b $BASEDIR/hlsl.-D-U.frag.out $TARGETDIR/hlsl.-D-U.frag.out || HASERROR=1
 
 #
 # Test --client and --target-env
 #
 echo "Testing --client and --target-env"
-$EXE --client vulkan100       spv.targetVulkan.vert || HASERROR=1
-$EXE --client opengl100       spv.targetOpenGL.vert || HASERROR=1
-$EXE --target-env vulkan1.0   spv.targetVulkan.vert || HASERROR=1
-$EXE --target-env vulkan1.1   spv.targetVulkan.vert || HASERROR=1
-$EXE --target-env vulkan1.2   spv.targetVulkan.vert || HASERROR=1
-$EXE --target-env opengl      spv.targetOpenGL.vert || HASERROR=1
-$EXE -V100                    spv.targetVulkan.vert || HASERROR=1
-$EXE -G100                    spv.targetOpenGL.vert || HASERROR=1
-$EXE --target-env spirv1.2 -V spv.targetVulkan.vert || HASERROR=1
+run --client vulkan100       spv.targetVulkan.vert || HASERROR=1
+run --client opengl100       spv.targetOpenGL.vert || HASERROR=1
+run --target-env vulkan1.0   spv.targetVulkan.vert || HASERROR=1
+run --target-env vulkan1.1   spv.targetVulkan.vert || HASERROR=1
+run --target-env vulkan1.2   spv.targetVulkan.vert || HASERROR=1
+run --target-env opengl      spv.targetOpenGL.vert || HASERROR=1
+run -V100                    spv.targetVulkan.vert || HASERROR=1
+run -G100                    spv.targetOpenGL.vert || HASERROR=1
+run --target-env spirv1.2 -V spv.targetVulkan.vert || HASERROR=1
 
 #
 # Testing GLSL entry point rename
 #
 echo "Testing GLSL entry point rename"
-$EXE -H -e foo --source-entrypoint main glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.out
+run -H -e foo --source-entrypoint main glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.out
 diff -b $BASEDIR/glsl.entryPointRename.vert.out $TARGETDIR/glsl.entryPointRename.vert.out || HASERROR=1
-$EXE -H -e foo --source-entrypoint bar glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.bad.out
+run -H -e foo --source-entrypoint bar glsl.entryPointRename.vert > $TARGETDIR/glsl.entryPointRename.vert.bad.out
 diff -b $BASEDIR/glsl.entryPointRename.vert.bad.out $TARGETDIR/glsl.entryPointRename.vert.bad.out || HASERROR=1
-$EXE -H -e foo --source-entrypoint main glsl.entryPointRename2.vert > $TARGETDIR/glsl.entryPointRename2.vert.out
+run -H -e foo --source-entrypoint main glsl.entryPointRename2.vert > $TARGETDIR/glsl.entryPointRename2.vert.out
 diff -b $BASEDIR/glsl.entryPointRename2.vert.out $TARGETDIR/glsl.entryPointRename2.vert.out || HASERROR=1
 
 #
@@ -219,21 +237,21 @@
 # Testing position Y inversion
 #
 echo "Testing position Y inversion"
-$EXE -H -e main -V -D -Od -H -i --iy hlsl.y-negate-1.vert > $TARGETDIR/hlsl.y-negate-1.vert.out
+run -H -e main -V -D -Od -H -i --iy hlsl.y-negate-1.vert > $TARGETDIR/hlsl.y-negate-1.vert.out
 diff -b $BASEDIR/hlsl.y-negate-1.vert.out $TARGETDIR/hlsl.y-negate-1.vert.out || HASERROR=1
-$EXE -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-2.vert > $TARGETDIR/hlsl.y-negate-2.vert.out
+run -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-2.vert > $TARGETDIR/hlsl.y-negate-2.vert.out
 diff -b $BASEDIR/hlsl.y-negate-2.vert.out $TARGETDIR/hlsl.y-negate-2.vert.out || HASERROR=1
-$EXE -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-3.vert > $TARGETDIR/hlsl.y-negate-3.vert.out
+run -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-3.vert > $TARGETDIR/hlsl.y-negate-3.vert.out
 diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || HASERROR=1
 
 #
 # Testing hlsl_functionality1
 #
 echo "Testing hlsl_functionality1"
-$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.structbuffer.incdec.frag > \
+run -H -e main -D -Od -fhlsl_functionality1 hlsl.structbuffer.incdec.frag > \
     $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out
 diff -b $BASEDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out || HASERROR=1
-$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.noSemantic.functionality1.comp > \
+run -H -e main -D -Od -fhlsl_functionality1 hlsl.noSemantic.functionality1.comp > \
     $TARGETDIR/hlsl.noSemantic.functionality1.comp.out
 diff -b $BASEDIR/hlsl.noSemantic.functionality1.comp.out $TARGETDIR/hlsl.noSemantic.functionality1.comp.out || HASERROR=1
 
@@ -241,7 +259,7 @@
 # Testing HLSL-specific PP feature expansion
 #
 echo "Testing HLSL-specific PP feature expansion"
-$EXE -D -E hlsl.pp.expand.frag > $TARGETDIR/hlsl.pp.expand.frag.out 2> $TARGETDIR/hlsl.pp.expand.frag.err
+run -D -E hlsl.pp.expand.frag > $TARGETDIR/hlsl.pp.expand.frag.out 2> $TARGETDIR/hlsl.pp.expand.frag.err
 diff -b $BASEDIR/hlsl.pp.expand.frag.out $TARGETDIR/hlsl.pp.expand.frag.out || HASERROR=1
 diff -b $BASEDIR/hlsl.pp.expand.frag.err $TARGETDIR/hlsl.pp.expand.frag.err || HASERROR=1
 
@@ -249,7 +267,7 @@
 # Test --nan-clamp
 #
 echo "Testing nan-clamp"
-$EXE --nan-clamp -H --aml --amb spv.400.frag > $TARGETDIR/spv.400.frag.nanclamp.out
+run --nan-clamp -H --aml --amb spv.400.frag > $TARGETDIR/spv.400.frag.nanclamp.out
 diff -b $BASEDIR/spv.400.frag.nanclamp.out $TARGETDIR/spv.400.frag.nanclamp.out || HASERROR=1
 
 #
diff --git a/Test/spv.1.4.NonWritable.frag b/Test/spv.1.4.NonWritable.frag
old mode 100755
new mode 100644
diff --git a/Test/spv.1.4.OpEntryPoint.opaqueParams.vert b/Test/spv.1.4.OpEntryPoint.opaqueParams.vert
new file mode 100644
index 0000000..71c287d
--- /dev/null
+++ b/Test/spv.1.4.OpEntryPoint.opaqueParams.vert
@@ -0,0 +1,15 @@
+#version 450

+

+layout(binding = 0) uniform sampler2D s2D;

+layout(binding = 1) uniform texture2D t2D;

+layout(binding = 3) uniform sampler s;

+

+vec2 funOpaque(in sampler2D s2D, texture2D t2D, sampler s)

+{

+    return textureSize(s2D, 0) * texture(sampler2D(t2D, s), vec2(0.5)).xy;

+}

+

+void main()

+{

+    vec2 size = funOpaque(s2D, t2D, s);

+}
\ No newline at end of file
diff --git a/Test/spv.1.4.OpSelect.frag b/Test/spv.1.4.OpSelect.frag
old mode 100755
new mode 100644
diff --git a/Test/spv.140.frag b/Test/spv.140.frag
index ceeac47..92923eb 100644
--- a/Test/spv.140.frag
+++ b/Test/spv.140.frag
@@ -1,4 +1,5 @@
 #version 140

+#extension GL_ARB_enhanced_layouts : require

 

 in vec4 k;

 out vec4 o;

diff --git a/Test/spv.MissShader.rmiss b/Test/spv.MissShader.rmiss
index 06113de..3c6b31c 100644
--- a/Test/spv.MissShader.rmiss
+++ b/Test/spv.MissShader.rmiss
@@ -9,8 +9,7 @@
 	uvec3 v1 = gl_LaunchSizeNV;
 	vec3 v2 = gl_WorldRayOriginNV;
 	vec3 v3 = gl_WorldRayDirectionNV;
-	vec3 v4 = gl_ObjectRayOriginNV;
-	vec3 v5 = gl_ObjectRayDirectionNV;
+	uint v4 = gl_IncomingRayFlagsNV;
 	float v6 = gl_RayTminNV;
 	float v7 = gl_RayTmaxNV;
 	traceNV(accNV, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp b/Test/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp
new file mode 100644
index 0000000..e06555e
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp
@@ -0,0 +1,18 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+
+layout(local_size_x = 2) in;
+
+shared first
+{
+    int16_t a;
+    float16_t f;
+};
+
+void main()
+{
+    a = int16_t(3);
+    f = float16_t(12.3);
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp b/Test/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp
new file mode 100644
index 0000000..aaa512c
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp
@@ -0,0 +1,16 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+#extension GL_EXT_shader_explicit_arithmetic_types: enable
+
+layout(local_size_x = 2) in;
+
+shared first
+{
+    int8_t a;
+};
+
+void main()
+{
+    a = int8_t(2);
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp b/Test/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp
new file mode 100644
index 0000000..573d092
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp
@@ -0,0 +1,20 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+shared first
+{
+    int a;
+};
+
+shared int b;
+
+// Cannot mix shared block and shared non-block, will fail at linking.
+
+void main()
+{
+    a = 2;
+    b = 3;
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp b/Test/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp
new file mode 100644
index 0000000..675a443
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp
@@ -0,0 +1,21 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+shared first
+{
+    int a;
+};
+
+shared second
+{
+    int b;
+};
+
+void main()
+{
+    a = 2;
+    b = 3;
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp b/Test/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp
new file mode 100644
index 0000000..38316a5
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.NonBlock.comp
@@ -0,0 +1,14 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+shared int a;
+shared int b;
+
+void main()
+{
+    a = 2;
+    b = 3;
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp b/Test/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp
new file mode 100644
index 0000000..2a17c61
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp
@@ -0,0 +1,15 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+shared first
+{
+    int a;
+};
+
+void main()
+{
+    a = 2;
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.scalar.comp b/Test/spv.WorkgroupMemoryExplicitLayout.scalar.comp
new file mode 100644
index 0000000..38085b4
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.scalar.comp
@@ -0,0 +1,39 @@
+#version 430 core
+
+#extension GL_EXT_scalar_block_layout : enable
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+struct T
+{
+    float t[3];
+};
+
+struct S
+{
+    float f;
+    vec2 v2;
+    vec3 v3;
+    vec4 v4;
+    T t;
+
+    float f_array[6];
+    vec2 v2_array[6];
+    vec3 v3_array[6];
+    vec4 v4_array[6];
+    T t_array[6];
+};
+
+// Use a default qualifier.
+layout(scalar) shared;
+
+shared Block
+{
+    S s;
+    S s_array[6];
+};
+
+void main()
+{
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.std140.comp b/Test/spv.WorkgroupMemoryExplicitLayout.std140.comp
new file mode 100644
index 0000000..f4f2475
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.std140.comp
@@ -0,0 +1,35 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+struct T
+{
+    float t[3];
+};
+
+struct S
+{
+    float f;
+    vec2 v2;
+    vec3 v3;
+    vec4 v4;
+    T t;
+
+    float f_array[6];
+    vec2 v2_array[6];
+    vec3 v3_array[6];
+    vec4 v4_array[6];
+    T t_array[6];
+};
+
+layout(std140) shared Block
+{
+    S s;
+    S s_array[6];
+};
+
+void main()
+{
+}
diff --git a/Test/spv.WorkgroupMemoryExplicitLayout.std430.comp b/Test/spv.WorkgroupMemoryExplicitLayout.std430.comp
new file mode 100644
index 0000000..717593b
--- /dev/null
+++ b/Test/spv.WorkgroupMemoryExplicitLayout.std430.comp
@@ -0,0 +1,35 @@
+#version 430 core
+
+#extension GL_EXT_shared_memory_block : enable
+
+layout(local_size_x = 8) in;
+
+struct T
+{
+    float t[3];
+};
+
+struct S
+{
+    float f;
+    vec2 v2;
+    vec3 v3;
+    vec4 v4;
+    T t;
+
+    float f_array[6];
+    vec2 v2_array[6];
+    vec3 v3_array[6];
+    vec4 v4_array[6];
+    T t_array[6];
+};
+
+layout(std430) shared Block
+{
+    S s;
+    S s_array[6];
+};
+
+void main()
+{
+}
diff --git a/Test/spv.atomicFloat.comp b/Test/spv.atomicFloat.comp
new file mode 100644
index 0000000..2022734
--- /dev/null
+++ b/Test/spv.atomicFloat.comp
@@ -0,0 +1,197 @@
+#version 450 core
+
+#extension GL_KHR_memory_scope_semantics : enable
+#extension GL_EXT_shader_atomic_float: enable
+#pragma use_vulkan_memory_model
+
+layout(local_size_x = 16, local_size_y = 16) in;
+
+layout(binding = 0) buffer Buffer
+{
+    float dataf;
+    double datad;
+} buf;
+
+shared float  atomf;
+shared double atomd;
+
+layout(binding = 0, r32f) volatile coherent uniform image1D        fimage1D;
+layout(binding = 1, r32f) volatile coherent uniform image1DArray   fimage1DArray;
+layout(binding = 2, r32f) volatile coherent uniform image2D        fimage2D;
+layout(binding = 3, r32f) volatile coherent uniform image2DArray   fimage2DArray;
+layout(binding = 4, r32f) volatile coherent uniform image2DRect    fimage2DRect;
+layout(binding = 5, r32f) volatile coherent uniform imageCube      fimageCube;
+layout(binding = 6, r32f) volatile coherent uniform imageCubeArray fimageCubeArray;
+layout(binding = 9, r32f) volatile coherent uniform image3D        fimage3D;
+
+void main()
+{
+    //atomicAdd
+    float resultf = 0;
+    resultf = atomicAdd(atomf, 3.0);
+    resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(buf.dataf, 3.0);
+    resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    double resultd = 0;
+    resultd = atomicAdd(atomd, 3.0);
+    resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultd = atomicAdd(buf.datad, 3.0);
+    resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.dataf, resultf);
+    buf.dataf += resultf;
+    resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+    resultf = atomicExchange(atomf, resultf);
+    buf.dataf += resultf;
+    resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicExchange(buf.datad, resultd);
+    buf.datad += resultd;
+    resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+    resultd = atomicExchange(atomd, resultd);
+    buf.datad += resultd;
+    resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    // image atomics on 1D:
+    atomf = imageAtomicAdd(fimage1D, int(0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage1D, int(1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage1D, int(1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage1D, int(2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 1D Array:
+    atomf = imageAtomicAdd(fimage1DArray, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage1DArray, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage1DArray, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage1DArray, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D:
+    atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D Rect:
+    atomf = imageAtomicAdd(fimage2DRect, ivec2(0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2DRect, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2DRect, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2DRect, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 2D Array:
+    atomf = imageAtomicAdd(fimage2DArray, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage2DArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage2DArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage2DArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on Cube:
+    atomf = imageAtomicAdd(fimageCube, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimageCube, ivec3(1,0,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimageCube, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimageCube, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on Cube Array:
+    atomf = imageAtomicAdd(fimageCubeArray, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimageCubeArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimageCubeArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimageCubeArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    // image atomics on 3D:
+    atomf = imageAtomicAdd(fimage3D, ivec3(0,0,0), 2.0);
+    buf.dataf += atomf;
+    atomf = imageAtomicAdd(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicExchange(fimage3D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    atomf = imageAtomicLoad(fimage3D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+
+    imageAtomicStore(fimage3D, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
\ No newline at end of file
diff --git a/Test/spv.atomicFloat_Error.comp b/Test/spv.atomicFloat_Error.comp
new file mode 100644
index 0000000..b90b97f
--- /dev/null
+++ b/Test/spv.atomicFloat_Error.comp
@@ -0,0 +1,112 @@
+#version 450 core
+#extension GL_KHR_memory_scope_semantics : enable
+#pragma use_vulkan_memory_model
+
+layout(local_size_x = 16, local_size_y = 16) in;
+
+layout(binding = 0) buffer Buffer
+{
+    int    datai;
+    float  dataf;
+    double datad;
+} buf;
+
+shared int    atomi;
+shared float  atomf;
+shared double atomd;
+
+layout(binding = 0, r32f) volatile coherent uniform image1D fimage1D;
+layout(binding = 1, r32f) volatile coherent uniform image2D fimage2D;
+
+void undeclared_errors()
+{
+    //atomicAdd
+    float resultf = 0;
+    resultf = atomicAdd(atomf, 3.0);
+    resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(buf.dataf, 3.0);
+    resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    double resultd = 0;
+    resultd = atomicAdd(atomd, 3.0);
+    resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultd = atomicAdd(buf.datad, 3.0);
+    resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.dataf, resultf);
+    resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(atomf, resultf);
+    resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicExchange(buf.datad, resultd);
+    resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultd = atomicExchange(atomd, resultd);
+    resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.datad += resultd;
+
+    // image atomics:
+    atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
+
+#extension GL_EXT_shader_atomic_float: enable
+
+void main()
+{
+    float resultf = 0;
+    double resultd = 0;
+    int resulti = 0;
+
+    //atomicAdd
+    resultf = atomicAdd(atomi);
+    resultf = atomicAdd(atomi, 3.0);
+    resultf = atomicAdd(atomi, resultf, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+    resultf = atomicAdd(atomi, resultf, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+
+    //atomicExchange
+    resultf = atomicExchange(buf.datai);
+    resultf = atomicExchange(buf.datai, resultf);
+    resultf = atomicExchange(buf.datai, resultf, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(buf.datai, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    resultf = atomicExchange(atomi, resultf);
+    resultf = atomicExchange(atomi, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    buf.dataf += resultf;
+
+    //atomic load/store
+    resultf = atomicLoad(buf.datai, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+    atomicStore(buf.datai, resulti, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
+
+    // image atomics:
+    atomf = imageAtomicAdd(fimage1D, ivec2(0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, ivec3(0,0,0), 2.0);
+    atomf = imageAtomicAdd(fimage2D, 2.0);
+    atomf = imageAtomicExchange(fimage1D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicExchange(fimage2D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage1D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    atomf = imageAtomicLoad(fimage2D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage1D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    imageAtomicStore(fimage2D, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
+    buf.dataf += atomf;
+}
\ No newline at end of file
diff --git a/Test/spv.builtin.PrimitiveShadingRateEXT.vert b/Test/spv.builtin.PrimitiveShadingRateEXT.vert
new file mode 100644
index 0000000..6fd98c3
--- /dev/null
+++ b/Test/spv.builtin.PrimitiveShadingRateEXT.vert
@@ -0,0 +1,28 @@
+#version 450
+
+#extension GL_EXT_fragment_shading_rate : enable
+
+layout(location = 0) in int id;
+
+void main()
+{
+    switch (id)
+    {
+    case 0:
+        // V2 | H2 => 5
+        gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
+        break;
+    case 1:
+        // V2 | H4 => 9
+        gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
+        break;
+    case 2:
+        // V4 | H2 => 6
+        gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
+        break;
+    case 3:
+        // V4 | H4 => 10
+        gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
+        break;
+    }
+}
\ No newline at end of file
diff --git a/Test/spv.builtin.ShadingRateEXT.frag b/Test/spv.builtin.ShadingRateEXT.frag
new file mode 100644
index 0000000..616baec
--- /dev/null
+++ b/Test/spv.builtin.ShadingRateEXT.frag
@@ -0,0 +1,8 @@
+#version 450
+
+#extension GL_EXT_fragment_shading_rate : enable
+
+out highp int val;
+void main () {
+    val = gl_ShadingRateEXT;
+}
diff --git a/Test/spv.ext.AccelDecl.frag b/Test/spv.ext.AccelDecl.frag
new file mode 100644
index 0000000..4374bf3
--- /dev/null
+++ b/Test/spv.ext.AccelDecl.frag
@@ -0,0 +1,14 @@
+#version 460
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_GOOGLE_include_directive : enable
+#extension GL_EXT_scalar_block_layout : enable
+#extension GL_EXT_ray_query : enable
+
+layout(location = 0) out vec4 outColor;
+
+layout(binding = 1, set = 0) uniform accelerationStructureEXT topLevelAS;
+
+void main() {
+  outColor = vec4(0.0);
+}
diff --git a/Test/spv.ext.AnyHitShader.rahit b/Test/spv.ext.AnyHitShader.rahit
index ee7d9c7..871f8fe 100644
--- a/Test/spv.ext.AnyHitShader.rahit
+++ b/Test/spv.ext.AnyHitShader.rahit
@@ -1,5 +1,6 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
+#extension GL_KHR_shader_subgroup_basic : enable
 layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
 void main()
 {
@@ -22,8 +23,10 @@
     mat3x4 v16 = gl_ObjectToWorld3x4EXT;
     mat3x4 v17 = gl_WorldToObject3x4EXT;
 	incomingPayload = vec4(0.5f);
-	if (v2 == 1)
-	    ignoreIntersectionEXT();
-	else
-	    terminateRayEXT();
+	if (v2 == 1) {
+	    ignoreIntersectionEXT;
+	    v0.x++;
+	}
+	incomingPayload.x += float(gl_SubgroupSize);
+	terminateRayEXT;
 }
diff --git a/Test/spv.ext.ClosestHitShader_Errors.rchit b/Test/spv.ext.ClosestHitShader_Errors.rchit
index 05e05fe..6416f1f 100644
--- a/Test/spv.ext.ClosestHitShader_Errors.rchit
+++ b/Test/spv.ext.ClosestHitShader_Errors.rchit
@@ -2,12 +2,14 @@
 #extension GL_EXT_ray_tracing : enable
 hitAttributeEXT vec4 payload;
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-
+layout(location = 2) rayPayloadEXT vec4 payload0;
+layout(location = 2) rayPayloadInEXT block { vec4 data; }; // ERROR : location already used
 void main()
 {
     payload.x = 1.0f;                                       // ERROR, cannot write to hitattributeEXT in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage 
-    terminateRayEXT();
-    ignoreIntersectionEXT();
+    terminateRayEXT;
+    ignoreIntersectionEXT;
     bool e1 = gl_IncomingRayFlagsEXT == gl_RayFlagsSkipAABBEXT;
+    traceRayEXT(accEXT, 0, 0, 0, 0, 0, vec3(0.0), 0.0, vec3(1.0), 1.0, 0); //ERROR no payload variable with location = 0
 }
diff --git a/Test/spv.ext.ClosestHitShader_Subgroup.rchit b/Test/spv.ext.ClosestHitShader_Subgroup.rchit
new file mode 100644
index 0000000..ce2091a
--- /dev/null
+++ b/Test/spv.ext.ClosestHitShader_Subgroup.rchit
@@ -0,0 +1,16 @@
+#version 460
+#pragma use_vulkan_memory_model
+#extension GL_EXT_ray_tracing : enable
+#extension GL_NV_shader_sm_builtins : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_ARB_shader_ballot : enable
+#extension GL_NV_shader_sm_builtins : enable
+layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
+layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
+void main()
+{
+	traceRayEXT(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+        incomingPayload.x = float(gl_SubgroupInvocationID) + float(gl_SubGroupGeMaskARB) +
+			    float(gl_SubgroupGtMask) + float(gl_SubgroupLeMask) + 
+                            float(gl_SubGroupLtMaskARB) + float(gl_SMIDNV);
+}
diff --git a/Test/spv.ext.MissShader.rmiss b/Test/spv.ext.MissShader.rmiss
index e774334..982bd84 100644
--- a/Test/spv.ext.MissShader.rmiss
+++ b/Test/spv.ext.MissShader.rmiss
@@ -1,5 +1,9 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
+#extension GL_NV_shader_sm_builtins : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_ARB_shader_ballot : enable
+#extension GL_NV_shader_sm_builtins : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
 layout(location = 0) rayPayloadEXT vec4 localPayload;
 layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
@@ -12,4 +16,5 @@
 	float v4 = gl_RayTminEXT;
 	float v5 = gl_RayTmaxEXT;
 	traceRayEXT(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1);
+    incomingPayload.x = float(gl_SubGroupSizeARB) + float(gl_SubgroupEqMask) + float(gl_WarpIDNV);
 }
diff --git a/Test/spv.ext.MissShader_Errors.rmiss b/Test/spv.ext.MissShader_Errors.rmiss
index 2391211..c921f23 100644
--- a/Test/spv.ext.MissShader_Errors.rmiss
+++ b/Test/spv.ext.MissShader_Errors.rmiss
@@ -11,6 +11,6 @@
     float e12 = gl_HitTEXT;                                 // ERROR, unsupported builtin in stage
     float e13 = gl_HitKindEXT;                              // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                         // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                      // ERROR, unsupported builtin in stage
+    ignoreIntersectionEXT;                                  // ERROR, unsupported in stage
+    terminateRayEXT;                                        // ERROR, unsupported in stage
 }
diff --git a/Test/spv.ext.RayCallable_Errors.rcall b/Test/spv.ext.RayCallable_Errors.rcall
index d35672e..660ea75 100644
--- a/Test/spv.ext.RayCallable_Errors.rcall
+++ b/Test/spv.ext.RayCallable_Errors.rcall
@@ -3,7 +3,8 @@
 hitAttributeEXT vec4 hitattr;                                // ERROR, hitattributeEXT unsupported in this stage 
 rayPayloadEXT vec4 payload;                                  // ERROR, rayPayloadEXT unsupported in this stage
 rayPayloadInEXT vec4 payloadIn;                              // ERROR, rayPayloadInEXT unsupported in this stage
-
+layout(location = 0) callableDataEXT vec4 cd0;
+layout(location = 0) callableDataEXT float cd1;              // ERROR, location already used
 void main()
 {
     int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
@@ -21,6 +22,7 @@
     float e13 = gl_HitKindEXT;                               // ERROR, unsupported builtin in stage
     uint curFlags = gl_IncomingRayFlagsEXT;                  // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                 // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                       // ERROR, unsupported builtin in stage
+    ignoreIntersectionEXT;                                   // ERROR, unsupported in stage
+    terminateRayEXT;                                         // ERROR, unsupported in stage
+    executeCallableEXT(1,1);                                 // ERROR, no callable data with location 1
 }
diff --git a/Test/spv.ext.RayConstants.rgen b/Test/spv.ext.RayConstants.rgen
index 73cb0c1..8e681ba 100644
--- a/Test/spv.ext.RayConstants.rgen
+++ b/Test/spv.ext.RayConstants.rgen
@@ -1,7 +1,7 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 void main()
 {
     const uint rayFlags = gl_RayFlagsNoneEXT | gl_RayFlagsOpaqueEXT |
diff --git a/Test/spv.ext.RayGenSBTlayout.rgen b/Test/spv.ext.RayGenSBTlayout.rgen
new file mode 100644
index 0000000..a5fa2b6
--- /dev/null
+++ b/Test/spv.ext.RayGenSBTlayout.rgen
@@ -0,0 +1,28 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+// should get std430 layout
+layout(shaderRecordEXT) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr2[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/Test/spv.ext.RayGenSBTlayout140.rgen b/Test/spv.ext.RayGenSBTlayout140.rgen
new file mode 100644
index 0000000..7d673a8
--- /dev/null
+++ b/Test/spv.ext.RayGenSBTlayout140.rgen
@@ -0,0 +1,27 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, std140) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/Test/spv.ext.RayGenSBTlayout430.rgen b/Test/spv.ext.RayGenSBTlayout430.rgen
new file mode 100644
index 0000000..bd308b4
--- /dev/null
+++ b/Test/spv.ext.RayGenSBTlayout430.rgen
@@ -0,0 +1,27 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, std430) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/Test/spv.ext.RayGenSBTlayoutscalar.rgen b/Test/spv.ext.RayGenSBTlayoutscalar.rgen
new file mode 100644
index 0000000..16bcb13
--- /dev/null
+++ b/Test/spv.ext.RayGenSBTlayoutscalar.rgen
@@ -0,0 +1,28 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+#extension GL_EXT_scalar_block_layout : enable
+layout(location = 1) rayPayloadEXT vec4 payload;
+layout(shaderRecordEXT, scalar) buffer block
+{
+    vec3 dir;
+    vec3 origin;
+    int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
+    vec2 arr[2];
+    float a;
+    vec3 arr3[2];
+    float packme;
+    vec2 b;
+    float c;
+};
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+}
diff --git a/Test/spv.ext.RayGenShader.rgen b/Test/spv.ext.RayGenShader.rgen
index c92772e..e9eb2cb 100644
--- a/Test/spv.ext.RayGenShader.rgen
+++ b/Test/spv.ext.RayGenShader.rgen
@@ -1,16 +1,17 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 #extension GL_EXT_ray_flags_primitive_culling : enable
-layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0;
+layout(binding = 0) uniform accelerationStructureEXT accEXT0;
 layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1; // Unused
 layout(binding = 2, r32ui) shadercallcoherent uniform uimage2D imageu;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
 	vec3 origin;
 
 };
+layout(primitive_culling);
 void main()
 {
     uint lx = gl_LaunchIDEXT.x;
diff --git a/Test/spv.ext.RayGenShader11.rgen b/Test/spv.ext.RayGenShader11.rgen
index 4817026..50853d4 100644
--- a/Test/spv.ext.RayGenShader11.rgen
+++ b/Test/spv.ext.RayGenShader11.rgen
@@ -1,7 +1,7 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
diff --git a/Test/spv.ext.RayGenShaderArray.rgen b/Test/spv.ext.RayGenShaderArray.rgen
index d3f99de..66286d9 100644
--- a/Test/spv.ext.RayGenShaderArray.rgen
+++ b/Test/spv.ext.RayGenShaderArray.rgen
@@ -1,14 +1,17 @@
 #version 460
 #extension GL_EXT_ray_tracing : enable
 #extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_ARB_gpu_shader_int64 : enable
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0[];
 layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1[2];
-layout(location = 0) rayPayloadEXT vec4 payload;
+layout(location = 1) rayPayloadEXT vec4 payload;
 layout(shaderRecordEXT) buffer block
 {
 	vec3 dir;
 	vec3 origin;
     int i;
+    uvec2 aHandle32;
+    uint64_t aHandle64;
 };
 void main()
 {
@@ -19,4 +22,6 @@
     traceRayEXT(accEXT0[i], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
     traceRayEXT(accEXT1[i], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
     traceRayEXT(accEXT0[nonuniformEXT(i)], lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle32), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
+    traceRayEXT(accelerationStructureEXT(aHandle64), lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1);
 }
diff --git a/Test/spv.ext.RayGenShader_Errors.rgen b/Test/spv.ext.RayGenShader_Errors.rgen
index 3498342..107df0f 100644
--- a/Test/spv.ext.RayGenShader_Errors.rgen
+++ b/Test/spv.ext.RayGenShader_Errors.rgen
@@ -20,7 +20,7 @@
 };
 void main()
 {
-    accelerationStructureEXT a = 0;
+    accelerationStructureEXT a = accelerationStructureEXT(c);
     int e0 = gl_PrimitiveID;                                // ERROR, unsupported builtin in stage
     int e1 = gl_InstanceID;                                 // ERROR, unsupported builtin in stage
     int e3 = gl_InstanceCustomIndexEXT;                      // ERROR, unsupported builtin in stage
@@ -36,7 +36,7 @@
     float e13 = gl_HitKindEXT;                               // ERROR, unsupported builtin in stage
     int e14 = gl_RayFlagsSkipAABBEXT;                        // ERROR, unsupported builtin in stage
     reportIntersectionEXT(1.0, 1U);                          // ERROR, unsupported builtin in stage
-    ignoreIntersectionEXT();                                 // ERROR, unsupported builtin in stage
-    terminateRayEXT();                                       // ERROR, unsupported builtin in stage
-    d = 1.0f;                                               // ERROR, can't modify shaderRecordEXT block
+    ignoreIntersectionEXT;                                   // ERROR, unsupported builtin in stage
+    terminateRayEXT;                                         // ERROR, unsupported builtin in stage
+    d = 1.0f;                                                // ERROR, can't modify shaderRecordEXT block
 }
diff --git a/Test/spv.ext.RayPrimCull_Errors.rgen b/Test/spv.ext.RayPrimCull_Errors.rgen
new file mode 100644
index 0000000..0fceccf
--- /dev/null
+++ b/Test/spv.ext.RayPrimCull_Errors.rgen
@@ -0,0 +1,10 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+layout(primitive_culling);
+#extension GL_EXT_ray_flags_primitive_culling : enable
+layout(primitive_culling) uniform;
+layout(primitive_culling, binding = 2) uniform accelerationStructureEXT as;
+layout(std140, binding = 2, primitive_culling) buffer block { int x; };
+void main()
+{
+}
diff --git a/Test/spv.ext.RayQueryDecl.frag b/Test/spv.ext.RayQueryDecl.frag
new file mode 100644
index 0000000..8a144d6
--- /dev/null
+++ b/Test/spv.ext.RayQueryDecl.frag
@@ -0,0 +1,14 @@
+#version 460
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_EXT_nonuniform_qualifier : enable
+#extension GL_GOOGLE_include_directive : enable
+#extension GL_EXT_scalar_block_layout : enable
+#extension GL_EXT_ray_query : enable
+
+layout(location = 0) out vec4 outColor;
+
+rayQueryEXT rq;
+
+void main() {
+  outColor = vec4(0.0);
+}
diff --git a/Test/spv.ext.World3x4.rahit b/Test/spv.ext.World3x4.rahit
new file mode 100644
index 0000000..4f541f8
--- /dev/null
+++ b/Test/spv.ext.World3x4.rahit
@@ -0,0 +1,21 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+
+hitAttributeEXT vec3 attribs;
+layout(location = 0) rayPayloadInEXT vec3 hitValue;
+layout(set = 0, binding = 0, r32i) uniform iimage3D result;
+
+void main()
+{
+  float k = 1048576.0f;
+  int ndx = -1;
+  for (int col = 0; col < 3; col++)
+  for (int row = 0; row < 4; row++)
+  {
+    ndx++;
+    ivec3 p = ivec3(gl_LaunchIDEXT.xy, ndx);
+    float r = k * gl_WorldToObject3x4EXT[col][row];
+    ivec4 c = ivec4(int(r),0,0,1);
+    imageStore(result, p, c);
+  }
+}
diff --git a/Test/spv.imageAtomic64.frag b/Test/spv.imageAtomic64.frag
new file mode 100644
index 0000000..bd671d9
--- /dev/null
+++ b/Test/spv.imageAtomic64.frag
@@ -0,0 +1,92 @@
+#version 450 core

+

+#extension GL_ARB_gpu_shader_int64: enable

+#extension GL_EXT_shader_image_int64: enable

+#extension GL_KHR_memory_scope_semantics: enable

+#extension GL_ARB_sparse_texture2: enable

+ 

+layout(binding = 0, r64i)  uniform i64image1D i1D;

+layout(binding = 1, r64ui) uniform u64image2D u2D;

+layout(binding = 2, r64i)  uniform i64image3D i3D;

+layout(binding = 3, r64ui) uniform u64imageCube uCube;

+layout(binding = 4, r64i)  uniform i64imageBuffer iBuf;

+layout(binding = 5, r64ui) uniform u64image1DArray u1DArray;

+layout(binding = 6, r64i)  uniform i64image2DArray i2DArray;

+layout(binding = 7, r64ui) uniform u64imageCubeArray uCubeArray;

+layout(binding = 8, r64i)  uniform i64image2DRect i2DRect;

+layout(binding = 9, r64ui) uniform u64image2DMS u2DMS;

+layout(binding = 10, r64i) uniform i64image2DMSArray i2DMSArray;

+

+layout(binding = 11) buffer Buf

+{

+    int64_t i64;

+    uint64_t u64;

+    i64vec4 i64v4;

+    u64vec4 u64v4;

+    ivec4 i32v4;

+};

+

+void main()

+{

+    i64 = imageAtomicAdd(i1D, i32v4.x, i64);

+    i64 = imageAtomicMin(i3D, i32v4.xyz, i64);

+    i64 = imageAtomicMax(iBuf, i32v4.x, i64);

+    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64);

+    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64);

+    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64);

+    i64 = imageAtomicExchange(i1D, i32v4.x, i64);

+    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1);

+

+    i64 = imageAtomicAdd(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicMin(i3D, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicMax(iBuf, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicExchange(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1, gl_ScopeDevice,

+            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    i64 = imageAtomicLoad(iBuf, i32v4.x, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    imageAtomicStore(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+

+    u64 = imageAtomicAdd(u2D, i32v4.xy, u64);

+    u64 = imageAtomicMin(uCube, i32v4.xyz, u64);

+    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64);

+    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64);

+    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64);

+    u64 = imageAtomicXor(u2D, i32v4.xy, u64);

+    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64);

+    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1);

+

+    u64 = imageAtomicAdd(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicMin(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicXor(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1, gl_ScopeDevice,

+            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    u64 = imageAtomicLoad(uCubeArray, i32v4.xyz, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+    imageAtomicStore(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);

+

+    i64v4 += imageLoad(i1D, i32v4.x);

+    i64v4 += imageLoad(i3D, i32v4.xyz);

+    i64v4 += imageLoad(iBuf, i32v4.x);

+    i64v4 += imageLoad(i2DArray, i32v4.xyz);

+    i64v4 += imageLoad(i2DRect, i32v4.xy);

+    i64v4 += imageLoad(i2DMSArray, i32v4.xyz, i32v4.w);

+

+    imageStore(u2D, i32v4.xy, u64v4);

+    imageStore(uCube, i32v4.xyz, u64v4);

+    imageStore(u1DArray, i32v4.xy, u64v4);

+    imageStore(uCubeArray, i32v4.xyz, u64v4);

+    imageStore(u2DMS, i32v4.xy, i32v4.z, u64v4);

+

+    sparseImageLoadARB(i3D, i32v4.xyz, i64v4);

+    sparseImageLoadARB(i2DArray, i32v4.xyz, i64v4);

+    sparseImageLoadARB(i2DRect, i32v4.xy, i64v4);

+    sparseImageLoadARB(u2D, i32v4.xy, u64v4);

+    sparseImageLoadARB(uCube, i32v4.xyz, u64v4);

+    sparseImageLoadARB(uCubeArray, i32v4.xyz, u64v4);

+}
\ No newline at end of file
diff --git a/Test/spv.imageLoadStoreLod.frag b/Test/spv.imageLoadStoreLod.frag
index 0da1da1..ed3cad2 100644
--- a/Test/spv.imageLoadStoreLod.frag
+++ b/Test/spv.imageLoadStoreLod.frag
@@ -1,6 +1,8 @@
 #version 450 core

 

 #extension GL_AMD_shader_image_load_store_lod: enable

+#extension GL_ARB_gpu_shader_int64: enable

+#extension GL_EXT_shader_image_int64: enable

 

 layout(rgba32f,  binding = 0) uniform image1D         i1D;

 layout(rgba32f,  binding = 1) uniform image2D         i2D;

@@ -12,6 +14,20 @@
 

 layout(location = 0) out vec4 fragColor;

 

+layout(r64i,  binding = 7)  uniform i64image1D        i64i1D;

+layout(r64i,  binding = 8)  uniform i64image2D        i64i2D;

+layout(r64i,  binding = 9)  uniform i64image3D        i64i3D;

+layout(r64ui, binding = 10) uniform u64imageCube      u64iCube;

+layout(r64ui, binding = 11) uniform u64image1DArray   u64i1DArray;

+layout(r64ui, binding = 12) uniform u64image2DArray   u64i2DArray;

+layout(r64ui, binding = 13) uniform u64imageCubeArray u64iCubeArray;

+

+layout(binding = 14) buffer Buf

+{

+    i64vec4 i64v4;

+    u64vec4 u64v4;

+};

+

 void main()

 {

     const int c1 = 1;

@@ -33,4 +49,14 @@
     sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4);

 

     fragColor = f4 + vec4(u4);

+

+    i64v4 += imageLoadLodAMD(i64i1D, c1, lod);

+    i64v4 += imageLoadLodAMD(i64i2D, c2, lod);

+    i64v4 += imageLoadLodAMD(i64i3D, c3, lod);

+

+    imageStoreLodAMD(u64iCube, c3, lod, u64v4);

+    imageStoreLodAMD(u64i1DArray, c2, lod, u64v4);

+

+    sparseImageLoadLodAMD(u64i2DArray, c3, lod, u64v4);

+    sparseImageLoadLodAMD(u64iCubeArray, c3, lod, u64v4);

 }
\ No newline at end of file
diff --git a/Test/spv.layer.tese b/Test/spv.layer.tese
new file mode 100644
index 0000000..b0ce079
--- /dev/null
+++ b/Test/spv.layer.tese
@@ -0,0 +1,8 @@
+#version 450
+
+#extension GL_ARB_shader_viewport_layer_array : require
+
+layout(triangles) in;
+void main() {
+  gl_Layer = 1;
+}
diff --git a/Test/spv.nonuniform.frag b/Test/spv.nonuniform.frag
index d3b05a5..cf7ebed 100644
--- a/Test/spv.nonuniform.frag
+++ b/Test/spv.nonuniform.frag
@@ -5,6 +5,7 @@
 layout(location=0) nonuniformEXT in vec4 nu_inv4;

 nonuniformEXT float nu_gf;

 layout(location=1) in nonuniformEXT flat int nu_ii;

+layout(location = 2) in vec2 inTexcoord;

 

 layout(binding=0, input_attachment_index = 0) uniform subpassInput        inputAttachmentDyn[];

 layout(binding=1)                             uniform samplerBuffer       uniformTexelBufferDyn[];

@@ -16,6 +17,8 @@
 layout(binding=7, input_attachment_index = 1) uniform subpassInput        inputAttachment[];

 layout(binding=8)                             uniform samplerBuffer       uniformTexelBuffer[];

 layout(binding=9, r32f)                       uniform imageBuffer         storageTexelBuffer[];

+layout(binding = 10)                          uniform texture2D           uniformTexArr[8];

+layout(binding = 11)                          uniform sampler             uniformSampler;

 

 nonuniformEXT int foo(nonuniformEXT int nupi, nonuniformEXT out int f)

 {

@@ -25,10 +28,12 @@
 void main()

 {

     nonuniformEXT int nu_li;

+    nonuniformEXT int nu_li2;

     int dyn_i;

 

     int a = foo(nu_li, nu_li);

     nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);

+    nu_li2 = a + nonuniformEXT(a * 2);

 

     float b;

     b = nu_inv4.x * nu_gf;

@@ -42,14 +47,26 @@
     b += subpassLoad(inputAttachment[nu_ii]).x;

     b += texelFetch(uniformTexelBuffer[nu_ii], 1).x;

     b += imageLoad(storageTexelBuffer[nu_ii], 1).x;

+    b += texture(sampler2D(uniformTexArr[nu_ii], uniformSampler), inTexcoord.xy).x;

+    b += texture(nonuniformEXT(sampler2D(uniformTexArr[nu_ii], uniformSampler)), inTexcoord.xy).x;

 

     nonuniformEXT ivec4 v;

     nonuniformEXT mat4 m;

     nonuniformEXT struct S { int a; } s;

+    nonuniformEXT int arr[10];

     ivec4 uv;

+    mat4 um;

+    struct US { int a[10]; } us;

+    int uarr[10];

     b += uniformBuffer[v.y].a;

     b += uniformBuffer[v[2]].a;

     b += uniformBuffer[uv[nu_ii]].a;

     b += uniformBuffer[int(m[2].z)].a;

     b += uniformBuffer[s.a].a;

+    b += uniformBuffer[arr[2]].a;

+    b += uniformBuffer[int(um[nu_ii].z)].a;

+    b += uniformBuffer[us.a[nu_ii]].a;

+    b += uniformBuffer[uarr[nu_ii]].a;

+

+    storageBuffer[nu_ii].b = b;

 }

diff --git a/Test/spv.nullInit.comp b/Test/spv.nullInit.comp
new file mode 100644
index 0000000..256fd54
--- /dev/null
+++ b/Test/spv.nullInit.comp
@@ -0,0 +1,32 @@
+#version 460

+

+#extension GL_EXT_null_initializer : enable

+

+#ifdef GL_EXT_null_initializer

+

+struct S {

+    vec3[4] v;

+    int a;

+};

+

+struct T {

+    int b;

+    S s;

+};

+

+shared float f = { };

+shared T t1 = { };

+shared T t2 = { };

+shared S s = { };

+shared float g = { };

+shared int i = { };

+

+void main()

+{

+    S local = { };

+    ++local.a;

+}

+

+S global = { };

+

+#endif

diff --git a/Test/spv.paramMemory.420.frag b/Test/spv.paramMemory.420.frag
new file mode 100644
index 0000000..15f175a
--- /dev/null
+++ b/Test/spv.paramMemory.420.frag
@@ -0,0 +1,33 @@
+#version 420
+
+// Need this extension to permit passing a formatless readonly image to a helper function.
+#extension GL_EXT_shader_image_load_formatted : require
+
+readonly coherent uniform layout(set = 0, binding = 0) image2D image1;
+readonly uniform layout(set = 0, binding = 2) image2D image2;
+writeonly coherent uniform layout(set = 0, binding = 1, rgba32f) image2D image3;
+writeonly uniform layout(set = 0, binding = 3, rgba16f) image2D image4;
+
+flat in layout(location = 0) ivec2 in_coords;
+out layout(location = 0) vec4 out_color;
+
+vec4 image_load(readonly coherent image2D image, ivec2 coords)
+{
+	return imageLoad(image, in_coords);
+}
+
+void image_store(writeonly coherent image2D image, ivec2 coords, vec4 data)
+{
+	imageStore(image, in_coords, data);
+}
+
+void main()
+{
+	vec4 read1 = image_load(image1, in_coords);
+	vec4 read2 = image_load(image2, in_coords);
+
+	image_store(image3, in_coords, read1*0.5);
+	image_store(image4, in_coords, read2*2.0);
+
+	out_color = vec4(0.0);
+}
diff --git a/Test/spv.precision.frag b/Test/spv.precision.frag
index 090c1a6..463afdf 100644
--- a/Test/spv.precision.frag
+++ b/Test/spv.precision.frag
@@ -57,4 +57,6 @@
     

     mediumfout *= s.a;

     mediumfout *= s.b;

+

+    mediumfout = ((mediumfin * mediumfin > 4.2) ? 2.0 * mediumfout : 3.0 * mediumfout);

 }

diff --git a/Test/spv.precisionArgs.frag b/Test/spv.precisionArgs.frag
new file mode 100644
index 0000000..4a968cb
--- /dev/null
+++ b/Test/spv.precisionArgs.frag
@@ -0,0 +1,27 @@
+#version 310 es
+
+precision mediump float;
+
+void fooConst(const in float f, const in highp float g) { }
+
+void foo(in float f, in highp float g) { }
+
+      float retM (      float x) { return x; }
+highp float retH (highp float x) { return x; }
+      float retHM(highp float x) { return x; }
+highp float retMH(      float x) { return x; }
+
+void main()
+{
+    float aM, bM;
+    highp float aH, bH;
+    fooConst(aM, bM);   // must copy bM
+    fooConst(aH, bH);   // must copy aH
+    foo(aM, bM);
+    foo(aH, bH);
+
+    retM(aM);
+    retH(aH);
+    retHM(aH);
+    retMH(aM);
+}
diff --git a/Test/spv.precisionTexture.frag b/Test/spv.precisionTexture.frag
new file mode 100644
index 0000000..7868889
--- /dev/null
+++ b/Test/spv.precisionTexture.frag
@@ -0,0 +1,24 @@
+#version 310 es

+precision mediump float;

+precision mediump int;

+layout(binding = 0) uniform mediump sampler2D texM;

+layout(binding = 1) uniform highp sampler2D texH;

+layout(binding = 0, rgba32f) uniform readonly mediump image2D imageM;

+layout(binding = 1, rgba32f) uniform readonly highp image2D imageH;

+

+layout(location = 0) in highp vec4 vertex;

+layout(location = 1) flat in highp ivec2 coord;

+layout(location = 0) out vec4 fragColor;

+

+void main()

+{

+    vec4 v;

+    v = texture(texM, vertex.xy);

+    v = texture(texH, vertex.xy);

+    v = textureLod(texM, vertex.xy, vertex.z);

+    v = textureLod(texH, vertex.xy, vertex.z);

+    v = textureProj(texM, vertex.xyz);

+    v = textureProj(texH, vertex.xyz);

+    v = imageLoad(imageM, coord);

+    v = imageLoad(imageH, coord);

+}
\ No newline at end of file
diff --git a/Test/spv.queueFamilyScope.comp b/Test/spv.queueFamilyScope.comp
new file mode 100644
index 0000000..0d79850
--- /dev/null
+++ b/Test/spv.queueFamilyScope.comp
@@ -0,0 +1,10 @@
+#version 450

+#extension GL_KHR_memory_scope_semantics : require

+

+layout (binding = 0) buffer Buffer { uint a; } A;

+

+void main()

+{

+    atomicLoad(A.a, gl_ScopeQueueFamily, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);

+}

+

diff --git a/Test/spv.specConstArrayCheck.vert b/Test/spv.specConstArrayCheck.vert
old mode 100755
new mode 100644
diff --git a/Test/spv.specConstant.float16.comp b/Test/spv.specConstant.float16.comp
new file mode 100644
index 0000000..d729cb9
--- /dev/null
+++ b/Test/spv.specConstant.float16.comp
@@ -0,0 +1,18 @@
+#version 450
+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
+
+layout(constant_id = 1) const float16_t sc0 = 9.5hf;
+layout(constant_id = 2) const float16_t sc1 = -14.25hf;
+
+layout (set = 0, binding = 0, std430) writeonly buffer Output {
+    float16_t r0;
+    float16_t r1;
+} sb_out;
+
+
+void main (void)
+{
+    sb_out.r0 = sc0;
+    sb_out.r1 = sc1;
+}
+
diff --git a/Test/spv.specConstant.int16.comp b/Test/spv.specConstant.int16.comp
new file mode 100644
index 0000000..80f6300
--- /dev/null
+++ b/Test/spv.specConstant.int16.comp
@@ -0,0 +1,18 @@
+#version 450
+#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require
+
+layout(constant_id = 1) const int16_t sc0 = 20000s;
+layout(constant_id = 2) const int16_t sc1 = -20000s;
+
+layout (set = 0, binding = 0, std430) writeonly buffer Output {
+    int16_t r0;
+    int16_t r1;
+} sb_out;
+
+
+void main (void)
+{
+    sb_out.r0 = sc0;
+    sb_out.r1 = sc1;
+}
+
diff --git a/Test/spv.specConstant.int8.comp b/Test/spv.specConstant.int8.comp
new file mode 100644
index 0000000..e2b6318
--- /dev/null
+++ b/Test/spv.specConstant.int8.comp
@@ -0,0 +1,18 @@
+#version 450
+#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require
+
+layout(constant_id = 1) const int8_t sc0 = int8_t(127);
+layout(constant_id = 2) const int8_t sc1 = int8_t(-127);
+
+layout (set = 0, binding = 0, std430) writeonly buffer Output {
+    int8_t r0;
+    int8_t r1;
+} sb_out;
+
+
+void main (void)
+{
+    sb_out.r0 = sc0;
+    sb_out.r1 = sc1;
+}
+
diff --git a/Test/spv.terminate.frag b/Test/spv.terminate.frag
new file mode 100644
index 0000000..2555877
--- /dev/null
+++ b/Test/spv.terminate.frag
@@ -0,0 +1,8 @@
+#version 400

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    terminateInvocation;

+}

diff --git a/Test/spv.uniformInitializer.frag b/Test/spv.uniformInitializer.frag
new file mode 100644
index 0000000..cdae1c1
--- /dev/null
+++ b/Test/spv.uniformInitializer.frag
@@ -0,0 +1,10 @@
+#version 450
+
+layout (location = 0) out vec4 color;
+
+layout (location = 0) uniform vec4 in_color = vec4(0.0, 1.0, 0.0, 1.0);
+
+void main()
+{
+	color = in_color;
+}
diff --git a/Test/spv.uniformInitializerSpecConstant.frag b/Test/spv.uniformInitializerSpecConstant.frag
new file mode 100644
index 0000000..289d61a
--- /dev/null
+++ b/Test/spv.uniformInitializerSpecConstant.frag
@@ -0,0 +1,14 @@
+#version 450
+
+layout (location = 0) out vec4 color;
+
+layout (constant_id = 1) const float opacity = 0.5;
+
+layout (location = 0) uniform vec3 in_color = vec3(1.0, 0.5, 0);
+
+layout (location = 4) uniform float foo = opacity;
+
+void main()
+{
+	color = vec4(in_color, foo);
+}
diff --git a/Test/spv.uniformInitializerStruct.frag b/Test/spv.uniformInitializerStruct.frag
new file mode 100644
index 0000000..b614806
--- /dev/null
+++ b/Test/spv.uniformInitializerStruct.frag
@@ -0,0 +1,19 @@
+#version 450
+
+layout (location = 0) out vec4 color;
+
+layout (location = 0) uniform struct {
+        float r;
+        float g;
+        float b;
+} parts[2] = { { 1.0, 1.0, 1.0}, { 0.0, 1.0, 0.0 } };
+
+void main() {
+  color = vec4(0.0, 0.0, 0.0, 1.0);
+
+  for (int i = 0; i < 2; i++) {
+    color.r += parts[i].r;
+    color.g += parts[i].g;
+    color.b += parts[i].b;
+  }
+}
diff --git a/Test/spv.viewportindex.tese b/Test/spv.viewportindex.tese
new file mode 100644
index 0000000..0da4cc8
--- /dev/null
+++ b/Test/spv.viewportindex.tese
@@ -0,0 +1,8 @@
+#version 450
+
+#extension GL_ARB_shader_viewport_layer_array : require
+
+layout(triangles) in;
+void main() {
+  gl_ViewportIndex = 1;
+}
diff --git a/Test/terminate.frag b/Test/terminate.frag
new file mode 100644
index 0000000..32f1495
--- /dev/null
+++ b/Test/terminate.frag
@@ -0,0 +1,10 @@
+#version 400

+

+void foo() { terminateInvocation; } // ERROR: identifier undeclared

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    int terminateInvocation;  // syntax ERROR

+}

diff --git a/Test/terminate.vert b/Test/terminate.vert
new file mode 100644
index 0000000..1d4eea9
--- /dev/null
+++ b/Test/terminate.vert
@@ -0,0 +1,10 @@
+#version 400

+

+void foo() { terminateInvocation; } // ERROR: identifier undeclared

+

+#extension GL_EXT_terminate_invocation : enable

+

+void main()

+{

+    terminateInvocation;  // ERROR: wrong stage

+}

diff --git a/Test/tokenPaste.vert b/Test/tokenPaste.vert
index 40de6f9..c4515d4 100644
--- a/Test/tokenPaste.vert
+++ b/Test/tokenPaste.vert
@@ -51,6 +51,18 @@
 // non-identifiers
 int a = simplePaste(11,12);
 
+// should work in #if as well
+#define seahorse 1
+#define sealion 0
+#define marine_animal(suffix) (sea ## suffix)
+
+#if marine_animal(horse) // should pass
+uniform float seahorse_var;
+#endif
+#if !marine_animal(lion) // should pass
+uniform float sealion_var;
+#endif
+
 // operators
 #define MAKE_OP(L, R) L ## R

 const int aop = 10;

diff --git a/Test/vulkan.comp b/Test/vulkan.comp
index 6b6f4cf..98d93ed 100644
--- a/Test/vulkan.comp
+++ b/Test/vulkan.comp
@@ -7,6 +7,27 @@
 void main()

 {

     gl_WorkGroupSize;

+    int i = { };  // ERROR, need an extension

 }

 

 layout(local_size_y_id = 19) in; // ERROR, already used: TODO not yet reported

+

+shared float f = { };  // ERROR, need an extension

+float g = { };         // ERROR, need an extension

+

+#extension GL_EXT_null_initializer : enable

+

+shared float f2 = { };

+float g2 = { };

+

+void foo()

+{

+    int i = { };

+    float fa[] = { };

+}

+

+struct samp {

+    sampler2D s2D;

+} sampVar = { };

+

+atomic_uint a = { };

diff --git a/Test/xfbUnsizedArray.error.vert b/Test/xfbUnsizedArray.error.vert
new file mode 100644
index 0000000..5beb9f8
--- /dev/null
+++ b/Test/xfbUnsizedArray.error.vert
@@ -0,0 +1,16 @@
+#version 430 core

+#extension GL_ARB_enhanced_layouts : require

+

+layout (xfb_offset = 0) out vec4 xfb_buffer[]; // ERROR: unsized array cannot be used for an xfb buffer?

+

+in  vec4 in_vs;

+out vec4 out_vs;

+

+void main()

+{

+    vec4 result = in_vs;

+

+    xfb_buffer[0] = result / 2;

+

+    out_vs = result;

+}

diff --git a/WORKSPACE b/WORKSPACE
index 3c38e61..488546c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -6,9 +6,9 @@
 
 http_archive(
     name = "com_google_googletest",
-    sha256 = "ef9e2e12e7bf115ee48b427ae171fc869eeaf1b532c0fcfd982f6a353d2471b4",
-    strip_prefix = "googletest-37ae1fc5e6be26f367d76c078beabd7024fed53a",
-    urls = ["https://github.com/google/googletest/archive/37ae1fc5e6be26f367d76c078beabd7024fed53a.zip"],  # 2018-07-16
+    sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
+    strip_prefix = "googletest-release-1.10.0",
+    urls = ["https://github.com/google/googletest/archive/release-1.10.0.zip"],  # 3-Oct-2019
 )
 
 http_archive(
diff --git a/build_info.h.tmpl b/build_info.h.tmpl
new file mode 100644
index 0000000..eacecb0
--- /dev/null
+++ b/build_info.h.tmpl
@@ -0,0 +1,62 @@
+// Copyright (C) 2020 The Khronos Group Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of The Khronos Group Inc. nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GLSLANG_BUILD_INFO
+#define GLSLANG_BUILD_INFO
+
+#define GLSLANG_VERSION_MAJOR <major>
+#define GLSLANG_VERSION_MINOR <minor>
+#define GLSLANG_VERSION_PATCH <patch>
+#define GLSLANG_VERSION_FLAVOR "<flavor>"
+
+#define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \
+    (((major) > GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+    (((minor) > GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+     ((patch) > GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \
+    (((major) > GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+    (((minor) > GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+     ((patch) >= GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \
+    (((major) < GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+    (((minor) < GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+     ((patch) < GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \
+    (((major) < GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+    (((minor) < GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+     ((patch) <= GLSLANG_VERSION_PATCH)))))
+
+#endif // GLSLANG_BUILD_INFO
diff --git a/build_info.py b/build_info.py
new file mode 100755
index 0000000..2ac864b
--- /dev/null
+++ b/build_info.py
@@ -0,0 +1,226 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import datetime
+import errno
+import os
+import os.path
+import re
+import subprocess
+import sys
+import time
+
+usage = """{} emits a string to stdout or file with project version information.
+
+args: <project-dir> [<input-string>] [-i <input-file>] [-o <output-file>]
+
+Either <input-string> or -i <input-file> needs to be provided.
+
+The tool will output the provided string or file content with the following
+tokens substituted:
+
+ <major>   - The major version point parsed from the CHANGES.md file.
+ <minor>   - The minor version point parsed from the CHANGES.md file.
+ <patch>   - The point version point parsed from the CHANGES.md file.
+ <flavor>  - The optional dash suffix parsed from the CHANGES.md file (excluding
+             dash prefix).
+ <-flavor> - The optional dash suffix parsed from the CHANGES.md file (including
+             dash prefix).
+ <date>    - The optional date of the release in the form YYYY-MM-DD
+ <commit>  - The git commit information for the directory taken from
+             "git describe" if that succeeds, or "git rev-parse HEAD"
+             if that succeeds, or otherwise a message containing the phrase
+             "unknown hash".
+
+-o is an optional flag for writing the output string to the given file. If
+   ommitted then the string is printed to stdout.
+"""
+
+def mkdir_p(directory):
+    """Make the directory, and all its ancestors as required.  Any of the
+    directories are allowed to already exist."""
+
+    if directory == "":
+        # We're being asked to make the current directory.
+        return
+
+    try:
+        os.makedirs(directory)
+    except OSError as e:
+        if e.errno == errno.EEXIST and os.path.isdir(directory):
+            pass
+        else:
+            raise
+
+
+def command_output(cmd, directory):
+    """Runs a command in a directory and returns its standard output stream.
+
+    Captures the standard error stream.
+
+    Raises a RuntimeError if the command fails to launch or otherwise fails.
+    """
+    p = subprocess.Popen(cmd,
+                         cwd=directory,
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE)
+    (stdout, _) = p.communicate()
+    if p.returncode != 0:
+        raise RuntimeError('Failed to run %s in %s' % (cmd, directory))
+    return stdout
+
+
+def deduce_software_version(directory):
+    """Returns a software version number parsed from the CHANGES.md file
+    in the given directory.
+
+    The CHANGES.md file describes most recent versions first.
+    """
+
+    # Match the first well-formed version-and-date line.
+    # Allow trailing whitespace in the checked-out source code has
+    # unexpected carriage returns on a linefeed-only system such as
+    # Linux.
+    pattern = re.compile(r'^#* +(\d+)\.(\d+)\.(\d+)(-\w+)? (\d\d\d\d-\d\d-\d\d)? *$')
+    changes_file = os.path.join(directory, 'CHANGES.md')
+    with open(changes_file, mode='r') as f:
+        for line in f.readlines():
+            match = pattern.match(line)
+            if match:
+                flavor = match.group(4)
+                if flavor == None:
+                    flavor = ""
+                return {
+                    "major": match.group(1),
+                    "minor": match.group(2),
+                    "patch": match.group(3),
+                    "flavor": flavor.lstrip("-"),
+                    "-flavor": flavor,
+                    "date": match.group(5),
+                }
+    raise Exception('No version number found in {}'.format(changes_file))
+
+
+def describe(directory):
+    """Returns a string describing the current Git HEAD version as descriptively
+    as possible.
+
+    Runs 'git describe', or alternately 'git rev-parse HEAD', in directory.  If
+    successful, returns the output; otherwise returns 'unknown hash, <date>'."""
+    try:
+        # decode() is needed here for Python3 compatibility. In Python2,
+        # str and bytes are the same type, but not in Python3.
+        # Popen.communicate() returns a bytes instance, which needs to be
+        # decoded into text data first in Python3. And this decode() won't
+        # hurt Python2.
+        return command_output(['git', 'describe'], directory).rstrip().decode()
+    except:
+        try:
+            return command_output(
+                ['git', 'rev-parse', 'HEAD'], directory).rstrip().decode()
+        except:
+            # This is the fallback case where git gives us no information,
+            # e.g. because the source tree might not be in a git tree.
+            # In this case, usually use a timestamp.  However, to ensure
+            # reproducible builds, allow the builder to override the wall
+            # clock time with environment variable SOURCE_DATE_EPOCH
+            # containing a (presumably) fixed timestamp.
+            timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))
+            formatted = datetime.datetime.utcfromtimestamp(timestamp).isoformat()
+            return 'unknown hash, {}'.format(formatted)
+
+def parse_args():
+    directory = None
+    input_string = None
+    input_file = None
+    output_file = None
+
+    if len(sys.argv) < 2:
+        raise Exception("Invalid number of arguments")
+
+    directory = sys.argv[1]
+    i = 2
+
+    if not sys.argv[i].startswith("-"):
+        input_string = sys.argv[i]
+        i = i + 1
+
+    while i < len(sys.argv):
+        opt = sys.argv[i]
+        i = i + 1
+
+        if opt == "-i" or opt == "-o":
+            if i == len(sys.argv):
+                raise Exception("Expected path after {}".format(opt))
+            val = sys.argv[i]
+            i = i + 1
+            if (opt == "-i"):
+                input_file = val
+            elif (opt == "-o"):
+                output_file = val
+            else:
+                raise Exception("Unknown flag {}".format(opt))
+
+    return {
+        "directory": directory,
+        "input_string": input_string,
+        "input_file": input_file,
+        "output_file": output_file,
+    }
+
+def main():
+    args = None
+    try:
+        args = parse_args()
+    except Exception as e:
+        print(e)
+        print("\nUsage:\n")
+        print(usage.format(sys.argv[0]))
+        sys.exit(1)
+
+    directory = args["directory"]
+    template = args["input_string"]
+    if template == None:
+        with open(args["input_file"], 'r') as f:
+            template = f.read()
+    output_file = args["output_file"]
+
+    software_version = deduce_software_version(directory)
+    commit = describe(directory)
+    output = template \
+        .replace("<major>", software_version["major"]) \
+        .replace("<minor>", software_version["minor"]) \
+        .replace("<patch>", software_version["patch"]) \
+        .replace("<flavor>", software_version["flavor"]) \
+        .replace("<-flavor>", software_version["-flavor"]) \
+        .replace("<date>", software_version["date"]) \
+        .replace("<commit>", commit)
+
+    if output_file is None:
+        print(output)
+    else:
+        mkdir_p(os.path.dirname(output_file))
+
+        if os.path.isfile(output_file):
+            with open(output_file, 'r') as f:
+                if output == f.read():
+                    return
+
+        with open(output_file, 'w') as f:
+            f.write(output)
+
+if __name__ == '__main__':
+    main()
diff --git a/build_overrides/build.gni b/build_overrides/build.gni
new file mode 100644
index 0000000..3101a86
--- /dev/null
+++ b/build_overrides/build.gni
@@ -0,0 +1,39 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+declare_args() {
+    build_with_chromium = false
+    linux_use_bundled_binutils_override = true
+    ignore_elf32_limitations = true
+    use_system_xcode = true
+}
diff --git a/build_overrides/glslang.gni b/build_overrides/glslang.gni
index 500578c..003c78f 100644
--- a/build_overrides/glslang.gni
+++ b/build_overrides/glslang.gni
@@ -34,4 +34,4 @@
 # These are variables that are overridable by projects that include glslang.
 
 # The path to glslang dependencies.
-glslang_spirv_tools_dir = "//Externals/spirv-tools"
+glslang_spirv_tools_dir = "//External/spirv-tools"
diff --git a/build_overrides/spirv_tools.gni b/build_overrides/spirv_tools.gni
new file mode 100644
index 0000000..7cf7005
--- /dev/null
+++ b/build_overrides/spirv_tools.gni
@@ -0,0 +1,38 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# We are building inside glslang
+spirv_tools_standalone = false
+
+# Paths to SPIRV-Tools dependencies
+spirv_tools_spirv_headers_dir = "//External/spirv-tools/external/spirv-headers"
diff --git a/glslang/CInterface/glslang_c_interface.cpp b/glslang/CInterface/glslang_c_interface.cpp
index c4c24a9..2e04f53 100644
--- a/glslang/CInterface/glslang_c_interface.cpp
+++ b/glslang/CInterface/glslang_c_interface.cpp
@@ -32,9 +32,6 @@
 
 #include "glslang/Include/glslang_c_interface.h"
 
-#include "SPIRV/GlslangToSpv.h"
-#include "SPIRV/Logger.h"
-#include "SPIRV/SpvTools.h"
 #include "StandAlone/DirStackFileIncluder.h"
 #include "StandAlone/ResourceLimits.h"
 #include "glslang/Include/ShHandle.h"
@@ -163,9 +160,9 @@
     void* context;
 };
 
-int glslang_initialize_process() { return static_cast<int>(glslang::InitializeProcess()); }
+GLSLANG_EXPORT int glslang_initialize_process() { return static_cast<int>(glslang::InitializeProcess()); }
 
-void glslang_finalize_process() { glslang::FinalizeProcess(); }
+GLSLANG_EXPORT void glslang_finalize_process() { glslang::FinalizeProcess(); }
 
 static EShLanguage c_shader_stage(glslang_stage_t stage)
 {
@@ -323,7 +320,7 @@
     return EProfile();
 }
 
-glslang_shader_t* glslang_shader_create(const glslang_input_t* input)
+GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input)
 {
     if (!input || !input->code) {
         printf("Error creating shader: null input(%p)/input->code\n", input);
@@ -347,12 +344,12 @@
     return shader;
 }
 
-const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader)
+GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader)
 {
     return shader->preprocessedGLSL.c_str();
 }
 
-int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input)
+GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input)
 {
     DirStackFileIncluder Includer;
     /* TODO: use custom callbacks if they are available in 'i->callbacks' */
@@ -368,7 +365,7 @@
     );
 }
 
-int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input)
+GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input)
 {
     const char* preprocessedCStr = shader->preprocessedGLSL.c_str();
     shader->shader->setStrings(&preprocessedCStr, 1);
@@ -381,11 +378,11 @@
     );
 }
 
-const char* glslang_shader_get_info_log(glslang_shader_t* shader) { return shader->shader->getInfoLog(); }
+GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader) { return shader->shader->getInfoLog(); }
 
-const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader) { return shader->shader->getInfoDebugLog(); }
+GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader) { return shader->shader->getInfoDebugLog(); }
 
-void glslang_shader_delete(glslang_shader_t* shader)
+GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader)
 {
     if (!shader)
         return;
@@ -394,44 +391,14 @@
     delete (shader);
 }
 
-glslang_program_t* glslang_program_create()
+GLSLANG_EXPORT glslang_program_t* glslang_program_create()
 {
     glslang_program_t* p = new glslang_program_t();
     p->program = new glslang::TProgram();
     return p;
 }
 
-void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage)
-{
-    spv::SpvBuildLogger logger;
-    glslang::SpvOptions spvOptions;
-    spvOptions.validate = true;
-
-    const glslang::TIntermediate* intermediate = program->program->getIntermediate(c_shader_stage(stage));
-
-    glslang::GlslangToSpv(*intermediate, program->spirv, &logger, &spvOptions);
-
-    program->loggerMessages = logger.getAllMessages();
-}
-
-size_t glslang_program_SPIRV_get_size(glslang_program_t* program) { return program->spirv.size(); }
-
-void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int* out)
-{
-    memcpy(out, program->spirv.data(), program->spirv.size() * sizeof(unsigned int));
-}
-
-unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program)
-{
-    return program->spirv.data();
-}
-
-const char* glslang_program_SPIRV_get_messages(glslang_program_t* program)
-{
-    return program->loggerMessages.empty() ? nullptr : program->loggerMessages.c_str();
-}
-
-void glslang_program_delete(glslang_program_t* program)
+GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program)
 {
     if (!program)
         return;
@@ -440,22 +407,22 @@
     delete (program);
 }
 
-void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader)
+GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader)
 {
     program->program->addShader(shader->shader);
 }
 
-int glslang_program_link(glslang_program_t* program, int messages)
+GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages)
 {
     return (int)program->program->link((EShMessages)messages);
 }
 
-const char* glslang_program_get_info_log(glslang_program_t* program)
+GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program)
 {
     return program->program->getInfoLog();
 }
 
-const char* glslang_program_get_info_debug_log(glslang_program_t* program)
+GLSLANG_EXPORT const char* glslang_program_get_info_debug_log(glslang_program_t* program)
 {
     return program->program->getInfoDebugLog();
 }
diff --git a/glslang/CMakeLists.txt b/glslang/CMakeLists.txt
index a0259a3..fc925ea 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -1,6 +1,39 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 if(WIN32)
     add_subdirectory(OSDependent/Windows)
-elseif(UNIX)
+elseif(UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia")
     add_subdirectory(OSDependent/Unix)
 else(WIN32)
     message("unknown platform")
@@ -11,7 +44,19 @@
     add_subdirectory(OSDependent/Web)
 endif(EMSCRIPTEN OR ENABLE_GLSLANG_JS)
 
-set(SOURCES
+################################################################################
+# GenericCodeGen
+################################################################################
+add_library(GenericCodeGen STATIC
+    GenericCodeGen/CodeGen.cpp
+    GenericCodeGen/Link.cpp)
+set_property(TARGET GenericCodeGen PROPERTY POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET GenericCodeGen PROPERTY FOLDER glslang)
+
+################################################################################
+# MachineIndependent
+################################################################################
+set(MACHINEINDEPENDENT_SOURCES
     MachineIndependent/glslang.m4
     MachineIndependent/glslang.y
     MachineIndependent/glslang_tab.cpp
@@ -41,26 +86,9 @@
     MachineIndependent/preprocessor/PpScanner.cpp
     MachineIndependent/preprocessor/PpTokens.cpp
     MachineIndependent/propagateNoContraction.cpp
-    GenericCodeGen/CodeGen.cpp
-    GenericCodeGen/Link.cpp
-    CInterface/glslang_c_interface.cpp)
+)
 
-set(HEADERS
-    Public/ShaderLang.h
-    Include/arrays.h
-    Include/BaseTypes.h
-    Include/Common.h
-    Include/ConstantUnion.h
-    Include/glslang_c_interface.h
-    Include/glslang_c_shader_types.h
-    Include/InfoSink.h
-    Include/InitializeGlobals.h
-    Include/intermediate.h
-    Include/PoolAlloc.h
-    Include/ResourceLimits.h
-    Include/revision.h
-    Include/ShHandle.h
-    Include/Types.h
+set(MACHINEINDEPENDENT_HEADERS
     MachineIndependent/attribute.h
     MachineIndependent/glslang_tab.cpp.h
     MachineIndependent/gl_types.h
@@ -78,50 +106,121 @@
     MachineIndependent/parseVersions.h
     MachineIndependent/propagateNoContraction.h
     MachineIndependent/preprocessor/PpContext.h
-    MachineIndependent/preprocessor/PpTokens.h)
+    MachineIndependent/preprocessor/PpTokens.h
+)
 
-glslang_pch(SOURCES MachineIndependent/pch.cpp)
+if(ENABLE_HLSL)
+    list(APPEND MACHINEINDEPENDENT_SOURCES
+        HLSL/hlslAttributes.cpp
+        HLSL/hlslParseHelper.cpp
+        HLSL/hlslScanContext.cpp
+        HLSL/hlslOpMap.cpp
+        HLSL/hlslTokenStream.cpp
+        HLSL/hlslGrammar.cpp
+        HLSL/hlslParseables.cpp)
 
-add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
-set_property(TARGET glslang PROPERTY FOLDER glslang)
-set_property(TARGET glslang PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(glslang OGLCompiler OSDependent)
-target_include_directories(glslang PUBLIC 
+    list(APPEND MACHINEINDEPENDENT_HEADERS
+        HLSL/hlslAttributes.h
+        HLSL/hlslParseHelper.h
+        HLSL/hlslTokens.h
+        HLSL/hlslScanContext.h
+        HLSL/hlslOpMap.h
+        HLSL/hlslTokenStream.h
+        HLSL/hlslGrammar.h
+        HLSL/hlslParseables.h)
+endif(ENABLE_HLSL)
+
+add_library(MachineIndependent STATIC ${MACHINEINDEPENDENT_SOURCES} ${MACHINEINDEPENDENT_HEADERS})
+set_property(TARGET MachineIndependent PROPERTY POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET MachineIndependent PROPERTY FOLDER glslang)
+
+glslang_add_build_info_dependency(MachineIndependent)
+
+glslang_pch(MachineIndependent MachineIndependent/pch.h)
+
+target_link_libraries(MachineIndependent PRIVATE OGLCompiler OSDependent GenericCodeGen)
+
+################################################################################
+# glslang
+################################################################################
+set(GLSLANG_SOURCES
+    CInterface/glslang_c_interface.cpp)
+
+set(GLSLANG_HEADERS
+    Public/ShaderLang.h
+    Include/arrays.h
+    Include/BaseTypes.h
+    Include/Common.h
+    Include/ConstantUnion.h
+    Include/glslang_c_interface.h
+    Include/glslang_c_shader_types.h
+    Include/InfoSink.h
+    Include/InitializeGlobals.h
+    Include/intermediate.h
+    Include/PoolAlloc.h
+    Include/ResourceLimits.h
+    Include/ShHandle.h
+    Include/Types.h)
+
+add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${GLSLANG_SOURCES} ${GLSLANG_HEADERS})
+set_target_properties(glslang PROPERTIES
+    FOLDER glslang
+    POSITION_INDEPENDENT_CODE ON
+    VERSION   "${GLSLANG_VERSION}"
+    SOVERSION "${GLSLANG_VERSION_MAJOR}")
+target_link_libraries(glslang PRIVATE OGLCompiler OSDependent MachineIndependent)
+target_include_directories(glslang PUBLIC
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
 
+glslang_add_build_info_dependency(glslang)
+
+glslang_only_export_explicit_symbols(glslang)
+
 if(WIN32 AND BUILD_SHARED_LIBS)
     set_target_properties(glslang PROPERTIES PREFIX "")
 endif()
 
-if(ENABLE_HLSL)
-    target_link_libraries(glslang HLSL)
-endif()
-
+################################################################################
+# source_groups
+################################################################################
 if(WIN32)
     source_group("Public" REGULAR_EXPRESSION "Public/*")
     source_group("MachineIndependent" REGULAR_EXPRESSION "MachineIndependent/[^/]*")
     source_group("Include" REGULAR_EXPRESSION "Include/[^/]*")
     source_group("GenericCodeGen" REGULAR_EXPRESSION "GenericCodeGen/*")
     source_group("MachineIndependent\\Preprocessor" REGULAR_EXPRESSION "MachineIndependent/preprocessor/*")
+    source_group("HLSL" REGULAR_EXPRESSION "HLSL/*")
+    source_group("CInterface" REGULAR_EXPRESSION "CInterface/*")
 endif(WIN32)
 
+################################################################################
+# install
+################################################################################
 if(ENABLE_GLSLANG_INSTALL)
     if(BUILD_SHARED_LIBS)
-        install(TARGETS glslang EXPORT glslangTargets
+        install(TARGETS glslang
+                EXPORT  glslangTargets
                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
                 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
                 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
     else()
-        install(TARGETS glslang EXPORT glslangTargets
+        install(TARGETS glslang MachineIndependent GenericCodeGen
+                EXPORT  glslangTargets
                 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
     endif()
-    install(EXPORT glslangTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
-endif(ENABLE_GLSLANG_INSTALL)
 
-if(ENABLE_GLSLANG_INSTALL)
-    foreach(file ${HEADERS})
+    install(EXPORT glslangTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
+
+    set(ALL_HEADERS
+        ${GLSLANG_HEADERS}
+        ${MACHINEINDEPENDENT_HEADERS})
+
+    foreach(file ${ALL_HEADERS})
         get_filename_component(dir ${file} DIRECTORY)
         install(FILES ${file} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/${dir})
     endforeach()
+
+    install(FILES ${GLSLANG_BUILD_INFO_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang)
+
 endif(ENABLE_GLSLANG_INSTALL)
diff --git a/hlsl/hlslAttributes.cpp b/glslang/HLSL/hlslAttributes.cpp
similarity index 100%
rename from hlsl/hlslAttributes.cpp
rename to glslang/HLSL/hlslAttributes.cpp
diff --git a/hlsl/hlslAttributes.h b/glslang/HLSL/hlslAttributes.h
similarity index 94%
rename from hlsl/hlslAttributes.h
rename to glslang/HLSL/hlslAttributes.h
index b1cc037..62faa5b 100644
--- a/hlsl/hlslAttributes.h
+++ b/glslang/HLSL/hlslAttributes.h
@@ -39,8 +39,8 @@
 #include <unordered_map>
 #include <functional>
 
-#include "../glslang/MachineIndependent/attribute.h"
-#include "../glslang/MachineIndependent/SymbolTable.h"
+#include "../MachineIndependent/attribute.h"
+#include "../MachineIndependent/SymbolTable.h"
 #include "hlslScanContext.h"
 
 namespace glslang {
diff --git a/hlsl/hlslGrammar.cpp b/glslang/HLSL/hlslGrammar.cpp
similarity index 98%
rename from hlsl/hlslGrammar.cpp
rename to glslang/HLSL/hlslGrammar.cpp
index 47ced29..f30c640 100644
--- a/hlsl/hlslGrammar.cpp
+++ b/glslang/HLSL/hlslGrammar.cpp
@@ -382,6 +382,16 @@
     if (forbidDeclarators)
         return true;
 
+    // Check if there are invalid in/out qualifiers
+    switch (declaredType.getQualifier().storage) {
+    case EvqIn:
+    case EvqOut:
+    case EvqInOut:
+        parseContext.error(token.loc, "in/out qualifiers are only valid on parameters", token.string->c_str(), "");
+    default:
+        break;
+    }
+
     // declarator_list
     //    : declarator
     //         : identifier
@@ -470,8 +480,9 @@
             }
 
             // TODO: things scoped within an annotation need their own name space;
-            // TODO: strings are not yet handled.
-            if (variableType.getBasicType() != EbtString && parseContext.getAnnotationNestingLevel() == 0) {
+            // TODO: non-constant strings are not yet handled.
+            if (!(variableType.getBasicType() == EbtString && !variableType.getQualifier().isConstant()) &&
+                parseContext.getAnnotationNestingLevel() == 0) {
                 if (typedefDecl)
                     parseContext.declareTypedef(idToken.loc, *fullName, variableType);
                 else if (variableType.getBasicType() == EbtBlock) {
@@ -697,7 +708,9 @@
             qualifier.noContraction = true;
             break;
         case EHTokIn:
-            qualifier.storage = (qualifier.storage == EvqOut) ? EvqInOut : EvqIn;
+            if (qualifier.storage != EvqUniform) {
+                qualifier.storage = (qualifier.storage == EvqOut) ? EvqInOut : EvqIn;
+            }
             break;
         case EHTokOut:
             qualifier.storage = (qualifier.storage == EvqIn) ? EvqInOut : EvqOut;
diff --git a/hlsl/hlslGrammar.h b/glslang/HLSL/hlslGrammar.h
similarity index 100%
rename from hlsl/hlslGrammar.h
rename to glslang/HLSL/hlslGrammar.h
diff --git a/hlsl/hlslOpMap.cpp b/glslang/HLSL/hlslOpMap.cpp
similarity index 100%
rename from hlsl/hlslOpMap.cpp
rename to glslang/HLSL/hlslOpMap.cpp
diff --git a/hlsl/hlslOpMap.h b/glslang/HLSL/hlslOpMap.h
similarity index 100%
rename from hlsl/hlslOpMap.h
rename to glslang/HLSL/hlslOpMap.h
diff --git a/hlsl/hlslParseHelper.cpp b/glslang/HLSL/hlslParseHelper.cpp
old mode 100755
new mode 100644
similarity index 97%
rename from hlsl/hlslParseHelper.cpp
rename to glslang/HLSL/hlslParseHelper.cpp
index 2dc173f..fce647a
--- a/hlsl/hlslParseHelper.cpp
+++ b/glslang/HLSL/hlslParseHelper.cpp
@@ -39,11 +39,11 @@
 #include "hlslGrammar.h"
 #include "hlslAttributes.h"
 
-#include "../glslang/Include/Common.h"
-#include "../glslang/MachineIndependent/Scan.h"
-#include "../glslang/MachineIndependent/preprocessor/PpContext.h"
+#include "../Include/Common.h"
+#include "../MachineIndependent/Scan.h"
+#include "../MachineIndependent/preprocessor/PpContext.h"
 
-#include "../glslang/OSDependent/osinclude.h"
+#include "../OSDependent/osinclude.h"
 
 #include <algorithm>
 #include <functional>
@@ -814,7 +814,7 @@
                   base->getAsSymbolNode()->getName().c_str(), "");
         else
             error(loc, " left of '[' is not of type array, matrix, or vector ", "expression", "");
-    } else if (base->getType().getQualifier().isFrontEndConstant() && 
+    } else if (base->getType().getQualifier().isFrontEndConstant() &&
                index->getQualifier().isFrontEndConstant()) {
         // both base and index are front-end constants
         checkIndex(loc, base->getType(), indexValue);
@@ -1169,7 +1169,7 @@
 }
 
 // Top level variable flattening: construct data
-void HlslParseContext::flatten(const TVariable& variable, bool linkage)
+void HlslParseContext::flatten(const TVariable& variable, bool linkage, bool arrayed)
 {
     const TType& type = variable.getType();
 
@@ -1181,8 +1181,15 @@
                                                   TFlattenData(type.getQualifier().layoutBinding,
                                                                type.getQualifier().layoutLocation)));
 
-    // the item is a map pair, so first->second is the TFlattenData itself.
-    flatten(variable, type, entry.first->second, variable.getName(), linkage, type.getQualifier(), nullptr);
+    // if flattening arrayed io struct, array each member of dereferenced type
+    if (arrayed) {
+        const TType dereferencedType(type, 0);
+        flatten(variable, dereferencedType, entry.first->second, variable.getName(), linkage,
+                type.getQualifier(), type.getArraySizes());
+    } else {
+        flatten(variable, type, entry.first->second, variable.getName(), linkage,
+                type.getQualifier(), nullptr);
+    }
 }
 
 // Recursively flatten the given variable at the provided type, building the flattenData as we go.
@@ -1256,6 +1263,10 @@
             }
         }
 
+        // Only propagate arraysizes here for arrayed io
+        if (variable.getType().getQualifier().isArrayedIo(language) && builtInArraySizes != nullptr)
+            memberVariable->getWritableType().copyArraySizes(*builtInArraySizes);
+
         flattenData.offsets.push_back(static_cast<int>(flattenData.members.size()));
         flattenData.members.push_back(memberVariable);
 
@@ -1837,7 +1848,7 @@
                 error(loc, "invalid partitioning", "", "");
             } else {
                 TVertexSpacing partitioning = EvsNone;
-                
+
                 if (partitionStr == "integer") {
                     partitioning = EvsEqual;
                 } else if (partitionStr == "fractional_even") {
@@ -1942,6 +1953,10 @@
             break;
         case EatConstantId:
             // specialization constant
+            if (type.getQualifier().storage != EvqConst) {
+                error(loc, "needs a const type", "constant_id", "");
+                break;
+            }
             if (it->getInt(value)) {
                 TSourceLoc loc;
                 loc.init();
@@ -2068,11 +2083,8 @@
     // Further this return/in/out transform by flattening, splitting, and assigning locations
     const auto makeVariableInOut = [&](TVariable& variable) {
         if (variable.getType().isStruct()) {
-            if (variable.getType().getQualifier().isArrayedIo(language)) {
-                if (variable.getType().containsBuiltIn())
-                    split(variable);
-            } else if (shouldFlatten(variable.getType(), EvqVaryingIn /* not assigned yet, but close enough */, true))
-                flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */);
+            bool arrayed = variable.getType().getQualifier().isArrayedIo(language);
+            flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */, arrayed);
         }
         // TODO: flatten arrays too
         // TODO: flatten everything in I/O
@@ -2103,6 +2115,23 @@
                 makeVariableInOut(*(*it));
     }
 
+    // Add uniform parameters to the $Global uniform block.
+    TVector<TVariable*> opaque_uniforms;
+    for (int i = 0; i < userFunction.getParamCount(); i++) {
+        TType& paramType = *userFunction[i].type;
+        TString& paramName = *userFunction[i].name;
+        if (paramType.getQualifier().storage == EvqUniform) {
+            if (!paramType.containsOpaque()) {
+                // Add it to the global uniform block.
+                growGlobalUniformBlock(loc, paramType, paramName);
+            } else {
+                // Declare it as a separate variable.
+                TVariable *var = makeInternalVariable(paramName.c_str(), paramType);
+                opaque_uniforms.push_back(var);
+            }
+        }
+    }
+
     // Synthesize the call
 
     pushScope(); // matches the one in handleFunctionBody()
@@ -2123,6 +2152,7 @@
     TVector<TVariable*> argVars;
     TIntermAggregate* synthBody = new TIntermAggregate();
     auto inputIt = inputs.begin();
+    auto opaqueUniformIt = opaque_uniforms.begin();
     TIntermTyped* callingArgs = nullptr;
 
     for (int i = 0; i < userFunction.getParamCount(); i++) {
@@ -2141,6 +2171,17 @@
                                                                intermediate.addSymbol(**inputIt)));
             inputIt++;
         }
+        if (param.type->getQualifier().storage == EvqUniform) {
+            if (!param.type->containsOpaque()) {
+                // Look it up in the $Global uniform block.
+                intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg,
+                                                                   handleVariable(loc, param.name)));
+            } else {
+                intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg,
+                                                                   intermediate.addSymbol(**opaqueUniformIt)));
+                ++opaqueUniformIt;
+            }
+        }
     }
 
     // Call
@@ -2447,7 +2488,7 @@
         TIntermTyped* rhsElement = intermediate.addIndex(EOpIndexDirect, tempSymR, index, loc);
 
         const TType derefType(right->getType(), 0);
-    
+
         lhsElement->setType(derefType);
         rhsElement->setType(derefType);
 
@@ -2467,7 +2508,7 @@
 
     return assignList;
 }
-    
+
 // Clip and cull distance require special handling due to a semantic mismatch.  In HLSL,
 // these can be float scalar, float vector, or arrays of float scalar or float vector.
 // In SPIR-V, they are arrays of scalar floats in all cases.  We must copy individual components
@@ -2536,7 +2577,7 @@
         vecItems += (*semanticNSize)[x];
         arrayLoc += (*semanticNSize)[x];
     }
- 
+
 
     // It can have up to 2 array dimensions (in the case of geometry shader inputs)
     const TArraySizes* const internalArraySizes = internalNode->getType().getArraySizes();
@@ -2557,7 +2598,7 @@
         // into a float array, or vice versa.  Here, we make the array the right size and type,
         // which depends on the incoming data, which has several potential dimensions:
         //    * Semantic ID
-        //    * vector size 
+        //    * vector size
         //    * array size
         // Of those, semantic ID and array size cannot appear simultaneously.
         //
@@ -2618,7 +2659,7 @@
     // Holds individual component assignments as we make them.
     TIntermTyped* clipCullAssign = nullptr;
 
-    // If the types are homomorphic, use a simple assign.  No need to mess about with 
+    // If the types are homomorphic, use a simple assign.  No need to mess about with
     // individual components.
     if (clipCullSym->getType().isArray() == internalNode->getType().isArray() &&
         clipCullInnerArraySize == internalInnerArraySize &&
@@ -2729,23 +2770,39 @@
         if (binaryNode == nullptr)
             return false;
 
-        return (binaryNode->getOp() == EOpIndexDirect || binaryNode->getOp() == EOpIndexIndirect) && 
+        return (binaryNode->getOp() == EOpIndexDirect || binaryNode->getOp() == EOpIndexIndirect) &&
                wasSplit(binaryNode->getLeft());
     };
 
+    // Return symbol if node is symbol or index ref
+    const auto getSymbol = [](const TIntermTyped* node) -> const TIntermSymbol* {
+        const TIntermSymbol* symbolNode = node->getAsSymbolNode();
+        if (symbolNode != nullptr)
+            return symbolNode;
+
+        const TIntermBinary* binaryNode = node->getAsBinaryNode();
+        if (binaryNode != nullptr && (binaryNode->getOp() == EOpIndexDirect || binaryNode->getOp() == EOpIndexIndirect))
+            return binaryNode->getLeft()->getAsSymbolNode();
+
+        return nullptr;
+    };
+
     // Return true if this stage assigns clip position with potentially inverted Y
     const auto assignsClipPos = [this](const TIntermTyped* node) -> bool {
         return node->getType().getQualifier().builtIn == EbvPosition &&
                (language == EShLangVertex || language == EShLangGeometry || language == EShLangTessEvaluation);
     };
 
+    const TIntermSymbol* leftSymbol = getSymbol(left);
+    const TIntermSymbol* rightSymbol = getSymbol(right);
+
     const bool isSplitLeft    = wasSplit(left) || indexesSplit(left);
     const bool isSplitRight   = wasSplit(right) || indexesSplit(right);
 
-    const bool isFlattenLeft  = wasFlattened(left);
-    const bool isFlattenRight = wasFlattened(right);
+    const bool isFlattenLeft  = wasFlattened(leftSymbol);
+    const bool isFlattenRight = wasFlattened(rightSymbol);
 
-    // OK to do a single assign if neither side is split or flattened.  Otherwise, 
+    // OK to do a single assign if neither side is split or flattened.  Otherwise,
     // fall through to a member-wise copy.
     if (!isFlattenLeft && !isFlattenRight && !isSplitLeft && !isSplitRight) {
         // Clip and cull distance requires more processing.  See comment above assignClipCullDistance.
@@ -2791,10 +2848,10 @@
         memberCount = left->getType().getCumulativeArraySize();
 
     if (isFlattenLeft)
-        leftVariables = &flattenMap.find(left->getAsSymbolNode()->getId())->second.members;
+        leftVariables = &flattenMap.find(leftSymbol->getId())->second.members;
 
     if (isFlattenRight) {
-        rightVariables = &flattenMap.find(right->getAsSymbolNode()->getId())->second.members;
+        rightVariables = &flattenMap.find(rightSymbol->getId())->second.members;
     } else {
         // The RHS is not flattened.  There are several cases:
         // 1. 1 item to copy:  Use the RHS directly.
@@ -2828,8 +2885,10 @@
     TStorageQualifier leftStorage = left->getType().getQualifier().storage;
     TStorageQualifier rightStorage = right->getType().getQualifier().storage;
 
-    int leftOffset = findSubtreeOffset(*left);
-    int rightOffset = findSubtreeOffset(*right);
+    int leftOffsetStart = findSubtreeOffset(*left);
+    int rightOffsetStart = findSubtreeOffset(*right);
+    int leftOffset = leftOffsetStart;
+    int rightOffset = rightOffsetStart;
 
     const auto getMember = [&](bool isLeft, const TType& type, int member, TIntermTyped* splitNode, int splitMember,
                                bool flattened)
@@ -2869,10 +2928,35 @@
                 }
             }
         } else if (flattened && !shouldFlatten(derefType, isLeft ? leftStorage : rightStorage, false)) {
-            if (isLeft)
+            if (isLeft) {
+                // offset will cycle through variables for arrayed io
+                if (leftOffset >= static_cast<int>(leftVariables->size()))
+                    leftOffset = leftOffsetStart;
                 subTree = intermediate.addSymbol(*(*leftVariables)[leftOffset++]);
-            else
+            } else {
+                // offset will cycle through variables for arrayed io
+                if (rightOffset >= static_cast<int>(rightVariables->size()))
+                    rightOffset = rightOffsetStart;
                 subTree = intermediate.addSymbol(*(*rightVariables)[rightOffset++]);
+            }
+
+            // arrayed io
+            if (subTree->getType().isArray()) {
+                if (!arrayElement.empty()) {
+                    const TType derefType(subTree->getType(), arrayElement.front());
+                    subTree = intermediate.addIndex(EOpIndexDirect, subTree,
+                                                    intermediate.addConstantUnion(arrayElement.front(), loc), loc);
+                    subTree->setType(derefType);
+                } else {
+                    // There's an index operation we should transfer to the output builtin.
+                    assert(splitNode->getAsOperator() != nullptr &&
+                           splitNode->getAsOperator()->getOp() == EOpIndexIndirect);
+                    const TType splitDerefType(subTree->getType(), 0);
+                    subTree = intermediate.addIndex(splitNode->getAsOperator()->getOp(), subTree,
+                                                    splitNode->getAsBinaryNode()->getRight(), loc);
+                    subTree->setType(splitDerefType);
+                }
+            }
         } else {
             // Index operator if it's an aggregate, else EOpNull
             const TOperator accessOp = type.isArray()  ? EOpIndexDirect
@@ -3350,9 +3434,9 @@
 
             // Byte address buffers index in bytes (only multiples of 4 permitted... not so much a byte address
             // buffer then, but that's what it calls itself.
-            const bool isByteAddressBuffer = (builtInType == EbvByteAddressBuffer   || 
+            const bool isByteAddressBuffer = (builtInType == EbvByteAddressBuffer   ||
                                               builtInType == EbvRWByteAddressBuffer);
-                
+
 
             if (isByteAddressBuffer)
                 argIndex = intermediate.addBinaryNode(EOpRightShift, argIndex,
@@ -3367,7 +3451,7 @@
             const TType derefType(argArray->getType(), 0);
             node->setType(derefType);
         }
-        
+
         break;
 
     case EOpMethodLoad2:
@@ -3493,8 +3577,8 @@
                     const TType indexType(argValue->getType(), 0);
                     rValue->setType(indexType);
                 }
-                    
-                TIntermTyped* assign = intermediate.addAssign(EOpAssign, lValue, rValue, loc); 
+
+                TIntermTyped* assign = intermediate.addAssign(EOpAssign, lValue, rValue, loc);
 
                 body = intermediate.growAggregate(body, assign);
             }
@@ -3671,7 +3755,7 @@
     }
 
     TConstUnionArray* values = new TConstUnionArray(numSamples*2);
-    
+
     for (int pos=0; pos<count; ++pos) {
         TConstUnion x, y;
         x.setDConst(sampleLoc[pos].x);
@@ -3705,7 +3789,7 @@
         result->setType(TType(node->getType().getBasicType(), EvqTemporary, node->getVectorSize()));
 
         TIntermTyped* convertedResult = nullptr;
-        
+
         TType retType;
         getTextureReturnType(sampler, retType);
 
@@ -3731,7 +3815,7 @@
 
             for (unsigned m = 0; m < unsigned(retType.getStruct()->size()); ++m) {
                 const TType memberType(retType, m); // dereferenced type of the member we're about to assign.
-                
+
                 // Check for bad struct members.  This should have been caught upstream.  Complain, because
                 // wwe don't know what to do with it.  This algorithm could be generalized to handle
                 // other things, e.g, sub-structures, but HLSL doesn't allow them.
@@ -3739,7 +3823,7 @@
                     error(loc, "expected: scalar or vector type in texture structure", "", "");
                     return nullptr;
                 }
-                    
+
                 // Index into the struct variable to find the member to assign.
                 TIntermTyped* structMember = intermediate.addIndex(EOpIndexDirectStruct,
                                                                    intermediate.addSymbol(*structVar, loc),
@@ -3761,14 +3845,14 @@
 
                         TIntermTyped* structVecComponent = intermediate.addIndex(EOpIndexDirect, structMember,
                                                                                  intermediate.addConstantUnion(component, loc), loc);
-                        
+
                         memberAssign = intermediate.addAssign(EOpAssign, structVecComponent, vec4Member, loc);
                     } else {
                         // Scalar member: we can assign to it directly.
                         memberAssign = intermediate.addAssign(EOpAssign, structMember, vec4Member, loc);
                     }
 
-                    
+
                     conversionAggregate->getSequence().push_back(memberAssign);
                 }
             }
@@ -3807,7 +3891,7 @@
             if (arguments->getAsTyped()->getBasicType() != EbtSampler)
                 return;
         } else {
-            if (argAggregate->getSequence().size() == 0 || 
+            if (argAggregate->getSequence().size() == 0 ||
                 argAggregate->getSequence()[0] == nullptr ||
                 argAggregate->getSequence()[0]->getAsTyped()->getBasicType() != EbtSampler)
                 return;
@@ -3844,6 +3928,7 @@
             case Esd3D:   constructOp = EOpConstructVec3;  coordSize = 3; break; // 3D
             case EsdCube: constructOp = EOpConstructVec3;  coordSize = 3; break; // also 3D
             default:
+                error(loc, "unhandled DX9 texture LoD dimension", "", "");
                 break;
             }
 
@@ -3880,7 +3965,9 @@
             case Esd2D:   constructOp = EOpConstructVec2;  break; // 2D
             case Esd3D:   constructOp = EOpConstructVec3;  break; // 3D
             case EsdCube: constructOp = EOpConstructVec3;  break; // also 3D
-            default: break;
+            default:
+                error(loc, "unhandled DX9 texture bias dimension", "", "");
+                break;
             }
 
             TIntermAggregate* constructCoord = new TIntermAggregate(constructOp);
@@ -4004,7 +4091,8 @@
             case EsdBuffer: numDims = 1; break; // W (buffers)
             case EsdRect:   numDims = 2; break; // W, H (rect)
             default:
-                assert(0 && "unhandled texture dimension");
+                error(loc, "unhandled DX10 MethodGet dimension", "", "");
+                break;
             }
 
             // Arrayed adds another dimension for the number of array elements
@@ -4140,7 +4228,9 @@
             case 3: constructOp = EOpConstructVec3;  break;
             case 4: constructOp = EOpConstructVec4;  break;
             case 5: constructOp = EOpConstructVec4;  break; // cubeArrayShadow, cmp value is separate arg.
-            default: assert(0); break;
+            default:
+                error(loc, "unhandled DX10 MethodSample dimension", "", "");
+                break;
             }
 
             TIntermAggregate* coordWithCmp = new TIntermAggregate(constructOp);
@@ -4504,13 +4594,13 @@
             int count = 0;
             for (int val = 2; val <= 16; val *= 2)
                 idxtest[count++] =
-                    intermediate.addBinaryNode(EOpEqual, 
+                    intermediate.addBinaryNode(EOpEqual,
                                                intermediate.addSymbol(*outSampleCount, loc),
                                                intermediate.addConstantUnion(val, loc),
                                                loc, TType(EbtBool));
 
             const TOperator idxOp = (argSampIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect;
-            
+
             // Create index ops into position arrays given sample index.
             // TODO: should it be clamped?
             TIntermTyped* index[4];
@@ -4525,13 +4615,13 @@
             // (sampleCount == 4)  ? pos4[idx] :
             // (sampleCount == 8)  ? pos8[idx] :
             // (sampleCount == 16) ? pos16[idx] : float2(0,0);
-            TIntermTyped* test = 
-                intermediate.addSelection(idxtest[0], index[0], 
-                    intermediate.addSelection(idxtest[1], index[1], 
+            TIntermTyped* test =
+                intermediate.addSelection(idxtest[0], index[0],
+                    intermediate.addSelection(idxtest[1], index[1],
                         intermediate.addSelection(idxtest[2], index[2],
-                            intermediate.addSelection(idxtest[3], index[3], 
+                            intermediate.addSelection(idxtest[3], index[3],
                                                       getSamplePosArray(1), loc), loc), loc), loc);
-                                         
+
             compoundStatement = intermediate.growAggregate(compoundStatement, test);
             compoundStatement->setOperator(EOpSequence);
             compoundStatement->setLoc(loc);
@@ -4544,7 +4634,7 @@
 
     case EOpSubpassLoad:
         {
-            const TIntermTyped* argSubpass = 
+            const TIntermTyped* argSubpass =
                 argAggregate ? argAggregate->getSequence()[0]->getAsTyped() :
                 arguments->getAsTyped();
 
@@ -4559,7 +4649,7 @@
 
             break;
         }
-        
+
 
     default:
         break; // most pass through unchanged
@@ -5079,7 +5169,7 @@
 
             for (int idx = 0; idx < vecSize; ++idx) {
                 TIntermTyped* idxConst = intermediate.addConstantUnion(idx, loc, true);
-                TIntermTyped* component = argValue->getType().isVector() ? 
+                TIntermTyped* component = argValue->getType().isVector() ?
                     intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc) : argValue;
 
                 if (component != argValue)
@@ -5091,7 +5181,7 @@
                 unpackOp->setLoc(loc);
 
                 TIntermTyped* lowOrder  = intermediate.addIndex(EOpIndexDirect, unpackOp, zero, loc);
-                
+
                 if (result != nullptr) {
                     result->getSequence().push_back(lowOrder);
                     node = result;
@@ -5099,7 +5189,7 @@
                     node = lowOrder;
                 }
             }
-            
+
             break;
         }
 
@@ -5130,7 +5220,7 @@
 
             for (int idx = 0; idx < vecSize; ++idx) {
                 TIntermTyped* idxConst = intermediate.addConstantUnion(idx, loc, true);
-                TIntermTyped* component = argValue->getType().isVector() ? 
+                TIntermTyped* component = argValue->getType().isVector() ?
                     intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc) : argValue;
 
                 if (component != argValue)
@@ -5141,7 +5231,7 @@
                 vec2ComponentAndZero->getSequence().push_back(zero);
                 vec2ComponentAndZero->setType(TType(EbtFloat, EvqTemporary, 2));
                 vec2ComponentAndZero->setLoc(loc);
-                
+
                 TIntermTyped* packOp = new TIntermUnary(EOpPackHalf2x16);
                 packOp->getAsUnaryNode()->setOperand(vec2ComponentAndZero);
                 packOp->setLoc(loc);
@@ -5214,7 +5304,7 @@
 
             TIntermTyped* notinf = handleUnaryMath(loc, "!", EOpLogicalNot, isinf);
             notinf->setType(boolType);
-            
+
             TIntermTyped* andNode = handleBinaryMath(loc, "and", EOpLogicalAnd, notnan, notinf);
             andNode->setType(boolType);
 
@@ -5402,6 +5492,10 @@
 
             op = fnCandidate->getBuiltInOp();
             if (builtIn && op != EOpNull) {
+                // SM 4.0 and above guarantees roundEven semantics for round()
+                if (!hlslDX9Compatible() && op == EOpRound)
+                    op = EOpRoundEven;
+
                 // A function call mapped to a built-in operation.
                 result = intermediate.addBuiltInFunctionCall(loc, op, fnCandidate->getParamCount() == 1, arguments,
                                                              fnCandidate->getType());
@@ -5598,7 +5692,7 @@
         // means take 'arguments' itself as the one argument.
         TIntermTyped* arg = function.getParamCount() == 1
                                    ? arguments->getAsTyped()
-                                   : (aggregate ? 
+                                   : (aggregate ?
                                         aggregate->getSequence()[param]->getAsTyped() :
                                         arguments->getAsTyped());
         if (*function[param].type != arg->getType()) {
@@ -5669,7 +5763,7 @@
         else if (args.size() > 1) {
             if (function.getParamCount() + functionParamNumberOffset == 1) {
                 arguments = intermediate.makeAggregate(args.front());
-                std::for_each(args.begin() + 1, args.end(), 
+                std::for_each(args.begin() + 1, args.end(),
                     [&](TIntermTyped* arg) {
                         arguments = intermediate.growAggregate(arguments, arg);
                     });
@@ -5688,7 +5782,7 @@
         // means take 'arguments' itself as the one argument.
         TIntermTyped* arg = function.getParamCount() == 1
                                    ? arguments->getAsTyped()
-                                   : (aggregate ? 
+                                   : (aggregate ?
                                         aggregate->getSequence()[param + functionParamNumberOffset]->getAsTyped() :
                                         arguments->getAsTyped());
 
@@ -6049,6 +6143,32 @@
         return semanticNum;
     };
 
+    if (builtIn == EbvNone && hlslDX9Compatible()) {
+        if (language == EShLangVertex) {
+            if (qualifier.isParamOutput()) {
+                if (upperCase == "POSITION") {
+                    builtIn = EbvPosition;
+                }
+                if (upperCase == "PSIZE") {
+                    builtIn = EbvPointSize;
+                }
+            }
+        } else if (language == EShLangFragment) {
+            if (qualifier.isParamInput() && upperCase == "VPOS") {
+                builtIn = EbvFragCoord;
+            }
+            if (qualifier.isParamOutput()) {
+                if (upperCase.compare(0, 5, "COLOR") == 0) {
+                    qualifier.layoutLocation = getSemanticNumber(upperCase, 0, nullptr);
+                    nextOutLocation = std::max(nextOutLocation, qualifier.layoutLocation + 1u);
+                }
+                if (upperCase == "DEPTH") {
+                    builtIn = EbvFragDepth;
+                }
+            }
+        }
+    }
+
     switch(builtIn) {
     case EbvNone:
         // Get location numbers from fragment outputs, instead of
@@ -6863,7 +6983,6 @@
         type.getQualifier().storage = EvqConstReadOnly;
         break;
     case EvqGlobal:
-    case EvqUniform:
     case EvqTemporary:
         type.getQualifier().storage = EvqIn;
         break;
@@ -7513,7 +7632,17 @@
     bool tie = false;
 
     // send to the generic selector
-    const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie);
+    const TFunction* bestMatch = nullptr;
+
+    // printf has var args and is in the symbol table as "printf()",
+    // mangled to "printf("
+    if (call.getName() == "printf") {
+        TSymbol* symbol = symbolTable.find("printf(", &builtIn);
+        if (symbol)
+            return symbol->getAsFunction();
+    }
+
+    bestMatch = selectFunction(candidateList, call, convertible, better, tie);
 
     if (bestMatch == nullptr) {
         // If there is nothing selected by allowing only up-conversions (to a larger linearize() value),
@@ -8463,7 +8592,7 @@
     // bump up to the next component to consume
     const auto getNextComponent = [&]() {
         TIntermTyped* component;
-        component = handleBracketDereference(node->getLoc(), constructee, 
+        component = handleBracketDereference(node->getLoc(), constructee,
                                              intermediate.addConstantUnion(constructeeElement, node->getLoc()));
         if (component->isVector())
             component = handleBracketDereference(node->getLoc(), component,
@@ -9535,7 +9664,7 @@
     // Insert it in the vector that tracks struct return types.
     sampler.structReturnIndex = unsigned(textureReturnStruct.size());
     textureReturnStruct.push_back(members);
-    
+
     // Success!
     return true;
 }
@@ -9583,7 +9712,7 @@
     TVector<const TFunction*> candidateList;
     bool builtIn;
     symbolTable.findFunctionNameList(mangledName, candidateList, builtIn);
-    
+
     // We have to have one and only one, or we don't know which to pick: the patchconstantfunc does not
     // allow any disambiguation of overloads.
     if (candidateList.empty()) {
@@ -9654,26 +9783,26 @@
 
         return type.isSizedArray() && biType == EbvOutputPatch;
     };
-    
+
     // We will perform these steps.  Each is in a scoped block for separation: they could
     // become separate functions to make addPatchConstantInvocation shorter.
-    // 
+    //
     // 1. Union the interfaces, and create built-ins for anything present in the PCF and
     //    declared as a built-in variable that isn't present in the entry point's signature.
     //
     // 2. Synthesizes a call to the patchconstfunction using built-in variables from either main,
     //    or the ones we created.  Matching is based on built-in type.  We may use synthesized
     //    variables from (1) above.
-    // 
+    //
     // 2B: Synthesize per control point invocations of wrapped entry point if the PCF requires them.
     //
     // 3. Create a return sequence: copy the return value (if any) from the PCF to a
     //    (non-sanitized) output variable.  In case this may involve multiple copies, such as for
     //    an arrayed variable, a temporary copy of the PCF output is created to avoid multiple
     //    indirections into a complex R-value coming from the call to the PCF.
-    // 
+    //
     // 4. Create a barrier.
-    // 
+    //
     // 5/5B. Call the PCF inside an if test for (invocation id == 0).
 
     TFunction* patchConstantFunctionPtr = const_cast<TFunction*>(findPatchConstantFunction(loc));
@@ -9740,6 +9869,8 @@
                 } else {
                     // Use the original declaration type for the linkage
                     paramType->getQualifier().builtIn = biType;
+                    if (biType == EbvTessLevelInner || biType == EbvTessLevelOuter)
+                        paramType->getQualifier().patch = true;
 
                     if (notInEntryPoint.count(tInterstageIoData(biType, storage)) == 1)
                         addToLinkage(*paramType, patchConstantFunction[p].name, nullptr);
@@ -9778,7 +9909,7 @@
             } else {
                 // find which built-in it is
                 const TBuiltInVariable biType = patchConstantFunction[p].getDeclaredBuiltIn();
-                
+
                 if (biType == EbvInputPatch && inputPatch == nullptr) {
                     error(loc, "unimplemented: PCF input patch without entry point input patch parameter", "", "");
                     return;
@@ -9885,7 +10016,7 @@
             element->setType(derefType);
             element->setLoc(loc);
 
-            pcfCallSequence = intermediate.growAggregate(pcfCallSequence, 
+            pcfCallSequence = intermediate.growAggregate(pcfCallSequence,
                                                          handleAssign(loc, EOpAssign, element, callReturn));
         }
     }
@@ -9911,8 +10042,8 @@
         TVariable* pcfOutput = makeInternalVariable("@patchConstantOutput", outType);
         pcfOutput->getWritableType().getQualifier().storage = EvqVaryingOut;
 
-        if (pcfOutput->getType().containsBuiltIn())
-            split(*pcfOutput);
+        if (pcfOutput->getType().isStruct())
+            flatten(*pcfOutput, false);
 
         assignToInterface(*pcfOutput);
 
@@ -9934,7 +10065,7 @@
         pcfCallSequence = intermediate.growAggregate(pcfCallSequence, pcfCall);
     }
 
-    // ================ Step 4: Barrier ================    
+    // ================ Step 4: Barrier ================
     TIntermTyped* barrier = new TIntermAggregate(EOpBarrier);
     barrier->setLoc(loc);
     barrier->setType(TType(EbtVoid));
@@ -10006,7 +10137,7 @@
 
     // Patch append sequences, now that we know the stream output symbol.
     for (auto append = gsAppends.begin(); append != gsAppends.end(); ++append) {
-        append->node->getSequence()[0] = 
+        append->node->getSequence()[0] =
             handleAssign(append->loc, EOpAssign,
                          intermediate.addSymbol(*gsStreamOutput, append->loc),
                          append->node->getSequence()[0]->getAsTyped());
diff --git a/hlsl/hlslParseHelper.h b/glslang/HLSL/hlslParseHelper.h
similarity index 98%
rename from hlsl/hlslParseHelper.h
rename to glslang/HLSL/hlslParseHelper.h
index 6f41661..b92856a 100644
--- a/hlsl/hlslParseHelper.h
+++ b/glslang/HLSL/hlslParseHelper.h
@@ -36,9 +36,9 @@
 #ifndef HLSL_PARSE_INCLUDED_
 #define HLSL_PARSE_INCLUDED_
 
-#include "../glslang/MachineIndependent/parseVersions.h"
-#include "../glslang/MachineIndependent/ParseHelper.h"
-#include "../glslang/MachineIndependent/attribute.h"
+#include "../MachineIndependent/parseVersions.h"
+#include "../MachineIndependent/ParseHelper.h"
+#include "../MachineIndependent/attribute.h"
 
 #include <array>
 
@@ -60,8 +60,8 @@
     virtual const char* getGlobalUniformBlockName() const override { return "$Global"; }
     virtual void setUniformBlockDefaults(TType& block) const override
     {
-        block.getQualifier().layoutPacking = ElpStd140;
-        block.getQualifier().layoutMatrix = ElmRowMajor;
+        block.getQualifier().layoutPacking = globalUniformDefaults.layoutPacking;
+        block.getQualifier().layoutMatrix = globalUniformDefaults.layoutMatrix;
     }
 
     void reservedPpErrorCheck(const TSourceLoc&, const char* /*name*/, const char* /*op*/) override { }
@@ -276,7 +276,7 @@
 
     void fixBuiltInIoType(TType&);
 
-    void flatten(const TVariable& variable, bool linkage);
+    void flatten(const TVariable& variable, bool linkage, bool arrayed = false);
     int flatten(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage,
                 const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes);
     int flattenStruct(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage,
@@ -320,7 +320,7 @@
     // Finalization step: remove unused buffer blocks from linkage (we don't know until the
     // shader is entirely compiled)
     void removeUnusedStructBufferCounters();
- 
+
     static bool isClipOrCullDistance(TBuiltInVariable);
     static bool isClipOrCullDistance(const TQualifier& qual) { return isClipOrCullDistance(qual.builtIn); }
     static bool isClipOrCullDistance(const TType& type) { return isClipOrCullDistance(type.getQualifier()); }
@@ -407,7 +407,7 @@
     // This tracks texture sample user structure return types.  Only a limited number are supported, as
     // may fit in TSampler::structReturnIndex.
     TVector<TTypeList*> textureReturnStruct;
-    
+
     TMap<TString, bool> structBufferCounter;  // true if counter buffer is in use
 
     // The built-in interstage IO map considers e.g, EvqPosition on input and output separately, so that we
@@ -456,7 +456,7 @@
     std::array<int, maxClipCullRegs> cullSemanticNSizeOut; // vector, indexed by cull semantic ID
 
     // This tracks the first (mip level) argument to the .mips[][] operator.  Since this can be nested as
-    // in tx.mips[tx.mips[0][1].x][2], we need a stack.  We also track the TSourceLoc for error reporting 
+    // in tx.mips[tx.mips[0][1].x][2], we need a stack.  We also track the TSourceLoc for error reporting
     // purposes.
     struct tMipsOperatorData {
         tMipsOperatorData(TSourceLoc l, TIntermTyped* m) : loc(l), mipLevel(m) { }
diff --git a/hlsl/hlslParseables.cpp b/glslang/HLSL/hlslParseables.cpp
similarity index 93%
rename from hlsl/hlslParseables.cpp
rename to glslang/HLSL/hlslParseables.cpp
index a63ecb6..4673b46 100644
--- a/hlsl/hlslParseables.cpp
+++ b/glslang/HLSL/hlslParseables.cpp
@@ -56,18 +56,6 @@
 
 namespace {  // anonymous namespace functions
 
-const bool UseHlslTypes = true;
-
-const char* BaseTypeName(const char argOrder, const char* scalarName, const char* vecName, const char* matName)
-{
-    switch (argOrder) {
-    case 'S': return scalarName;
-    case 'V': return vecName;
-    case 'M': return matName;
-    default:  return "UNKNOWN_TYPE";
-    }
-}
-
 // arg order queries
 bool IsSamplerType(const char argType)     { return argType == 'S' || argType == 's'; }
 bool IsArrayed(const char argOrder)        { return argOrder == '@' || argOrder == '&' || argOrder == '#'; }
@@ -216,8 +204,7 @@
     return 0; // none found.
 }
 
-// Create and return a type name.  This is done in GLSL, not HLSL conventions, until such
-// time as builtins are parsed using the HLSL parser.
+// Create and return a type name, using HLSL type conventions.
 //
 //    order:   S = scalar, V = vector, M = matrix
 //    argType: F = float, D = double, I = int, U = uint, B = bool, S = sampler
@@ -252,63 +239,35 @@
 
     char order = *argOrder;
 
-    if (UseHlslTypes) {
-        switch (type) {
-        case '-': s += "void";                                break;
-        case 'F': s += "float";                               break;
-        case 'D': s += "double";                              break;
-        case 'I': s += "int";                                 break;
-        case 'U': s += "uint";                                break;
-        case 'L': s += "int64_t";                             break;
-        case 'M': s += "uint64_t";                            break;
-        case 'B': s += "bool";                                break;
-        case 'S': s += "sampler";                             break;
-        case 's': s += "SamplerComparisonState";              break;
-        case 'T': s += ((isBuffer && isImage) ? "RWBuffer" :
-                        isSubpass ? "SubpassInput" :
-                        isBuffer ? "Buffer" :
-                        isImage  ? "RWTexture" : "Texture");  break;
-        case 'i': s += ((isBuffer && isImage) ? "RWBuffer" :
-                        isSubpass ? "SubpassInput" :
-                        isBuffer ? "Buffer" :
-                        isImage ? "RWTexture" : "Texture");   break;
-        case 'u': s += ((isBuffer && isImage) ? "RWBuffer" :
-                        isSubpass ? "SubpassInput" :
-                        isBuffer ? "Buffer" :
-                        isImage ? "RWTexture" : "Texture");   break;
-        default:  s += "UNKNOWN_TYPE";                        break;
-        }
-
-        if (isSubpass && isMS)
-            s += "MS";
-
-    } else {
-        switch (type) {
-        case '-': s += "void"; break;
-        case 'F': s += BaseTypeName(order, "float",  "vec",  "mat");  break;
-        case 'D': s += BaseTypeName(order, "double", "dvec", "dmat"); break;
-        case 'I': s += BaseTypeName(order, "int",    "ivec", "imat"); break;
-        case 'U': s += BaseTypeName(order, "uint",   "uvec", "umat"); break;
-        case 'B': s += BaseTypeName(order, "bool",   "bvec", "bmat"); break;
-        case 'S': s += "sampler";                                     break;
-        case 's': s += "samplerShadow";                               break;
-        case 'T': // fall through
-        case 'i': // ...
-        case 'u': // ...
-            if (type != 'T') // create itexture, utexture, etc
-                s += type;
-
-            s += ((isImage && isBuffer) ? "imageBuffer"   :
-                  isSubpass             ? "subpassInput" :
-                  isImage               ? "image"         :
-                  isBuffer              ? "samplerBuffer" :
-                  "texture");
-            break;
-
-        default:  s += "UNKNOWN_TYPE"; break;
-        }
+    switch (type) {
+    case '-': s += "void";                                break;
+    case 'F': s += "float";                               break;
+    case 'D': s += "double";                              break;
+    case 'I': s += "int";                                 break;
+    case 'U': s += "uint";                                break;
+    case 'L': s += "int64_t";                             break;
+    case 'M': s += "uint64_t";                            break;
+    case 'B': s += "bool";                                break;
+    case 'S': s += "sampler";                             break;
+    case 's': s += "SamplerComparisonState";              break;
+    case 'T': s += ((isBuffer && isImage) ? "RWBuffer" :
+                    isSubpass ? "SubpassInput" :
+                    isBuffer ? "Buffer" :
+                    isImage  ? "RWTexture" : "Texture");  break;
+    case 'i': s += ((isBuffer && isImage) ? "RWBuffer" :
+                    isSubpass ? "SubpassInput" :
+                    isBuffer ? "Buffer" :
+                    isImage ? "RWTexture" : "Texture");   break;
+    case 'u': s += ((isBuffer && isImage) ? "RWBuffer" :
+                    isSubpass ? "SubpassInput" :
+                    isBuffer ? "Buffer" :
+                    isImage ? "RWTexture" : "Texture");   break;
+    default:  s += "UNKNOWN_TYPE";                        break;
     }
 
+    if (isSubpass && isMS)
+        s += "MS";
+
     // handle fixed vector sizes, such as float3, and only ever 3.
     const int fixedVecSize = FixedVecSize(argOrder);
     if (fixedVecSize != 0)
@@ -324,7 +283,7 @@
             case 1: s += "1D";                   break;
             case 2: s += (isMS ? "2DMS" : "2D"); break;
             case 3: s += "3D";                   break;
-            case 4: s += "Cube";                 break;
+            case 4: s += (type == 'S'? "CUBE" : "Cube"); break;
             default: s += "UNKNOWN_SAMPLER";     break;
             }
         }
@@ -357,26 +316,24 @@
     if (isArrayed)
         s += "Array";
 
-    // For HLSL, append return type for texture types
-    if (UseHlslTypes) {
-        switch (type) {
-        case 'i': s += "<int";   s += dim0Char; s += ">"; break;
-        case 'u': s += "<uint";  s += dim0Char; s += ">"; break;
-        case 'T': s += "<float"; s += dim0Char; s += ">"; break;
-        default: break;
-        }
+    switch (type) {
+    case 'i': s += "<int";   s += dim0Char; s += ">"; break;
+    case 'u': s += "<uint";  s += dim0Char; s += ">"; break;
+    case 'T': s += "<float"; s += dim0Char; s += ">"; break;
+    default: break;
     }
 
     return s;
 }
 
-// The GLSL parser can be used to parse a subset of HLSL prototypes.  However, many valid HLSL prototypes
-// are not valid GLSL prototypes.  This rejects the invalid ones.  Thus, there is a single switch below
-// to enable creation of the entire HLSL space.
-inline bool IsValid(const char* cname, char retOrder, char retType, char argOrder, char argType, int dim0, int dim1)
+// This rejects prototypes not normally valid for GLSL and it's way of finding
+// overloaded built-ins under implicit type conversion.
+//
+// It is possible that this is not needed, but that would require some tweaking
+// of other rules to get the same results.
+inline bool IsValid(const char* cname, char /* retOrder */, char /* retType */, char argOrder, char /* argType */, int dim0, int /* dim1 */)
 {
     const bool isVec = (argOrder == 'V');
-    const bool isMat = (argOrder == 'M');
 
     const std::string name(cname);
 
@@ -387,26 +344,6 @@
     if (!IsTextureType(argOrder) && (isVec && dim0 == 1)) // avoid vec1
         return false;
 
-    if (UseHlslTypes) {
-        // NO further restrictions for HLSL
-    } else {
-        // GLSL parser restrictions
-        if ((isMat && (argType == 'I' || argType == 'U' || argType == 'B')) ||
-            (retOrder == 'M' && (retType == 'I' || retType == 'U' || retType == 'B')))
-            return false;
-
-        if (isMat && dim0 == 1 && dim1 == 1)  // avoid mat1x1
-            return false;
-
-        if (isMat && dim1 == 1)  // TODO: avoid mat Nx1 until we find the right GLSL profile
-            return false;
-
-        if (name == "GetRenderTargetSamplePosition" ||
-            name == "tex1D" ||
-            name == "tex1Dgrad")
-            return false;
-    }
-
     return true;
 }
 
@@ -461,12 +398,10 @@
 {
     TString& s = commonBuiltins;
 
-    const int first = (UseHlslTypes ? 1 : 2);
-
-    for (int xRows = first; xRows <=4; xRows++) {
-        for (int xCols = first; xCols <=4; xCols++) {
+    for (int xRows = 1; xRows <=4; xRows++) {
+        for (int xCols = 1; xCols <=4; xCols++) {
             const int yRows = xCols;
-            for (int yCols = first; yCols <=4; yCols++) {
+            for (int yCols = 1; yCols <=4; yCols++) {
                 const int retRows = xRows;
                 const int retCols = yCols;
 
@@ -670,7 +605,7 @@
         { "noise",                            "S",     "F",       "V",              "F",             EShLangPS,     false },
         { "normalize",                        nullptr, nullptr,   "V",              "F",             EShLangAll,    false },
         { "pow",                              nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false },
-        // { "printf",                           "-",     "-",       "",            "",              EShLangAll,    false }, TODO: varargs
+        { "printf",                           nullptr, nullptr,   "-",              "-",             EShLangAll,    false },
         { "Process2DQuadTessFactorsAvg",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false },
         { "Process2DQuadTessFactorsMax",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false },
         { "Process2DQuadTessFactorsMin",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false },
@@ -917,7 +852,7 @@
         { "WaveActiveAllEqual",               "S",     "B",       "SV",             "DFUI",           EShLangPSCS,  false},
         { "WaveActiveAllEqualBool",           "S",     "B",       "S",              "B",              EShLangPSCS,  false},
         { "WaveActiveCountBits",              "S",     "U",       "S",              "B",              EShLangPSCS,  false},
-        
+
         { "WaveActiveSum",                    nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
         { "WaveActiveProduct",                nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
         { "WaveActiveBitAnd",                 nullptr, nullptr,   "SV",             "DFUI",           EShLangPSCS,  false},
@@ -1172,7 +1107,7 @@
     // symbolTable.relateToOperator("noise",                    EOpNoise); // TODO: check return type
     symbolTable.relateToOperator("normalize",                   EOpNormalize);
     symbolTable.relateToOperator("pow",                         EOpPow);
-    // symbolTable.relateToOperator("printf",                     EOpPrintf);
+    symbolTable.relateToOperator("printf",                      EOpDebugPrintf);
     // symbolTable.relateToOperator("Process2DQuadTessFactorsAvg");
     // symbolTable.relateToOperator("Process2DQuadTessFactorsMax");
     // symbolTable.relateToOperator("Process2DQuadTessFactorsMin");
@@ -1188,7 +1123,7 @@
     symbolTable.relateToOperator("reflect",                     EOpReflect);
     symbolTable.relateToOperator("refract",                     EOpRefract);
     symbolTable.relateToOperator("reversebits",                 EOpBitFieldReverse);
-    symbolTable.relateToOperator("round",                       EOpRoundEven);
+    symbolTable.relateToOperator("round",                       EOpRound);
     symbolTable.relateToOperator("rsqrt",                       EOpInverseSqrt);
     symbolTable.relateToOperator("saturate",                    EOpSaturate);
     symbolTable.relateToOperator("sign",                        EOpSign);
diff --git a/hlsl/hlslParseables.h b/glslang/HLSL/hlslParseables.h
similarity index 97%
rename from hlsl/hlslParseables.h
rename to glslang/HLSL/hlslParseables.h
index 28f424b..a4aef6c 100644
--- a/hlsl/hlslParseables.h
+++ b/glslang/HLSL/hlslParseables.h
@@ -36,7 +36,7 @@
 #ifndef _HLSLPARSEABLES_INCLUDED_
 #define _HLSLPARSEABLES_INCLUDED_
 
-#include "../glslang/MachineIndependent/Initialize.h"
+#include "../MachineIndependent/Initialize.h"
 
 namespace glslang {
 
diff --git a/hlsl/hlslScanContext.cpp b/glslang/HLSL/hlslScanContext.cpp
similarity index 98%
rename from hlsl/hlslScanContext.cpp
rename to glslang/HLSL/hlslScanContext.cpp
index 28a66bb..fc62672 100644
--- a/hlsl/hlslScanContext.cpp
+++ b/glslang/HLSL/hlslScanContext.cpp
@@ -42,15 +42,15 @@
 #include <unordered_map>
 #include <unordered_set>
 
-#include "../glslang/Include/Types.h"
-#include "../glslang/MachineIndependent/SymbolTable.h"
-#include "../glslang/MachineIndependent/ParseHelper.h"
+#include "../Include/Types.h"
+#include "../MachineIndependent/SymbolTable.h"
+#include "../MachineIndependent/ParseHelper.h"
 #include "hlslScanContext.h"
 #include "hlslTokens.h"
 
 // preprocessor includes
-#include "../glslang/MachineIndependent/preprocessor/PpContext.h"
-#include "../glslang/MachineIndependent/preprocessor/PpTokens.h"
+#include "../MachineIndependent/preprocessor/PpContext.h"
+#include "../MachineIndependent/preprocessor/PpTokens.h"
 
 namespace {
 
@@ -317,7 +317,7 @@
     (*KeywordMap)["sampler1D"] =               EHTokSampler1d;
     (*KeywordMap)["sampler2D"] =               EHTokSampler2d;
     (*KeywordMap)["sampler3D"] =               EHTokSampler3d;
-    (*KeywordMap)["samplerCube"] =             EHTokSamplerCube;
+    (*KeywordMap)["samplerCUBE"] =             EHTokSamplerCube;
     (*KeywordMap)["sampler_state"] =           EHTokSamplerState;
     (*KeywordMap)["SamplerState"] =            EHTokSamplerState;
     (*KeywordMap)["SamplerComparisonState"] =  EHTokSamplerComparisonState;
diff --git a/hlsl/hlslScanContext.h b/glslang/HLSL/hlslScanContext.h
similarity index 97%
rename from hlsl/hlslScanContext.h
rename to glslang/HLSL/hlslScanContext.h
index 9d30a12..3b191e4 100644
--- a/hlsl/hlslScanContext.h
+++ b/glslang/HLSL/hlslScanContext.h
@@ -41,7 +41,7 @@
 #ifndef HLSLSCANCONTEXT_H_
 #define HLSLSCANCONTEXT_H_
 
-#include "../glslang/MachineIndependent/ParseHelper.h"
+#include "../MachineIndependent/ParseHelper.h"
 #include "hlslTokens.h"
 
 namespace glslang {
diff --git a/hlsl/hlslTokenStream.cpp b/glslang/HLSL/hlslTokenStream.cpp
similarity index 100%
rename from hlsl/hlslTokenStream.cpp
rename to glslang/HLSL/hlslTokenStream.cpp
diff --git a/hlsl/hlslTokenStream.h b/glslang/HLSL/hlslTokenStream.h
similarity index 100%
rename from hlsl/hlslTokenStream.h
rename to glslang/HLSL/hlslTokenStream.h
diff --git a/hlsl/hlslTokens.h b/glslang/HLSL/hlslTokens.h
similarity index 100%
rename from hlsl/hlslTokens.h
rename to glslang/HLSL/hlslTokens.h
diff --git a/hlsl/pch.h b/glslang/HLSL/pch.h
similarity index 91%
rename from hlsl/pch.h
rename to glslang/HLSL/pch.h
index e0bc491..465e7c1 100644
--- a/hlsl/pch.h
+++ b/glslang/HLSL/pch.h
@@ -34,21 +34,20 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
+#include "hlslAttributes.h"
+#include "hlslGrammar.h"
 #include "hlslParseHelper.h"
 #include "hlslScanContext.h"
-#include "hlslGrammar.h"
-#include "hlslAttributes.h"
 
-#include "../glslang/MachineIndependent/Scan.h"
-#include "../glslang/MachineIndependent/preprocessor/PpContext.h"
+#include "../MachineIndependent/Scan.h"
+#include "../MachineIndependent/preprocessor/PpContext.h"
 
-#include "../glslang/OSDependent/osinclude.h"
+#include "../OSDependent/osinclude.h"
 
 #include <algorithm>
-#include <functional>
-#include <cctype>
 #include <array>
+#include <cctype>
+#include <functional>
 #include <set>
 
-
 #endif /* _PCH_H */
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index b69eaeb..55bdd25 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -228,6 +228,9 @@
     EbvViewIndex,
     EbvDeviceIndex,
 
+    EbvShadingRateKHR,
+    EbvPrimitiveShadingRateKHR,
+
     EbvFragSizeEXT,
     EbvFragInvocationCountEXT,
 
@@ -480,6 +483,9 @@
     case EbvWarpID:                     return "WarpIDNV";
     case EbvSMID:                       return "SMIDNV";
 
+    case EbvShadingRateKHR:             return "ShadingRateKHR";
+    case EbvPrimitiveShadingRateKHR:    return "PrimitiveShadingRateKHR";
+
     default:                      return "unknown built-in variable";
     }
 }
diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h
index 733a790..b628cdc 100644
--- a/glslang/Include/Common.h
+++ b/glslang/Include/Common.h
@@ -37,6 +37,17 @@
 #ifndef _COMMON_INCLUDED_
 #define _COMMON_INCLUDED_
 
+#include <algorithm>
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+#include <list>
+#include <map>
+#include <set>
+#include <string>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
 
 #if defined(__ANDROID__) || (defined(_MSC_VER) && _MSC_VER < 1700)
 #include <sstream>
@@ -93,18 +104,6 @@
     #pragma warning(disable : 4201) // nameless union
 #endif
 
-#include <set>
-#include <unordered_set>
-#include <vector>
-#include <map>
-#include <unordered_map>
-#include <list>
-#include <algorithm>
-#include <string>
-#include <cstdio>
-#include <cstdlib>
-#include <cassert>
-
 #include "PoolAlloc.h"
 
 //
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index b2c416d..603203d 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -406,6 +406,7 @@
     ElfRg8i,
     ElfR16i,
     ElfR8i,
+    ElfR64i,
 
     ElfIntGuard,       // to help with comparisons
 
@@ -423,6 +424,7 @@
     ElfRg8ui,
     ElfR16ui,
     ElfR8ui,
+    ElfR64ui,
 
     ElfCount
 };
@@ -497,6 +499,7 @@
         declaredBuiltIn = EbvNone;
 #ifndef GLSLANG_WEB
         noContraction = false;
+        nullInit = false;
 #endif
     }
 
@@ -510,6 +513,7 @@
         clearMemory();
         specConstant = false;
         nonUniform = false;
+        nullInit = false;
         clearLayout();
     }
 
@@ -586,6 +590,8 @@
     bool isNoContraction() const { return false; }
     void setNoContraction() { }
     bool isPervertexNV() const { return false; }
+    void setNullInit() { }
+    bool isNullInit() const { return false; }
 #else
     bool noContraction: 1; // prevent contraction and reassociation, e.g., for 'precise' keyword, and expressions it affects
     bool nopersp      : 1;
@@ -607,6 +613,7 @@
     bool subgroupcoherent  : 1;
     bool shadercallcoherent : 1;
     bool nonprivate   : 1;
+    bool nullInit : 1;
     bool isWriteOnly() const { return writeonly; }
     bool isReadOnly() const { return readonly; }
     bool isRestrict() const { return restrict; }
@@ -642,6 +649,8 @@
     bool isNoContraction() const { return noContraction; }
     void setNoContraction() { noContraction = true; }
     bool isPervertexNV() const { return pervertexNV; }
+    void setNullInit() { nullInit = true; }
+    bool isNullInit() const { return nullInit; }
 #endif
 
     bool isPipeInput() const
@@ -755,6 +764,12 @@
     bool isPerPrimitive() const { return perPrimitiveNV; }
     bool isPerView() const { return perViewNV; }
     bool isTaskMemory() const { return perTaskNV; }
+    bool isAnyPayload() const {
+        return storage == EvqPayload || storage == EvqPayloadIn;
+    }
+    bool isAnyCallable() const {
+        return storage == EvqCallableData || storage == EvqCallableDataIn;
+    }
 
     // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
     bool isArrayedIo(EShLanguage language) const
@@ -1117,6 +1132,8 @@
         case ElfR32ui:        return "r32ui";
         case ElfR16ui:        return "r16ui";
         case ElfR8ui:         return "r8ui";
+        case ElfR64ui:        return "r64ui";
+        case ElfR64i:         return "r64i";
         default:              return "none";
         }
     }
@@ -1235,6 +1252,7 @@
     bool layoutDerivativeGroupQuads;    // true if layout derivative_group_quadsNV set
     bool layoutDerivativeGroupLinear;   // true if layout derivative_group_linearNV set
     int primitives;                     // mesh shader "max_primitives"DerivativeGroupLinear;   // true if layout derivative_group_linearNV set
+    bool layoutPrimitiveCulling;        // true if layout primitive_culling set
     TLayoutDepth getDepth() const { return layoutDepth; }
 #else
     TLayoutDepth getDepth() const { return EldNone; }
@@ -1268,6 +1286,7 @@
         layoutOverrideCoverage      = false;
         layoutDerivativeGroupQuads  = false;
         layoutDerivativeGroupLinear = false;
+        layoutPrimitiveCulling      = false;
         primitives                  = TQualifier::layoutNotSet;
         interlockOrdering = EioNone;
 #endif
@@ -1331,6 +1350,8 @@
             primitives = src.primitives;
         if (src.interlockOrdering != EioNone)
             interlockOrdering = src.interlockOrdering;
+        if (src.layoutPrimitiveCulling)
+            layoutPrimitiveCulling = src.layoutPrimitiveCulling;
 #endif
     }
 };
@@ -1982,6 +2003,7 @@
         case EbtAccStruct:         return "accelerationStructureNV";
         case EbtRayQuery:          return "rayQueryEXT";
         case EbtReference:         return "reference";
+        case EbtString:            return "string";
 #endif
         default:                   return "unknown type";
         }
@@ -2149,6 +2171,8 @@
             appendStr(" specialization-constant");
         if (qualifier.nonUniform)
             appendStr(" nonuniform");
+        if (qualifier.isNullInit())
+            appendStr(" null-init");
         appendStr(" ");
         appendStr(getStorageQualifierString());
         if (isArray()) {
diff --git a/glslang/Include/glslang_c_interface.h b/glslang/Include/glslang_c_interface.h
index 50e95b7..4b32e2b 100644
--- a/glslang/Include/glslang_c_interface.h
+++ b/glslang/Include/glslang_c_interface.h
@@ -203,28 +203,44 @@
 extern "C" {
 #endif
 
-int glslang_initialize_process();
-void glslang_finalize_process();
+#ifdef GLSLANG_IS_SHARED_LIBRARY
+    #ifdef _WIN32
+        #ifdef GLSLANG_EXPORTING
+            #define GLSLANG_EXPORT __declspec(dllexport)
+        #else
+            #define GLSLANG_EXPORT __declspec(dllimport)
+        #endif
+    #elif __GNUC__ >= 4
+        #define GLSLANG_EXPORT __attribute__((visibility("default")))
+    #endif
+#endif // GLSLANG_IS_SHARED_LIBRARY
 
-glslang_shader_t* glslang_shader_create(const glslang_input_t* input);
-void glslang_shader_delete(glslang_shader_t* shader);
-int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
-int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
-const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
-const char* glslang_shader_get_info_log(glslang_shader_t* shader);
-const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader);
+#ifndef GLSLANG_EXPORT
+#define GLSLANG_EXPORT
+#endif
 
-glslang_program_t* glslang_program_create();
-void glslang_program_delete(glslang_program_t* program);
-void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader);
-int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t
-void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
-size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
-void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
-unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program);
-const char* glslang_program_SPIRV_get_messages(glslang_program_t* program);
-const char* glslang_program_get_info_log(glslang_program_t* program);
-const char* glslang_program_get_info_debug_log(glslang_program_t* program);
+GLSLANG_EXPORT int glslang_initialize_process();
+GLSLANG_EXPORT void glslang_finalize_process();
+
+GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input);
+GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader);
+GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
+GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
+GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
+GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader);
+GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader);
+
+GLSLANG_EXPORT glslang_program_t* glslang_program_create();
+GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program);
+GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader);
+GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t
+GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
+GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
+GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
+GLSLANG_EXPORT unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program);
+GLSLANG_EXPORT const char* glslang_program_SPIRV_get_messages(glslang_program_t* program);
+GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program);
+GLSLANG_EXPORT const char* glslang_program_get_info_debug_log(glslang_program_t* program);
 
 #ifdef __cplusplus
 }
diff --git a/glslang/Include/glslang_c_shader_types.h b/glslang/Include/glslang_c_shader_types.h
index 769f4c4..f100a9a 100644
--- a/glslang/Include/glslang_c_shader_types.h
+++ b/glslang/Include/glslang_c_shader_types.h
@@ -100,8 +100,9 @@
 typedef enum {
     GLSLANG_TARGET_VULKAN_1_0 = (1 << 22),
     GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12),
+    GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12),
     GLSLANG_TARGET_OPENGL_450 = 450,
-    LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT),
+    LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 4),
 } glslang_target_client_version_t;
 
 /* SH_TARGET_LanguageVersion counterpart */
@@ -112,7 +113,7 @@
     GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8),
     GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8),
     GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8),
-    LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT),
+    LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 6),
 } glslang_target_language_version_t;
 
 /* EShExecutable counterpart */
@@ -164,6 +165,9 @@
     GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
     GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
     GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
+    GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6),
+    GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7),
+    GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8),
     LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
 } glslang_reflection_options_t;
 
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index bf12fcf..19cd32e 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -280,6 +280,12 @@
     EOpConvUvec2ToPtr,
     EOpConvPtrToUvec2,
 
+    // uint64_t -> accelerationStructureEXT
+    EOpConvUint64ToAccStruct,
+
+    // uvec2 -> accelerationStructureEXT
+    EOpConvUvec2ToAccStruct,
+
     //
     // binary operations
     //
@@ -628,13 +634,16 @@
     // Branch
     //
 
-    EOpKill,            // Fragment only
+    EOpKill,                // Fragment only
+    EOpTerminateInvocation, // Fragment only
+    EOpDemote,              // Fragment only
+    EOpTerminateRayKHR,         // Any-hit only
+    EOpIgnoreIntersectionKHR,   // Any-hit only
     EOpReturn,
     EOpBreak,
     EOpContinue,
     EOpCase,
     EOpDefault,
-    EOpDemote,          // Fragment only
 
     //
     // Constructors
@@ -751,6 +760,7 @@
     EOpConstructNonuniform,     // expected to be transformed away, not present in final AST
     EOpConstructReference,
     EOpConstructCooperativeMatrix,
+    EOpConstructAccStruct,
     EOpConstructGuardEnd,
 
     //
@@ -911,11 +921,13 @@
     EOpAverageRounded,
     EOpMul32x16,
 
-    EOpTrace,
+    EOpTraceNV,
+    EOpTraceKHR,
     EOpReportIntersection,
-    EOpIgnoreIntersection,
-    EOpTerminateRay,
-    EOpExecuteCallable,
+    EOpIgnoreIntersectionNV,
+    EOpTerminateRayNV,
+    EOpExecuteCallableNV,
+    EOpExecuteCallableKHR,
     EOpWritePackedPrimitiveIndices4x8NV,
 
     //
@@ -1231,6 +1243,7 @@
     TOperator getFlowOp() const { return flowOp; }
     TIntermTyped* getExpression() const { return expression; }
     void setExpression(TIntermTyped* pExpression) { expression = pExpression; }
+    void updatePrecision(TPrecisionQualifier parentPrecision);
 protected:
     TOperator flowOp;
     TIntermTyped* expression;
@@ -1281,6 +1294,8 @@
     TIntermTyped* getConstSubtree() const { return constSubtree; }
 #ifndef GLSLANG_WEB
     void setFlattenSubset(int subset) { flattenSubset = subset; }
+    virtual const TString& getAccessName() const;
+
     int getFlattenSubset() const { return flattenSubset; } // -1 means full object
 #endif
 
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
deleted file mode 100644
index 744c2fb..0000000
--- a/glslang/Include/revision.h
+++ /dev/null
@@ -1,3 +0,0 @@
-// This header is generated by the make-revision script.
-
-#define GLSLANG_PATCH_LEVEL 3743
diff --git a/glslang/Include/revision.template b/glslang/Include/revision.template
deleted file mode 100644
index 4a16bee..0000000
--- a/glslang/Include/revision.template
+++ /dev/null
@@ -1,13 +0,0 @@
-// The file revision.h should be updated to the latest version, somehow, on
-// check-in, if glslang has changed.
-//
-// revision.template is the source for revision.h when using SubWCRev as the
-// method of updating revision.h.  You don't have to do it this way, the
-// requirement is only that revision.h gets updated.
-//
-// revision.h is under source control so that not all consumers of glslang
-// 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 "$WCREV$"
-#define GLSLANG_DATE     "$WCDATE$"
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 36c35a8..a5ef6cc 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -146,6 +146,11 @@
 // Declare pointers to put into the table for versioning.
 #ifdef GLSLANG_WEB
     const Versioning* Es300Desktop130 = nullptr;
+    const Versioning* Es310Desktop420 = nullptr;
+#elif defined(GLSLANG_ANGLE)
+    const Versioning* Es300Desktop130 = nullptr;
+    const Versioning* Es310Desktop420 = nullptr;
+    const Versioning* Es310Desktop450 = nullptr;
 #else
     const Versioning Es300Desktop130Version[] = { { EEsProfile,      0, 300, 0, nullptr },
                                                   { EDesktopProfile, 0, 130, 0, nullptr },
@@ -414,7 +419,7 @@
 // See if the tabled versioning information allows the current version.
 bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile, const SpvVersion& /* spVersion */)
 {
-#ifdef GLSLANG_WEB
+#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
     // all entries in table are valid
     return true;
 #endif
@@ -498,12 +503,14 @@
     prefixes[EbtFloat] =  "";
     prefixes[EbtInt]   = "i";
     prefixes[EbtUint]  = "u";
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     prefixes[EbtFloat16] = "f16";
     prefixes[EbtInt8]  = "i8";
     prefixes[EbtUint8] = "u8";
     prefixes[EbtInt16]  = "i16";
     prefixes[EbtUint16] = "u16";
+    prefixes[EbtInt64]  = "i64";
+    prefixes[EbtUint64] = "u64";
 #endif
 
     postfixes[2] = "2";
@@ -515,7 +522,9 @@
     dimMap[Esd3D] = 3;
     dimMap[EsdCube] = 3;
 #ifndef GLSLANG_WEB
+#ifndef GLSLANG_ANGLE
     dimMap[Esd1D] = 1;
+#endif
     dimMap[EsdRect] = 2;
     dimMap[EsdBuffer] = 1;
     dimMap[EsdSubpass] = 2;  // potentially unused for now
@@ -540,6 +549,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
     addTabledBuiltins(version, profile, spvVersion);
 
@@ -585,6 +597,7 @@
         "vec4  fwidthCoarse(vec4  p);"
     );
 
+#ifndef GLSLANG_ANGLE
     TString derivativesAndControl16bits (
         "float16_t dFdx(float16_t);"
         "f16vec2   dFdx(f16vec2);"
@@ -1172,6 +1185,7 @@
             "\n"
         );
     }
+#endif // !GLSLANG_ANGLE
 
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 430)) {
@@ -1209,6 +1223,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 440) {
         commonBuiltins.append(
             "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);"
@@ -1240,11 +1255,19 @@
             " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t);"
             "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
             " int64_t atomicAdd(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+            "   float atomicAdd(coherent volatile inout float, float);"
+            "   float atomicAdd(coherent volatile inout float, float, int, int, int);"
+            "  double atomicAdd(coherent volatile inout double, double);"
+            "  double atomicAdd(coherent volatile inout double, double, int, int, int);"
 
             "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t);"
             " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t);"
             "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t, int, int, int);"
             " int64_t atomicExchange(coherent volatile inout  int64_t,  int64_t, int, int, int);"
+            "   float atomicExchange(coherent volatile inout float, float);"
+            "   float atomicExchange(coherent volatile inout float, float, int, int, int);"
+            "  double atomicExchange(coherent volatile inout double, double);"
+            "  double atomicExchange(coherent volatile inout double, double, int, int, int);"
 
             "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t);"
             " int64_t atomicCompSwap(coherent volatile inout  int64_t,  int64_t,  int64_t);"
@@ -1253,12 +1276,17 @@
 
             "uint64_t atomicLoad(coherent volatile in uint64_t, int, int, int);"
             " int64_t atomicLoad(coherent volatile in  int64_t, int, int, int);"
+            "   float atomicLoad(coherent volatile in float, int, int, int);"
+            "  double atomicLoad(coherent volatile in double, int, int, int);"
 
             "void atomicStore(coherent volatile out uint64_t, uint64_t, int, int, int);"
             "void atomicStore(coherent volatile out  int64_t,  int64_t, int, int, int);"
+            "void atomicStore(coherent volatile out float, float, int, int, int);"
+            "void atomicStore(coherent volatile out double, double, int, int, int);"
             "\n");
     }
-#endif
+#endif // !GLSLANG_ANGLE
+#endif // !GLSLANG_WEB
 
     if ((profile == EEsProfile && version >= 300) ||
         (profile != EEsProfile && version >= 150)) { // GL_ARB_shader_bit_encoding
@@ -1298,6 +1326,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 150) {  // ARB_gpu_shader_fp64
             commonBuiltins.append(
                 "double fma(double, double, double);"
@@ -1306,6 +1335,7 @@
                 "dvec4  fma(dvec4,  dvec4,  dvec4 );"
                 "\n");
     }
+#endif
 
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 400)) {
@@ -1323,6 +1353,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64
         commonBuiltins.append(
             "double frexp(double, out int);"
@@ -1341,6 +1372,7 @@
             "\n");
     }
 #endif
+#endif
 
     if ((profile == EEsProfile && version >= 300) ||
         (profile != EEsProfile && version >= 150)) {
@@ -1449,6 +1481,7 @@
     }
 
 #ifndef GLSLANG_WEB
+#ifndef GLSLANG_ANGLE
     //
     // Original-style texture functions existing in all stages.
     // (Per-stage functions below.)
@@ -1597,6 +1630,7 @@
                 "\n");
         }
     }
+#endif // !GLSLANG_ANGLE
 
     // Bitfield
     if ((profile == EEsProfile && version >= 310) ||
@@ -1739,6 +1773,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // GL_ARB_shader_ballot
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
@@ -3059,6 +3094,7 @@
             "bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
             "\n");
     }
+#endif // !GLSLANG_ANGLE
 
     if ((profile == EEsProfile && version >= 300 && version < 310) ||
         (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix
@@ -3078,6 +3114,7 @@
                               "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // GL_AMD_gpu_shader_half_float/Explicit types
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
@@ -3928,28 +3965,30 @@
             "f64vec3   log2(f64vec3);"
             "f64vec4   log2(f64vec4);"
             "\n");
-        }
-        if (profile != EEsProfile && version >= 450) {
-            stageBuiltins[EShLangFragment].append(derivativesAndControl64bits);
-            stageBuiltins[EShLangFragment].append(
-                "float64_t interpolateAtCentroid(float64_t);"
-                "f64vec2   interpolateAtCentroid(f64vec2);"
-                "f64vec3   interpolateAtCentroid(f64vec3);"
-                "f64vec4   interpolateAtCentroid(f64vec4);"
+    }
 
-                "float64_t interpolateAtSample(float64_t, int);"
-                "f64vec2   interpolateAtSample(f64vec2,   int);"
-                "f64vec3   interpolateAtSample(f64vec3,   int);"
-                "f64vec4   interpolateAtSample(f64vec4,   int);"
+    if (profile != EEsProfile && version >= 450) {
+        stageBuiltins[EShLangFragment].append(derivativesAndControl64bits);
+        stageBuiltins[EShLangFragment].append(
+            "float64_t interpolateAtCentroid(float64_t);"
+            "f64vec2   interpolateAtCentroid(f64vec2);"
+            "f64vec3   interpolateAtCentroid(f64vec3);"
+            "f64vec4   interpolateAtCentroid(f64vec4);"
 
-                "float64_t interpolateAtOffset(float64_t, f64vec2);"
-                "f64vec2   interpolateAtOffset(f64vec2,   f64vec2);"
-                "f64vec3   interpolateAtOffset(f64vec3,   f64vec2);"
-                "f64vec4   interpolateAtOffset(f64vec4,   f64vec2);"
+            "float64_t interpolateAtSample(float64_t, int);"
+            "f64vec2   interpolateAtSample(f64vec2,   int);"
+            "f64vec3   interpolateAtSample(f64vec3,   int);"
+            "f64vec4   interpolateAtSample(f64vec4,   int);"
 
-                "\n");
+            "float64_t interpolateAtOffset(float64_t, f64vec2);"
+            "f64vec2   interpolateAtOffset(f64vec2,   f64vec2);"
+            "f64vec3   interpolateAtOffset(f64vec3,   f64vec2);"
+            "f64vec4   interpolateAtOffset(f64vec4,   f64vec2);"
+
+            "\n");
 
     }
+#endif // !GLSLANG_ANGLE
 
     //============================================================================
     //
@@ -3965,6 +4004,7 @@
     if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion))
         stageBuiltins[EShLangVertex].append("vec4 ftransform();");
 
+#ifndef GLSLANG_ANGLE
     //
     // Original-style texture Functions with lod.
     //
@@ -4024,6 +4064,7 @@
                 "\n");
         }
     }
+#endif // !GLSLANG_ANGLE
 
     if ((profile != EEsProfile && version >= 150) ||
         (profile == EEsProfile && version >= 310)) {
@@ -4044,7 +4085,7 @@
             "void EndPrimitive();"
             "\n");
     }
-#endif
+#endif // !GLSLANG_WEB
 
     //============================================================================
     //
@@ -4104,6 +4145,7 @@
 
     commonBuiltins.append("void debugPrintfEXT();\n");
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 450) {
         // coopMatStoreNV perhaps ought to have "out" on the buf parameter, but
         // adding it introduces undesirable tempArgs on the stack. What we want
@@ -4227,6 +4269,7 @@
 
             "\n");
     }
+#endif // !GLSLANG_ANGLE
 
     // GL_ARB_derivative_control
     if (profile != EEsProfile && version >= 400) {
@@ -4264,6 +4307,7 @@
         "bool helperInvocationEXT();"
         "\n");
 
+#ifndef GLSLANG_ANGLE
     // GL_AMD_shader_explicit_vertex_parameter
     if (profile != EEsProfile && version >= 450) {
         stageBuiltins[EShLangFragment].append(
@@ -4377,9 +4421,7 @@
             "\n");
         stageBuiltins[EShLangAnyHit].append(
             "void ignoreIntersectionNV();"
-            "void ignoreIntersectionEXT();"
             "void terminateRayNV();"
-            "void terminateRayEXT();"
             "\n");
         stageBuiltins[EShLangClosestHit].append(
             "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
@@ -4398,12 +4440,14 @@
             "void executeCallableEXT(uint, int);"
             "\n");
     }
+#endif // !GLSLANG_ANGLE
 
     //E_SPV_NV_compute_shader_derivatives
     if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) {
         stageBuiltins[EShLangCompute].append(derivativeControls);
         stageBuiltins[EShLangCompute].append("\n");
     }
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 450) {
         stageBuiltins[EShLangCompute].append(derivativesAndControl16bits);
         stageBuiltins[EShLangCompute].append(derivativesAndControl64bits);
@@ -4416,7 +4460,8 @@
             "void writePackedPrimitiveIndices4x8NV(uint, uint);"
             "\n");
     }
-#endif
+#endif // !GLSLANG_ANGLE
+#endif // !GLSLANG_WEB
 
     //============================================================================
     //
@@ -4453,7 +4498,7 @@
             "\n");
     }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) {
         //
         // Matrix state. p. 31, 32, 37, 39, 40.
@@ -4571,7 +4616,7 @@
 
             "\n");
     }
-#endif
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
     //============================================================================
     //
@@ -4602,6 +4647,7 @@
     }
 
 #ifndef GLSLANG_WEB
+#ifndef GLSLANG_ANGLE
     //============================================================================
     //
     // Define the interface to the mesh/task shader.
@@ -4689,6 +4735,7 @@
                 "\n");
         }
     }
+#endif // !GLSLANG_ANGLE
 
     //============================================================================
     //
@@ -4881,6 +4928,11 @@
             "\n");
     }
 
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangVertex].append(
+            "out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
+            "\n");
+    }
 
     //============================================================================
     //
@@ -4994,6 +5046,12 @@
             "\n");
     }
 
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangGeometry].append(
+            "out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
+            "\n");
+    }
+
     //============================================================================
     //
     // Define the interface to the tessellation control shader.
@@ -5291,6 +5349,11 @@
                 "in vec3 gl_BaryCoordNoPerspNV;"
                 );
 
+        if (version >= 450)
+            stageBuiltins[EShLangFragment].append(
+                "flat in int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
+            );
+
     } else {
         // ES profile
 
@@ -5349,6 +5412,10 @@
                 "in vec3 gl_BaryCoordNV;"
                 "in vec3 gl_BaryCoordNoPerspNV;"
                 );
+        if (version >= 310)
+            stageBuiltins[EShLangFragment].append(
+                "flat in highp int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
+            );
     }
 #endif
 
@@ -5359,6 +5426,21 @@
 
 #ifndef GLSLANG_WEB
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangFragment].append(
+            "flat in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "flat in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
+    }
+
+    if (version >= 300 /* both ES and non-ES */) {
+        stageBuiltins[EShLangFragment].append(
+            "flat in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
+            "\n");
+    }
+
+#ifndef GLSLANG_ANGLE
     // GL_ARB_shader_ballot
     if (profile != EEsProfile && version >= 450) {
         const char* ballotDecls =
@@ -5370,6 +5452,15 @@
             "in uint64_t gl_SubGroupLeMaskARB;"
             "in uint64_t gl_SubGroupLtMaskARB;"
             "\n";
+        const char* rtBallotDecls =
+            "uniform volatile uint gl_SubGroupSizeARB;"
+            "in volatile uint     gl_SubGroupInvocationARB;"
+            "in volatile uint64_t gl_SubGroupEqMaskARB;"
+            "in volatile uint64_t gl_SubGroupGeMaskARB;"
+            "in volatile uint64_t gl_SubGroupGtMaskARB;"
+            "in volatile uint64_t gl_SubGroupLeMaskARB;"
+            "in volatile uint64_t gl_SubGroupLtMaskARB;"
+            "\n";
         const char* fragmentBallotDecls =
             "uniform uint gl_SubGroupSizeARB;"
             "flat in uint     gl_SubGroupInvocationARB;"
@@ -5387,14 +5478,13 @@
         stageBuiltins[EShLangFragment]      .append(fragmentBallotDecls);
         stageBuiltins[EShLangMeshNV]        .append(ballotDecls);
         stageBuiltins[EShLangTaskNV]        .append(ballotDecls);
-    }
-
-    if ((profile != EEsProfile && version >= 140) ||
-        (profile == EEsProfile && version >= 310)) {
-        stageBuiltins[EShLangFragment].append(
-            "flat in highp int gl_DeviceIndex;"     // GL_EXT_device_group
-            "flat in highp int gl_ViewIndex;"       // GL_EXT_multiview
-            "\n");
+        stageBuiltins[EShLangRayGen]        .append(rtBallotDecls);
+        stageBuiltins[EShLangIntersect]     .append(rtBallotDecls);
+        // No volatile qualifier on these builtins in any-hit
+        stageBuiltins[EShLangAnyHit]        .append(ballotDecls);
+        stageBuiltins[EShLangClosestHit]    .append(rtBallotDecls);
+        stageBuiltins[EShLangMiss]          .append(rtBallotDecls);
+        stageBuiltins[EShLangCallable]      .append(rtBallotDecls);
     }
 
     // GL_KHR_shader_subgroup
@@ -5432,6 +5522,21 @@
             "in highp   uint  gl_NumSubgroups;"
             "in highp   uint  gl_SubgroupID;"
             "\n";
+        // These builtins are volatile for RT stages
+        const char* rtSubgroupDecls =
+            "in mediump volatile uint  gl_SubgroupSize;"
+            "in mediump volatile uint  gl_SubgroupInvocationID;"
+            "in highp   volatile uvec4 gl_SubgroupEqMask;"
+            "in highp   volatile uvec4 gl_SubgroupGeMask;"
+            "in highp   volatile uvec4 gl_SubgroupGtMask;"
+            "in highp   volatile uvec4 gl_SubgroupLeMask;"
+            "in highp   volatile uvec4 gl_SubgroupLtMask;"
+            // GL_NV_shader_sm_builtins
+            "in highp    uint  gl_WarpsPerSMNV;"
+            "in highp    uint  gl_SMCountNV;"
+            "in highp volatile uint  gl_WarpIDNV;"
+            "in highp volatile uint  gl_SMIDNV;"
+            "\n";
 
         stageBuiltins[EShLangVertex]        .append(subgroupDecls);
         stageBuiltins[EShLangTessControl]   .append(subgroupDecls);
@@ -5444,12 +5549,13 @@
         stageBuiltins[EShLangMeshNV]        .append(computeSubgroupDecls);
         stageBuiltins[EShLangTaskNV]        .append(subgroupDecls);
         stageBuiltins[EShLangTaskNV]        .append(computeSubgroupDecls);
-        stageBuiltins[EShLangRayGen]        .append(subgroupDecls);
-        stageBuiltins[EShLangIntersect]     .append(subgroupDecls);
+        stageBuiltins[EShLangRayGen]        .append(rtSubgroupDecls);
+        stageBuiltins[EShLangIntersect]     .append(rtSubgroupDecls);
+        // No volatile qualifier on these builtins in any-hit
         stageBuiltins[EShLangAnyHit]        .append(subgroupDecls);
-        stageBuiltins[EShLangClosestHit]    .append(subgroupDecls);
-        stageBuiltins[EShLangMiss]          .append(subgroupDecls);
-        stageBuiltins[EShLangCallable]      .append(subgroupDecls);
+        stageBuiltins[EShLangClosestHit]    .append(rtSubgroupDecls);
+        stageBuiltins[EShLangMiss]          .append(rtSubgroupDecls);
+        stageBuiltins[EShLangCallable]      .append(rtSubgroupDecls);
     }
 
     // GL_NV_ray_tracing/GL_EXT_ray_tracing
@@ -5517,7 +5623,7 @@
             "in    float  gl_RayTminNV;"
             "in    float  gl_RayTminEXT;"
             "in    float  gl_RayTmaxNV;"
-            "in    float  gl_RayTmaxEXT;"
+            "in volatile float gl_RayTmaxEXT;"
             "in    mat4x3 gl_ObjectToWorldNV;"
             "in    mat4x3 gl_ObjectToWorldEXT;"
             "in    mat3x4 gl_ObjectToWorld3x4EXT;"
@@ -5600,6 +5706,7 @@
         stageBuiltins[EShLangCallable].append(callableDecls);
 
     }
+
     if ((profile != EEsProfile && version >= 140)) {
         const char *deviceIndex =
             "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
@@ -5612,12 +5719,6 @@
         stageBuiltins[EShLangMiss].append(deviceIndex);
     }
 
-    if (version >= 300 /* both ES and non-ES */) {
-        stageBuiltins[EShLangFragment].append(
-            "flat in highp uint gl_ViewID_OVR;"     // GL_OVR_multiview, GL_OVR_multiview2
-            "\n");
-    }
-
     if ((profile != EEsProfile && version >= 420) ||
         (profile == EEsProfile && version >= 310)) {
         commonBuiltins.append("const int gl_ScopeDevice      = 1;\n");
@@ -5641,7 +5742,59 @@
         commonBuiltins.append("const int gl_StorageSemanticsImage    = 0x800;\n");
         commonBuiltins.append("const int gl_StorageSemanticsOutput   = 0x1000;\n");
     }
-#endif
+
+    // Adding these to common built-ins triggers an assert due to a memory corruption in related code when testing
+    // So instead add to each stage individually, avoiding the GLSLang bug
+    if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
+        for (int stage=EShLangVertex; stage<EShLangCount; stage++)
+        {
+            stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2VerticalPixelsEXT       = 1;\n");
+            stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4VerticalPixelsEXT       = 2;\n");
+            stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2HorizontalPixelsEXT     = 4;\n");
+            stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4HorizontalPixelsEXT     = 8;\n");
+        }
+    }
+    
+    // GL_EXT_shader_image_int64
+    if ((profile != EEsProfile && version >= 420) ||
+        (profile == EEsProfile && version >= 310)) {
+            
+        const TBasicType bTypes[] = { EbtInt64, EbtUint64 };
+        for (int ms = 0; ms <= 1; ++ms) { // loop over "bool" multisample or not
+            for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not
+                for (int dim = Esd1D; dim < EsdSubpass; ++dim) { // 1D, ..., buffer
+                    if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)
+                        continue;
+                    
+                    if ((dim == Esd3D || dim == EsdRect || dim == EsdBuffer) && arrayed)
+                        continue;
+                    
+                    if (dim != Esd2D && ms)
+                        continue;
+                    
+                    // Loop over the bTypes
+                    for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {
+                        //
+                        // Now, make all the function prototypes for the type we just built...
+                        //
+                        TSampler sampler;
+                    
+                        sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,
+                                                                          false,
+                                                                          ms      ? true : false);
+
+                        TString typeName = sampler.getString();
+
+                        addQueryFunctions(sampler, typeName, version, profile);
+                        addImageFunctions(sampler, typeName, version, profile);
+                    }
+                }
+            }
+        }
+    }
+#endif // !GLSLANG_ANGLE
+    
+#endif // !GLSLANG_WEB
 
     // printf("%s\n", commonBuiltins.c_str());
     // printf("%s\n", stageBuiltins[EShLangFragment].c_str());
@@ -5659,13 +5812,16 @@
     //
 
     // enumerate all the types
+    const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint,
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+        EbtFloat16
+#endif
+    };
 #ifdef GLSLANG_WEB
-    const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint };
     bool skipBuffer = true;
     bool skipCubeArrayed = true;
     const int image = 0;
 #else
-    const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint, EbtFloat16 };
     bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140);
     bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130);
     for (int image = 0; image <= 1; ++image) // loop over "bool" image vs sampler
@@ -5691,7 +5847,11 @@
 #ifdef GLSLANG_WEB
                     for (int dim = Esd2D; dim <= EsdCube; ++dim) { // 2D, 3D, and Cube
 #else
+#if defined(GLSLANG_ANGLE)
+                    for (int dim = Esd2D; dim < EsdNumDims; ++dim) { // 2D, ..., buffer, subpass
+#else
                     for (int dim = Esd1D; dim < EsdNumDims; ++dim) { // 1D, ..., buffer, subpass
+#endif
                         if (dim == EsdSubpass && spvVersion.vulkan == 0)
                             continue;
                         if (dim == EsdSubpass && (image || shadow || arrayed))
@@ -5730,7 +5890,6 @@
 #endif
                             if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint))
                                 continue;
-
                             //
                             // Now, make all the function prototypes for the type we just built...
                             //
@@ -5955,8 +6114,16 @@
 
     if ( profile != EEsProfile ||
         (profile == EEsProfile && version >= 310)) {
-        if (sampler.type == EbtInt || sampler.type == EbtUint) {
-            const char* dataType = sampler.type == EbtInt ? "highp int" : "highp uint";
+        if (sampler.type == EbtInt || sampler.type == EbtUint || sampler.type == EbtInt64 || sampler.type == EbtUint64 ) {
+            
+            const char* dataType;
+            switch (sampler.type) {
+                case(EbtInt): dataType = "highp int"; break;
+                case(EbtUint): dataType = "highp uint"; break;
+                case(EbtInt64): dataType = "highp int64_t"; break;
+                case(EbtUint64): dataType = "highp uint64_t"; break;
+                default: dataType = "";
+            }
 
             const int numBuiltins = 7;
 
@@ -6012,12 +6179,39 @@
             // not int or uint
             // GL_ARB_ES3_1_compatibility
             // TODO: spec issue: are there restrictions on the kind of layout() that can be used?  what about dropping memory qualifiers?
-            if ((profile != EEsProfile && version >= 450) ||
-                (profile == EEsProfile && version >= 310)) {
+            if (profile == EEsProfile && version >= 310) {
                 commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
                 commonBuiltins.append(imageParams);
                 commonBuiltins.append(", float);\n");
             }
+            if (profile != EEsProfile && version >= 450) {
+                commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float);\n");
+
+                commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float);\n");
+
+                commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("float imageAtomicLoad(readonly volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", int, int, int);\n");
+
+                commonBuiltins.append("void imageAtomicStore(writeonly volatile coherent ");
+                commonBuiltins.append(imageParams);
+                commonBuiltins.append(", float");
+                commonBuiltins.append(", int, int, int);\n");
+            }
         }
     }
 
@@ -6085,6 +6279,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     //
@@ -6161,7 +6358,7 @@
                                     continue;
 
                                 // loop over 16-bit floating-point texel addressing
-#ifdef GLSLANG_WEB
+#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
                                 const int f16TexAddr = 0;
 #else
                                 for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr)
@@ -6174,7 +6371,7 @@
                                         totalDims--;
                                     }
                                     // loop over "bool" lod clamp
-#ifdef GLSLANG_WEB
+#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
                                     const int lodClamp = 0;
 #else
                                     for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp)
@@ -6186,7 +6383,7 @@
                                             continue;
 
                                         // loop over "bool" sparse or not
-#ifdef GLSLANG_WEB
+#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
                                         const int sparse = 0;
 #else
                                         for (int sparse = 0; sparse <= 1; ++sparse)
@@ -6241,7 +6438,7 @@
                                                 s.append("Offset");
                                             if (lodClamp)
                                                 s.append("Clamp");
-                                            if (lodClamp || sparse)
+                                            if (lodClamp != 0 || sparse)
                                                 s.append("ARB");
                                             s.append("(");
 
@@ -6341,7 +6538,7 @@
                                             s.append(");\n");
 
                                             // Add to the per-language set of built-ins
-                                            if (bias || lodClamp) {
+                                            if (bias || lodClamp != 0) {
                                                 stageBuiltins[EShLangFragment].append(s);
                                                 stageBuiltins[EShLangCompute].append(s);
                                             } else
@@ -6370,6 +6567,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     switch (sampler.dim) {
@@ -6613,6 +6813,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
 
     //
@@ -7041,6 +7244,7 @@
         s.append("\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // atomic counters (some in compute below)
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 420)) {
@@ -7077,6 +7281,7 @@
 
         s.append("\n");
     }
+#endif // !GLSLANG_ANGLE
 
     // GL_ARB_cull_distance
     if (profile != EEsProfile && version >= 450) {
@@ -7093,6 +7298,7 @@
         s.append(builtInConstant);
     }
 
+#ifndef GLSLANG_ANGLE
     // SPV_NV_mesh_shader
     if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
         snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV);
@@ -7116,6 +7322,7 @@
         s.append("\n");
     }
 #endif
+#endif
 
     s.append("\n");
 }
@@ -7199,6 +7406,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
 
     //
@@ -7388,7 +7598,7 @@
 
     case EShLangTessEvaluation:
     case EShLangGeometry:
-#endif
+#endif // !GLSLANG_WEB
         SpecialQualifier("gl_Position",   EvqPosition,   EbvPosition,   symbolTable);
         SpecialQualifier("gl_PointSize",  EvqPointSize,  EbvPointSize,  symbolTable);
 
@@ -7549,7 +7759,21 @@
             BuiltInVariable("gl_WarpIDNV",              EbvWarpID,          symbolTable);
             BuiltInVariable("gl_SMIDNV",                EbvSMID,            symbolTable);
         }
-#endif
+
+		if (language == EShLangGeometry || language == EShLangVertex) {
+			if ((profile == EEsProfile && version >= 310) ||
+				(profile != EEsProfile && version >= 450)) {
+				symbolTable.setVariableExtensions("gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
+				BuiltInVariable("gl_PrimitiveShadingRateEXT", EbvPrimitiveShadingRateKHR, symbolTable);
+
+				symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+				symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+				symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+				symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+			}
+		}
+
+#endif // !GLSLANG_WEB
         break;
 
     case EShLangFragment:
@@ -8055,7 +8279,18 @@
         }
 
         symbolTable.setFunctionExtensions("helperInvocationEXT",            1, &E_GL_EXT_demote_to_helper_invocation);
-#endif
+
+        if ((profile == EEsProfile && version >= 310) ||
+            (profile != EEsProfile && version >= 450)) {
+            symbolTable.setVariableExtensions("gl_ShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            BuiltInVariable("gl_ShadingRateEXT", EbvShadingRateKHR, symbolTable);
+
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+        }
+#endif // !GLSLANG_WEB
         break;
 
     case EShLangCompute:
@@ -8187,10 +8422,18 @@
             symbolTable.setFunctionExtensions("dFdyCoarse",             1, &E_GL_NV_compute_shader_derivatives);
             symbolTable.setFunctionExtensions("fwidthCoarse",           1, &E_GL_NV_compute_shader_derivatives);
         }
-#endif
+
+        if ((profile == EEsProfile && version >= 310) ||
+            (profile != EEsProfile && version >= 450)) {
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+        }
+#endif // !GLSLANG_WEB
         break;
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     case EShLangRayGen:
     case EShLangIntersect:
     case EShLangAnyHit:
@@ -8241,9 +8484,7 @@
             symbolTable.setFunctionExtensions("reportIntersectionNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setFunctionExtensions("reportIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("ignoreIntersectionNV", 1, &E_GL_NV_ray_tracing);
-            symbolTable.setFunctionExtensions("ignoreIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("terminateRayNV", 1, &E_GL_NV_ray_tracing);
-            symbolTable.setFunctionExtensions("terminateRayEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("executeCallableNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setFunctionExtensions("executeCallableEXT", 1, &E_GL_EXT_ray_tracing);
 
@@ -8336,6 +8577,13 @@
             BuiltInVariable("gl_WarpIDNV",              EbvWarpID,          symbolTable);
             BuiltInVariable("gl_SMIDNV",                EbvSMID,            symbolTable);
         }
+        if ((profile == EEsProfile && version >= 310) ||
+            (profile != EEsProfile && version >= 450)) {
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+        }
         break;
 
     case EShLangMeshNV:
@@ -8480,6 +8728,14 @@
             BuiltInVariable("gl_WarpIDNV",              EbvWarpID,          symbolTable);
             BuiltInVariable("gl_SMIDNV",                EbvSMID,            symbolTable);
         }
+
+        if ((profile == EEsProfile && version >= 310) ||
+            (profile != EEsProfile && version >= 450)) {
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+        }
         break;
 
     case EShLangTaskNV:
@@ -8580,6 +8836,13 @@
             BuiltInVariable("gl_WarpIDNV",              EbvWarpID,          symbolTable);
             BuiltInVariable("gl_SMIDNV",                EbvSMID,            symbolTable);
         }
+        if ((profile == EEsProfile && version >= 310) ||
+            (profile != EEsProfile && version >= 450)) {
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+            symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
+        }
         break;
 #endif
 
@@ -9051,10 +9314,10 @@
     case EShLangClosestHit:
     case EShLangMiss:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("traceNV", EOpTrace);
-            symbolTable.relateToOperator("traceRayEXT", EOpTrace);
-            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallable);
-            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallable);
+            symbolTable.relateToOperator("traceNV", EOpTraceNV);
+            symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR);
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
         }
         break;
     case EShLangIntersect:
@@ -9065,16 +9328,14 @@
         break;
     case EShLangAnyHit:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersection);
-            symbolTable.relateToOperator("ignoreIntersectionEXT", EOpIgnoreIntersection);
-            symbolTable.relateToOperator("terminateRayNV", EOpTerminateRay);
-            symbolTable.relateToOperator("terminateRayEXT", EOpTerminateRay);
+            symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersectionNV);
+            symbolTable.relateToOperator("terminateRayNV", EOpTerminateRayNV);
         }
         break;
     case EShLangCallable:
         if (profile != EEsProfile && version >= 460) {
-            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallable);
-            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallable);
+            symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
+            symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
         }
         break;
     case EShLangMeshNV:
@@ -9093,7 +9354,7 @@
     default:
         assert(false && "Language not supported");
     }
-#endif
+#endif // !GLSLANG_WEB
 }
 
 //
@@ -9108,6 +9369,10 @@
 void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources)
 {
 #ifndef GLSLANG_WEB
+#if defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
+#endif
     if (profile != EEsProfile && version >= 430 && version < 440) {
         symbolTable.setVariableExtensions("gl_MaxTransformFeedbackBuffers", 1, &E_GL_ARB_enhanced_layouts);
         symbolTable.setVariableExtensions("gl_MaxTransformFeedbackInterleavedComponents", 1, &E_GL_ARB_enhanced_layouts);
diff --git a/glslang/MachineIndependent/IntermTraverse.cpp b/glslang/MachineIndependent/IntermTraverse.cpp
index f46010b..553b1b5 100644
--- a/glslang/MachineIndependent/IntermTraverse.cpp
+++ b/glslang/MachineIndependent/IntermTraverse.cpp
@@ -71,6 +71,13 @@
     it->visitConstantUnion(this);
 }
 
+const TString& TIntermSymbol::getAccessName() const {
+    if (getBasicType() == EbtBlock)
+        return getType().getTypeName();
+    else
+        return getName();
+}
+
 //
 // Traverse a binary node.
 //
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
old mode 100755
new mode 100644
index d7049d8..b7ad87a
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -113,14 +113,14 @@
 //
 // Returns nullptr if the working conversions and promotions could not be found.
 //
-TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc loc)
+TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc& loc)
 {
     // No operations work on blocks
     if (left->getType().getBasicType() == EbtBlock || right->getType().getBasicType() == EbtBlock)
         return nullptr;
 
     // Convert "reference +/- int" and "reference - reference" to integer math
-    if ((op == EOpAdd || op == EOpSub) && extensionRequested(E_GL_EXT_buffer_reference2)) {
+    if (op == EOpAdd || op == EOpSub) {
 
         // No addressing math on struct with unsized array.
         if ((left->isReference() && left->getType().getReferentType()->containsUnsizedArray()) ||
@@ -140,43 +140,44 @@
             node = addBuiltInFunctionCall(loc, EOpConvUint64ToPtr, true, node, referenceType);
             return node;
         }
-
-        if (op == EOpAdd && right->isReference() && isTypeInt(left->getBasicType())) {
-            const TType& referenceType = right->getType();
-            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(right->getType()), loc, true);
-            right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
-
-            left  = createConversion(EbtInt64, left);
-            left  = addBinaryMath(EOpMul, left, size, loc);
-
-            TIntermTyped *node = addBinaryMath(op, left, right, loc);
-            node = addBuiltInFunctionCall(loc, EOpConvUint64ToPtr, true, node, referenceType);
-            return node;
-        }
-
-        if (op == EOpSub && left->isReference() && right->isReference()) {
-            TIntermConstantUnion* size = addConstantUnion((long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
-
-            left = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
-            right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
-
-            left = addBuiltInFunctionCall(loc, EOpConvUint64ToInt64, true, left, TType(EbtInt64));
-            right = addBuiltInFunctionCall(loc, EOpConvUint64ToInt64, true, right, TType(EbtInt64));
-
-            left = addBinaryMath(EOpSub, left, right, loc);
-
-            TIntermTyped *node = addBinaryMath(EOpDiv, left, size, loc);
-            return node;
-        }
-
-        // No other math operators supported on references
-        if (left->isReference() || right->isReference()) {
-            return nullptr;
-        }
     }
 
+    if (op == EOpAdd && right->isReference() && isTypeInt(left->getBasicType())) {
+        const TType& referenceType = right->getType();
+        TIntermConstantUnion* size =
+            addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(right->getType()), loc, true);
+        right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
+
+        left  = createConversion(EbtInt64, left);
+        left  = addBinaryMath(EOpMul, left, size, loc);
+
+        TIntermTyped *node = addBinaryMath(op, left, right, loc);
+        node = addBuiltInFunctionCall(loc, EOpConvUint64ToPtr, true, node, referenceType);
+        return node;
+    }
+
+    if (op == EOpSub && left->isReference() && right->isReference()) {
+        TIntermConstantUnion* size =
+            addConstantUnion((long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
+
+        left = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
+        right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
+
+        left = addBuiltInFunctionCall(loc, EOpConvUint64ToInt64, true, left, TType(EbtInt64));
+        right = addBuiltInFunctionCall(loc, EOpConvUint64ToInt64, true, right, TType(EbtInt64));
+
+        left = addBinaryMath(EOpSub, left, right, loc);
+
+        TIntermTyped *node = addBinaryMath(EOpDiv, left, size, loc);
+        return node;
+    }
+
+    // No other math operators supported on references
+    if (left->isReference() || right->isReference())
+        return nullptr;
+
     // Try converting the children's base types to compatible types.
-    auto children = addConversion(op, left, right);
+    auto children = addPairConversion(op, left, right);
     left = std::get<0>(children);
     right = std::get<1>(children);
 
@@ -226,13 +227,12 @@
 //
 // Low level: add binary node (no promotions or other argument modifications)
 //
-TIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc loc) const
+TIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right,
+    const TSourceLoc& loc) const
 {
     // build the node
     TIntermBinary* node = new TIntermBinary(op);
-    if (loc.line == 0)
-        loc = left->getLoc();
-    node->setLoc(loc);
+    node->setLoc(loc.line != 0 ? loc : left->getLoc());
     node->setLeft(left);
     node->setRight(right);
 
@@ -242,7 +242,8 @@
 //
 // like non-type form, but sets node's type.
 //
-TIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc loc, const TType& type) const
+TIntermBinary* TIntermediate::addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right,
+    const TSourceLoc& loc, const TType& type) const
 {
     TIntermBinary* node = addBinaryNode(op, left, right, loc);
     node->setType(type);
@@ -252,12 +253,10 @@
 //
 // Low level: add unary node (no promotions or other argument modifications)
 //
-TIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc loc) const
+TIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc& loc) const
 {
     TIntermUnary* node = new TIntermUnary(op);
-    if (loc.line == 0)
-        loc = child->getLoc();
-    node->setLoc(loc);
+    node->setLoc(loc.line != 0 ? loc : child->getLoc());
     node->setOperand(child);
 
     return node;
@@ -266,7 +265,8 @@
 //
 // like non-type form, but sets node's type.
 //
-TIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc loc, const TType& type) const
+TIntermUnary* TIntermediate::addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc& loc, const TType& type)
+    const
 {
     TIntermUnary* node = addUnaryNode(op, child, loc);
     node->setType(type);
@@ -281,7 +281,8 @@
 // Returns nullptr if the 'right' type could not be converted to match the 'left' type,
 // or the resulting operation cannot be properly promoted.
 //
-TIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc loc)
+TIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right,
+    const TSourceLoc& loc)
 {
     // No block assignment
     if (left->getType().getBasicType() == EbtBlock || right->getType().getBasicType() == EbtBlock)
@@ -290,9 +291,7 @@
     // Convert "reference += int" to "reference = reference + int". We need this because the
     // "reference + int" calculation involves a cast back to the original type, which makes it
     // not an lvalue.
-    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference() &&
-        extensionRequested(E_GL_EXT_buffer_reference2)) {
-
+    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference()) {
         if (!(right->getType().isScalar() && right->getType().isIntegerDomain()))
             return nullptr;
 
@@ -338,7 +337,8 @@
 // Returns the added node.
 // The caller should set the type of the returned node.
 //
-TIntermTyped* TIntermediate::addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, TSourceLoc loc)
+TIntermTyped* TIntermediate::addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index,
+    const TSourceLoc& loc)
 {
     // caller should set the type
     return addBinaryNode(op, base, index, loc);
@@ -349,7 +349,8 @@
 //
 // Returns the added node.
 //
-TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, TSourceLoc loc)
+TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child,
+    const TSourceLoc& loc)
 {
     if (child == 0)
         return nullptr;
@@ -495,7 +496,8 @@
 // Returns an aggregate node, which could be the one passed in if
 // it was already an aggregate.
 //
-TIntermTyped* TIntermediate::setAggregateOperator(TIntermNode* node, TOperator op, const TType& type, TSourceLoc loc)
+TIntermTyped* TIntermediate::setAggregateOperator(TIntermNode* node, TOperator op, const TType& type,
+    const TSourceLoc& loc)
 {
     TIntermAggregate* aggNode;
 
@@ -510,8 +512,6 @@
             //
             aggNode = new TIntermAggregate();
             aggNode->getSequence().push_back(node);
-            if (loc.line == 0)
-                loc = node->getLoc();
         }
     } else
         aggNode = new TIntermAggregate();
@@ -520,8 +520,8 @@
     // Set the operator.
     //
     aggNode->setOperator(op);
-    if (loc.line != 0)
-        aggNode->setLoc(loc);
+    if (loc.line != 0 || node != nullptr)
+        aggNode->setLoc(loc.line != 0 ? loc : node->getLoc());
 
     aggNode->setType(type);
 
@@ -819,22 +819,25 @@
                                   node->getBasicType() == EbtFloat ||
                                   node->getBasicType() == EbtDouble);
 
-    if (! getArithemeticInt8Enabled()) {
-        if (((convertTo == EbtInt8 || convertTo == EbtUint8) && ! convertFromIntTypes) ||
-            ((node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8) && ! convertToIntTypes))
+    if (((convertTo == EbtInt8 || convertTo == EbtUint8) && ! convertFromIntTypes) ||
+        ((node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8) && ! convertToIntTypes)) {
+        if (! getArithemeticInt8Enabled()) {
             return nullptr;
+        }
     }
 
-    if (! getArithemeticInt16Enabled()) {
-        if (((convertTo == EbtInt16 || convertTo == EbtUint16) && ! convertFromIntTypes) ||
-            ((node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16) && ! convertToIntTypes))
+    if (((convertTo == EbtInt16 || convertTo == EbtUint16) && ! convertFromIntTypes) ||
+        ((node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16) && ! convertToIntTypes)) {
+        if (! getArithemeticInt16Enabled()) {
             return nullptr;
+        }
     }
 
-    if (! getArithemeticFloat16Enabled()) {
-        if ((convertTo == EbtFloat16 && ! convertFromFloatTypes) ||
-            (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes))
+    if ((convertTo == EbtFloat16 && ! convertFromFloatTypes) ||
+        (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes)) {
+        if (! getArithemeticFloat16Enabled()) {
             return nullptr;
+        }
     }
 #endif
 
@@ -887,7 +890,7 @@
 // Returns the converted pair of nodes.
 // Returns <nullptr, nullptr> when there is no conversion.
 std::tuple<TIntermTyped*, TIntermTyped*>
-TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1)
+TIntermediate::addPairConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1)
 {
     if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1))
         return std::make_tuple(nullptr, nullptr);
@@ -940,7 +943,7 @@
         if (node0->getBasicType() == node1->getBasicType())
             return std::make_tuple(node0, node1);
 
-        promoteTo = getConversionDestinatonType(node0->getBasicType(), node1->getBasicType(), op);
+        promoteTo = getConversionDestinationType(node0->getBasicType(), node1->getBasicType(), op);
         if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes)
             return std::make_tuple(nullptr, nullptr);
 
@@ -1040,64 +1043,30 @@
     // Note: callers are responsible for other aspects of shape,
     // like vector and matrix sizes.
 
-    TBasicType promoteTo;
-    // GL_EXT_shader_16bit_storage can't do OpConstantComposite with
-    // 16-bit types, so disable promotion for those types.
-    bool canPromoteConstant = true;
-
     switch (op) {
     //
     // Explicit conversions (unary operations)
     //
     case EOpConstructBool:
-        promoteTo = EbtBool;
-        break;
     case EOpConstructFloat:
-        promoteTo = EbtFloat;
-        break;
     case EOpConstructInt:
-        promoteTo = EbtInt;
-        break;
     case EOpConstructUint:
-        promoteTo = EbtUint;
-        break;
 #ifndef GLSLANG_WEB
     case EOpConstructDouble:
-        promoteTo = EbtDouble;
-        break;
     case EOpConstructFloat16:
-        promoteTo = EbtFloat16;
-        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16);
-        break;
     case EOpConstructInt8:
-        promoteTo = EbtInt8;
-        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
-        break;
     case EOpConstructUint8:
-        promoteTo = EbtUint8;
-        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
-        break;
     case EOpConstructInt16:
-        promoteTo = EbtInt16;
-        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
-        break;
     case EOpConstructUint16:
-        promoteTo = EbtUint16;
-        canPromoteConstant = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                             extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
-        break;
     case EOpConstructInt64:
-        promoteTo = EbtInt64;
-        break;
     case EOpConstructUint64:
-        promoteTo = EbtUint64;
         break;
+
 #endif
 
+    //
+    // Implicit conversions
+    //
     case EOpLogicalNot:
 
     case EOpFunctionCall:
@@ -1152,9 +1121,7 @@
         if (type.getBasicType() == node->getType().getBasicType())
             return node;
 
-        if (canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op))
-            promoteTo = type.getBasicType();
-        else
+        if (! canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op))
             return nullptr;
         break;
 
@@ -1164,9 +1131,7 @@
     case EOpLeftShiftAssign:
     case EOpRightShiftAssign:
     {
-        if (getSource() == EShSourceHlsl && node->getType().getBasicType() == EbtBool)
-            promoteTo = type.getBasicType();
-        else {
+        if (!(getSource() == EShSourceHlsl && node->getType().getBasicType() == EbtBool)) {
             if (isTypeInt(type.getBasicType()) && isTypeInt(node->getBasicType()))
                 return node;
             else
@@ -1184,13 +1149,44 @@
             return nullptr;
     }
 
+    bool canPromoteConstant = true;
+#ifndef GLSLANG_WEB
+    // GL_EXT_shader_16bit_storage can't do OpConstantComposite with
+    // 16-bit types, so disable promotion for those types.
+    // Many issues with this, from JohnK:
+    //  - this isn't really right to discuss SPIR-V here
+    //  - this could easily be entirely about scalars, so is overstepping
+    //  - we should be looking at what the shader asked for, and saying whether or
+    //    not it can be done, in the parser, by calling requireExtensions(), not
+    //    changing language sementics on the fly by asking what extensions are in use
+    //  - at the time of this writing (14-Aug-2020), no test results are changed by this.
+    switch (op) {
+    case EOpConstructFloat16:
+        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16);
+        break;
+    case EOpConstructInt8:
+    case EOpConstructUint8:
+        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8);
+        break;
+    case EOpConstructInt16:
+    case EOpConstructUint16:
+        canPromoteConstant = numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+                             numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16);
+        break;
+    default:
+        break;
+    }
+#endif
+
     if (canPromoteConstant && node->getAsConstantUnion())
-        return promoteConstantUnion(promoteTo, node->getAsConstantUnion());
+        return promoteConstantUnion(type.getBasicType(), node->getAsConstantUnion());
 
     //
     // Add a new newNode for the conversion.
     //
-    TIntermTyped* newNode = createConversion(promoteTo, node);
+    TIntermTyped* newNode = createConversion(type.getBasicType(), node);
 
     return newNode;
 }
@@ -1659,64 +1655,45 @@
         }
     }
 
-    bool explicitTypesEnabled = extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int32) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int64) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float32) ||
-                                extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float64);
-    
-    if (explicitTypesEnabled) {
-        // integral promotions
-        if (isIntegralPromotion(from, to)) {
+    if (getSource() == EShSourceHlsl) {
+        // HLSL
+        if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat))
             return true;
-        }
+    } else {
+        // GLSL
+        if (isIntegralPromotion(from, to) ||
+            isFPPromotion(from, to) ||
+            isIntegralConversion(from, to) ||
+            isFPConversion(from, to) ||
+            isFPIntegralConversion(from, to)) {
 
-        // floating-point promotions
-        if (isFPPromotion(from, to)) {
-            return true;
-        }
-
-        // integral conversions
-        if (isIntegralConversion(from, to)) {
-            return true;
-        }
-
-        // floating-point conversions
-        if (isFPConversion(from, to)) {
-           return true;
-        }
-
-        // floating-integral conversions
-        if (isFPIntegralConversion(from, to)) {
-           return true;
-        }
-
-        // hlsl supported conversions
-        if (getSource() == EShSourceHlsl) {
-            if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat))
+            if (numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int32) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int64) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float32) ||
+                numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float64)) {
                 return true;
+            }
         }
-    } else if (isEsProfile()) {
+    }
+
+    if (isEsProfile()) {
         switch (to) {
             case EbtFloat:
                 switch (from) {
                 case EbtInt:
                 case EbtUint:
-                    return extensionRequested(E_GL_EXT_shader_implicit_conversions);
-                case EbtFloat:
-                    return true;
+                    return numericFeatures.contains(TNumericFeatures::shader_implicit_conversions);
                 default:
                     return false;
                 }
             case EbtUint:
                 switch (from) {
                 case EbtInt:
-                    return extensionRequested(E_GL_EXT_shader_implicit_conversions);
-                case EbtUint:
-                    return true;
+                    return numericFeatures.contains(TNumericFeatures::shader_implicit_conversions);
                 default:
                     return false;
                 }
@@ -1732,13 +1709,14 @@
             case EbtInt64:
             case EbtUint64:
             case EbtFloat:
-            case EbtDouble:
-                return true;
+                return version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64);
             case EbtInt16:
             case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return (version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64)) &&
+                                          numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             case EbtFloat16:
-                return extensionRequested(E_GL_AMD_gpu_shader_half_float);
+                return (version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64)) &&
+                                          numericFeatures.contains(TNumericFeatures::gpu_shader_half_float);
             default:
                 return false;
            }
@@ -1746,16 +1724,15 @@
             switch (from) {
             case EbtInt:
             case EbtUint:
-            case EbtFloat:
                  return true;
             case EbtBool:
                  return getSource() == EShSourceHlsl;
             case EbtInt16:
             case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             case EbtFloat16:
-                return 
-                    extensionRequested(E_GL_AMD_gpu_shader_half_float) || getSource() == EShSourceHlsl;
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_half_float) ||
+                    getSource() == EShSourceHlsl;
             default:
                  return false;
             }
@@ -1763,24 +1740,20 @@
             switch (from) {
             case EbtInt:
                 return version >= 400 || getSource() == EShSourceHlsl;
-            case EbtUint:
-                return true;
             case EbtBool:
                 return getSource() == EShSourceHlsl;
             case EbtInt16:
             case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 return false;
             }
         case EbtInt:
             switch (from) {
-            case EbtInt:
-                return true;
             case EbtBool:
                 return getSource() == EShSourceHlsl;
             case EbtInt16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 return false;
             }
@@ -1789,21 +1762,19 @@
             case EbtInt:
             case EbtUint:
             case EbtInt64:
-            case EbtUint64:
                 return true;
             case EbtInt16:
             case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 return false;
             }
         case EbtInt64:
             switch (from) {
             case EbtInt:
-            case EbtInt64:
                 return true;
             case EbtInt16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 return false;
             }
@@ -1811,9 +1782,7 @@
             switch (from) {
             case EbtInt16:
             case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
-            case EbtFloat16:
-                return extensionRequested(E_GL_AMD_gpu_shader_half_float);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 break;
             }
@@ -1821,8 +1790,7 @@
         case EbtUint16:
             switch (from) {
             case EbtInt16:
-            case EbtUint16:
-                return extensionRequested(E_GL_AMD_gpu_shader_int16);
+                return numericFeatures.contains(TNumericFeatures::gpu_shader_int16);
             default:
                 break;
             }
@@ -1949,13 +1917,13 @@
 //        integer type corresponding to the type of the operand with signed
 //        integer type.
 
-std::tuple<TBasicType, TBasicType> TIntermediate::getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const
+std::tuple<TBasicType, TBasicType> TIntermediate::getConversionDestinationType(TBasicType type0, TBasicType type1, TOperator op) const
 {
     TBasicType res0 = EbtNumTypes;
     TBasicType res1 = EbtNumTypes;
 
     if ((isEsProfile() && 
-        (version < 310 || !extensionRequested(E_GL_EXT_shader_implicit_conversions))) || 
+        (version < 310 || !numericFeatures.contains(TNumericFeatures::shader_implicit_conversions))) || 
         version == 110)
         return std::make_tuple(res0, res1);
 
@@ -2330,6 +2298,10 @@
     case EbtReference:
         op = EOpConstructReference;
         break;
+
+    case EbtAccStruct:
+        op = EOpConstructAccStruct;
+        break;
 #endif
     default:
         break;
@@ -2488,7 +2460,7 @@
     //
     // Get compatible types.
     //
-    auto children = addConversion(EOpSequence, trueBlock, falseBlock);
+    auto children = addPairConversion(EOpSequence, trueBlock, falseBlock);
     trueBlock = std::get<0>(children);
     falseBlock = std::get<1>(children);
 
@@ -2775,6 +2747,22 @@
     return node;
 }
 
+// Propagate precision from formal function return type to actual return type,
+// and on to its subtree.
+void TIntermBranch::updatePrecision(TPrecisionQualifier parentPrecision)
+{
+    TIntermTyped* exp = getExpression();
+    if (exp == nullptr)
+        return;
+
+    if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||
+        exp->getBasicType() == EbtFloat || exp->getBasicType() == EbtFloat16) {
+        if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {
+            exp->propagatePrecision(parentPrecision);
+        }
+    }
+}
+
 //
 // This is to be executed after the final root is put on top by the parsing
 // process.
@@ -2882,7 +2870,7 @@
             return;
     }
 
-    callGraph.push_front(TCall(caller, callee));
+    callGraph.emplace_front(caller, callee);
 }
 
 //
@@ -3282,9 +3270,11 @@
     return true;
 }
 
+// Propagate precision qualifiers *up* from children to parent.
 void TIntermUnary::updatePrecision()
 {
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
         if (operand->getQualifier().precision > getQualifier().precision)
             getQualifier().precision = operand->getQualifier().precision;
     }
@@ -3780,9 +3770,12 @@
     return false;
 }
 
+// Propagate precision qualifiers *up* from children to parent, and then
+// back *down* again to the children's subtrees.
 void TIntermBinary::updatePrecision()
 {
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+     if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+         getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
         getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision);
         if (getQualifier().precision != EpqNone) {
             left->propagatePrecision(getQualifier().precision);
@@ -3791,9 +3784,14 @@
     }
 }
 
+// Recursively propagate precision qualifiers *down* the subtree of the current node,
+// until reaching a node that already has a precision qualifier or otherwise does
+// not participate in precision propagation.
 void TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision)
 {
-    if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat && getBasicType() != EbtFloat16))
+    if (getQualifier().precision != EpqNone ||
+        (getBasicType() != EbtInt && getBasicType() != EbtUint &&
+         getBasicType() != EbtFloat && getBasicType() != EbtFloat16))
         return;
 
     getQualifier().precision = newPrecision;
diff --git a/glslang/MachineIndependent/LiveTraverser.h b/glslang/MachineIndependent/LiveTraverser.h
index 7333bc9..9b39b59 100644
--- a/glslang/MachineIndependent/LiveTraverser.h
+++ b/glslang/MachineIndependent/LiveTraverser.h
@@ -74,14 +74,33 @@
         for (unsigned int f = 0; f < globals.size(); ++f) {
             TIntermAggregate* candidate = globals[f]->getAsAggregate();
             if (candidate && candidate->getOp() == EOpFunction && candidate->getName() == name) {
-                functions.push_back(candidate);
+                destinations.push_back(candidate);
                 break;
             }
         }
     }
 
-    typedef std::list<TIntermAggregate*> TFunctionStack;
-    TFunctionStack functions;
+    void pushGlobalReference(const TString& name)
+    {
+        TIntermSequence& globals = intermediate.getTreeRoot()->getAsAggregate()->getSequence();
+        for (unsigned int f = 0; f < globals.size(); ++f) {
+            TIntermAggregate* candidate = globals[f]->getAsAggregate();
+            if (candidate && candidate->getOp() == EOpSequence &&
+                candidate->getSequence().size() == 1 &&
+                candidate->getSequence()[0]->getAsBinaryNode()) {
+                TIntermBinary* binary = candidate->getSequence()[0]->getAsBinaryNode();
+                TIntermSymbol* symbol = binary->getLeft()->getAsSymbolNode();
+                if (symbol && symbol->getQualifier().storage == EvqGlobal &&
+                    symbol->getName() == name) {
+                    destinations.push_back(candidate);
+                    break;
+                }
+            }
+        }
+    }
+
+    typedef std::list<TIntermAggregate*> TDestinationStack;
+    TDestinationStack destinations;
 
 protected:
     // To catch which function calls are not dead, and hence which functions must be visited.
@@ -117,16 +136,27 @@
     // and only visit each function once.
     void addFunctionCall(TIntermAggregate* call)
     {
-        // // just use the map to ensure we process each function at most once
+        // just use the map to ensure we process each function at most once
         if (liveFunctions.find(call->getName()) == liveFunctions.end()) {
             liveFunctions.insert(call->getName());
             pushFunction(call->getName());
         }
     }
 
+    void addGlobalReference(const TString& name)
+    {
+        // just use the map to ensure we process each global at most once
+        if (liveGlobals.find(name) == liveGlobals.end()) {
+            liveGlobals.insert(name);
+            pushGlobalReference(name);
+        }
+    }
+
     const TIntermediate& intermediate;
     typedef std::unordered_set<TString> TLiveFunctions;
     TLiveFunctions liveFunctions;
+    typedef std::unordered_set<TString> TLiveGlobals;
+    TLiveGlobals liveGlobals;
     bool traverseAll;
 
 private:
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
index b464009..3efa27a 100644
--- a/glslang/MachineIndependent/ParseContextBase.cpp
+++ b/glslang/MachineIndependent/ParseContextBase.cpp
@@ -127,22 +127,6 @@
 {
     TIntermBinary* binaryNode = node->getAsBinaryNode();
 
-    if (binaryNode) {
-        switch(binaryNode->getOp()) {
-        case EOpIndexDirect:
-        case EOpIndexIndirect:     // fall through
-        case EOpIndexDirectStruct: // fall through
-        case EOpVectorSwizzle:
-        case EOpMatrixSwizzle:
-            return lValueErrorCheck(loc, op, binaryNode->getLeft());
-        default:
-            break;
-        }
-        error(loc, " l-value required", op, "", "");
-
-        return true;
-    }
-
     const char* symbol = nullptr;
     TIntermSymbol* symNode = node->getAsSymbolNode();
     if (symNode != nullptr)
@@ -203,15 +187,40 @@
     // Everything else is okay, no error.
     //
     if (message == nullptr)
+    {
+        if (binaryNode) {
+            switch (binaryNode->getOp()) {
+            case EOpIndexDirect:
+            case EOpIndexIndirect:     // fall through
+            case EOpIndexDirectStruct: // fall through
+            case EOpVectorSwizzle:
+            case EOpMatrixSwizzle:
+                return lValueErrorCheck(loc, op, binaryNode->getLeft());
+            default:
+                break;
+            }
+            error(loc, " l-value required", op, "", "");
+
+            return true;
+        }
         return false;
+    }
 
     //
     // If we get here, we have an error and a message.
     //
+    const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true);
+
     if (symNode)
         error(loc, " l-value required", op, "\"%s\" (%s)", symbol, message);
     else
-        error(loc, " l-value required", op, "(%s)", message);
+        if (binaryNode && binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct)
+            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))
+                error(loc, " l-value required", op, "\"%s\" (%s)", leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str(), message);
+            else
+                error(loc, " l-value required", op, "\"%s\" (%s)", leftMostTypeNode->getAsSymbolNode()->getName().c_str(), message);
+        else
+            error(loc, " l-value required", op, "(%s)", message);
 
     return true;
 }
@@ -219,28 +228,41 @@
 // Test for and give an error if the node can't be read from.
 void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node)
 {
+    TIntermBinary* binaryNode = node->getAsBinaryNode();
+    const TIntermSymbol* symNode = node->getAsSymbolNode();
+
     if (! node)
         return;
 
-    TIntermBinary* binaryNode = node->getAsBinaryNode();
-    if (binaryNode) {
-        switch(binaryNode->getOp()) {
-        case EOpIndexDirect:
-        case EOpIndexIndirect:
-        case EOpIndexDirectStruct:
-        case EOpVectorSwizzle:
-        case EOpMatrixSwizzle:
-            rValueErrorCheck(loc, op, binaryNode->getLeft());
-        default:
-            break;
+    if (node->getQualifier().isWriteOnly()) {
+        const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true);
+
+        if (symNode != nullptr)
+            error(loc, "can't read from writeonly object: ", op, symNode->getName().c_str());
+        else if (binaryNode &&
+                (binaryNode->getAsOperator()->getOp() == EOpIndexDirectStruct ||
+                 binaryNode->getAsOperator()->getOp() == EOpIndexDirect))
+            if(IsAnonymous(leftMostTypeNode->getAsSymbolNode()->getName()))
+                error(loc, "can't read from writeonly object: ", op, leftMostTypeNode->getAsSymbolNode()->getAccessName().c_str());
+            else
+                error(loc, "can't read from writeonly object: ", op, leftMostTypeNode->getAsSymbolNode()->getName().c_str());
+        else
+            error(loc, "can't read from writeonly object: ", op, "");
+
+    } else {
+        if (binaryNode) {
+            switch (binaryNode->getOp()) {
+            case EOpIndexDirect:
+            case EOpIndexIndirect:
+            case EOpIndexDirectStruct:
+            case EOpVectorSwizzle:
+            case EOpMatrixSwizzle:
+                rValueErrorCheck(loc, op, binaryNode->getLeft());
+            default:
+                break;
+            }
         }
-
-        return;
     }
-
-    TIntermSymbol* symNode = node->getAsSymbolNode();
-    if (symNode && symNode->getQualifier().isWriteOnly())
-        error(loc, "can't read from writeonly object: ", op, symNode->getName().c_str());
 }
 
 // Add 'symbol' to the list of deferred linkage symbols, which
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 117c164..8927b82 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -87,6 +87,10 @@
     globalInputDefaults.clear();
     globalOutputDefaults.clear();
 
+    globalSharedDefaults.clear();
+    globalSharedDefaults.layoutMatrix = ElmColumnMajor;
+    globalSharedDefaults.layoutPacking = ElpStd430;
+
 #ifndef GLSLANG_WEB
     // "Shaders in the transform
     // feedback capturing mode have an initial global default of
@@ -246,7 +250,9 @@
         else if (tokens[2].compare("off") == 0)
             contextPragma.optimize = false;
         else {
-            error(loc, "\"on\" or \"off\" expected after '(' for 'optimize' pragma", "#pragma", "");
+            if(relaxedErrors())
+                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.
+                warn(loc, "\"on\" or \"off\" expected after '(' for 'optimize' pragma", "#pragma", "");
             return;
         }
 
@@ -270,7 +276,9 @@
         else if (tokens[2].compare("off") == 0)
             contextPragma.debug = false;
         else {
-            error(loc, "\"on\" or \"off\" expected after '(' for 'debug' pragma", "#pragma", "");
+            if(relaxedErrors())
+                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.
+                warn(loc, "\"on\" or \"off\" expected after '(' for 'debug' pragma", "#pragma", "");
             return;
         }
 
@@ -751,8 +759,11 @@
     }
 
     TIntermTyped* result = nullptr;
-    if (allowed)
+    if (allowed) {
+        if ((left->isReference() || right->isReference()))
+            requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "buffer reference math");
         result = intermediate.addBinaryMath(op, left, right, loc);
+    }
 
     if (result == nullptr)
         binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString());
@@ -1295,7 +1306,7 @@
     TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(),
                                                                function.getParamCount() == 1,
                                                                arguments, function.getType());
-    if (obeyPrecisionQualifiers())
+    if (result != nullptr && obeyPrecisionQualifiers())
         computeBuiltinPrecisions(*result, function);
 
     if (result == nullptr) {
@@ -1415,23 +1426,28 @@
 #endif
 
     functionReturnsValue = true;
+    TIntermBranch* branch = nullptr;
     if (currentFunctionType->getBasicType() == EbtVoid) {
         error(loc, "void function cannot return a value", "return", "");
-        return intermediate.addBranch(EOpReturn, loc);
+        branch = intermediate.addBranch(EOpReturn, loc);
     } else if (*currentFunctionType != value->getType()) {
         TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
         if (converted) {
             if (*currentFunctionType != converted->getType())
                 error(loc, "cannot convert return value to function return type", "return", "");
             if (version < 420)
-                warn(loc, "type conversion on return values was not explicitly allowed until version 420", "return", "");
-            return intermediate.addBranch(EOpReturn, converted, loc);
+                warn(loc, "type conversion on return values was not explicitly allowed until version 420",
+                     "return", "");
+            branch = intermediate.addBranch(EOpReturn, converted, loc);
         } else {
             error(loc, "type does not match, or is not convertible to, the function's return type", "return", "");
-            return intermediate.addBranch(EOpReturn, value, loc);
+            branch = intermediate.addBranch(EOpReturn, value, loc);
         }
     } else
-        return intermediate.addBranch(EOpReturn, value, loc);
+        branch = intermediate.addBranch(EOpReturn, value, loc);
+
+    branch->updatePrecision(currentFunctionType->getQualifier().precision);
+    return branch;
 }
 
 // See if the operation is being done in an illegal location.
@@ -1675,6 +1691,14 @@
 #endif
 }
 
+TIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)
+{
+    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference())
+        requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "+= and -= on a buffer reference");
+
+    return intermediate.addAssign(op, left, right, loc);
+}
+
 void TParseContext::memorySemanticsCheck(const TSourceLoc& loc, const TFunction& fnCandidate, const TIntermOperator& callNode)
 {
     const TIntermSequence* argp = &callNode.getAsAggregate()->getSequence();
@@ -2056,14 +2080,32 @@
     }
 
 #ifndef GLSLANG_WEB
-    case EOpTrace:
+    case EOpTraceNV:
         if (!(*argp)[10]->getAsConstantUnion())
-            error(loc, "argument must be compile-time constant", "payload number", "");
+            error(loc, "argument must be compile-time constant", "payload number", "a");
         break;
-    case EOpExecuteCallable:
+    case EOpTraceKHR:
+        if (!(*argp)[10]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "payload number", "a");
+        else {
+            unsigned int location = (*argp)[10]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();
+            if (intermediate.checkLocationRT(0, location) < 0)
+                error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location);
+        }
+        break;
+    case EOpExecuteCallableNV:
         if (!(*argp)[1]->getAsConstantUnion())
             error(loc, "argument must be compile-time constant", "callable data number", "");
         break;
+    case EOpExecuteCallableKHR:
+        if (!(*argp)[1]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "callable data number", "");
+        else {
+            unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst();
+            if (intermediate.checkLocationRT(1, location) < 0)
+                error(loc, "with layout(location =", "no callableDataEXT/callableDataInEXT declared", "%d)", location);
+        }
+        break;
 
     case EOpRayQueryGetIntersectionType:
     case EOpRayQueryGetIntersectionT:
@@ -2101,11 +2143,24 @@
     {
         // Make sure the image types have the correct layout() format and correct argument types
         const TType& imageType = arg0->getType();
-        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint) {
-            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui)
+        if (imageType.getSampler().type == EbtInt || imageType.getSampler().type == EbtUint ||
+            imageType.getSampler().type == EbtInt64 || imageType.getSampler().type == EbtUint64) {
+            if (imageType.getQualifier().getFormat() != ElfR32i && imageType.getQualifier().getFormat() != ElfR32ui &&
+                imageType.getQualifier().getFormat() != ElfR64i && imageType.getQualifier().getFormat() != ElfR64ui)
                 error(loc, "only supported on image with format r32i or r32ui", fnCandidate.getName().c_str(), "");
+            if (callNode.getType().getBasicType() == EbtInt64 && imageType.getQualifier().getFormat() != ElfR64i)
+                error(loc, "only supported on image with format r64i", fnCandidate.getName().c_str(), "");
+            else if (callNode.getType().getBasicType() == EbtUint64 && imageType.getQualifier().getFormat() != ElfR64ui)
+                error(loc, "only supported on image with format r64ui", fnCandidate.getName().c_str(), "");
         } else {
-            if (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") != 0)
+            bool isImageAtomicOnFloatAllowed = ((fnCandidate.getName().compare(0, 14, "imageAtomicAdd") == 0) ||
+                (fnCandidate.getName().compare(0, 15, "imageAtomicLoad") == 0) ||
+                (fnCandidate.getName().compare(0, 16, "imageAtomicStore") == 0) ||
+                (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") == 0));
+            if (imageType.getSampler().type == EbtFloat && isImageAtomicOnFloatAllowed &&
+                (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") != 0)) // imageAtomicExchange doesn't require GL_EXT_shader_atomic_float
+                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
+            if (!isImageAtomicOnFloatAllowed)
                 error(loc, "only supported on integer images", fnCandidate.getName().c_str(), "");
             else if (imageType.getQualifier().getFormat() != ElfR32f && isEsProfile())
                 error(loc, "only supported on image with format r32f", fnCandidate.getName().c_str(), "");
@@ -2134,10 +2189,18 @@
         if (argp->size() > 3) {
             requireExtensions(loc, 1, &E_GL_KHR_memory_scope_semantics, fnCandidate.getName().c_str());
             memorySemanticsCheck(loc, fnCandidate, callNode);
+            if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange ||
+                callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpAtomicStore) &&
+                (arg0->getType().isFloatingDomain())) {
+                requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
+            }
         } else if (arg0->getType().getBasicType() == EbtInt64 || arg0->getType().getBasicType() == EbtUint64) {
             const char* const extensions[2] = { E_GL_NV_shader_atomic_int64,
                                                 E_GL_EXT_shader_atomic_int64 };
             requireExtensions(loc, 2, extensions, fnCandidate.getName().c_str());
+        } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange) &&
+                   (arg0->getType().isFloatingDomain())) {
+            requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
         }
         break;
     }
@@ -2767,7 +2830,10 @@
     if (strncmp(identifier, "GL_", 3) == 0)
         ppError(loc, "names beginning with \"GL_\" can't be (un)defined:", op,  identifier);
     else if (strncmp(identifier, "defined", 8) == 0)
-        ppError(loc, "\"defined\" can't be (un)defined:", op,  identifier);
+        if (relaxedErrors())
+            ppWarn(loc, "\"defined\" is (un)defined:", op,  identifier);
+        else
+            ppError(loc, "\"defined\" can't be (un)defined:", op,  identifier);
     else if (strstr(identifier, "__") != 0) {
         if (isEsProfile() && version >= 300 &&
             (strcmp(identifier, "__LINE__") == 0 ||
@@ -2775,7 +2841,7 @@
              strcmp(identifier, "__VERSION__") == 0))
             ppError(loc, "predefined names can't be (un)defined:", op,  identifier);
         else {
-            if (isEsProfile() && version < 300)
+            if (isEsProfile() && version < 300 && !relaxedErrors())
                 ppError(loc, "names containing consecutive underscores are reserved, and an error if version < 300:", op, identifier);
             else
                 ppWarn(loc, "names containing consecutive underscores are reserved:", op, identifier);
@@ -3330,7 +3396,7 @@
 //
 void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType)
 {
-    globalQualifierFixCheck(publicType.loc, publicType.qualifier);
+    globalQualifierFixCheck(publicType.loc, publicType.qualifier, true);
     checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers);
     if (publicType.qualifier.isNonUniform()) {
         error(publicType.loc, "not allowed on block or structure members", "nonuniformEXT", "");
@@ -3341,7 +3407,7 @@
 //
 // Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level.
 //
-void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier)
+void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck)
 {
     bool nonuniformOkay = false;
 
@@ -3366,6 +3432,16 @@
     case EvqTemporary:
         nonuniformOkay = true;
         break;
+    case EvqUniform:
+        // According to GLSL spec: The std430 qualifier is supported only for shader storage blocks; a shader using
+        // the std430 qualifier on a uniform block will fail to compile.
+        // Only check the global declaration: layout(std430) uniform;
+        if (blockName == nullptr &&
+            qualifier.layoutPacking == ElpStd430)
+        {
+            error(loc, "it is invalid to declare std430 qualifier on uniform", "", "");
+        }
+        break;
     default:
         break;
     }
@@ -3373,7 +3449,9 @@
     if (!nonuniformOkay && qualifier.isNonUniform())
         error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", "");
 
-    invariantCheck(loc, qualifier);
+    // Storage qualifier isn't ready for memberQualifierCheck, we should skip invariantCheck for it.
+    if (!isMemberCheck || structNestingLevel > 0)
+        invariantCheck(loc, qualifier);
 }
 
 //
@@ -3384,7 +3462,7 @@
     if (! symbolTable.atGlobalLevel())
         return;
 
-    if (!(publicType.userDef && publicType.userDef->isReference())) {
+    if (!(publicType.userDef && publicType.userDef->isReference()) && !parsingBuiltins) {
         if (qualifier.isMemoryQualifierImageAndSSBOOnly() && ! publicType.isImage() && publicType.qualifier.storage != EvqBuffer) {
             error(loc, "memory qualifiers cannot be used on this type", "", "");
         } else if (qualifier.isMemory() && (publicType.basicType != EbtSampler) && !publicType.qualifier.isUniformOrBuffer()) {
@@ -4045,6 +4123,9 @@
     if (isRuntimeLength(base))
         return;
 
+    if (base.getType().getQualifier().builtIn == EbvSampleMask)
+        return;
+
     // Check for last member of a bufferreference type, which is runtime sizeable
     // but doesn't support runtime length
     if (base.getType().getQualifier().storage == EvqBuffer) {
@@ -4188,6 +4269,8 @@
         (identifier == "gl_FragCoord"           && ((nonEsRedecls && version >= 150) || esRedecls)) ||
          identifier == "gl_ClipDistance"                                                            ||
          identifier == "gl_CullDistance"                                                            ||
+         identifier == "gl_ShadingRateEXT"                                                          ||
+         identifier == "gl_PrimitiveShadingRateEXT"                                                 ||
          identifier == "gl_FrontColor"                                                              ||
          identifier == "gl_BackColor"                                                               ||
          identifier == "gl_FrontSecondaryColor"                                                     ||
@@ -4594,14 +4677,14 @@
 
 void TParseContext::nestedBlockCheck(const TSourceLoc& loc)
 {
-    if (structNestingLevel > 0)
+    if (structNestingLevel > 0 || blockNestingLevel > 0)
         error(loc, "cannot nest a block definition inside a structure or block", "", "");
-    ++structNestingLevel;
+    ++blockNestingLevel;
 }
 
 void TParseContext::nestedStructCheck(const TSourceLoc& loc)
 {
-    if (structNestingLevel > 0)
+    if (structNestingLevel > 0 || blockNestingLevel > 0)
         error(loc, "cannot nest a structure definition inside a structure or block", "", "");
     ++structNestingLevel;
 }
@@ -5173,6 +5256,12 @@
             }
         }
     }
+
+    if (id == "primitive_culling") {
+        requireExtensions(loc, 1, &E_GL_EXT_ray_flags_primitive_culling, "primitive culling");
+        publicType.shaderQualifiers.layoutPrimitiveCulling = true;
+        return;
+    }
 #endif
 
     error(loc, "unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4)", id.c_str(), "");
@@ -5380,7 +5469,14 @@
         if (! IsPow2(value))
             error(loc, "must be a power of 2", "buffer_reference_align", "");
         else
+#ifdef __ANDROID__
+            // Android NDK r15c tageting ABI 15 doesn't have full support for C++11
+            // (no std::exp2/log2). ::exp2 is available from C99 but ::log2 isn't
+            // available up until ABI 18 so we use the mathematical equivalent form
+            publicType.qualifier.layoutBufferReferenceAlign = (unsigned int)(std::log(value) / std::log(2.0));
+#else
             publicType.qualifier.layoutBufferReferenceAlign = (unsigned int)std::log2(value);
+#endif
         if (nonLiteral)
             error(loc, "needs a literal integer", "buffer_reference_align", "");
         return;
@@ -5770,6 +5866,8 @@
         int repeated = intermediate.addXfbBufferOffset(type);
         if (repeated >= 0)
             error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
+        if (type.isUnsizedArray())
+            error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer);
 
         // "The offset must be a multiple of the size of the first component of the first
         // qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate
@@ -5939,12 +6037,28 @@
     }
 }
 
+static bool storageCanHaveLayoutInBlock(const enum TStorageQualifier storage)
+{
+    switch (storage) {
+    case EvqUniform:
+    case EvqBuffer:
+    case EvqShared:
+        return true;
+    default:
+        return false;
+    }
+}
+
 // Do layout error checking that can be done within a layout qualifier proper, not needing to know
 // if there are blocks, atomic counters, variables, etc.
 void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier& qualifier)
 {
-    if (qualifier.storage == EvqShared && qualifier.hasLayout())
-        error(loc, "cannot apply layout qualifiers to a shared variable", "shared", "");
+    if (qualifier.storage == EvqShared && qualifier.hasLayout()) {
+        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4) {
+            error(loc, "shared block requires at least SPIR-V 1.4", "shared block", "");
+        }
+        profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, "shared block");
+    }
 
     // "It is a compile-time error to use *component* without also specifying the location qualifier (order does not matter)."
     if (qualifier.hasComponent() && ! qualifier.hasLocation())
@@ -6027,7 +6141,7 @@
             error(loc, "can only be used on an output", "xfb layout qualifier", "");
     }
     if (qualifier.hasUniformLayout()) {
-        if (! qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory()) {
+        if (!storageCanHaveLayoutInBlock(qualifier.storage) && !qualifier.isTaskMemory()) {
             if (qualifier.hasMatrix() || qualifier.hasPacking())
                 error(loc, "matrix or packing qualifiers can only be used on a uniform or buffer", "layout", "");
             if (qualifier.hasOffset() || qualifier.hasAlign())
@@ -6104,6 +6218,8 @@
         error(loc, message, "num_views", "");
     if (shaderQualifiers.interlockOrdering != EioNone)
         error(loc, message, TQualifier::getInterlockOrderingString(shaderQualifiers.interlockOrdering), "");
+    if (shaderQualifiers.layoutPrimitiveCulling)
+        error(loc, "can only be applied as standalone", "primitive_culling", "");
 #endif
 }
 
@@ -6487,13 +6603,15 @@
             error(loc, "atomic_uint binding is too large", "binding", "");
             return;
         }
-
-        if(publicType.qualifier.hasOffset()) {
+        if (publicType.qualifier.hasOffset())
             atomicUintOffsets[publicType.qualifier.layoutBinding] = publicType.qualifier.layoutOffset;
-        }
         return;
     }
 
+    if (publicType.arraySizes) {
+        error(loc, "expect an array name", "", "");
+    }
+
     if (publicType.qualifier.hasLayout() && !publicType.qualifier.hasBufferReference())
         warn(loc, "useless application of layout qualifier", "layout", "");
 #endif
@@ -6520,6 +6638,12 @@
     type.copyArrayInnerSizes(publicType.arraySizes);
     arrayOfArrayVersionCheck(loc, type.getArraySizes());
 
+    if (initializer) {
+        if (type.getBasicType() == EbtRayQuery) {
+            error(loc, "ray queries can only be initialized by using the rayQueryInitializeEXT intrinsic:", "=", identifier.c_str());
+        }
+    }
+
     if (type.isCoopMat()) {
         intermediate.setUseVulkanMemoryModel();
         intermediate.setUseStorageBuffer();
@@ -6578,6 +6702,22 @@
     if (type.getQualifier().storage == EvqShared && type.containsCoopMat())
         error(loc, "qualifier", "Cooperative matrix types must not be used in shared memory", "");
 
+    if (profile == EEsProfile) {
+        if (type.getQualifier().isPipeInput() && type.getBasicType() == EbtStruct) {
+            if (type.getQualifier().isArrayedIo(language)) {
+                TType perVertexType(type, 0);
+                if (perVertexType.containsArray() && perVertexType.containsBuiltIn() == false) {
+                    error(loc, "A per vertex structure containing an array is not allowed as input in ES", type.getTypeName().c_str(), "");
+                }
+            }
+            else if (type.containsArray() && type.containsBuiltIn() == false) {
+                error(loc, "A structure containing an array is not allowed as input in ES", type.getTypeName().c_str(), "");
+            }
+            if (type.containsStructure())
+                error(loc, "A structure containing an struct is not allowed as input in ES", type.getTypeName().c_str(), "");
+        }
+    }
+
     if (identifier != "gl_FragCoord" && (publicType.shaderQualifiers.originUpperLeft || publicType.shaderQualifiers.pixelCenterInteger))
         error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", "");
     if (identifier != "gl_FragDepth" && publicType.shaderQualifiers.getDepth() != EldNone)
@@ -6695,6 +6835,11 @@
 //
 TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyped* initializer, TVariable* variable)
 {
+    // A null initializer is an aggregate that hasn't had an op assigned yet
+    // (still EOpNull, no relation to nullInit), and has no children.
+    bool nullInit = initializer->getAsAggregate() && initializer->getAsAggregate()->getOp() == EOpNull &&
+        initializer->getAsAggregate()->getSequence().size() == 0;
+
     //
     // Identifier must be of type constant, a global, or a temporary, and
     // starting at version 120, desktop allows uniforms to have initializers.
@@ -6702,9 +6847,36 @@
     TStorageQualifier qualifier = variable->getType().getQualifier().storage;
     if (! (qualifier == EvqTemporary || qualifier == EvqGlobal || qualifier == EvqConst ||
            (qualifier == EvqUniform && !isEsProfile() && version >= 120))) {
-        error(loc, " cannot initialize this type of qualifier ", variable->getType().getStorageQualifierString(), "");
+        if (qualifier == EvqShared) {
+            // GL_EXT_null_initializer allows this for shared, if it's a null initializer
+            if (nullInit) {
+                const char* feature = "initialization with shared qualifier";
+                profileRequires(loc, EEsProfile, 0, E_GL_EXT_null_initializer, feature);
+                profileRequires(loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, feature);
+            } else {
+                error(loc, "initializer can only be a null initializer ('{}')", "shared", "");
+            }
+        } else {
+            error(loc, " cannot initialize this type of qualifier ",
+                  variable->getType().getStorageQualifierString(), "");
+            return nullptr;
+        }
+    }
+
+    if (nullInit) {
+        // only some types can be null initialized
+        if (variable->getType().containsUnsizedArray()) {
+            error(loc, "null initializers can't size unsized arrays", "{}", "");
+            return nullptr;
+        }
+        if (variable->getType().containsOpaque()) {
+            error(loc, "null initializers can't be used on opaque values", "{}", "");
+            return nullptr;
+        }
+        variable->getWritableType().getQualifier().setNullInit();
         return nullptr;
     }
+
     arrayObjectCheck(loc, variable->getType(), "array initializer");
 
     //
@@ -6748,13 +6920,15 @@
 
     // Uniforms require a compile-time constant initializer
     if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) {
-        error(loc, "uniform initializers must be constant", "=", "'%s'", variable->getType().getCompleteString().c_str());
+        error(loc, "uniform initializers must be constant", "=", "'%s'",
+              variable->getType().getCompleteString().c_str());
         variable->getWritableType().getQualifier().makeTemporary();
         return nullptr;
     }
     // Global consts require a constant initializer (specialization constant is okay)
     if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {
-        error(loc, "global const initializers must be constant", "=", "'%s'", variable->getType().getCompleteString().c_str());
+        error(loc, "global const initializers must be constant", "=", "'%s'",
+              variable->getType().getCompleteString().c_str());
         variable->getWritableType().getQualifier().makeTemporary();
         return nullptr;
     }
@@ -6774,7 +6948,8 @@
         // "In declarations of global variables with no storage qualifier or with a const
         // qualifier any initializer must be a constant expression."
         if (symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {
-            const char* initFeature = "non-constant global initializer (needs GL_EXT_shader_non_constant_global_initializers)";
+            const char* initFeature =
+                "non-constant global initializer (needs GL_EXT_shader_non_constant_global_initializers)";
             if (isEsProfile()) {
                 if (relaxedErrors() && ! extensionTurnedOn(E_GL_EXT_shader_non_constant_global_initializers))
                     warn(loc, "not allowed in this version", initFeature, "");
@@ -6788,7 +6963,8 @@
         // Compile-time tagging of the variable with its constant value...
 
         initializer = intermediate.addConversion(EOpAssign, variable->getType(), initializer);
-        if (! initializer || ! initializer->getType().getQualifier().isConstant() || variable->getType() != initializer->getType()) {
+        if (! initializer || ! initializer->getType().getQualifier().isConstant() ||
+            variable->getType() != initializer->getType()) {
             error(loc, "non-matching or non-convertible constant type for const initializer",
                   variable->getType().getStorageQualifierString(), "");
             variable->getWritableType().getQualifier().makeTemporary();
@@ -6900,6 +7076,15 @@
             error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
             return nullptr;
         }
+        TBasicType destType = type.getBasicType();
+        for (int i = 0; i < type.getVectorSize(); ++i) {
+            TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();
+            if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {
+                error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString().c_str());
+                return nullptr;
+            }
+
+        }
     } else {
         error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
         return nullptr;
@@ -7275,6 +7460,8 @@
         if (!node->getType().isCoopMat()) {
             if (type.getBasicType() != node->getType().getBasicType()) {
                 node = intermediate.addConversion(type.getBasicType(), node);
+                if (node == nullptr)
+                    return nullptr;
             }
             node = intermediate.setAggregateOperator(node, EOpConstructCooperativeMatrix, type, node->getLoc());
         } else {
@@ -7354,6 +7541,19 @@
 
         return node;
 
+    case EOpConstructAccStruct:
+        if ((node->getType().isScalar() && node->getType().getBasicType() == EbtUint64)) {
+            // construct acceleration structure from uint64
+            requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uint64_t conversion to acclerationStructureEXT");
+            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUint64ToAccStruct, true, node,
+                type);
+        } else if (node->getType().isVector() && node->getType().getBasicType() == EbtUint && node->getVectorSize() == 2) {
+            // construct acceleration structure from uint64
+            requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uvec2 conversion to accelerationStructureEXT");
+            return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUvec2ToAccStruct, true, node,
+                type);
+        } else
+            return nullptr;
 #endif // GLSLANG_WEB
 
     default:
@@ -7434,10 +7634,10 @@
         TType& memberType = *typeList[member].type;
         TQualifier& memberQualifier = memberType.getQualifier();
         const TSourceLoc& memberLoc = typeList[member].loc;
-        globalQualifierFixCheck(memberLoc, memberQualifier);
         if (memberQualifier.storage != EvqTemporary && memberQualifier.storage != EvqGlobal && memberQualifier.storage != currentBlockQualifier.storage)
             error(memberLoc, "member storage qualifier cannot contradict block storage qualifier", memberType.getFieldName().c_str(), "");
         memberQualifier.storage = currentBlockQualifier.storage;
+        globalQualifierFixCheck(memberLoc, memberQualifier);
 #ifndef GLSLANG_WEB
         inheritMemoryQualifiers(currentBlockQualifier, memberQualifier);
         if (currentBlockQualifier.perPrimitiveNV)
@@ -7453,8 +7653,8 @@
             arraySizesCheck(memberLoc, currentBlockQualifier, memberType.getArraySizes(), nullptr, member == typeList.size() - 1);
         if (memberQualifier.hasOffset()) {
             if (spvVersion.spv == 0) {
-                requireProfile(memberLoc, ~EEsProfile, "offset on block member");
-                profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
+                profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "\"offset\" on block member");
+                profileRequires(memberLoc, EEsProfile, 300, E_GL_ARB_enhanced_layouts, "\"offset\" on block member");
             }
         }
 
@@ -7487,6 +7687,7 @@
     case EvqBuffer:     defaultQualification = globalBufferDefaults;     break;
     case EvqVaryingIn:  defaultQualification = globalInputDefaults;      break;
     case EvqVaryingOut: defaultQualification = globalOutputDefaults;     break;
+    case EvqShared:     defaultQualification = globalSharedDefaults;     break;
     default:            defaultQualification.clear();                    break;
     }
 
@@ -7593,6 +7794,8 @@
     fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation);
     fixXfbOffsets(currentBlockQualifier, typeList);
     fixBlockUniformOffsets(currentBlockQualifier, typeList);
+    fixBlockUniformLayoutMatrix(currentBlockQualifier, &typeList, nullptr);
+    fixBlockUniformLayoutPacking(currentBlockQualifier, &typeList, nullptr);
     for (unsigned int member = 0; member < typeList.size(); ++member)
         layoutTypeCheck(typeList[member].loc, *typeList[member].type);
 
@@ -7748,6 +7951,12 @@
             error(loc, "output blocks cannot be used in a task shader", "out", "");
         }
         break;
+    case EvqShared:
+        if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4) {
+            error(loc, "shared block requires at least SPIR-V 1.4", "shared block", "");
+        }
+        profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, "shared block");
+        break;
 #ifndef GLSLANG_WEB
     case EvqPayload:
         profileRequires(loc, ~EEsProfile, 460, 2, extsrt, "rayPayloadNV block");
@@ -7906,7 +8115,7 @@
 //
 void TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
-    if (!qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory())
+    if (!storageCanHaveLayoutInBlock(qualifier.storage) && !qualifier.isTaskMemory())
         return;
     if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)
         return;
@@ -7963,6 +8172,101 @@
     }
 }
 
+//
+// Spread LayoutMatrix to uniform block member, if a uniform block member is a struct,
+// we need spread LayoutMatrix to this struct member too. and keep this rule for recursive.
+//
+void TParseContext::fixBlockUniformLayoutMatrix(TQualifier& qualifier, TTypeList* originTypeList,
+                                                TTypeList* tmpTypeList)
+{
+    assert(tmpTypeList == nullptr || originTypeList->size() == tmpTypeList->size());
+    for (unsigned int member = 0; member < originTypeList->size(); ++member) {
+        if (qualifier.layoutPacking != ElpNone) {
+            if (tmpTypeList == nullptr) {
+                if (((*originTypeList)[member].type->isMatrix() ||
+                     (*originTypeList)[member].type->getBasicType() == EbtStruct) &&
+                    (*originTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {
+                    (*originTypeList)[member].type->getQualifier().layoutMatrix = qualifier.layoutMatrix;
+                }
+            } else {
+                if (((*tmpTypeList)[member].type->isMatrix() ||
+                     (*tmpTypeList)[member].type->getBasicType() == EbtStruct) &&
+                    (*tmpTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {
+                    (*tmpTypeList)[member].type->getQualifier().layoutMatrix = qualifier.layoutMatrix;
+                }
+            }
+        }
+
+        if ((*originTypeList)[member].type->getBasicType() == EbtStruct) {
+            TQualifier* memberQualifier = nullptr;
+            // block member can be declare a matrix style, so it should be update to the member's style
+            if ((*originTypeList)[member].type->getQualifier().layoutMatrix == ElmNone) {
+                memberQualifier = &qualifier;
+            } else {
+                memberQualifier = &((*originTypeList)[member].type->getQualifier());
+            }
+
+            const TType* tmpType = tmpTypeList == nullptr ?
+                (*originTypeList)[member].type->clone() : (*tmpTypeList)[member].type;
+
+            fixBlockUniformLayoutMatrix(*memberQualifier, (*originTypeList)[member].type->getWritableStruct(),
+                                        tmpType->getWritableStruct());
+
+            const TTypeList* structure = recordStructCopy(matrixFixRecord, (*originTypeList)[member].type, tmpType);
+
+            if (tmpTypeList == nullptr) {
+                (*originTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));
+            }
+            if (tmpTypeList != nullptr) {
+                (*tmpTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));
+            }
+        }
+    }
+}
+
+//
+// Spread LayoutPacking to block member, if a  block member is a struct, we need spread LayoutPacking to
+// this struct member too. and keep this rule for recursive.
+//
+void TParseContext::fixBlockUniformLayoutPacking(TQualifier& qualifier, TTypeList* originTypeList,
+                                                 TTypeList* tmpTypeList)
+{
+    assert(tmpTypeList == nullptr || originTypeList->size() == tmpTypeList->size());
+    for (unsigned int member = 0; member < originTypeList->size(); ++member) {
+        if (qualifier.layoutPacking != ElpNone) {
+            if (tmpTypeList == nullptr) {
+                if ((*originTypeList)[member].type->getQualifier().layoutPacking == ElpNone) {
+                    (*originTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;
+                }
+            } else {
+                if ((*tmpTypeList)[member].type->getQualifier().layoutPacking == ElpNone) {
+                    (*tmpTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;
+                }
+            }
+        }
+
+        if ((*originTypeList)[member].type->getBasicType() == EbtStruct) {
+            // Deep copy the type in pool.
+            // Because, struct use in different block may have different layout qualifier.
+            // We have to new a object to distinguish between them.
+            const TType* tmpType = tmpTypeList == nullptr ?
+                (*originTypeList)[member].type->clone() : (*tmpTypeList)[member].type;
+
+            fixBlockUniformLayoutPacking(qualifier, (*originTypeList)[member].type->getWritableStruct(),
+                                         tmpType->getWritableStruct());
+
+            const TTypeList* structure = recordStructCopy(packingFixRecord, (*originTypeList)[member].type, tmpType);
+
+            if (tmpTypeList == nullptr) {
+                (*originTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));
+            }
+            if (tmpTypeList != nullptr) {
+                (*tmpTypeList)[member].type->setStruct(const_cast<TTypeList*>(structure));
+            }
+        }
+    }
+}
+
 // For an identifier that is already declared, add more qualification to it.
 void TParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qualifier, const TString& identifier)
 {
@@ -8038,7 +8342,7 @@
 
     bool pipeOut = qualifier.isPipeOutput();
     bool pipeIn = qualifier.isPipeInput();
-    if (version >= 300 || (!isEsProfile() && version >= 420)) {
+    if ((version >= 300 && isEsProfile()) || (!isEsProfile() && version >= 420)) {
         if (! pipeOut)
             error(loc, "can only apply to an output", "invariant", "");
     } else {
@@ -8271,6 +8575,16 @@
     {
         checkIoArraysConsistency(loc);
     }
+
+    if (publicType.shaderQualifiers.layoutPrimitiveCulling) {
+        if (publicType.qualifier.storage != EvqTemporary)
+            error(loc, "layout qualifier can not have storage qualifiers", "primitive_culling","", "");
+        else {
+            intermediate.setLayoutPrimitiveCulling();
+        }
+        // Exit early as further checks are not valid
+        return;
+    }
 #endif 
     const TQualifier& qualifier = publicType.qualifier;
 
@@ -8315,8 +8629,14 @@
         }
 #endif
         break;
+    case EvqShared:
+        if (qualifier.hasMatrix())
+            globalSharedDefaults.layoutMatrix = qualifier.layoutMatrix;
+        if (qualifier.hasPacking())
+            globalSharedDefaults.layoutPacking = qualifier.layoutPacking;
+        break;
     default:
-        error(loc, "default qualifier requires 'uniform', 'buffer', 'in', or 'out' storage qualification", "", "");
+        error(loc, "default qualifier requires 'uniform', 'buffer', 'in', 'out' or 'shared' storage qualification", "", "");
         return;
     }
 
@@ -8421,5 +8741,43 @@
     return switchNode;
 }
 
+//
+// When a struct used in block, and has it's own layout packing, layout matrix,
+// record the origin structure of a struct to map, and Record the structure copy to the copy table,
+//
+const TTypeList* TParseContext::recordStructCopy(TStructRecord& record, const TType* originType, const TType* tmpType)
+{
+    size_t memberCount = tmpType->getStruct()->size();
+    size_t originHash = 0, tmpHash = 0;
+    std::hash<size_t> hasher;
+    for (size_t i = 0; i < memberCount; i++) {
+        size_t originMemberHash = hasher(originType->getStruct()->at(i).type->getQualifier().layoutPacking +
+                                         originType->getStruct()->at(i).type->getQualifier().layoutMatrix);
+        size_t tmpMemberHash = hasher(tmpType->getStruct()->at(i).type->getQualifier().layoutPacking +
+                                      tmpType->getStruct()->at(i).type->getQualifier().layoutMatrix);
+        originHash = hasher((originHash ^ originMemberHash) << 1);
+        tmpHash = hasher((tmpHash ^ tmpMemberHash) << 1);
+    }
+    const TTypeList* originStruct = originType->getStruct();
+    const TTypeList* tmpStruct = tmpType->getStruct();
+    if (originHash != tmpHash) {
+        auto fixRecords = record.find(originStruct);
+        if (fixRecords != record.end()) {
+            auto fixRecord = fixRecords->second.find(tmpHash);
+            if (fixRecord != fixRecords->second.end()) {
+                return fixRecord->second;
+            } else {
+                record[originStruct][tmpHash] = tmpStruct;
+                return tmpStruct;
+            }
+        } else {
+            record[originStruct] = std::map<size_t, const TTypeList*>();
+            record[originStruct][tmpHash] = tmpStruct;
+            return tmpStruct;
+        }
+    }
+    return originStruct;
+}
+
 } // end namespace glslang
 
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 9c5fdc7..4093fbf 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -68,6 +68,7 @@
 class TPpContext;
 
 typedef std::set<int> TIdSetType;
+typedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;
 
 //
 // Sharable code (as well as what's in TParseVersions) across
@@ -82,7 +83,8 @@
           : TParseVersions(interm, version, profile, spvVersion, language, infoSink, forwardCompatible, messages),
             scopeMangler("::"),
             symbolTable(symbolTable),
-            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), controlFlowNestingLevel(0),
+            statementNestingLevel(0), loopNestingLevel(0), structNestingLevel(0), blockNestingLevel(0), controlFlowNestingLevel(0),
+            currentFunctionType(nullptr),
             postEntryPointReturn(false),
             contextPragma(true, false),
             beginInvocationInterlockCount(0), endInvocationInterlockCount(0),
@@ -176,7 +178,8 @@
     TSymbolTable& symbolTable;        // symbol table that goes with the current language, version, and profile
     int statementNestingLevel;        // 0 if outside all flow control or compound statements
     int loopNestingLevel;             // 0 if outside all loops
-    int structNestingLevel;           // 0 if outside blocks and structures
+    int structNestingLevel;           // 0 if outside structures
+    int blockNestingLevel;            // 0 if outside blocks
     int controlFlowNestingLevel;      // 0 if outside all flow control
     const TType* currentFunctionType; // the return type of the function that's currently being parsed
     bool functionReturnsValue;        // true if a non-void function has a return
@@ -327,6 +330,7 @@
     TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*);
     void addInputArgumentConversions(const TFunction&, TIntermNode*&) const;
     TIntermTyped* addOutputArgumentConversions(const TFunction&, TIntermAggregate&) const;
+    TIntermTyped* addAssign(const TSourceLoc&, TOperator op, TIntermTyped* left, TIntermTyped* right);
     void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&);
     void nonOpBuiltInCheck(const TSourceLoc&, const TFunction&, TIntermAggregate&);
     void userFunctionCallCheck(const TSourceLoc&, TIntermAggregate&);
@@ -362,7 +366,7 @@
     void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
     void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
     void memberQualifierCheck(glslang::TPublicType&);
-    void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
+    void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false);
     void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
     bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
     void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force);
@@ -418,12 +422,15 @@
     void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
     void fixXfbOffsets(TQualifier&, TTypeList&);
     void fixBlockUniformOffsets(TQualifier&, TTypeList&);
+    void fixBlockUniformLayoutMatrix(TQualifier&, TTypeList*, TTypeList*);
+    void fixBlockUniformLayoutPacking(TQualifier&, TTypeList*, TTypeList*);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
     void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
     void invariantCheck(const TSourceLoc&, const TQualifier&);
     void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
     void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
     TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
+    const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*);
 
 #ifndef GLSLANG_WEB
     TAttributeType attributeFromName(const TString& name) const;
@@ -478,12 +485,15 @@
     TQualifier globalUniformDefaults;
     TQualifier globalInputDefaults;
     TQualifier globalOutputDefaults;
+    TQualifier globalSharedDefaults;
     TString currentCaller;        // name of last function body entered (not valid when at global scope)
 #ifndef GLSLANG_WEB
     int* atomicUintOffsets;       // to become an array of the right size to hold an offset per binding point
     bool anyIndexLimits;
     TIdSetType inductiveLoopIds;
     TVector<TIntermTyped*> needsIndexLimitationChecking;
+    TStructRecord matrixFixRecord;
+    TStructRecord packingFixRecord;
 
     //
     // Geometry shader input arrays:
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index bd3181a..78c8a36 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -365,6 +365,9 @@
     (*KeywordMap)["if"] =                      IF;
     (*KeywordMap)["else"] =                    ELSE;
     (*KeywordMap)["discard"] =                 DISCARD;
+    (*KeywordMap)["terminateInvocation"] =     TERMINATE_INVOCATION;
+    (*KeywordMap)["terminateRayEXT"] =         TERMINATE_RAY;
+    (*KeywordMap)["ignoreIntersectionEXT"] =   IGNORE_INTERSECTION;
     (*KeywordMap)["return"] =                  RETURN;
     (*KeywordMap)["void"] =                    VOID;
     (*KeywordMap)["bool"] =                    BOOL;
@@ -471,6 +474,28 @@
     (*KeywordMap)["image2DMSArray"] =          IMAGE2DMSARRAY;
     (*KeywordMap)["iimage2DMSArray"] =         IIMAGE2DMSARRAY;
     (*KeywordMap)["uimage2DMSArray"] =         UIMAGE2DMSARRAY;
+    (*KeywordMap)["i64image1D"] =              I64IMAGE1D;
+    (*KeywordMap)["u64image1D"] =              U64IMAGE1D;
+    (*KeywordMap)["i64image2D"] =              I64IMAGE2D;
+    (*KeywordMap)["u64image2D"] =              U64IMAGE2D;
+    (*KeywordMap)["i64image3D"] =              I64IMAGE3D;
+    (*KeywordMap)["u64image3D"] =              U64IMAGE3D;
+    (*KeywordMap)["i64image2DRect"] =          I64IMAGE2DRECT;
+    (*KeywordMap)["u64image2DRect"] =          U64IMAGE2DRECT;
+    (*KeywordMap)["i64imageCube"] =            I64IMAGECUBE;
+    (*KeywordMap)["u64imageCube"] =            U64IMAGECUBE;
+    (*KeywordMap)["i64imageBuffer"] =          I64IMAGEBUFFER;
+    (*KeywordMap)["u64imageBuffer"] =          U64IMAGEBUFFER;
+    (*KeywordMap)["i64image1DArray"] =         I64IMAGE1DARRAY;
+    (*KeywordMap)["u64image1DArray"] =         U64IMAGE1DARRAY;
+    (*KeywordMap)["i64image2DArray"] =         I64IMAGE2DARRAY;
+    (*KeywordMap)["u64image2DArray"] =         U64IMAGE2DARRAY;
+    (*KeywordMap)["i64imageCubeArray"] =       I64IMAGECUBEARRAY;
+    (*KeywordMap)["u64imageCubeArray"] =       U64IMAGECUBEARRAY;
+    (*KeywordMap)["i64image2DMS"] =            I64IMAGE2DMS;
+    (*KeywordMap)["u64image2DMS"] =            U64IMAGE2DMS;
+    (*KeywordMap)["i64image2DMSArray"] =       I64IMAGE2DMSARRAY;
+    (*KeywordMap)["u64image2DMSArray"] =       U64IMAGE2DMSARRAY;
     (*KeywordMap)["double"] =                  DOUBLE;
     (*KeywordMap)["dvec2"] =                   DVEC2;
     (*KeywordMap)["dvec3"] =                   DVEC3;
@@ -914,6 +939,17 @@
     case CASE:
         return keyword;
 
+    case TERMINATE_INVOCATION:
+        if (!parseContext.extensionTurnedOn(E_GL_EXT_terminate_invocation))
+            return identifierOrType();
+        return keyword;
+
+    case TERMINATE_RAY:
+    case IGNORE_INTERSECTION:
+        if (!parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing))
+            return identifierOrType();
+        return keyword;
+
     case BUFFER:
         afterBuffer = true;
         if ((parseContext.isEsProfile() && parseContext.version < 310) ||
@@ -982,7 +1018,7 @@
         return keyword;
     case PACKED:
         if ((parseContext.isEsProfile() && parseContext.version < 300) ||
-            (!parseContext.isEsProfile() && parseContext.version < 330))
+            (!parseContext.isEsProfile() && parseContext.version < 140))
             return reservedWord();
         return identifierOrType();
 
@@ -1147,6 +1183,19 @@
         afterType = true;
         return firstGenerationImage(false);
 
+    case I64IMAGE1D:
+    case U64IMAGE1D:
+    case I64IMAGE1DARRAY:
+    case U64IMAGE1DARRAY:
+    case I64IMAGE2DRECT:
+    case U64IMAGE2DRECT:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            return firstGenerationImage(false);
+        }
+        return identifierOrType();
+
     case IMAGEBUFFER:
     case IIMAGEBUFFER:
     case UIMAGEBUFFER:
@@ -1155,6 +1204,18 @@
             parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
             return keyword;
         return firstGenerationImage(false);
+        
+    case I64IMAGEBUFFER:
+    case U64IMAGEBUFFER:
+        afterType = true;        
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||
+                parseContext.extensionsTurnedOn(Num_AEP_texture_buffer, AEP_texture_buffer))
+                return keyword;
+            return firstGenerationImage(false);
+        }
+        return identifierOrType();
 
     case IMAGE2D:
     case IIMAGE2D:
@@ -1171,6 +1232,20 @@
         afterType = true;
         return firstGenerationImage(true);
 
+    case I64IMAGE2D:
+    case U64IMAGE2D:
+    case I64IMAGE3D:
+    case U64IMAGE3D:
+    case I64IMAGECUBE:
+    case U64IMAGECUBE:
+    case I64IMAGE2DARRAY:
+    case U64IMAGE2DARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64))
+            return firstGenerationImage(true);
+        return identifierOrType();
+        
     case IMAGECUBEARRAY:
     case IIMAGECUBEARRAY:
     case UIMAGECUBEARRAY:
@@ -1179,6 +1254,18 @@
             parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
             return keyword;
         return secondGenerationImage();
+        
+    case I64IMAGECUBEARRAY:
+    case U64IMAGECUBEARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            if ((parseContext.isEsProfile() && parseContext.version >= 320) ||
+                parseContext.extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array))
+                return keyword;
+            return secondGenerationImage();
+        }
+        return identifierOrType();
 
     case IMAGE2DMS:
     case IIMAGE2DMS:
@@ -1188,6 +1275,17 @@
     case UIMAGE2DMSARRAY:
         afterType = true;
         return secondGenerationImage();
+        
+    case I64IMAGE2DMS:
+    case U64IMAGE2DMS:
+    case I64IMAGE2DMSARRAY:
+    case U64IMAGE2DMSARRAY:
+        afterType = true;
+        if (parseContext.symbolTable.atBuiltInLevel() ||
+            parseContext.extensionTurnedOn(E_GL_EXT_shader_image_int64)) {
+            return secondGenerationImage();
+        }
+        return identifierOrType();
 
     case DOUBLE:
     case DVEC2:
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index a1392db..c6030bd 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -51,9 +51,9 @@
 #include "ScanContext.h"
 
 #ifdef ENABLE_HLSL
-#include "../../hlsl/hlslParseHelper.h"
-#include "../../hlsl/hlslParseables.h"
-#include "../../hlsl/hlslScanContext.h"
+#include "../HLSL/hlslParseHelper.h"
+#include "../HLSL/hlslParseables.h"
+#include "../HLSL/hlslScanContext.h"
 #endif
 
 #include "../Include/ShHandle.h"
@@ -72,6 +72,9 @@
 // token to print ", but none of that seems appropriate for this file.
 #include "preprocessor/PpTokens.h"
 
+// Build-time generated includes
+#include "glslang/build_info.h"
+
 namespace { // anonymous namespace for file-local functions and symbols
 
 // Total number of successful initializers of glslang: a refcount
@@ -291,6 +294,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]);
@@ -312,6 +318,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     std::unique_ptr<TBuiltInParseables> builtInParseables(CreateBuiltInParseables(infoSink, source));
@@ -351,7 +360,6 @@
         (profile == EEsProfile && version >= 310))
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangGeometry, source,
                                    infoSink, commonTable, symbolTables);
-#endif
 
     // check for compute
     if ((profile != EEsProfile && version >= 420) ||
@@ -359,6 +367,7 @@
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source,
                                    infoSink, commonTable, symbolTables);
 
+#ifndef GLSLANG_ANGLE
     // check for ray tracing stages
     if (profile != EEsProfile && version >= 450) {
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGen, source,
@@ -386,6 +395,8 @@
         (profile == EEsProfile && version >= 320))
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source,
                                    infoSink, commonTable, symbolTables);
+#endif // !GLSLANG_ANGLE
+#endif // !GLSLANG_WEB
 
     return true;
 }
@@ -487,7 +498,7 @@
 // Function to Print all builtins
 void DumpBuiltinSymbolTable(TInfoSink& infoSink, const TSymbolTable& symbolTable)
 {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     infoSink.debug << "BuiltinSymbolTable {\n";
 
     symbolTable.dump(infoSink, true);
@@ -591,7 +602,7 @@
         break;
     }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     // Correct for stage type...
     switch (stage) {
     case EShLangGeometry:
@@ -867,7 +878,7 @@
                                 : userInput.scanVersion(version, profile, versionNotFirstToken);
     bool versionNotFound = version == 0;
     if (forceDefaultVersionAndProfile && source == EShSourceGlsl) {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound &&
             (version != defaultVersion || profile != defaultProfile)) {
             compiler->infoSink.info << "Warning, (version, profile) forced to be ("
@@ -890,10 +901,13 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst));
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     bool warnVersionNotFirst = false;
     if (! versionWillBeError && versionNotFirstToken) {
         if (messages & EShMsgRelaxedErrors)
@@ -963,7 +977,7 @@
     parseContext->setLimits(*resources);
     if (! goodVersion)
         parseContext->addError();
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     if (warnVersionNotFirst) {
         TSourceLoc loc;
         loc.init();
@@ -1000,7 +1014,7 @@
     return success;
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 // Responsible for keeping track of the most recent source string and line in
 // the preprocessor and outputting newlines appropriately if the source string
@@ -1223,14 +1237,16 @@
             parseContext.infoSink.info << parseContext.getNumErrors() << " compilation errors.  No code generated.\n\n";
         }
 
+#ifndef GLSLANG_ANGLE
         if (messages & EShMsgAST)
             intermediate.output(parseContext.infoSink, true);
+#endif
 
         return success;
     }
 };
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 // Take a single compilation unit, and run the preprocessor on it.
 // Return: True if there were no issues found in preprocessing,
 //         False if during preprocessing any unknown version, pragmas or
@@ -1684,19 +1700,29 @@
 
 namespace glslang {
 
-#include "../Include/revision.h"
+Version GetVersion()
+{
+    Version version;
+    version.major = GLSLANG_VERSION_MAJOR;
+    version.minor = GLSLANG_VERSION_MINOR;
+    version.patch = GLSLANG_VERSION_PATCH;
+    version.flavor = GLSLANG_VERSION_FLAVOR;
+    return version;
+}
 
 #define QUOTE(s) #s
 #define STR(n) QUOTE(n)
 
 const char* GetEsslVersionString()
 {
-    return "OpenGL ES GLSL 3.20 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL);
+    return "OpenGL ES GLSL 3.20 glslang Khronos. " STR(GLSLANG_VERSION_MAJOR) "." STR(GLSLANG_VERSION_MINOR) "." STR(
+        GLSLANG_VERSION_PATCH) GLSLANG_VERSION_FLAVOR;
 }
 
 const char* GetGlslVersionString()
 {
-    return "4.60 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL);
+    return "4.60 glslang Khronos. " STR(GLSLANG_VERSION_MAJOR) "." STR(GLSLANG_VERSION_MINOR) "." STR(
+        GLSLANG_VERSION_PATCH) GLSLANG_VERSION_FLAVOR;
 }
 
 int GetKhronosToolId()
@@ -1860,7 +1886,7 @@
                            &environment);
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 // Fill in a string with the result of preprocessing ShaderStrings
 // Returns true if all extensions, pragmas and version strings were valid.
 //
@@ -1898,7 +1924,7 @@
 }
 
 TProgram::TProgram() :
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     reflection(0),
 #endif
     linked(false)
@@ -1914,7 +1940,7 @@
 TProgram::~TProgram()
 {
     delete infoSink;
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     delete reflection;
 #endif
 
@@ -1961,7 +1987,7 @@
     if (stages[stage].size() == 0)
         return true;
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     int numEsShaders = 0, numNonEsShaders = 0;
     for (auto it = stages[stage].begin(); it != stages[stage].end(); ++it) {
         if ((*it)->intermediate->getProfile() == EEsProfile) {
@@ -1990,7 +2016,7 @@
         intermediate[stage] = new TIntermediate(stage,
                                                 firstIntermediate->getVersion(),
                                                 firstIntermediate->getProfile());
-
+        intermediate[stage]->setLimits(firstIntermediate->getLimits());
 
         // The new TIntermediate must use the same origin as the original TIntermediates.
         // Otherwise linking will fail due to different coordinate systems.
@@ -2015,8 +2041,10 @@
 #endif
     intermediate[stage]->finalCheck(*infoSink, (messages & EShMsgKeepUncalled) != 0);
 
+#ifndef GLSLANG_ANGLE
     if (messages & EShMsgAST)
         intermediate[stage]->output(*infoSink, true);
+#endif
 
     return intermediate[stage]->getNumErrors() == 0;
 }
@@ -2031,7 +2059,7 @@
     return infoSink->debug.c_str();
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 //
 // Reflection implementation.
@@ -2113,6 +2141,6 @@
     return ioMapper->doMap(pResolver, *infoSink);
 }
 
-#endif // GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/SymbolTable.cpp b/glslang/MachineIndependent/SymbolTable.cpp
index 06b5a81..f6291c3 100644
--- a/glslang/MachineIndependent/SymbolTable.cpp
+++ b/glslang/MachineIndependent/SymbolTable.cpp
@@ -85,6 +85,8 @@
 #endif
         case EbtInt:   mangledName += "i"; break;
         case EbtUint:  mangledName += "u"; break;
+        case EbtInt64:   mangledName += "i64"; break;
+        case EbtUint64:  mangledName += "u64"; break;
         default: break; // some compilers want this
         }
         if (sampler.isImageClass())
@@ -146,6 +148,8 @@
         if (typeName)
             mangledName += *typeName;
         for (unsigned int i = 0; i < structure->size(); ++i) {
+            if ((*structure)[i].type->getBasicType() == EbtVoid)
+                continue;
             mangledName += '-';
             (*structure)[i].type->buildMangledName(mangledName);
         }
@@ -178,7 +182,7 @@
     }
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 //
 // Dump functions.
diff --git a/glslang/MachineIndependent/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h
index 40ca3da..db16c19 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -117,7 +117,7 @@
     virtual int getNumExtensions() const { return extensions == nullptr ? 0 : (int)extensions->size(); }
     virtual const char** getExtensions() const { return extensions->data(); }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     virtual void dump(TInfoSink& infoSink, bool complete = false) const = 0;
     void dumpExtensions(TInfoSink& infoSink) const;
 #endif
@@ -196,7 +196,7 @@
     }
     virtual const char** getMemberExtensions(int member) const { return (*memberExtensions)[member].data(); }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     virtual void dump(TInfoSink& infoSink, bool complete = false) const;
 #endif
 
@@ -319,7 +319,7 @@
     virtual TParameter& operator[](int i) { assert(writable); return parameters[i]; }
     virtual const TParameter& operator[](int i) const { return parameters[i]; }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     virtual void dump(TInfoSink& infoSink, bool complete = false) const override;
 #endif
 
@@ -381,7 +381,7 @@
     virtual const char** getExtensions() const override { return anonContainer.getMemberExtensions(memberNumber); }
 
     virtual int getAnonId() const { return anonId; }
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     virtual void dump(TInfoSink& infoSink, bool complete = false) const override;
 #endif
 
@@ -551,7 +551,7 @@
 
     void relateToOperator(const char* name, TOperator op);
     void setFunctionExtensions(const char* name, int num, const char* const extensions[]);
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     void dump(TInfoSink& infoSink, bool complete = false) const;
 #endif
     TSymbolTableLevel* clone() const;
@@ -613,20 +613,24 @@
     //
 protected:
     static const int globalLevel = 3;
-    bool isSharedLevel(int level)  { return level <= 1; }              // exclude all per-compile levels
-    bool isBuiltInLevel(int level) { return level <= 2; }              // exclude user globals
-    bool isGlobalLevel(int level)  { return level <= globalLevel; }    // include user globals
+    static bool isSharedLevel(int level)  { return level <= 1; }            // exclude all per-compile levels
+    static bool isBuiltInLevel(int level) { return level <= 2; }            // exclude user globals
+    static bool isGlobalLevel(int level)  { return level <= globalLevel; }  // include user globals
 public:
     bool isEmpty() { return table.size() == 0; }
     bool atBuiltInLevel() { return isBuiltInLevel(currentLevel()); }
     bool atGlobalLevel()  { return isGlobalLevel(currentLevel()); }
-
+    static bool isBuiltInSymbol(int uniqueId) {
+        int level = uniqueId >> LevelFlagBitOffset;
+        return isBuiltInLevel(level);
+    }
     void setNoBuiltInRedeclarations() { noBuiltInRedeclarations = true; }
     void setSeparateNameSpaces() { separateNameSpaces = true; }
 
     void push()
     {
         table.push_back(new TSymbolTableLevel);
+        updateUniqueIdLevelFlag();
     }
 
     // Make a new symbol-table level to represent the scope introduced by a structure
@@ -639,6 +643,7 @@
     {
         assert(thisSymbol.getName().size() == 0);
         table.push_back(new TSymbolTableLevel);
+        updateUniqueIdLevelFlag();
         table.back()->setThisLevel();
         insert(thisSymbol);
     }
@@ -648,6 +653,7 @@
         table[currentLevel()]->getPreviousDefaultPrecisions(p);
         delete table.back();
         table.pop_back();
+        updateUniqueIdLevelFlag();
     }
 
     //
@@ -854,7 +860,7 @@
     }
 
     int getMaxSymbolId() { return uniqueId; }
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     void dump(TInfoSink& infoSink, bool complete = false) const;
 #endif
     void copyTable(const TSymbolTable& copyOf);
@@ -867,12 +873,20 @@
             table[level]->readOnly();
     }
 
+    // Add current level in the high-bits of unique id
+    void updateUniqueIdLevelFlag() {
+        // clamp level to avoid overflow
+        uint32_t level = currentLevel() > 7 ? 7 : currentLevel();
+        uniqueId &= ((1 << LevelFlagBitOffset) - 1);
+        uniqueId |= (level << LevelFlagBitOffset);
+    }
+
 protected:
     TSymbolTable(TSymbolTable&);
     TSymbolTable& operator=(TSymbolTableLevel&);
 
     int currentLevel() const { return static_cast<int>(table.size()) - 1; }
-
+    static const uint32_t LevelFlagBitOffset = 28;
     std::vector<TSymbolTableLevel*> table;
     int uniqueId;     // for unique identification in code generation
     bool noBuiltInRedeclarations;
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 143f251..488c98c 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -64,6 +64,7 @@
 //        checkDeprecated()
 //        requireNotRemoved()
 //        requireExtensions()
+//        extensionRequires()
 //
 //    Typically, only the first two calls are needed.  They go into a code path that
 //    implements Feature F, and will log the proper error/warning messages.  Parsing
@@ -78,9 +79,11 @@
 //     const char* const XXX_extension_X = "XXX_extension_X";
 //
 // 2) Add extension initialization to TParseVersions::initializeExtensionBehavior(),
-//    the first function below:
+//    the first function below and optionally a entry to extensionData for additional
+//    error checks:
 //
 //     extensionBehavior[XXX_extension_X] = EBhDisable;
+//     (Optional) exts[] = {XXX_extension_X, EShTargetSpv_1_4}
 //
 // 3) Add any preprocessor directives etc. in the next function, TParseVersions::getPreamble():
 //
@@ -140,6 +143,8 @@
 //    set of extensions that both enable them and are necessary, given the version of the symbol
 //    table. (There is a different symbol table for each version.)
 //
+// 7) If the extension has additional requirements like minimum SPIR-V version required, add them
+//    to extensionRequires()
 
 #include "parseVersions.h"
 #include "localintermediate.h"
@@ -155,6 +160,20 @@
 //
 void TParseVersions::initializeExtensionBehavior()
 {
+    typedef struct {
+        const char *const extensionName;
+        EShTargetLanguageVersion minSpvVersion;
+    } extensionData;
+
+    const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4} };
+
+    for (size_t ii = 0; ii < sizeof(exts) / sizeof(exts[0]); ii++) {
+        // Add only extensions which require > spv1.0 to save space in map
+        if (exts[ii].minSpvVersion > EShTargetSpv_1_0) {
+            extensionMinSpv[E_GL_EXT_ray_tracing] = exts[ii].minSpvVersion;
+        }
+    }
+
     extensionBehavior[E_GL_OES_texture_3D]                   = EBhDisable;
     extensionBehavior[E_GL_OES_standard_derivatives]         = EBhDisable;
     extensionBehavior[E_GL_EXT_frag_depth]                   = EBhDisable;
@@ -286,6 +305,7 @@
     extensionBehavior[E_GL_EXT_tessellation_point_size]              = EBhDisable;
     extensionBehavior[E_GL_EXT_texture_buffer]                       = EBhDisable;
     extensionBehavior[E_GL_EXT_texture_cube_map_array]               = EBhDisable;
+    extensionBehavior[E_GL_EXT_null_initializer]                     = EBhDisable;
 
     // OES matching AEP
     extensionBehavior[E_GL_OES_geometry_shader]          = EBhDisable;
@@ -308,6 +328,10 @@
     extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable;
     extensionBehavior[E_GL_EXT_blend_func_extended]         = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable;
+    extensionBehavior[E_GL_EXT_fragment_shading_rate]       = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_image_int64]   = EBhDisable;
+    extensionBehavior[E_GL_EXT_terminate_invocation]        = EBhDisable;
+    extensionBehavior[E_GL_EXT_shared_memory_block]         = EBhDisable;
 
     // OVR extensions
     extensionBehavior[E_GL_OVR_multiview]                = EBhDisable;
@@ -328,7 +352,9 @@
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int16]   = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_int64]   = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_float16] = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_atomic_float]                    = EBhDisable;
 }
+
 #endif // GLSLANG_WEB
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -350,6 +376,7 @@
             "#define GL_EXT_YUV_target 1\n"
             "#define GL_EXT_shader_texture_lod 1\n"
             "#define GL_EXT_shadow_samplers 1\n"
+            "#define GL_EXT_fragment_shading_rate 1\n"
 
             // AEP
             "#define GL_ANDROID_extension_pack_es31a 1\n"
@@ -383,11 +410,14 @@
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             ;
 
-            if (isEsProfile() && version >= 300) {
+            if (version >= 300) {
                 preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
             }
+            if (version >= 310) {
+                preamble += "#define GL_EXT_null_initializer 1\n";
+            }
 
-    } else {
+    } else { // !isEsProfile()
         preamble =
             "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
             "#define GL_ARB_texture_rectangle 1\n"
@@ -442,6 +472,8 @@
             "#define GL_EXT_buffer_reference_uvec2 1\n"
             "#define GL_EXT_demote_to_helper_invocation 1\n"
             "#define GL_EXT_debug_printf 1\n"
+            "#define GL_EXT_fragment_shading_rate 1\n"
+            "#define GL_EXT_shared_memory_block 1\n"
 
             // GL_KHR_shader_subgroup
             "#define GL_KHR_shader_subgroup_basic 1\n"
@@ -453,11 +485,12 @@
             "#define GL_KHR_shader_subgroup_clustered 1\n"
             "#define GL_KHR_shader_subgroup_quad 1\n"
 
-            "#define E_GL_EXT_shader_atomic_int64 1\n"
-            "#define E_GL_EXT_shader_realtime_clock 1\n"
-            "#define E_GL_EXT_ray_tracing 1\n"
-            "#define E_GL_EXT_ray_query 1\n"
-            "#define E_GL_EXT_ray_flags_primitive_culling 1\n"
+            "#define GL_EXT_shader_image_int64 1\n"
+            "#define GL_EXT_shader_atomic_int64 1\n"
+            "#define GL_EXT_shader_realtime_clock 1\n"
+            "#define GL_EXT_ray_tracing 1\n"
+            "#define GL_EXT_ray_query 1\n"
+            "#define GL_EXT_ray_flags_primitive_culling 1\n"
 
             "#define GL_AMD_shader_ballot 1\n"
             "#define GL_AMD_shader_trinary_minmax 1\n"
@@ -500,6 +533,8 @@
             "#define GL_EXT_shader_subgroup_extended_types_int16 1\n"
             "#define GL_EXT_shader_subgroup_extended_types_int64 1\n"
             "#define GL_EXT_shader_subgroup_extended_types_float16 1\n"
+
+            "#define GL_EXT_shader_atomic_float 1\n"
             ;
 
         if (version >= 150) {
@@ -509,6 +544,9 @@
             if (profile == ECompatibilityProfile)
                 preamble += "#define GL_compatibility_profile 1\n";
         }
+        if (version >= 140) {
+            preamble += "#define GL_EXT_null_initializer 1\n";
+        }
 #endif // GLSLANG_WEB
     }
 
@@ -535,6 +573,11 @@
             "#define GL_GOOGLE_include_directive 1\n"
             "#define GL_KHR_blend_equation_advanced 1\n"
             ;
+
+    // other general extensions
+    preamble +=
+            "#define GL_EXT_terminate_invocation 1\n"
+            ;
 #endif
 
     // #define VULKAN XXXX
@@ -739,7 +782,8 @@
 // Use when there are no profile/version to check, it's just an error if one of the
 // extensions is not present.
 //
-void TParseVersions::requireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
+void TParseVersions::requireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[],
+    const char* featureDesc)
 {
     if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))
         return;
@@ -758,7 +802,8 @@
 // Use by preprocessor when there are no profile/version to check, it's just an error if one of the
 // extensions is not present.
 //
-void TParseVersions::ppRequireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
+void TParseVersions::ppRequireExtensions(const TSourceLoc& loc, int numExtensions, const char* const extensions[],
+    const char* featureDesc)
 {
     if (checkExtensionsRequested(loc, numExtensions, extensions, featureDesc))
         return;
@@ -824,10 +869,14 @@
         error(getCurrentLoc(), "behavior not supported:", "#extension", behaviorString);
         return;
     }
+    bool on = behavior != EBhDisable;
 
     // check if extension is used with correct shader stage
     checkExtensionStage(getCurrentLoc(), extension);
 
+    // check if extension has additional requirements
+    extensionRequires(getCurrentLoc(), extension ,behaviorString);
+
     // update the requested extension
     updateExtensionBehavior(extension, behavior);
 
@@ -890,6 +939,32 @@
         updateExtensionBehavior(line, "GL_EXT_shader_explicit_arithmetic_types_int64", behaviorString);
     else if (strcmp(extension, "GL_EXT_shader_subgroup_extended_types_float16") == 0)
         updateExtensionBehavior(line, "GL_EXT_shader_explicit_arithmetic_types_float16", behaviorString);
+
+    // see if we need to update the numeric features
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_int8") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int8, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_int16") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int16, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_int32") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int32, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_int64") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_int64, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_float16") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float16, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_float32") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float32, on);
+    else if (strcmp(extension, "GL_EXT_shader_explicit_arithmetic_types_float64") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_explicit_arithmetic_types_float64, on);
+    else if (strcmp(extension, "GL_EXT_shader_implicit_conversions") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::shader_implicit_conversions, on);
+    else if (strcmp(extension, "GL_ARB_gpu_shader_fp64") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_fp64, on);
+    else if (strcmp(extension, "GL_AMD_gpu_shader_int16") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_int16, on);
+    else if (strcmp(extension, "GL_AMD_gpu_shader_half_float") == 0)
+        intermediate.updateNumericFeature(TNumericFeatures::gpu_shader_half_float, on);
 }
 
 void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior)
@@ -925,8 +1000,8 @@
         } else {
             if (iter->second == EBhDisablePartial)
                 warn(getCurrentLoc(), "extension is only partially supported:", "#extension", extension);
-            if (behavior == EBhEnable || behavior == EBhRequire || behavior == EBhDisable)
-                intermediate.updateRequestedExtension(extension, behavior);
+            if (behavior != EBhDisable)
+                intermediate.addRequestedExtension(extension);
             iter->second = behavior;
         }
     }
@@ -944,6 +1019,24 @@
     }
 }
 
+// Check if extension has additional requirements
+void TParseVersions::extensionRequires(const TSourceLoc &loc, const char * const extension, const char *behaviorString)
+{
+    bool isEnabled = false;
+    if (!strcmp("require", behaviorString))
+        isEnabled = true;
+    else if (!strcmp("enable", behaviorString))
+        isEnabled = true;
+
+    if (isEnabled) {
+        unsigned int minSpvVersion = 0;
+        auto iter = extensionMinSpv.find(TString(extension));
+        if (iter != extensionMinSpv.end())
+            minSpvVersion = iter->second;
+        requireSpv(loc, extension, minSpvVersion);
+    }
+}
+
 // Call for any operation needing full GLSL integer data-type support.
 void TParseVersions::fullIntegerCheck(const TSourceLoc& loc, const char* op)
 {
@@ -1201,5 +1294,12 @@
         error(loc, "only allowed when generating SPIR-V", op, "");
 #endif
 }
+void TParseVersions::requireSpv(const TSourceLoc& loc, const char *op, unsigned int version)
+{
+#ifndef GLSLANG_WEB
+    if (spvVersion.spv < version)
+        error(loc, "not supported for current targeted SPIR-V version", op, "");
+#endif
+}
 
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 8667411..f377973 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -36,6 +36,7 @@
 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 // POSSIBILITY OF SUCH DAMAGE.
 //
+
 #ifndef _VERSIONS_INCLUDED_
 #define _VERSIONS_INCLUDED_
 
@@ -52,7 +53,7 @@
 // Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
 // defects from mixing the two different forms.
 //
-typedef enum {
+typedef enum : unsigned {
     EBadProfile           = 0,
     ENoProfile            = (1 << 0), // only for desktop, before profiles showed up
     ECoreProfile          = (1 << 1),
@@ -198,6 +199,10 @@
 const char* const E_GL_EXT_ray_flags_primitive_culling      = "GL_EXT_ray_flags_primitive_culling";
 const char* const E_GL_EXT_blend_func_extended              = "GL_EXT_blend_func_extended";
 const char* const E_GL_EXT_shader_implicit_conversions      = "GL_EXT_shader_implicit_conversions";
+const char* const E_GL_EXT_fragment_shading_rate            = "GL_EXT_fragment_shading_rate";
+const char* const E_GL_EXT_shader_image_int64               = "GL_EXT_shader_image_int64";
+const char* const E_GL_EXT_null_initializer                 = "GL_EXT_null_initializer";
+const char* const E_GL_EXT_shared_memory_block              = "GL_EXT_shared_memory_block";
 
 // Arrays of extensions for the above viewportEXTs duplications
 
@@ -296,6 +301,9 @@
 const char* const E_GL_EXT_shader_subgroup_extended_types_int16   = "GL_EXT_shader_subgroup_extended_types_int16";
 const char* const E_GL_EXT_shader_subgroup_extended_types_int64   = "GL_EXT_shader_subgroup_extended_types_int64";
 const char* const E_GL_EXT_shader_subgroup_extended_types_float16 = "GL_EXT_shader_subgroup_extended_types_float16";
+const char* const E_GL_EXT_terminate_invocation = "GL_EXT_terminate_invocation";
+
+const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float";
 
 // Arrays of extensions for the above AEP duplications
 
diff --git a/glslang/MachineIndependent/gl_types.h b/glslang/MachineIndependent/gl_types.h
index b6f613b..b9372d4 100644
--- a/glslang/MachineIndependent/gl_types.h
+++ b/glslang/MachineIndependent/gl_types.h
@@ -52,6 +52,14 @@
 #define GL_UNSIGNED_INT64_VEC2_ARB        0x8FE5
 #define GL_UNSIGNED_INT64_VEC3_ARB        0x8FE6
 #define GL_UNSIGNED_INT64_VEC4_ARB        0x8FE7
+#define GL_UNSIGNED_INT16_VEC2_NV         0x8FF1
+#define GL_UNSIGNED_INT16_VEC3_NV         0x8FF2
+#define GL_UNSIGNED_INT16_VEC4_NV         0x8FF3
+
+#define GL_INT16_NV                       0x8FE4
+#define GL_INT16_VEC2_NV                  0x8FE5
+#define GL_INT16_VEC3_NV                  0x8FE6
+#define GL_INT16_VEC4_NV                  0x8FE7
 
 #define GL_BOOL                           0x8B56
 #define GL_BOOL_VEC2                      0x8B57
diff --git a/glslang/MachineIndependent/glslang.m4 b/glslang/MachineIndependent/glslang.m4
index 1432bf6..4d37639 100644
--- a/glslang/MachineIndependent/glslang.m4
+++ b/glslang/MachineIndependent/glslang.m4
@@ -242,6 +242,18 @@
 %token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
 %token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
 
+%token <lex> I64IMAGE1D U64IMAGE1D
+%token <lex> I64IMAGE2D U64IMAGE2D
+%token <lex> I64IMAGE3D U64IMAGE3D
+%token <lex> I64IMAGE2DRECT U64IMAGE2DRECT
+%token <lex> I64IMAGECUBE U64IMAGECUBE
+%token <lex> I64IMAGEBUFFER U64IMAGEBUFFER
+%token <lex> I64IMAGE1DARRAY U64IMAGE1DARRAY
+%token <lex> I64IMAGE2DARRAY U64IMAGE2DARRAY
+%token <lex> I64IMAGECUBEARRAY U64IMAGECUBEARRAY
+%token <lex> I64IMAGE2DMS U64IMAGE2DMS
+%token <lex> I64IMAGE2DMSARRAY U64IMAGE2DMSARRAY
+
 // texture without sampler
 %token <lex> TEXTURECUBEARRAY ITEXTURECUBEARRAY UTEXTURECUBEARRAY
 %token <lex> TEXTURE1D ITEXTURE1D UTEXTURE1D
@@ -281,6 +293,8 @@
 %token <lex> CENTROID IN OUT INOUT
 %token <lex> STRUCT VOID WHILE
 %token <lex> BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
+%token <lex> TERMINATE_INVOCATION
+%token <lex> TERMINATE_RAY IGNORE_INTERSECTION
 %token <lex> UNIFORM SHARED BUFFER
 %token <lex> FLAT SMOOTH LAYOUT
 
@@ -778,7 +792,7 @@
         parseContext.specializationCheck($2.loc, $1->getType(), "=");
         parseContext.lValueErrorCheck($2.loc, "assign", $1);
         parseContext.rValueErrorCheck($2.loc, "assign", $3);
-        $$ = parseContext.intermediate.addAssign($2.op, $1, $3, $2.loc);
+        $$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
         if ($$ == 0) {
             parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
             $$ = $1;
@@ -905,7 +919,7 @@
 
 block_structure
     : type_qualifier IDENTIFIER LEFT_BRACE { parseContext.nestedBlockCheck($1.loc); } struct_declaration_list RIGHT_BRACE {
-        --parseContext.structNestingLevel;
+        --parseContext.blockNestingLevel;
         parseContext.blockName = $2.string;
         parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
         parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
@@ -3203,6 +3217,116 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
+    | I64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D);
+    }
+    | U64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D);
+    }
+    | I64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D);
+    }
+    | U64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D);
+    }
+    | I64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd3D);
+    }
+    | U64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd3D);
+    }
+    | I64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdRect);
+    }
+    | U64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdRect);
+    }
+    | I64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube);
+    }
+    | U64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube);
+    }
+    | I64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdBuffer);
+    }
+    | U64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdBuffer);
+    }
+    | I64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D, true);
+    }
+    | U64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D, true);
+    }
+    | I64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true);
+    }
+    | U64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true);
+    }
+    | I64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube, true);
+    }
+    | U64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube, true);
+    }
+    | I64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+    | U64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+    | I64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+    | U64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
     | SAMPLEREXTERNALOES {  // GL_OES_EGL_image_external
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -3451,6 +3575,12 @@
         parseContext.profileRequires($1.loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         $$ = $2;
     }
+    | LEFT_BRACE RIGHT_BRACE {
+        const char* initFeature = "empty { } initializer";
+        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        parseContext.profileRequires($1.loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        $$ = parseContext.intermediate.makeAggregate($1.loc);
+    }
 GLSLANG_WEB_EXCLUDE_OFF
     ;
 
@@ -3805,6 +3935,20 @@
         parseContext.requireStage($1.loc, EShLangFragment, "discard");
         $$ = parseContext.intermediate.addBranch(EOpKill, $1.loc);
     }
+    | TERMINATE_INVOCATION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc);
+    }
+GLSLANG_WEB_EXCLUDE_ON
+    | TERMINATE_RAY SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc);
+    }
+    | IGNORE_INTERSECTION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc);
+    }
+GLSLANG_WEB_EXCLUDE_OFF
     ;
 
 // Grammar Note:  No 'goto'.  Gotos are not supported.
@@ -3842,6 +3986,14 @@
     : function_prototype {
         $1.function = parseContext.handleFunctionDeclarator($1.loc, *$1.function, false /* not prototype */);
         $1.intermNode = parseContext.handleFunctionDefinition($1.loc, *$1.function);
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.push();
+            ++parseContext.statementNestingLevel;
+        }
     }
     compound_statement_no_new_scope {
         //   May be best done as post process phase on intermediate code
@@ -3857,6 +4009,17 @@
         $$->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);
         $$->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
         $$->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
+
+        // Set currentFunctionType to empty pointer when goes outside of the function
+        parseContext.currentFunctionType = nullptr;
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
+            --parseContext.statementNestingLevel;
+        }
     }
     ;
 
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index e33d7d1..0b711ae 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -242,6 +242,18 @@
 %token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
 %token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
 
+%token <lex> I64IMAGE1D U64IMAGE1D
+%token <lex> I64IMAGE2D U64IMAGE2D
+%token <lex> I64IMAGE3D U64IMAGE3D
+%token <lex> I64IMAGE2DRECT U64IMAGE2DRECT
+%token <lex> I64IMAGECUBE U64IMAGECUBE
+%token <lex> I64IMAGEBUFFER U64IMAGEBUFFER
+%token <lex> I64IMAGE1DARRAY U64IMAGE1DARRAY
+%token <lex> I64IMAGE2DARRAY U64IMAGE2DARRAY
+%token <lex> I64IMAGECUBEARRAY U64IMAGECUBEARRAY
+%token <lex> I64IMAGE2DMS U64IMAGE2DMS
+%token <lex> I64IMAGE2DMSARRAY U64IMAGE2DMSARRAY
+
 // texture without sampler
 %token <lex> TEXTURECUBEARRAY ITEXTURECUBEARRAY UTEXTURECUBEARRAY
 %token <lex> TEXTURE1D ITEXTURE1D UTEXTURE1D
@@ -281,6 +293,8 @@
 %token <lex> CENTROID IN OUT INOUT
 %token <lex> STRUCT VOID WHILE
 %token <lex> BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
+%token <lex> TERMINATE_INVOCATION
+%token <lex> TERMINATE_RAY IGNORE_INTERSECTION
 %token <lex> UNIFORM SHARED BUFFER
 %token <lex> FLAT SMOOTH LAYOUT
 
@@ -778,7 +792,7 @@
         parseContext.specializationCheck($2.loc, $1->getType(), "=");
         parseContext.lValueErrorCheck($2.loc, "assign", $1);
         parseContext.rValueErrorCheck($2.loc, "assign", $3);
-        $$ = parseContext.intermediate.addAssign($2.op, $1, $3, $2.loc);
+        $$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
         if ($$ == 0) {
             parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
             $$ = $1;
@@ -905,7 +919,7 @@
 
 block_structure
     : type_qualifier IDENTIFIER LEFT_BRACE { parseContext.nestedBlockCheck($1.loc); } struct_declaration_list RIGHT_BRACE {
-        --parseContext.structNestingLevel;
+        --parseContext.blockNestingLevel;
         parseContext.blockName = $2.string;
         parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
         parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
@@ -3203,6 +3217,116 @@
         $$.basicType = EbtSampler;
         $$.sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
+    | I64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D);
+    }
+    | U64IMAGE1D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D);
+    }
+    | I64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D);
+    }
+    | U64IMAGE2D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D);
+    }
+    | I64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd3D);
+    }
+    | U64IMAGE3D {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd3D);
+    }
+    | I64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdRect);
+    }
+    | U64IMAGE2DRECT {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdRect);
+    }
+    | I64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube);
+    }
+    | U64IMAGECUBE {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube);
+    }
+    | I64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdBuffer);
+    }
+    | U64IMAGEBUFFER {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdBuffer);
+    }
+    | I64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd1D, true);
+    }
+    | U64IMAGE1DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd1D, true);
+    }
+    | I64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true);
+    }
+    | U64IMAGE2DARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true);
+    }
+    | I64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, EsdCube, true);
+    }
+    | U64IMAGECUBEARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, EsdCube, true);
+    }
+    | I64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+    | U64IMAGE2DMS {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+    | I64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+    | U64IMAGE2DMSARRAY {
+        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
+        $$.basicType = EbtSampler;
+        $$.sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
     | SAMPLEREXTERNALOES {  // GL_OES_EGL_image_external
         $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtSampler;
@@ -3451,6 +3575,12 @@
         parseContext.profileRequires($1.loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         $$ = $2;
     }
+    | LEFT_BRACE RIGHT_BRACE {
+        const char* initFeature = "empty { } initializer";
+        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        parseContext.profileRequires($1.loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        $$ = parseContext.intermediate.makeAggregate($1.loc);
+    }
 
     ;
 
@@ -3805,6 +3935,20 @@
         parseContext.requireStage($1.loc, EShLangFragment, "discard");
         $$ = parseContext.intermediate.addBranch(EOpKill, $1.loc);
     }
+    | TERMINATE_INVOCATION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc);
+    }
+
+    | TERMINATE_RAY SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT");
+        $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc);
+    }
+    | IGNORE_INTERSECTION SEMICOLON {
+        parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc);
+    }
+
     ;
 
 // Grammar Note:  No 'goto'.  Gotos are not supported.
@@ -3842,6 +3986,14 @@
     : function_prototype {
         $1.function = parseContext.handleFunctionDeclarator($1.loc, *$1.function, false /* not prototype */);
         $1.intermNode = parseContext.handleFunctionDefinition($1.loc, *$1.function);
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.push();
+            ++parseContext.statementNestingLevel;
+        }
     }
     compound_statement_no_new_scope {
         //   May be best done as post process phase on intermediate code
@@ -3857,6 +4009,17 @@
         $$->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);
         $$->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
         $$->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
+
+        // Set currentFunctionType to empty pointer when goes outside of the function
+        parseContext.currentFunctionType = nullptr;
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
+            --parseContext.statementNestingLevel;
+        }
     }
     ;
 
@@ -3885,4 +4048,3 @@
 
 
 %%
-
diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp
index 69f7f8e..da0658c 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp
+++ b/glslang/MachineIndependent/glslang_tab.cpp
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -33,6 +34,10 @@
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
+
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
    variables, as they might otherwise be expanded by user macros.
@@ -40,11 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Identify Bison output.  */
-#define YYBISON 1
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30704
 
-/* Bison version.  */
-#define YYBISON_VERSION "3.0.4"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.7.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -61,8 +66,8 @@
 
 
 
-/* Copy the first part of user declarations.  */
-#line 69 "glslang.y" /* yacc.c:339  */
+/* First part of user prologue.  */
+#line 69 "MachineIndependent/glslang.y"
 
 
 /* Based on:
@@ -88,518 +93,596 @@
 using namespace glslang;
 
 
-#line 92 "glslang_tab.cpp" /* yacc.c:339  */
+#line 97 "MachineIndependent/glslang_tab.cpp"
 
-# ifndef YY_NULLPTR
-#  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULLPTR nullptr
+# ifndef YY_CAST
+#  ifdef __cplusplus
+#   define YY_CAST(Type, Val) static_cast<Type> (Val)
+#   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
 #  else
-#   define YY_NULLPTR 0
+#   define YY_CAST(Type, Val) ((Type) (Val))
+#   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+#  endif
+# endif
+# ifndef YY_NULLPTR
+#  if defined __cplusplus
+#   if 201103L <= __cplusplus
+#    define YY_NULLPTR nullptr
+#   else
+#    define YY_NULLPTR 0
+#   endif
+#  else
+#   define YY_NULLPTR ((void*)0)
 #  endif
 # endif
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 1
-#endif
-
-/* In a future release of Bison, this section will be replaced
-   by #include "glslang_tab.cpp.h".  */
-#ifndef YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
-# define YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
-/* Token type.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-  enum yytokentype
-  {
-    CONST = 258,
-    BOOL = 259,
-    INT = 260,
-    UINT = 261,
-    FLOAT = 262,
-    BVEC2 = 263,
-    BVEC3 = 264,
-    BVEC4 = 265,
-    IVEC2 = 266,
-    IVEC3 = 267,
-    IVEC4 = 268,
-    UVEC2 = 269,
-    UVEC3 = 270,
-    UVEC4 = 271,
-    VEC2 = 272,
-    VEC3 = 273,
-    VEC4 = 274,
-    MAT2 = 275,
-    MAT3 = 276,
-    MAT4 = 277,
-    MAT2X2 = 278,
-    MAT2X3 = 279,
-    MAT2X4 = 280,
-    MAT3X2 = 281,
-    MAT3X3 = 282,
-    MAT3X4 = 283,
-    MAT4X2 = 284,
-    MAT4X3 = 285,
-    MAT4X4 = 286,
-    SAMPLER2D = 287,
-    SAMPLER3D = 288,
-    SAMPLERCUBE = 289,
-    SAMPLER2DSHADOW = 290,
-    SAMPLERCUBESHADOW = 291,
-    SAMPLER2DARRAY = 292,
-    SAMPLER2DARRAYSHADOW = 293,
-    ISAMPLER2D = 294,
-    ISAMPLER3D = 295,
-    ISAMPLERCUBE = 296,
-    ISAMPLER2DARRAY = 297,
-    USAMPLER2D = 298,
-    USAMPLER3D = 299,
-    USAMPLERCUBE = 300,
-    USAMPLER2DARRAY = 301,
-    SAMPLER = 302,
-    SAMPLERSHADOW = 303,
-    TEXTURE2D = 304,
-    TEXTURE3D = 305,
-    TEXTURECUBE = 306,
-    TEXTURE2DARRAY = 307,
-    ITEXTURE2D = 308,
-    ITEXTURE3D = 309,
-    ITEXTURECUBE = 310,
-    ITEXTURE2DARRAY = 311,
-    UTEXTURE2D = 312,
-    UTEXTURE3D = 313,
-    UTEXTURECUBE = 314,
-    UTEXTURE2DARRAY = 315,
-    ATTRIBUTE = 316,
-    VARYING = 317,
-    FLOAT16_T = 318,
-    FLOAT32_T = 319,
-    DOUBLE = 320,
-    FLOAT64_T = 321,
-    INT64_T = 322,
-    UINT64_T = 323,
-    INT32_T = 324,
-    UINT32_T = 325,
-    INT16_T = 326,
-    UINT16_T = 327,
-    INT8_T = 328,
-    UINT8_T = 329,
-    I64VEC2 = 330,
-    I64VEC3 = 331,
-    I64VEC4 = 332,
-    U64VEC2 = 333,
-    U64VEC3 = 334,
-    U64VEC4 = 335,
-    I32VEC2 = 336,
-    I32VEC3 = 337,
-    I32VEC4 = 338,
-    U32VEC2 = 339,
-    U32VEC3 = 340,
-    U32VEC4 = 341,
-    I16VEC2 = 342,
-    I16VEC3 = 343,
-    I16VEC4 = 344,
-    U16VEC2 = 345,
-    U16VEC3 = 346,
-    U16VEC4 = 347,
-    I8VEC2 = 348,
-    I8VEC3 = 349,
-    I8VEC4 = 350,
-    U8VEC2 = 351,
-    U8VEC3 = 352,
-    U8VEC4 = 353,
-    DVEC2 = 354,
-    DVEC3 = 355,
-    DVEC4 = 356,
-    DMAT2 = 357,
-    DMAT3 = 358,
-    DMAT4 = 359,
-    F16VEC2 = 360,
-    F16VEC3 = 361,
-    F16VEC4 = 362,
-    F16MAT2 = 363,
-    F16MAT3 = 364,
-    F16MAT4 = 365,
-    F32VEC2 = 366,
-    F32VEC3 = 367,
-    F32VEC4 = 368,
-    F32MAT2 = 369,
-    F32MAT3 = 370,
-    F32MAT4 = 371,
-    F64VEC2 = 372,
-    F64VEC3 = 373,
-    F64VEC4 = 374,
-    F64MAT2 = 375,
-    F64MAT3 = 376,
-    F64MAT4 = 377,
-    DMAT2X2 = 378,
-    DMAT2X3 = 379,
-    DMAT2X4 = 380,
-    DMAT3X2 = 381,
-    DMAT3X3 = 382,
-    DMAT3X4 = 383,
-    DMAT4X2 = 384,
-    DMAT4X3 = 385,
-    DMAT4X4 = 386,
-    F16MAT2X2 = 387,
-    F16MAT2X3 = 388,
-    F16MAT2X4 = 389,
-    F16MAT3X2 = 390,
-    F16MAT3X3 = 391,
-    F16MAT3X4 = 392,
-    F16MAT4X2 = 393,
-    F16MAT4X3 = 394,
-    F16MAT4X4 = 395,
-    F32MAT2X2 = 396,
-    F32MAT2X3 = 397,
-    F32MAT2X4 = 398,
-    F32MAT3X2 = 399,
-    F32MAT3X3 = 400,
-    F32MAT3X4 = 401,
-    F32MAT4X2 = 402,
-    F32MAT4X3 = 403,
-    F32MAT4X4 = 404,
-    F64MAT2X2 = 405,
-    F64MAT2X3 = 406,
-    F64MAT2X4 = 407,
-    F64MAT3X2 = 408,
-    F64MAT3X3 = 409,
-    F64MAT3X4 = 410,
-    F64MAT4X2 = 411,
-    F64MAT4X3 = 412,
-    F64MAT4X4 = 413,
-    ATOMIC_UINT = 414,
-    ACCSTRUCTNV = 415,
-    ACCSTRUCTEXT = 416,
-    RAYQUERYEXT = 417,
-    FCOOPMATNV = 418,
-    ICOOPMATNV = 419,
-    UCOOPMATNV = 420,
-    SAMPLERCUBEARRAY = 421,
-    SAMPLERCUBEARRAYSHADOW = 422,
-    ISAMPLERCUBEARRAY = 423,
-    USAMPLERCUBEARRAY = 424,
-    SAMPLER1D = 425,
-    SAMPLER1DARRAY = 426,
-    SAMPLER1DARRAYSHADOW = 427,
-    ISAMPLER1D = 428,
-    SAMPLER1DSHADOW = 429,
-    SAMPLER2DRECT = 430,
-    SAMPLER2DRECTSHADOW = 431,
-    ISAMPLER2DRECT = 432,
-    USAMPLER2DRECT = 433,
-    SAMPLERBUFFER = 434,
-    ISAMPLERBUFFER = 435,
-    USAMPLERBUFFER = 436,
-    SAMPLER2DMS = 437,
-    ISAMPLER2DMS = 438,
-    USAMPLER2DMS = 439,
-    SAMPLER2DMSARRAY = 440,
-    ISAMPLER2DMSARRAY = 441,
-    USAMPLER2DMSARRAY = 442,
-    SAMPLEREXTERNALOES = 443,
-    SAMPLEREXTERNAL2DY2YEXT = 444,
-    ISAMPLER1DARRAY = 445,
-    USAMPLER1D = 446,
-    USAMPLER1DARRAY = 447,
-    F16SAMPLER1D = 448,
-    F16SAMPLER2D = 449,
-    F16SAMPLER3D = 450,
-    F16SAMPLER2DRECT = 451,
-    F16SAMPLERCUBE = 452,
-    F16SAMPLER1DARRAY = 453,
-    F16SAMPLER2DARRAY = 454,
-    F16SAMPLERCUBEARRAY = 455,
-    F16SAMPLERBUFFER = 456,
-    F16SAMPLER2DMS = 457,
-    F16SAMPLER2DMSARRAY = 458,
-    F16SAMPLER1DSHADOW = 459,
-    F16SAMPLER2DSHADOW = 460,
-    F16SAMPLER1DARRAYSHADOW = 461,
-    F16SAMPLER2DARRAYSHADOW = 462,
-    F16SAMPLER2DRECTSHADOW = 463,
-    F16SAMPLERCUBESHADOW = 464,
-    F16SAMPLERCUBEARRAYSHADOW = 465,
-    IMAGE1D = 466,
-    IIMAGE1D = 467,
-    UIMAGE1D = 468,
-    IMAGE2D = 469,
-    IIMAGE2D = 470,
-    UIMAGE2D = 471,
-    IMAGE3D = 472,
-    IIMAGE3D = 473,
-    UIMAGE3D = 474,
-    IMAGE2DRECT = 475,
-    IIMAGE2DRECT = 476,
-    UIMAGE2DRECT = 477,
-    IMAGECUBE = 478,
-    IIMAGECUBE = 479,
-    UIMAGECUBE = 480,
-    IMAGEBUFFER = 481,
-    IIMAGEBUFFER = 482,
-    UIMAGEBUFFER = 483,
-    IMAGE1DARRAY = 484,
-    IIMAGE1DARRAY = 485,
-    UIMAGE1DARRAY = 486,
-    IMAGE2DARRAY = 487,
-    IIMAGE2DARRAY = 488,
-    UIMAGE2DARRAY = 489,
-    IMAGECUBEARRAY = 490,
-    IIMAGECUBEARRAY = 491,
-    UIMAGECUBEARRAY = 492,
-    IMAGE2DMS = 493,
-    IIMAGE2DMS = 494,
-    UIMAGE2DMS = 495,
-    IMAGE2DMSARRAY = 496,
-    IIMAGE2DMSARRAY = 497,
-    UIMAGE2DMSARRAY = 498,
-    F16IMAGE1D = 499,
-    F16IMAGE2D = 500,
-    F16IMAGE3D = 501,
-    F16IMAGE2DRECT = 502,
-    F16IMAGECUBE = 503,
-    F16IMAGE1DARRAY = 504,
-    F16IMAGE2DARRAY = 505,
-    F16IMAGECUBEARRAY = 506,
-    F16IMAGEBUFFER = 507,
-    F16IMAGE2DMS = 508,
-    F16IMAGE2DMSARRAY = 509,
-    TEXTURECUBEARRAY = 510,
-    ITEXTURECUBEARRAY = 511,
-    UTEXTURECUBEARRAY = 512,
-    TEXTURE1D = 513,
-    ITEXTURE1D = 514,
-    UTEXTURE1D = 515,
-    TEXTURE1DARRAY = 516,
-    ITEXTURE1DARRAY = 517,
-    UTEXTURE1DARRAY = 518,
-    TEXTURE2DRECT = 519,
-    ITEXTURE2DRECT = 520,
-    UTEXTURE2DRECT = 521,
-    TEXTUREBUFFER = 522,
-    ITEXTUREBUFFER = 523,
-    UTEXTUREBUFFER = 524,
-    TEXTURE2DMS = 525,
-    ITEXTURE2DMS = 526,
-    UTEXTURE2DMS = 527,
-    TEXTURE2DMSARRAY = 528,
-    ITEXTURE2DMSARRAY = 529,
-    UTEXTURE2DMSARRAY = 530,
-    F16TEXTURE1D = 531,
-    F16TEXTURE2D = 532,
-    F16TEXTURE3D = 533,
-    F16TEXTURE2DRECT = 534,
-    F16TEXTURECUBE = 535,
-    F16TEXTURE1DARRAY = 536,
-    F16TEXTURE2DARRAY = 537,
-    F16TEXTURECUBEARRAY = 538,
-    F16TEXTUREBUFFER = 539,
-    F16TEXTURE2DMS = 540,
-    F16TEXTURE2DMSARRAY = 541,
-    SUBPASSINPUT = 542,
-    SUBPASSINPUTMS = 543,
-    ISUBPASSINPUT = 544,
-    ISUBPASSINPUTMS = 545,
-    USUBPASSINPUT = 546,
-    USUBPASSINPUTMS = 547,
-    F16SUBPASSINPUT = 548,
-    F16SUBPASSINPUTMS = 549,
-    LEFT_OP = 550,
-    RIGHT_OP = 551,
-    INC_OP = 552,
-    DEC_OP = 553,
-    LE_OP = 554,
-    GE_OP = 555,
-    EQ_OP = 556,
-    NE_OP = 557,
-    AND_OP = 558,
-    OR_OP = 559,
-    XOR_OP = 560,
-    MUL_ASSIGN = 561,
-    DIV_ASSIGN = 562,
-    ADD_ASSIGN = 563,
-    MOD_ASSIGN = 564,
-    LEFT_ASSIGN = 565,
-    RIGHT_ASSIGN = 566,
-    AND_ASSIGN = 567,
-    XOR_ASSIGN = 568,
-    OR_ASSIGN = 569,
-    SUB_ASSIGN = 570,
-    STRING_LITERAL = 571,
-    LEFT_PAREN = 572,
-    RIGHT_PAREN = 573,
-    LEFT_BRACKET = 574,
-    RIGHT_BRACKET = 575,
-    LEFT_BRACE = 576,
-    RIGHT_BRACE = 577,
-    DOT = 578,
-    COMMA = 579,
-    COLON = 580,
-    EQUAL = 581,
-    SEMICOLON = 582,
-    BANG = 583,
-    DASH = 584,
-    TILDE = 585,
-    PLUS = 586,
-    STAR = 587,
-    SLASH = 588,
-    PERCENT = 589,
-    LEFT_ANGLE = 590,
-    RIGHT_ANGLE = 591,
-    VERTICAL_BAR = 592,
-    CARET = 593,
-    AMPERSAND = 594,
-    QUESTION = 595,
-    INVARIANT = 596,
-    HIGH_PRECISION = 597,
-    MEDIUM_PRECISION = 598,
-    LOW_PRECISION = 599,
-    PRECISION = 600,
-    PACKED = 601,
-    RESOURCE = 602,
-    SUPERP = 603,
-    FLOATCONSTANT = 604,
-    INTCONSTANT = 605,
-    UINTCONSTANT = 606,
-    BOOLCONSTANT = 607,
-    IDENTIFIER = 608,
-    TYPE_NAME = 609,
-    CENTROID = 610,
-    IN = 611,
-    OUT = 612,
-    INOUT = 613,
-    STRUCT = 614,
-    VOID = 615,
-    WHILE = 616,
-    BREAK = 617,
-    CONTINUE = 618,
-    DO = 619,
-    ELSE = 620,
-    FOR = 621,
-    IF = 622,
-    DISCARD = 623,
-    RETURN = 624,
-    SWITCH = 625,
-    CASE = 626,
-    DEFAULT = 627,
-    UNIFORM = 628,
-    SHARED = 629,
-    BUFFER = 630,
-    FLAT = 631,
-    SMOOTH = 632,
-    LAYOUT = 633,
-    DOUBLECONSTANT = 634,
-    INT16CONSTANT = 635,
-    UINT16CONSTANT = 636,
-    FLOAT16CONSTANT = 637,
-    INT32CONSTANT = 638,
-    UINT32CONSTANT = 639,
-    INT64CONSTANT = 640,
-    UINT64CONSTANT = 641,
-    SUBROUTINE = 642,
-    DEMOTE = 643,
-    PAYLOADNV = 644,
-    PAYLOADINNV = 645,
-    HITATTRNV = 646,
-    CALLDATANV = 647,
-    CALLDATAINNV = 648,
-    PAYLOADEXT = 649,
-    PAYLOADINEXT = 650,
-    HITATTREXT = 651,
-    CALLDATAEXT = 652,
-    CALLDATAINEXT = 653,
-    PATCH = 654,
-    SAMPLE = 655,
-    NONUNIFORM = 656,
-    COHERENT = 657,
-    VOLATILE = 658,
-    RESTRICT = 659,
-    READONLY = 660,
-    WRITEONLY = 661,
-    DEVICECOHERENT = 662,
-    QUEUEFAMILYCOHERENT = 663,
-    WORKGROUPCOHERENT = 664,
-    SUBGROUPCOHERENT = 665,
-    NONPRIVATE = 666,
-    SHADERCALLCOHERENT = 667,
-    NOPERSPECTIVE = 668,
-    EXPLICITINTERPAMD = 669,
-    PERVERTEXNV = 670,
-    PERPRIMITIVENV = 671,
-    PERVIEWNV = 672,
-    PERTASKNV = 673,
-    PRECISE = 674
-  };
-#endif
-
-/* Value type.  */
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
-union YYSTYPE
+#include "glslang_tab.cpp.h"
+/* Symbol kind.  */
+enum yysymbol_kind_t
 {
-#line 97 "glslang.y" /* yacc.c:355  */
-
-    struct {
-        glslang::TSourceLoc loc;
-        union {
-            glslang::TString *string;
-            int i;
-            unsigned int u;
-            long long i64;
-            unsigned long long u64;
-            bool b;
-            double d;
-        };
-        glslang::TSymbol* symbol;
-    } lex;
-    struct {
-        glslang::TSourceLoc loc;
-        glslang::TOperator op;
-        union {
-            TIntermNode* intermNode;
-            glslang::TIntermNodePair nodePair;
-            glslang::TIntermTyped* intermTypedNode;
-            glslang::TAttributes* attributes;
-        };
-        union {
-            glslang::TPublicType type;
-            glslang::TFunction* function;
-            glslang::TParameter param;
-            glslang::TTypeLoc typeLine;
-            glslang::TTypeList* typeList;
-            glslang::TArraySizes* arraySizes;
-            glslang::TIdentifierList* identifierList;
-        };
-        glslang::TArraySizes* typeParameters;
-    } interm;
-
-#line 588 "glslang_tab.cpp" /* yacc.c:355  */
+  YYSYMBOL_YYEMPTY = -2,
+  YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
+  YYSYMBOL_YYerror = 1,                    /* error  */
+  YYSYMBOL_YYUNDEF = 2,                    /* "invalid token"  */
+  YYSYMBOL_CONST = 3,                      /* CONST  */
+  YYSYMBOL_BOOL = 4,                       /* BOOL  */
+  YYSYMBOL_INT = 5,                        /* INT  */
+  YYSYMBOL_UINT = 6,                       /* UINT  */
+  YYSYMBOL_FLOAT = 7,                      /* FLOAT  */
+  YYSYMBOL_BVEC2 = 8,                      /* BVEC2  */
+  YYSYMBOL_BVEC3 = 9,                      /* BVEC3  */
+  YYSYMBOL_BVEC4 = 10,                     /* BVEC4  */
+  YYSYMBOL_IVEC2 = 11,                     /* IVEC2  */
+  YYSYMBOL_IVEC3 = 12,                     /* IVEC3  */
+  YYSYMBOL_IVEC4 = 13,                     /* IVEC4  */
+  YYSYMBOL_UVEC2 = 14,                     /* UVEC2  */
+  YYSYMBOL_UVEC3 = 15,                     /* UVEC3  */
+  YYSYMBOL_UVEC4 = 16,                     /* UVEC4  */
+  YYSYMBOL_VEC2 = 17,                      /* VEC2  */
+  YYSYMBOL_VEC3 = 18,                      /* VEC3  */
+  YYSYMBOL_VEC4 = 19,                      /* VEC4  */
+  YYSYMBOL_MAT2 = 20,                      /* MAT2  */
+  YYSYMBOL_MAT3 = 21,                      /* MAT3  */
+  YYSYMBOL_MAT4 = 22,                      /* MAT4  */
+  YYSYMBOL_MAT2X2 = 23,                    /* MAT2X2  */
+  YYSYMBOL_MAT2X3 = 24,                    /* MAT2X3  */
+  YYSYMBOL_MAT2X4 = 25,                    /* MAT2X4  */
+  YYSYMBOL_MAT3X2 = 26,                    /* MAT3X2  */
+  YYSYMBOL_MAT3X3 = 27,                    /* MAT3X3  */
+  YYSYMBOL_MAT3X4 = 28,                    /* MAT3X4  */
+  YYSYMBOL_MAT4X2 = 29,                    /* MAT4X2  */
+  YYSYMBOL_MAT4X3 = 30,                    /* MAT4X3  */
+  YYSYMBOL_MAT4X4 = 31,                    /* MAT4X4  */
+  YYSYMBOL_SAMPLER2D = 32,                 /* SAMPLER2D  */
+  YYSYMBOL_SAMPLER3D = 33,                 /* SAMPLER3D  */
+  YYSYMBOL_SAMPLERCUBE = 34,               /* SAMPLERCUBE  */
+  YYSYMBOL_SAMPLER2DSHADOW = 35,           /* SAMPLER2DSHADOW  */
+  YYSYMBOL_SAMPLERCUBESHADOW = 36,         /* SAMPLERCUBESHADOW  */
+  YYSYMBOL_SAMPLER2DARRAY = 37,            /* SAMPLER2DARRAY  */
+  YYSYMBOL_SAMPLER2DARRAYSHADOW = 38,      /* SAMPLER2DARRAYSHADOW  */
+  YYSYMBOL_ISAMPLER2D = 39,                /* ISAMPLER2D  */
+  YYSYMBOL_ISAMPLER3D = 40,                /* ISAMPLER3D  */
+  YYSYMBOL_ISAMPLERCUBE = 41,              /* ISAMPLERCUBE  */
+  YYSYMBOL_ISAMPLER2DARRAY = 42,           /* ISAMPLER2DARRAY  */
+  YYSYMBOL_USAMPLER2D = 43,                /* USAMPLER2D  */
+  YYSYMBOL_USAMPLER3D = 44,                /* USAMPLER3D  */
+  YYSYMBOL_USAMPLERCUBE = 45,              /* USAMPLERCUBE  */
+  YYSYMBOL_USAMPLER2DARRAY = 46,           /* USAMPLER2DARRAY  */
+  YYSYMBOL_SAMPLER = 47,                   /* SAMPLER  */
+  YYSYMBOL_SAMPLERSHADOW = 48,             /* SAMPLERSHADOW  */
+  YYSYMBOL_TEXTURE2D = 49,                 /* TEXTURE2D  */
+  YYSYMBOL_TEXTURE3D = 50,                 /* TEXTURE3D  */
+  YYSYMBOL_TEXTURECUBE = 51,               /* TEXTURECUBE  */
+  YYSYMBOL_TEXTURE2DARRAY = 52,            /* TEXTURE2DARRAY  */
+  YYSYMBOL_ITEXTURE2D = 53,                /* ITEXTURE2D  */
+  YYSYMBOL_ITEXTURE3D = 54,                /* ITEXTURE3D  */
+  YYSYMBOL_ITEXTURECUBE = 55,              /* ITEXTURECUBE  */
+  YYSYMBOL_ITEXTURE2DARRAY = 56,           /* ITEXTURE2DARRAY  */
+  YYSYMBOL_UTEXTURE2D = 57,                /* UTEXTURE2D  */
+  YYSYMBOL_UTEXTURE3D = 58,                /* UTEXTURE3D  */
+  YYSYMBOL_UTEXTURECUBE = 59,              /* UTEXTURECUBE  */
+  YYSYMBOL_UTEXTURE2DARRAY = 60,           /* UTEXTURE2DARRAY  */
+  YYSYMBOL_ATTRIBUTE = 61,                 /* ATTRIBUTE  */
+  YYSYMBOL_VARYING = 62,                   /* VARYING  */
+  YYSYMBOL_FLOAT16_T = 63,                 /* FLOAT16_T  */
+  YYSYMBOL_FLOAT32_T = 64,                 /* FLOAT32_T  */
+  YYSYMBOL_DOUBLE = 65,                    /* DOUBLE  */
+  YYSYMBOL_FLOAT64_T = 66,                 /* FLOAT64_T  */
+  YYSYMBOL_INT64_T = 67,                   /* INT64_T  */
+  YYSYMBOL_UINT64_T = 68,                  /* UINT64_T  */
+  YYSYMBOL_INT32_T = 69,                   /* INT32_T  */
+  YYSYMBOL_UINT32_T = 70,                  /* UINT32_T  */
+  YYSYMBOL_INT16_T = 71,                   /* INT16_T  */
+  YYSYMBOL_UINT16_T = 72,                  /* UINT16_T  */
+  YYSYMBOL_INT8_T = 73,                    /* INT8_T  */
+  YYSYMBOL_UINT8_T = 74,                   /* UINT8_T  */
+  YYSYMBOL_I64VEC2 = 75,                   /* I64VEC2  */
+  YYSYMBOL_I64VEC3 = 76,                   /* I64VEC3  */
+  YYSYMBOL_I64VEC4 = 77,                   /* I64VEC4  */
+  YYSYMBOL_U64VEC2 = 78,                   /* U64VEC2  */
+  YYSYMBOL_U64VEC3 = 79,                   /* U64VEC3  */
+  YYSYMBOL_U64VEC4 = 80,                   /* U64VEC4  */
+  YYSYMBOL_I32VEC2 = 81,                   /* I32VEC2  */
+  YYSYMBOL_I32VEC3 = 82,                   /* I32VEC3  */
+  YYSYMBOL_I32VEC4 = 83,                   /* I32VEC4  */
+  YYSYMBOL_U32VEC2 = 84,                   /* U32VEC2  */
+  YYSYMBOL_U32VEC3 = 85,                   /* U32VEC3  */
+  YYSYMBOL_U32VEC4 = 86,                   /* U32VEC4  */
+  YYSYMBOL_I16VEC2 = 87,                   /* I16VEC2  */
+  YYSYMBOL_I16VEC3 = 88,                   /* I16VEC3  */
+  YYSYMBOL_I16VEC4 = 89,                   /* I16VEC4  */
+  YYSYMBOL_U16VEC2 = 90,                   /* U16VEC2  */
+  YYSYMBOL_U16VEC3 = 91,                   /* U16VEC3  */
+  YYSYMBOL_U16VEC4 = 92,                   /* U16VEC4  */
+  YYSYMBOL_I8VEC2 = 93,                    /* I8VEC2  */
+  YYSYMBOL_I8VEC3 = 94,                    /* I8VEC3  */
+  YYSYMBOL_I8VEC4 = 95,                    /* I8VEC4  */
+  YYSYMBOL_U8VEC2 = 96,                    /* U8VEC2  */
+  YYSYMBOL_U8VEC3 = 97,                    /* U8VEC3  */
+  YYSYMBOL_U8VEC4 = 98,                    /* U8VEC4  */
+  YYSYMBOL_DVEC2 = 99,                     /* DVEC2  */
+  YYSYMBOL_DVEC3 = 100,                    /* DVEC3  */
+  YYSYMBOL_DVEC4 = 101,                    /* DVEC4  */
+  YYSYMBOL_DMAT2 = 102,                    /* DMAT2  */
+  YYSYMBOL_DMAT3 = 103,                    /* DMAT3  */
+  YYSYMBOL_DMAT4 = 104,                    /* DMAT4  */
+  YYSYMBOL_F16VEC2 = 105,                  /* F16VEC2  */
+  YYSYMBOL_F16VEC3 = 106,                  /* F16VEC3  */
+  YYSYMBOL_F16VEC4 = 107,                  /* F16VEC4  */
+  YYSYMBOL_F16MAT2 = 108,                  /* F16MAT2  */
+  YYSYMBOL_F16MAT3 = 109,                  /* F16MAT3  */
+  YYSYMBOL_F16MAT4 = 110,                  /* F16MAT4  */
+  YYSYMBOL_F32VEC2 = 111,                  /* F32VEC2  */
+  YYSYMBOL_F32VEC3 = 112,                  /* F32VEC3  */
+  YYSYMBOL_F32VEC4 = 113,                  /* F32VEC4  */
+  YYSYMBOL_F32MAT2 = 114,                  /* F32MAT2  */
+  YYSYMBOL_F32MAT3 = 115,                  /* F32MAT3  */
+  YYSYMBOL_F32MAT4 = 116,                  /* F32MAT4  */
+  YYSYMBOL_F64VEC2 = 117,                  /* F64VEC2  */
+  YYSYMBOL_F64VEC3 = 118,                  /* F64VEC3  */
+  YYSYMBOL_F64VEC4 = 119,                  /* F64VEC4  */
+  YYSYMBOL_F64MAT2 = 120,                  /* F64MAT2  */
+  YYSYMBOL_F64MAT3 = 121,                  /* F64MAT3  */
+  YYSYMBOL_F64MAT4 = 122,                  /* F64MAT4  */
+  YYSYMBOL_DMAT2X2 = 123,                  /* DMAT2X2  */
+  YYSYMBOL_DMAT2X3 = 124,                  /* DMAT2X3  */
+  YYSYMBOL_DMAT2X4 = 125,                  /* DMAT2X4  */
+  YYSYMBOL_DMAT3X2 = 126,                  /* DMAT3X2  */
+  YYSYMBOL_DMAT3X3 = 127,                  /* DMAT3X3  */
+  YYSYMBOL_DMAT3X4 = 128,                  /* DMAT3X4  */
+  YYSYMBOL_DMAT4X2 = 129,                  /* DMAT4X2  */
+  YYSYMBOL_DMAT4X3 = 130,                  /* DMAT4X3  */
+  YYSYMBOL_DMAT4X4 = 131,                  /* DMAT4X4  */
+  YYSYMBOL_F16MAT2X2 = 132,                /* F16MAT2X2  */
+  YYSYMBOL_F16MAT2X3 = 133,                /* F16MAT2X3  */
+  YYSYMBOL_F16MAT2X4 = 134,                /* F16MAT2X4  */
+  YYSYMBOL_F16MAT3X2 = 135,                /* F16MAT3X2  */
+  YYSYMBOL_F16MAT3X3 = 136,                /* F16MAT3X3  */
+  YYSYMBOL_F16MAT3X4 = 137,                /* F16MAT3X4  */
+  YYSYMBOL_F16MAT4X2 = 138,                /* F16MAT4X2  */
+  YYSYMBOL_F16MAT4X3 = 139,                /* F16MAT4X3  */
+  YYSYMBOL_F16MAT4X4 = 140,                /* F16MAT4X4  */
+  YYSYMBOL_F32MAT2X2 = 141,                /* F32MAT2X2  */
+  YYSYMBOL_F32MAT2X3 = 142,                /* F32MAT2X3  */
+  YYSYMBOL_F32MAT2X4 = 143,                /* F32MAT2X4  */
+  YYSYMBOL_F32MAT3X2 = 144,                /* F32MAT3X2  */
+  YYSYMBOL_F32MAT3X3 = 145,                /* F32MAT3X3  */
+  YYSYMBOL_F32MAT3X4 = 146,                /* F32MAT3X4  */
+  YYSYMBOL_F32MAT4X2 = 147,                /* F32MAT4X2  */
+  YYSYMBOL_F32MAT4X3 = 148,                /* F32MAT4X3  */
+  YYSYMBOL_F32MAT4X4 = 149,                /* F32MAT4X4  */
+  YYSYMBOL_F64MAT2X2 = 150,                /* F64MAT2X2  */
+  YYSYMBOL_F64MAT2X3 = 151,                /* F64MAT2X3  */
+  YYSYMBOL_F64MAT2X4 = 152,                /* F64MAT2X4  */
+  YYSYMBOL_F64MAT3X2 = 153,                /* F64MAT3X2  */
+  YYSYMBOL_F64MAT3X3 = 154,                /* F64MAT3X3  */
+  YYSYMBOL_F64MAT3X4 = 155,                /* F64MAT3X4  */
+  YYSYMBOL_F64MAT4X2 = 156,                /* F64MAT4X2  */
+  YYSYMBOL_F64MAT4X3 = 157,                /* F64MAT4X3  */
+  YYSYMBOL_F64MAT4X4 = 158,                /* F64MAT4X4  */
+  YYSYMBOL_ATOMIC_UINT = 159,              /* ATOMIC_UINT  */
+  YYSYMBOL_ACCSTRUCTNV = 160,              /* ACCSTRUCTNV  */
+  YYSYMBOL_ACCSTRUCTEXT = 161,             /* ACCSTRUCTEXT  */
+  YYSYMBOL_RAYQUERYEXT = 162,              /* RAYQUERYEXT  */
+  YYSYMBOL_FCOOPMATNV = 163,               /* FCOOPMATNV  */
+  YYSYMBOL_ICOOPMATNV = 164,               /* ICOOPMATNV  */
+  YYSYMBOL_UCOOPMATNV = 165,               /* UCOOPMATNV  */
+  YYSYMBOL_SAMPLERCUBEARRAY = 166,         /* SAMPLERCUBEARRAY  */
+  YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 167,   /* SAMPLERCUBEARRAYSHADOW  */
+  YYSYMBOL_ISAMPLERCUBEARRAY = 168,        /* ISAMPLERCUBEARRAY  */
+  YYSYMBOL_USAMPLERCUBEARRAY = 169,        /* USAMPLERCUBEARRAY  */
+  YYSYMBOL_SAMPLER1D = 170,                /* SAMPLER1D  */
+  YYSYMBOL_SAMPLER1DARRAY = 171,           /* SAMPLER1DARRAY  */
+  YYSYMBOL_SAMPLER1DARRAYSHADOW = 172,     /* SAMPLER1DARRAYSHADOW  */
+  YYSYMBOL_ISAMPLER1D = 173,               /* ISAMPLER1D  */
+  YYSYMBOL_SAMPLER1DSHADOW = 174,          /* SAMPLER1DSHADOW  */
+  YYSYMBOL_SAMPLER2DRECT = 175,            /* SAMPLER2DRECT  */
+  YYSYMBOL_SAMPLER2DRECTSHADOW = 176,      /* SAMPLER2DRECTSHADOW  */
+  YYSYMBOL_ISAMPLER2DRECT = 177,           /* ISAMPLER2DRECT  */
+  YYSYMBOL_USAMPLER2DRECT = 178,           /* USAMPLER2DRECT  */
+  YYSYMBOL_SAMPLERBUFFER = 179,            /* SAMPLERBUFFER  */
+  YYSYMBOL_ISAMPLERBUFFER = 180,           /* ISAMPLERBUFFER  */
+  YYSYMBOL_USAMPLERBUFFER = 181,           /* USAMPLERBUFFER  */
+  YYSYMBOL_SAMPLER2DMS = 182,              /* SAMPLER2DMS  */
+  YYSYMBOL_ISAMPLER2DMS = 183,             /* ISAMPLER2DMS  */
+  YYSYMBOL_USAMPLER2DMS = 184,             /* USAMPLER2DMS  */
+  YYSYMBOL_SAMPLER2DMSARRAY = 185,         /* SAMPLER2DMSARRAY  */
+  YYSYMBOL_ISAMPLER2DMSARRAY = 186,        /* ISAMPLER2DMSARRAY  */
+  YYSYMBOL_USAMPLER2DMSARRAY = 187,        /* USAMPLER2DMSARRAY  */
+  YYSYMBOL_SAMPLEREXTERNALOES = 188,       /* SAMPLEREXTERNALOES  */
+  YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 189,  /* SAMPLEREXTERNAL2DY2YEXT  */
+  YYSYMBOL_ISAMPLER1DARRAY = 190,          /* ISAMPLER1DARRAY  */
+  YYSYMBOL_USAMPLER1D = 191,               /* USAMPLER1D  */
+  YYSYMBOL_USAMPLER1DARRAY = 192,          /* USAMPLER1DARRAY  */
+  YYSYMBOL_F16SAMPLER1D = 193,             /* F16SAMPLER1D  */
+  YYSYMBOL_F16SAMPLER2D = 194,             /* F16SAMPLER2D  */
+  YYSYMBOL_F16SAMPLER3D = 195,             /* F16SAMPLER3D  */
+  YYSYMBOL_F16SAMPLER2DRECT = 196,         /* F16SAMPLER2DRECT  */
+  YYSYMBOL_F16SAMPLERCUBE = 197,           /* F16SAMPLERCUBE  */
+  YYSYMBOL_F16SAMPLER1DARRAY = 198,        /* F16SAMPLER1DARRAY  */
+  YYSYMBOL_F16SAMPLER2DARRAY = 199,        /* F16SAMPLER2DARRAY  */
+  YYSYMBOL_F16SAMPLERCUBEARRAY = 200,      /* F16SAMPLERCUBEARRAY  */
+  YYSYMBOL_F16SAMPLERBUFFER = 201,         /* F16SAMPLERBUFFER  */
+  YYSYMBOL_F16SAMPLER2DMS = 202,           /* F16SAMPLER2DMS  */
+  YYSYMBOL_F16SAMPLER2DMSARRAY = 203,      /* F16SAMPLER2DMSARRAY  */
+  YYSYMBOL_F16SAMPLER1DSHADOW = 204,       /* F16SAMPLER1DSHADOW  */
+  YYSYMBOL_F16SAMPLER2DSHADOW = 205,       /* F16SAMPLER2DSHADOW  */
+  YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 206,  /* F16SAMPLER1DARRAYSHADOW  */
+  YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 207,  /* F16SAMPLER2DARRAYSHADOW  */
+  YYSYMBOL_F16SAMPLER2DRECTSHADOW = 208,   /* F16SAMPLER2DRECTSHADOW  */
+  YYSYMBOL_F16SAMPLERCUBESHADOW = 209,     /* F16SAMPLERCUBESHADOW  */
+  YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 210, /* F16SAMPLERCUBEARRAYSHADOW  */
+  YYSYMBOL_IMAGE1D = 211,                  /* IMAGE1D  */
+  YYSYMBOL_IIMAGE1D = 212,                 /* IIMAGE1D  */
+  YYSYMBOL_UIMAGE1D = 213,                 /* UIMAGE1D  */
+  YYSYMBOL_IMAGE2D = 214,                  /* IMAGE2D  */
+  YYSYMBOL_IIMAGE2D = 215,                 /* IIMAGE2D  */
+  YYSYMBOL_UIMAGE2D = 216,                 /* UIMAGE2D  */
+  YYSYMBOL_IMAGE3D = 217,                  /* IMAGE3D  */
+  YYSYMBOL_IIMAGE3D = 218,                 /* IIMAGE3D  */
+  YYSYMBOL_UIMAGE3D = 219,                 /* UIMAGE3D  */
+  YYSYMBOL_IMAGE2DRECT = 220,              /* IMAGE2DRECT  */
+  YYSYMBOL_IIMAGE2DRECT = 221,             /* IIMAGE2DRECT  */
+  YYSYMBOL_UIMAGE2DRECT = 222,             /* UIMAGE2DRECT  */
+  YYSYMBOL_IMAGECUBE = 223,                /* IMAGECUBE  */
+  YYSYMBOL_IIMAGECUBE = 224,               /* IIMAGECUBE  */
+  YYSYMBOL_UIMAGECUBE = 225,               /* UIMAGECUBE  */
+  YYSYMBOL_IMAGEBUFFER = 226,              /* IMAGEBUFFER  */
+  YYSYMBOL_IIMAGEBUFFER = 227,             /* IIMAGEBUFFER  */
+  YYSYMBOL_UIMAGEBUFFER = 228,             /* UIMAGEBUFFER  */
+  YYSYMBOL_IMAGE1DARRAY = 229,             /* IMAGE1DARRAY  */
+  YYSYMBOL_IIMAGE1DARRAY = 230,            /* IIMAGE1DARRAY  */
+  YYSYMBOL_UIMAGE1DARRAY = 231,            /* UIMAGE1DARRAY  */
+  YYSYMBOL_IMAGE2DARRAY = 232,             /* IMAGE2DARRAY  */
+  YYSYMBOL_IIMAGE2DARRAY = 233,            /* IIMAGE2DARRAY  */
+  YYSYMBOL_UIMAGE2DARRAY = 234,            /* UIMAGE2DARRAY  */
+  YYSYMBOL_IMAGECUBEARRAY = 235,           /* IMAGECUBEARRAY  */
+  YYSYMBOL_IIMAGECUBEARRAY = 236,          /* IIMAGECUBEARRAY  */
+  YYSYMBOL_UIMAGECUBEARRAY = 237,          /* UIMAGECUBEARRAY  */
+  YYSYMBOL_IMAGE2DMS = 238,                /* IMAGE2DMS  */
+  YYSYMBOL_IIMAGE2DMS = 239,               /* IIMAGE2DMS  */
+  YYSYMBOL_UIMAGE2DMS = 240,               /* UIMAGE2DMS  */
+  YYSYMBOL_IMAGE2DMSARRAY = 241,           /* IMAGE2DMSARRAY  */
+  YYSYMBOL_IIMAGE2DMSARRAY = 242,          /* IIMAGE2DMSARRAY  */
+  YYSYMBOL_UIMAGE2DMSARRAY = 243,          /* UIMAGE2DMSARRAY  */
+  YYSYMBOL_F16IMAGE1D = 244,               /* F16IMAGE1D  */
+  YYSYMBOL_F16IMAGE2D = 245,               /* F16IMAGE2D  */
+  YYSYMBOL_F16IMAGE3D = 246,               /* F16IMAGE3D  */
+  YYSYMBOL_F16IMAGE2DRECT = 247,           /* F16IMAGE2DRECT  */
+  YYSYMBOL_F16IMAGECUBE = 248,             /* F16IMAGECUBE  */
+  YYSYMBOL_F16IMAGE1DARRAY = 249,          /* F16IMAGE1DARRAY  */
+  YYSYMBOL_F16IMAGE2DARRAY = 250,          /* F16IMAGE2DARRAY  */
+  YYSYMBOL_F16IMAGECUBEARRAY = 251,        /* F16IMAGECUBEARRAY  */
+  YYSYMBOL_F16IMAGEBUFFER = 252,           /* F16IMAGEBUFFER  */
+  YYSYMBOL_F16IMAGE2DMS = 253,             /* F16IMAGE2DMS  */
+  YYSYMBOL_F16IMAGE2DMSARRAY = 254,        /* F16IMAGE2DMSARRAY  */
+  YYSYMBOL_I64IMAGE1D = 255,               /* I64IMAGE1D  */
+  YYSYMBOL_U64IMAGE1D = 256,               /* U64IMAGE1D  */
+  YYSYMBOL_I64IMAGE2D = 257,               /* I64IMAGE2D  */
+  YYSYMBOL_U64IMAGE2D = 258,               /* U64IMAGE2D  */
+  YYSYMBOL_I64IMAGE3D = 259,               /* I64IMAGE3D  */
+  YYSYMBOL_U64IMAGE3D = 260,               /* U64IMAGE3D  */
+  YYSYMBOL_I64IMAGE2DRECT = 261,           /* I64IMAGE2DRECT  */
+  YYSYMBOL_U64IMAGE2DRECT = 262,           /* U64IMAGE2DRECT  */
+  YYSYMBOL_I64IMAGECUBE = 263,             /* I64IMAGECUBE  */
+  YYSYMBOL_U64IMAGECUBE = 264,             /* U64IMAGECUBE  */
+  YYSYMBOL_I64IMAGEBUFFER = 265,           /* I64IMAGEBUFFER  */
+  YYSYMBOL_U64IMAGEBUFFER = 266,           /* U64IMAGEBUFFER  */
+  YYSYMBOL_I64IMAGE1DARRAY = 267,          /* I64IMAGE1DARRAY  */
+  YYSYMBOL_U64IMAGE1DARRAY = 268,          /* U64IMAGE1DARRAY  */
+  YYSYMBOL_I64IMAGE2DARRAY = 269,          /* I64IMAGE2DARRAY  */
+  YYSYMBOL_U64IMAGE2DARRAY = 270,          /* U64IMAGE2DARRAY  */
+  YYSYMBOL_I64IMAGECUBEARRAY = 271,        /* I64IMAGECUBEARRAY  */
+  YYSYMBOL_U64IMAGECUBEARRAY = 272,        /* U64IMAGECUBEARRAY  */
+  YYSYMBOL_I64IMAGE2DMS = 273,             /* I64IMAGE2DMS  */
+  YYSYMBOL_U64IMAGE2DMS = 274,             /* U64IMAGE2DMS  */
+  YYSYMBOL_I64IMAGE2DMSARRAY = 275,        /* I64IMAGE2DMSARRAY  */
+  YYSYMBOL_U64IMAGE2DMSARRAY = 276,        /* U64IMAGE2DMSARRAY  */
+  YYSYMBOL_TEXTURECUBEARRAY = 277,         /* TEXTURECUBEARRAY  */
+  YYSYMBOL_ITEXTURECUBEARRAY = 278,        /* ITEXTURECUBEARRAY  */
+  YYSYMBOL_UTEXTURECUBEARRAY = 279,        /* UTEXTURECUBEARRAY  */
+  YYSYMBOL_TEXTURE1D = 280,                /* TEXTURE1D  */
+  YYSYMBOL_ITEXTURE1D = 281,               /* ITEXTURE1D  */
+  YYSYMBOL_UTEXTURE1D = 282,               /* UTEXTURE1D  */
+  YYSYMBOL_TEXTURE1DARRAY = 283,           /* TEXTURE1DARRAY  */
+  YYSYMBOL_ITEXTURE1DARRAY = 284,          /* ITEXTURE1DARRAY  */
+  YYSYMBOL_UTEXTURE1DARRAY = 285,          /* UTEXTURE1DARRAY  */
+  YYSYMBOL_TEXTURE2DRECT = 286,            /* TEXTURE2DRECT  */
+  YYSYMBOL_ITEXTURE2DRECT = 287,           /* ITEXTURE2DRECT  */
+  YYSYMBOL_UTEXTURE2DRECT = 288,           /* UTEXTURE2DRECT  */
+  YYSYMBOL_TEXTUREBUFFER = 289,            /* TEXTUREBUFFER  */
+  YYSYMBOL_ITEXTUREBUFFER = 290,           /* ITEXTUREBUFFER  */
+  YYSYMBOL_UTEXTUREBUFFER = 291,           /* UTEXTUREBUFFER  */
+  YYSYMBOL_TEXTURE2DMS = 292,              /* TEXTURE2DMS  */
+  YYSYMBOL_ITEXTURE2DMS = 293,             /* ITEXTURE2DMS  */
+  YYSYMBOL_UTEXTURE2DMS = 294,             /* UTEXTURE2DMS  */
+  YYSYMBOL_TEXTURE2DMSARRAY = 295,         /* TEXTURE2DMSARRAY  */
+  YYSYMBOL_ITEXTURE2DMSARRAY = 296,        /* ITEXTURE2DMSARRAY  */
+  YYSYMBOL_UTEXTURE2DMSARRAY = 297,        /* UTEXTURE2DMSARRAY  */
+  YYSYMBOL_F16TEXTURE1D = 298,             /* F16TEXTURE1D  */
+  YYSYMBOL_F16TEXTURE2D = 299,             /* F16TEXTURE2D  */
+  YYSYMBOL_F16TEXTURE3D = 300,             /* F16TEXTURE3D  */
+  YYSYMBOL_F16TEXTURE2DRECT = 301,         /* F16TEXTURE2DRECT  */
+  YYSYMBOL_F16TEXTURECUBE = 302,           /* F16TEXTURECUBE  */
+  YYSYMBOL_F16TEXTURE1DARRAY = 303,        /* F16TEXTURE1DARRAY  */
+  YYSYMBOL_F16TEXTURE2DARRAY = 304,        /* F16TEXTURE2DARRAY  */
+  YYSYMBOL_F16TEXTURECUBEARRAY = 305,      /* F16TEXTURECUBEARRAY  */
+  YYSYMBOL_F16TEXTUREBUFFER = 306,         /* F16TEXTUREBUFFER  */
+  YYSYMBOL_F16TEXTURE2DMS = 307,           /* F16TEXTURE2DMS  */
+  YYSYMBOL_F16TEXTURE2DMSARRAY = 308,      /* F16TEXTURE2DMSARRAY  */
+  YYSYMBOL_SUBPASSINPUT = 309,             /* SUBPASSINPUT  */
+  YYSYMBOL_SUBPASSINPUTMS = 310,           /* SUBPASSINPUTMS  */
+  YYSYMBOL_ISUBPASSINPUT = 311,            /* ISUBPASSINPUT  */
+  YYSYMBOL_ISUBPASSINPUTMS = 312,          /* ISUBPASSINPUTMS  */
+  YYSYMBOL_USUBPASSINPUT = 313,            /* USUBPASSINPUT  */
+  YYSYMBOL_USUBPASSINPUTMS = 314,          /* USUBPASSINPUTMS  */
+  YYSYMBOL_F16SUBPASSINPUT = 315,          /* F16SUBPASSINPUT  */
+  YYSYMBOL_F16SUBPASSINPUTMS = 316,        /* F16SUBPASSINPUTMS  */
+  YYSYMBOL_LEFT_OP = 317,                  /* LEFT_OP  */
+  YYSYMBOL_RIGHT_OP = 318,                 /* RIGHT_OP  */
+  YYSYMBOL_INC_OP = 319,                   /* INC_OP  */
+  YYSYMBOL_DEC_OP = 320,                   /* DEC_OP  */
+  YYSYMBOL_LE_OP = 321,                    /* LE_OP  */
+  YYSYMBOL_GE_OP = 322,                    /* GE_OP  */
+  YYSYMBOL_EQ_OP = 323,                    /* EQ_OP  */
+  YYSYMBOL_NE_OP = 324,                    /* NE_OP  */
+  YYSYMBOL_AND_OP = 325,                   /* AND_OP  */
+  YYSYMBOL_OR_OP = 326,                    /* OR_OP  */
+  YYSYMBOL_XOR_OP = 327,                   /* XOR_OP  */
+  YYSYMBOL_MUL_ASSIGN = 328,               /* MUL_ASSIGN  */
+  YYSYMBOL_DIV_ASSIGN = 329,               /* DIV_ASSIGN  */
+  YYSYMBOL_ADD_ASSIGN = 330,               /* ADD_ASSIGN  */
+  YYSYMBOL_MOD_ASSIGN = 331,               /* MOD_ASSIGN  */
+  YYSYMBOL_LEFT_ASSIGN = 332,              /* LEFT_ASSIGN  */
+  YYSYMBOL_RIGHT_ASSIGN = 333,             /* RIGHT_ASSIGN  */
+  YYSYMBOL_AND_ASSIGN = 334,               /* AND_ASSIGN  */
+  YYSYMBOL_XOR_ASSIGN = 335,               /* XOR_ASSIGN  */
+  YYSYMBOL_OR_ASSIGN = 336,                /* OR_ASSIGN  */
+  YYSYMBOL_SUB_ASSIGN = 337,               /* SUB_ASSIGN  */
+  YYSYMBOL_STRING_LITERAL = 338,           /* STRING_LITERAL  */
+  YYSYMBOL_LEFT_PAREN = 339,               /* LEFT_PAREN  */
+  YYSYMBOL_RIGHT_PAREN = 340,              /* RIGHT_PAREN  */
+  YYSYMBOL_LEFT_BRACKET = 341,             /* LEFT_BRACKET  */
+  YYSYMBOL_RIGHT_BRACKET = 342,            /* RIGHT_BRACKET  */
+  YYSYMBOL_LEFT_BRACE = 343,               /* LEFT_BRACE  */
+  YYSYMBOL_RIGHT_BRACE = 344,              /* RIGHT_BRACE  */
+  YYSYMBOL_DOT = 345,                      /* DOT  */
+  YYSYMBOL_COMMA = 346,                    /* COMMA  */
+  YYSYMBOL_COLON = 347,                    /* COLON  */
+  YYSYMBOL_EQUAL = 348,                    /* EQUAL  */
+  YYSYMBOL_SEMICOLON = 349,                /* SEMICOLON  */
+  YYSYMBOL_BANG = 350,                     /* BANG  */
+  YYSYMBOL_DASH = 351,                     /* DASH  */
+  YYSYMBOL_TILDE = 352,                    /* TILDE  */
+  YYSYMBOL_PLUS = 353,                     /* PLUS  */
+  YYSYMBOL_STAR = 354,                     /* STAR  */
+  YYSYMBOL_SLASH = 355,                    /* SLASH  */
+  YYSYMBOL_PERCENT = 356,                  /* PERCENT  */
+  YYSYMBOL_LEFT_ANGLE = 357,               /* LEFT_ANGLE  */
+  YYSYMBOL_RIGHT_ANGLE = 358,              /* RIGHT_ANGLE  */
+  YYSYMBOL_VERTICAL_BAR = 359,             /* VERTICAL_BAR  */
+  YYSYMBOL_CARET = 360,                    /* CARET  */
+  YYSYMBOL_AMPERSAND = 361,                /* AMPERSAND  */
+  YYSYMBOL_QUESTION = 362,                 /* QUESTION  */
+  YYSYMBOL_INVARIANT = 363,                /* INVARIANT  */
+  YYSYMBOL_HIGH_PRECISION = 364,           /* HIGH_PRECISION  */
+  YYSYMBOL_MEDIUM_PRECISION = 365,         /* MEDIUM_PRECISION  */
+  YYSYMBOL_LOW_PRECISION = 366,            /* LOW_PRECISION  */
+  YYSYMBOL_PRECISION = 367,                /* PRECISION  */
+  YYSYMBOL_PACKED = 368,                   /* PACKED  */
+  YYSYMBOL_RESOURCE = 369,                 /* RESOURCE  */
+  YYSYMBOL_SUPERP = 370,                   /* SUPERP  */
+  YYSYMBOL_FLOATCONSTANT = 371,            /* FLOATCONSTANT  */
+  YYSYMBOL_INTCONSTANT = 372,              /* INTCONSTANT  */
+  YYSYMBOL_UINTCONSTANT = 373,             /* UINTCONSTANT  */
+  YYSYMBOL_BOOLCONSTANT = 374,             /* BOOLCONSTANT  */
+  YYSYMBOL_IDENTIFIER = 375,               /* IDENTIFIER  */
+  YYSYMBOL_TYPE_NAME = 376,                /* TYPE_NAME  */
+  YYSYMBOL_CENTROID = 377,                 /* CENTROID  */
+  YYSYMBOL_IN = 378,                       /* IN  */
+  YYSYMBOL_OUT = 379,                      /* OUT  */
+  YYSYMBOL_INOUT = 380,                    /* INOUT  */
+  YYSYMBOL_STRUCT = 381,                   /* STRUCT  */
+  YYSYMBOL_VOID = 382,                     /* VOID  */
+  YYSYMBOL_WHILE = 383,                    /* WHILE  */
+  YYSYMBOL_BREAK = 384,                    /* BREAK  */
+  YYSYMBOL_CONTINUE = 385,                 /* CONTINUE  */
+  YYSYMBOL_DO = 386,                       /* DO  */
+  YYSYMBOL_ELSE = 387,                     /* ELSE  */
+  YYSYMBOL_FOR = 388,                      /* FOR  */
+  YYSYMBOL_IF = 389,                       /* IF  */
+  YYSYMBOL_DISCARD = 390,                  /* DISCARD  */
+  YYSYMBOL_RETURN = 391,                   /* RETURN  */
+  YYSYMBOL_SWITCH = 392,                   /* SWITCH  */
+  YYSYMBOL_CASE = 393,                     /* CASE  */
+  YYSYMBOL_DEFAULT = 394,                  /* DEFAULT  */
+  YYSYMBOL_TERMINATE_INVOCATION = 395,     /* TERMINATE_INVOCATION  */
+  YYSYMBOL_TERMINATE_RAY = 396,            /* TERMINATE_RAY  */
+  YYSYMBOL_IGNORE_INTERSECTION = 397,      /* IGNORE_INTERSECTION  */
+  YYSYMBOL_UNIFORM = 398,                  /* UNIFORM  */
+  YYSYMBOL_SHARED = 399,                   /* SHARED  */
+  YYSYMBOL_BUFFER = 400,                   /* BUFFER  */
+  YYSYMBOL_FLAT = 401,                     /* FLAT  */
+  YYSYMBOL_SMOOTH = 402,                   /* SMOOTH  */
+  YYSYMBOL_LAYOUT = 403,                   /* LAYOUT  */
+  YYSYMBOL_DOUBLECONSTANT = 404,           /* DOUBLECONSTANT  */
+  YYSYMBOL_INT16CONSTANT = 405,            /* INT16CONSTANT  */
+  YYSYMBOL_UINT16CONSTANT = 406,           /* UINT16CONSTANT  */
+  YYSYMBOL_FLOAT16CONSTANT = 407,          /* FLOAT16CONSTANT  */
+  YYSYMBOL_INT32CONSTANT = 408,            /* INT32CONSTANT  */
+  YYSYMBOL_UINT32CONSTANT = 409,           /* UINT32CONSTANT  */
+  YYSYMBOL_INT64CONSTANT = 410,            /* INT64CONSTANT  */
+  YYSYMBOL_UINT64CONSTANT = 411,           /* UINT64CONSTANT  */
+  YYSYMBOL_SUBROUTINE = 412,               /* SUBROUTINE  */
+  YYSYMBOL_DEMOTE = 413,                   /* DEMOTE  */
+  YYSYMBOL_PAYLOADNV = 414,                /* PAYLOADNV  */
+  YYSYMBOL_PAYLOADINNV = 415,              /* PAYLOADINNV  */
+  YYSYMBOL_HITATTRNV = 416,                /* HITATTRNV  */
+  YYSYMBOL_CALLDATANV = 417,               /* CALLDATANV  */
+  YYSYMBOL_CALLDATAINNV = 418,             /* CALLDATAINNV  */
+  YYSYMBOL_PAYLOADEXT = 419,               /* PAYLOADEXT  */
+  YYSYMBOL_PAYLOADINEXT = 420,             /* PAYLOADINEXT  */
+  YYSYMBOL_HITATTREXT = 421,               /* HITATTREXT  */
+  YYSYMBOL_CALLDATAEXT = 422,              /* CALLDATAEXT  */
+  YYSYMBOL_CALLDATAINEXT = 423,            /* CALLDATAINEXT  */
+  YYSYMBOL_PATCH = 424,                    /* PATCH  */
+  YYSYMBOL_SAMPLE = 425,                   /* SAMPLE  */
+  YYSYMBOL_NONUNIFORM = 426,               /* NONUNIFORM  */
+  YYSYMBOL_COHERENT = 427,                 /* COHERENT  */
+  YYSYMBOL_VOLATILE = 428,                 /* VOLATILE  */
+  YYSYMBOL_RESTRICT = 429,                 /* RESTRICT  */
+  YYSYMBOL_READONLY = 430,                 /* READONLY  */
+  YYSYMBOL_WRITEONLY = 431,                /* WRITEONLY  */
+  YYSYMBOL_DEVICECOHERENT = 432,           /* DEVICECOHERENT  */
+  YYSYMBOL_QUEUEFAMILYCOHERENT = 433,      /* QUEUEFAMILYCOHERENT  */
+  YYSYMBOL_WORKGROUPCOHERENT = 434,        /* WORKGROUPCOHERENT  */
+  YYSYMBOL_SUBGROUPCOHERENT = 435,         /* SUBGROUPCOHERENT  */
+  YYSYMBOL_NONPRIVATE = 436,               /* NONPRIVATE  */
+  YYSYMBOL_SHADERCALLCOHERENT = 437,       /* SHADERCALLCOHERENT  */
+  YYSYMBOL_NOPERSPECTIVE = 438,            /* NOPERSPECTIVE  */
+  YYSYMBOL_EXPLICITINTERPAMD = 439,        /* EXPLICITINTERPAMD  */
+  YYSYMBOL_PERVERTEXNV = 440,              /* PERVERTEXNV  */
+  YYSYMBOL_PERPRIMITIVENV = 441,           /* PERPRIMITIVENV  */
+  YYSYMBOL_PERVIEWNV = 442,                /* PERVIEWNV  */
+  YYSYMBOL_PERTASKNV = 443,                /* PERTASKNV  */
+  YYSYMBOL_PRECISE = 444,                  /* PRECISE  */
+  YYSYMBOL_YYACCEPT = 445,                 /* $accept  */
+  YYSYMBOL_variable_identifier = 446,      /* variable_identifier  */
+  YYSYMBOL_primary_expression = 447,       /* primary_expression  */
+  YYSYMBOL_postfix_expression = 448,       /* postfix_expression  */
+  YYSYMBOL_integer_expression = 449,       /* integer_expression  */
+  YYSYMBOL_function_call = 450,            /* function_call  */
+  YYSYMBOL_function_call_or_method = 451,  /* function_call_or_method  */
+  YYSYMBOL_function_call_generic = 452,    /* function_call_generic  */
+  YYSYMBOL_function_call_header_no_parameters = 453, /* function_call_header_no_parameters  */
+  YYSYMBOL_function_call_header_with_parameters = 454, /* function_call_header_with_parameters  */
+  YYSYMBOL_function_call_header = 455,     /* function_call_header  */
+  YYSYMBOL_function_identifier = 456,      /* function_identifier  */
+  YYSYMBOL_unary_expression = 457,         /* unary_expression  */
+  YYSYMBOL_unary_operator = 458,           /* unary_operator  */
+  YYSYMBOL_multiplicative_expression = 459, /* multiplicative_expression  */
+  YYSYMBOL_additive_expression = 460,      /* additive_expression  */
+  YYSYMBOL_shift_expression = 461,         /* shift_expression  */
+  YYSYMBOL_relational_expression = 462,    /* relational_expression  */
+  YYSYMBOL_equality_expression = 463,      /* equality_expression  */
+  YYSYMBOL_and_expression = 464,           /* and_expression  */
+  YYSYMBOL_exclusive_or_expression = 465,  /* exclusive_or_expression  */
+  YYSYMBOL_inclusive_or_expression = 466,  /* inclusive_or_expression  */
+  YYSYMBOL_logical_and_expression = 467,   /* logical_and_expression  */
+  YYSYMBOL_logical_xor_expression = 468,   /* logical_xor_expression  */
+  YYSYMBOL_logical_or_expression = 469,    /* logical_or_expression  */
+  YYSYMBOL_conditional_expression = 470,   /* conditional_expression  */
+  YYSYMBOL_471_1 = 471,                    /* $@1  */
+  YYSYMBOL_assignment_expression = 472,    /* assignment_expression  */
+  YYSYMBOL_assignment_operator = 473,      /* assignment_operator  */
+  YYSYMBOL_expression = 474,               /* expression  */
+  YYSYMBOL_constant_expression = 475,      /* constant_expression  */
+  YYSYMBOL_declaration = 476,              /* declaration  */
+  YYSYMBOL_block_structure = 477,          /* block_structure  */
+  YYSYMBOL_478_2 = 478,                    /* $@2  */
+  YYSYMBOL_identifier_list = 479,          /* identifier_list  */
+  YYSYMBOL_function_prototype = 480,       /* function_prototype  */
+  YYSYMBOL_function_declarator = 481,      /* function_declarator  */
+  YYSYMBOL_function_header_with_parameters = 482, /* function_header_with_parameters  */
+  YYSYMBOL_function_header = 483,          /* function_header  */
+  YYSYMBOL_parameter_declarator = 484,     /* parameter_declarator  */
+  YYSYMBOL_parameter_declaration = 485,    /* parameter_declaration  */
+  YYSYMBOL_parameter_type_specifier = 486, /* parameter_type_specifier  */
+  YYSYMBOL_init_declarator_list = 487,     /* init_declarator_list  */
+  YYSYMBOL_single_declaration = 488,       /* single_declaration  */
+  YYSYMBOL_fully_specified_type = 489,     /* fully_specified_type  */
+  YYSYMBOL_invariant_qualifier = 490,      /* invariant_qualifier  */
+  YYSYMBOL_interpolation_qualifier = 491,  /* interpolation_qualifier  */
+  YYSYMBOL_layout_qualifier = 492,         /* layout_qualifier  */
+  YYSYMBOL_layout_qualifier_id_list = 493, /* layout_qualifier_id_list  */
+  YYSYMBOL_layout_qualifier_id = 494,      /* layout_qualifier_id  */
+  YYSYMBOL_precise_qualifier = 495,        /* precise_qualifier  */
+  YYSYMBOL_type_qualifier = 496,           /* type_qualifier  */
+  YYSYMBOL_single_type_qualifier = 497,    /* single_type_qualifier  */
+  YYSYMBOL_storage_qualifier = 498,        /* storage_qualifier  */
+  YYSYMBOL_non_uniform_qualifier = 499,    /* non_uniform_qualifier  */
+  YYSYMBOL_type_name_list = 500,           /* type_name_list  */
+  YYSYMBOL_type_specifier = 501,           /* type_specifier  */
+  YYSYMBOL_array_specifier = 502,          /* array_specifier  */
+  YYSYMBOL_type_parameter_specifier_opt = 503, /* type_parameter_specifier_opt  */
+  YYSYMBOL_type_parameter_specifier = 504, /* type_parameter_specifier  */
+  YYSYMBOL_type_parameter_specifier_list = 505, /* type_parameter_specifier_list  */
+  YYSYMBOL_type_specifier_nonarray = 506,  /* type_specifier_nonarray  */
+  YYSYMBOL_precision_qualifier = 507,      /* precision_qualifier  */
+  YYSYMBOL_struct_specifier = 508,         /* struct_specifier  */
+  YYSYMBOL_509_3 = 509,                    /* $@3  */
+  YYSYMBOL_510_4 = 510,                    /* $@4  */
+  YYSYMBOL_struct_declaration_list = 511,  /* struct_declaration_list  */
+  YYSYMBOL_struct_declaration = 512,       /* struct_declaration  */
+  YYSYMBOL_struct_declarator_list = 513,   /* struct_declarator_list  */
+  YYSYMBOL_struct_declarator = 514,        /* struct_declarator  */
+  YYSYMBOL_initializer = 515,              /* initializer  */
+  YYSYMBOL_initializer_list = 516,         /* initializer_list  */
+  YYSYMBOL_declaration_statement = 517,    /* declaration_statement  */
+  YYSYMBOL_statement = 518,                /* statement  */
+  YYSYMBOL_simple_statement = 519,         /* simple_statement  */
+  YYSYMBOL_demote_statement = 520,         /* demote_statement  */
+  YYSYMBOL_compound_statement = 521,       /* compound_statement  */
+  YYSYMBOL_522_5 = 522,                    /* $@5  */
+  YYSYMBOL_523_6 = 523,                    /* $@6  */
+  YYSYMBOL_statement_no_new_scope = 524,   /* statement_no_new_scope  */
+  YYSYMBOL_statement_scoped = 525,         /* statement_scoped  */
+  YYSYMBOL_526_7 = 526,                    /* $@7  */
+  YYSYMBOL_527_8 = 527,                    /* $@8  */
+  YYSYMBOL_compound_statement_no_new_scope = 528, /* compound_statement_no_new_scope  */
+  YYSYMBOL_statement_list = 529,           /* statement_list  */
+  YYSYMBOL_expression_statement = 530,     /* expression_statement  */
+  YYSYMBOL_selection_statement = 531,      /* selection_statement  */
+  YYSYMBOL_selection_statement_nonattributed = 532, /* selection_statement_nonattributed  */
+  YYSYMBOL_selection_rest_statement = 533, /* selection_rest_statement  */
+  YYSYMBOL_condition = 534,                /* condition  */
+  YYSYMBOL_switch_statement = 535,         /* switch_statement  */
+  YYSYMBOL_switch_statement_nonattributed = 536, /* switch_statement_nonattributed  */
+  YYSYMBOL_537_9 = 537,                    /* $@9  */
+  YYSYMBOL_switch_statement_list = 538,    /* switch_statement_list  */
+  YYSYMBOL_case_label = 539,               /* case_label  */
+  YYSYMBOL_iteration_statement = 540,      /* iteration_statement  */
+  YYSYMBOL_iteration_statement_nonattributed = 541, /* iteration_statement_nonattributed  */
+  YYSYMBOL_542_10 = 542,                   /* $@10  */
+  YYSYMBOL_543_11 = 543,                   /* $@11  */
+  YYSYMBOL_544_12 = 544,                   /* $@12  */
+  YYSYMBOL_for_init_statement = 545,       /* for_init_statement  */
+  YYSYMBOL_conditionopt = 546,             /* conditionopt  */
+  YYSYMBOL_for_rest_statement = 547,       /* for_rest_statement  */
+  YYSYMBOL_jump_statement = 548,           /* jump_statement  */
+  YYSYMBOL_translation_unit = 549,         /* translation_unit  */
+  YYSYMBOL_external_declaration = 550,     /* external_declaration  */
+  YYSYMBOL_function_definition = 551,      /* function_definition  */
+  YYSYMBOL_552_13 = 552,                   /* $@13  */
+  YYSYMBOL_attribute = 553,                /* attribute  */
+  YYSYMBOL_attribute_list = 554,           /* attribute_list  */
+  YYSYMBOL_single_attribute = 555          /* single_attribute  */
 };
-
-typedef union YYSTYPE YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define YYSTYPE_IS_DECLARED 1
-#endif
+typedef enum yysymbol_kind_t yysymbol_kind_t;
 
 
-
-int yyparse (glslang::TParseContext* pParseContext);
-
-#endif /* !YY_YY_GLSLANG_TAB_CPP_H_INCLUDED  */
-
-/* Copy the second part of user declarations.  */
-#line 133 "glslang.y" /* yacc.c:358  */
+/* Second part of user prologue.  */
+#line 133 "MachineIndependent/glslang.y"
 
 
 /* windows only pragma */
@@ -615,34 +698,82 @@
 extern int yylex(YYSTYPE*, TParseContext&);
 
 
-#line 619 "glslang_tab.cpp" /* yacc.c:358  */
+#line 702 "MachineIndependent/glslang_tab.cpp"
+
 
 #ifdef short
 # undef short
 #endif
 
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+   <limits.h> and (if available) <stdint.h> are included
+   so that the code can choose integer types of a good width.  */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+#  include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+#  define YY_STDINT_H
+# endif
 #endif
 
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
+/* Narrow types that promote to a signed type and that can represent a
+   signed or unsigned integer of at least N bits.  In tables they can
+   save space and decrease cache pressure.  Promoting to a signed type
+   helps avoid bugs in integer arithmetic.  */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
 #else
 typedef signed char yytype_int8;
 #endif
 
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
 #else
-typedef unsigned short int yytype_uint16;
+typedef short yytype_int16;
 #endif
 
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+       && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
 #else
-typedef short int yytype_int16;
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+       && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+#  define YYPTRDIFF_T __PTRDIFF_TYPE__
+#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+#  ifndef ptrdiff_t
+#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  endif
+#  define YYPTRDIFF_T ptrdiff_t
+#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+#  define YYPTRDIFF_T long
+#  define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
 #endif
 
 #ifndef YYSIZE_T
@@ -650,15 +781,28 @@
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
-#  define YYSIZE_T unsigned int
+#  define YYSIZE_T unsigned
 # endif
 #endif
 
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+#define YYSIZE_MAXIMUM                                  \
+  YY_CAST (YYPTRDIFF_T,                                 \
+           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
+            ? YYPTRDIFF_MAXIMUM                         \
+            : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations.  */
+typedef int yy_state_fast_t;
 
 #ifndef YY_
 # if defined YYENABLE_NLS && YYENABLE_NLS
@@ -672,30 +816,20 @@
 # endif
 #endif
 
-#ifndef YY_ATTRIBUTE
-# if (defined __GNUC__                                               \
-      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
-     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+#  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
-#  define YY_ATTRIBUTE(Spec) /* empty */
+#  define YY_ATTRIBUTE_PURE
 # endif
 #endif
 
-#ifndef YY_ATTRIBUTE_PURE
-# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
-#endif
-
 #ifndef YY_ATTRIBUTE_UNUSED
-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
-     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-#  define _Noreturn __declspec (noreturn)
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+#  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
 # else
-#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+#  define YY_ATTRIBUTE_UNUSED
 # endif
 #endif
 
@@ -706,13 +840,13 @@
 # define YYUSE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
-    _Pragma ("GCC diagnostic push") \
-    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                            \
+    _Pragma ("GCC diagnostic push")                                     \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
     _Pragma ("GCC diagnostic pop")
 #else
 # define YY_INITIAL_VALUE(Value) Value
@@ -725,8 +859,22 @@
 # define YY_INITIAL_VALUE(Value) /* Nothing. */
 #endif
 
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN                          \
+    _Pragma ("GCC diagnostic push")                            \
+    _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END            \
+    _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
 
-#if ! defined yyoverflow || YYERROR_VERBOSE
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if 1
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -791,8 +939,7 @@
 #   endif
 #  endif
 # endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
+#endif /* 1 */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
@@ -801,17 +948,17 @@
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  yytype_int16 yyss_alloc;
+  yy_state_t yyss_alloc;
   YYSTYPE yyvs_alloc;
 };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+     ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
 # define YYCOPY_NEEDED 1
@@ -824,11 +971,11 @@
 # define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
     do                                                                  \
       {                                                                 \
-        YYSIZE_T yynewbytes;                                            \
+        YYPTRDIFF_T yynewbytes;                                         \
         YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
         Stack = &yyptr->Stack_alloc;                                    \
-        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-        yyptr += yynewbytes / sizeof (*yyptr);                          \
+        yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / YYSIZEOF (*yyptr);                        \
       }                                                                 \
     while (0)
 
@@ -840,12 +987,12 @@
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(Dst, Src, Count) \
-      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+      __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
 #  else
 #   define YYCOPY(Dst, Src, Count)              \
       do                                        \
         {                                       \
-          YYSIZE_T yyi;                         \
+          YYPTRDIFF_T yyi;                      \
           for (yyi = 0; yyi < (Count); yyi++)   \
             (Dst)[yyi] = (Src)[yyi];            \
         }                                       \
@@ -855,30 +1002,33 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  394
+#define YYFINAL  416
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   9550
+#define YYLAST   10537
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  420
+#define YYNTOKENS  445
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  111
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  591
+#define YYNRULES  617
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  736
+#define YYNSTATES  765
 
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-   by yylex, with out-of-bounds checking.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   674
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   699
 
-#define YYTRANSLATE(YYX)                                                \
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
+#define YYTRANSLATE(YYX)                                \
+  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
+   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
+   : YYSYMBOL_YYUNDEF)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-   as returned by yylex, without out-of-bounds checking.  */
-static const yytype_uint16 yytranslate[] =
+   as returned by yylex.  */
+static const yytype_int16 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -947,120 +1097,131 @@
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
      395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
      405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-static const yytype_uint16 yyrline[] =
+static const yytype_int16 yyrline[] =
 {
-       0,   357,   357,   363,   366,   371,   374,   377,   381,   385,
-     388,   392,   396,   400,   404,   408,   412,   418,   426,   429,
-     432,   435,   438,   443,   451,   458,   465,   471,   475,   482,
-     485,   491,   498,   508,   516,   521,   549,   558,   564,   568,
-     572,   592,   593,   594,   595,   601,   602,   607,   612,   621,
-     622,   627,   635,   636,   642,   651,   652,   657,   662,   667,
-     675,   676,   685,   697,   698,   707,   708,   717,   718,   727,
-     728,   736,   737,   745,   746,   754,   755,   755,   773,   774,
-     790,   794,   798,   802,   807,   811,   815,   819,   823,   827,
-     831,   838,   841,   852,   859,   864,   869,   876,   880,   884,
-     888,   893,   898,   907,   907,   918,   922,   929,   936,   939,
-     946,   954,   974,   997,  1012,  1037,  1048,  1058,  1068,  1078,
-    1087,  1090,  1094,  1098,  1103,  1111,  1118,  1123,  1128,  1133,
-    1142,  1152,  1179,  1188,  1195,  1203,  1210,  1217,  1225,  1235,
-    1242,  1253,  1259,  1262,  1269,  1273,  1277,  1286,  1296,  1299,
-    1310,  1313,  1316,  1320,  1324,  1329,  1333,  1340,  1344,  1349,
-    1355,  1361,  1368,  1373,  1381,  1387,  1399,  1413,  1419,  1424,
-    1432,  1440,  1448,  1456,  1464,  1472,  1480,  1488,  1495,  1502,
-    1506,  1511,  1516,  1521,  1526,  1531,  1536,  1540,  1544,  1548,
-    1552,  1558,  1569,  1576,  1579,  1588,  1593,  1603,  1608,  1616,
-    1620,  1630,  1633,  1639,  1645,  1652,  1662,  1666,  1670,  1674,
-    1679,  1683,  1688,  1693,  1698,  1703,  1708,  1713,  1718,  1723,
-    1728,  1734,  1740,  1746,  1751,  1756,  1761,  1766,  1771,  1776,
-    1781,  1786,  1791,  1796,  1801,  1807,  1814,  1819,  1824,  1829,
-    1834,  1839,  1844,  1849,  1854,  1859,  1864,  1869,  1877,  1885,
-    1893,  1899,  1905,  1911,  1917,  1923,  1929,  1935,  1941,  1947,
-    1953,  1959,  1965,  1971,  1977,  1983,  1989,  1995,  2001,  2007,
-    2013,  2019,  2025,  2031,  2037,  2043,  2049,  2055,  2061,  2067,
-    2073,  2079,  2085,  2091,  2099,  2107,  2115,  2123,  2131,  2139,
-    2147,  2155,  2163,  2171,  2179,  2187,  2193,  2199,  2205,  2211,
-    2217,  2223,  2229,  2235,  2241,  2247,  2253,  2259,  2265,  2271,
-    2277,  2283,  2289,  2295,  2301,  2307,  2313,  2319,  2325,  2331,
-    2337,  2343,  2349,  2355,  2361,  2367,  2373,  2379,  2385,  2391,
-    2397,  2403,  2407,  2411,  2415,  2420,  2426,  2431,  2436,  2441,
-    2446,  2451,  2456,  2462,  2467,  2472,  2477,  2482,  2487,  2493,
-    2499,  2505,  2511,  2517,  2523,  2529,  2535,  2541,  2547,  2553,
-    2559,  2565,  2571,  2576,  2581,  2586,  2591,  2596,  2601,  2607,
-    2612,  2617,  2622,  2627,  2632,  2637,  2642,  2648,  2653,  2658,
-    2663,  2668,  2673,  2678,  2683,  2688,  2693,  2698,  2703,  2708,
-    2713,  2718,  2724,  2729,  2734,  2740,  2746,  2751,  2756,  2761,
-    2767,  2772,  2777,  2782,  2788,  2793,  2798,  2803,  2809,  2814,
-    2819,  2824,  2830,  2836,  2842,  2848,  2853,  2859,  2865,  2871,
-    2876,  2881,  2886,  2891,  2896,  2902,  2907,  2912,  2917,  2923,
-    2928,  2933,  2938,  2944,  2949,  2954,  2959,  2965,  2970,  2975,
-    2980,  2986,  2991,  2996,  3001,  3007,  3012,  3017,  3022,  3028,
-    3033,  3038,  3043,  3049,  3054,  3059,  3064,  3070,  3075,  3080,
-    3085,  3091,  3096,  3101,  3106,  3112,  3117,  3122,  3127,  3133,
-    3138,  3143,  3148,  3154,  3159,  3164,  3169,  3175,  3180,  3185,
-    3190,  3196,  3201,  3206,  3212,  3218,  3224,  3230,  3237,  3244,
-    3250,  3256,  3262,  3268,  3274,  3280,  3287,  3292,  3308,  3313,
-    3318,  3326,  3326,  3337,  3337,  3347,  3350,  3363,  3385,  3412,
-    3416,  3422,  3427,  3438,  3442,  3448,  3459,  3462,  3469,  3473,
-    3474,  3480,  3481,  3482,  3483,  3484,  3485,  3486,  3488,  3494,
-    3503,  3504,  3508,  3504,  3520,  3521,  3525,  3525,  3532,  3532,
-    3546,  3549,  3557,  3565,  3576,  3577,  3581,  3585,  3592,  3599,
-    3603,  3611,  3615,  3628,  3632,  3639,  3639,  3659,  3662,  3668,
-    3680,  3692,  3696,  3703,  3703,  3718,  3718,  3734,  3734,  3755,
-    3758,  3764,  3767,  3773,  3777,  3784,  3789,  3794,  3801,  3804,
-    3813,  3817,  3826,  3829,  3833,  3842,  3842,  3865,  3871,  3874,
-    3879,  3882
+       0,   371,   371,   377,   380,   385,   388,   391,   395,   399,
+     402,   406,   410,   414,   418,   422,   426,   432,   440,   443,
+     446,   449,   452,   457,   465,   472,   479,   485,   489,   496,
+     499,   505,   512,   522,   530,   535,   563,   572,   578,   582,
+     586,   606,   607,   608,   609,   615,   616,   621,   626,   635,
+     636,   641,   649,   650,   656,   665,   666,   671,   676,   681,
+     689,   690,   699,   711,   712,   721,   722,   731,   732,   741,
+     742,   750,   751,   759,   760,   768,   769,   769,   787,   788,
+     804,   808,   812,   816,   821,   825,   829,   833,   837,   841,
+     845,   852,   855,   866,   873,   878,   883,   890,   894,   898,
+     902,   907,   912,   921,   921,   932,   936,   943,   950,   953,
+     960,   968,   988,  1011,  1026,  1051,  1062,  1072,  1082,  1092,
+    1101,  1104,  1108,  1112,  1117,  1125,  1132,  1137,  1142,  1147,
+    1156,  1166,  1193,  1202,  1209,  1217,  1224,  1231,  1239,  1249,
+    1256,  1267,  1273,  1276,  1283,  1287,  1291,  1300,  1310,  1313,
+    1324,  1327,  1330,  1334,  1338,  1343,  1347,  1354,  1358,  1363,
+    1369,  1375,  1382,  1387,  1395,  1401,  1413,  1427,  1433,  1438,
+    1446,  1454,  1462,  1470,  1478,  1486,  1494,  1502,  1509,  1516,
+    1520,  1525,  1530,  1535,  1540,  1545,  1550,  1554,  1558,  1562,
+    1566,  1572,  1583,  1590,  1593,  1602,  1607,  1617,  1622,  1630,
+    1634,  1644,  1647,  1653,  1659,  1666,  1676,  1680,  1684,  1688,
+    1693,  1697,  1702,  1707,  1712,  1717,  1722,  1727,  1732,  1737,
+    1742,  1748,  1754,  1760,  1765,  1770,  1775,  1780,  1785,  1790,
+    1795,  1800,  1805,  1810,  1815,  1821,  1828,  1833,  1838,  1843,
+    1848,  1853,  1858,  1863,  1868,  1873,  1878,  1883,  1891,  1899,
+    1907,  1913,  1919,  1925,  1931,  1937,  1943,  1949,  1955,  1961,
+    1967,  1973,  1979,  1985,  1991,  1997,  2003,  2009,  2015,  2021,
+    2027,  2033,  2039,  2045,  2051,  2057,  2063,  2069,  2075,  2081,
+    2087,  2093,  2099,  2105,  2113,  2121,  2129,  2137,  2145,  2153,
+    2161,  2169,  2177,  2185,  2193,  2201,  2207,  2213,  2219,  2225,
+    2231,  2237,  2243,  2249,  2255,  2261,  2267,  2273,  2279,  2285,
+    2291,  2297,  2303,  2309,  2315,  2321,  2327,  2333,  2339,  2345,
+    2351,  2357,  2363,  2369,  2375,  2381,  2387,  2393,  2399,  2405,
+    2411,  2417,  2421,  2425,  2429,  2434,  2440,  2445,  2450,  2455,
+    2460,  2465,  2470,  2476,  2481,  2486,  2491,  2496,  2501,  2507,
+    2513,  2519,  2525,  2531,  2537,  2543,  2549,  2555,  2561,  2567,
+    2573,  2579,  2585,  2590,  2595,  2600,  2605,  2610,  2615,  2621,
+    2626,  2631,  2636,  2641,  2646,  2651,  2656,  2662,  2667,  2672,
+    2677,  2682,  2687,  2692,  2697,  2702,  2707,  2712,  2717,  2722,
+    2727,  2732,  2738,  2743,  2748,  2754,  2760,  2765,  2770,  2775,
+    2781,  2786,  2791,  2796,  2802,  2807,  2812,  2817,  2823,  2828,
+    2833,  2838,  2844,  2850,  2856,  2862,  2867,  2873,  2879,  2885,
+    2890,  2895,  2900,  2905,  2910,  2916,  2921,  2926,  2931,  2937,
+    2942,  2947,  2952,  2958,  2963,  2968,  2973,  2979,  2984,  2989,
+    2994,  3000,  3005,  3010,  3015,  3021,  3026,  3031,  3036,  3042,
+    3047,  3052,  3057,  3063,  3068,  3073,  3078,  3084,  3089,  3094,
+    3099,  3105,  3110,  3115,  3120,  3126,  3131,  3136,  3141,  3147,
+    3152,  3157,  3162,  3168,  3173,  3178,  3183,  3189,  3194,  3199,
+    3204,  3210,  3215,  3220,  3225,  3230,  3235,  3240,  3245,  3250,
+    3255,  3260,  3265,  3270,  3275,  3280,  3285,  3290,  3295,  3300,
+    3305,  3310,  3315,  3320,  3325,  3330,  3336,  3342,  3348,  3354,
+    3361,  3368,  3374,  3380,  3386,  3392,  3398,  3404,  3411,  3416,
+    3432,  3437,  3442,  3450,  3450,  3461,  3461,  3471,  3474,  3487,
+    3509,  3536,  3540,  3546,  3551,  3562,  3566,  3572,  3578,  3589,
+    3592,  3599,  3603,  3604,  3610,  3611,  3612,  3613,  3614,  3615,
+    3616,  3618,  3624,  3633,  3634,  3638,  3634,  3650,  3651,  3655,
+    3655,  3662,  3662,  3676,  3679,  3687,  3695,  3706,  3707,  3711,
+    3715,  3722,  3729,  3733,  3741,  3745,  3758,  3762,  3769,  3769,
+    3789,  3792,  3798,  3810,  3822,  3826,  3833,  3833,  3848,  3848,
+    3864,  3864,  3885,  3888,  3894,  3897,  3903,  3907,  3914,  3919,
+    3924,  3931,  3934,  3938,  3943,  3947,  3957,  3961,  3970,  3973,
+    3977,  3986,  3986,  4028,  4034,  4037,  4042,  4045
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || 1
+/** Accessing symbol of state STATE.  */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if 1
+/* The user-facing name of the symbol whose (internal) number is
+   YYSYMBOL.  No bounds checking.  */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "CONST", "BOOL", "INT", "UINT", "FLOAT",
-  "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4", "UVEC2", "UVEC3",
-  "UVEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3", "MAT4", "MAT2X2",
-  "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4", "MAT4X2", "MAT4X3",
-  "MAT4X4", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE", "SAMPLER2DSHADOW",
-  "SAMPLERCUBESHADOW", "SAMPLER2DARRAY", "SAMPLER2DARRAYSHADOW",
-  "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE", "ISAMPLER2DARRAY",
-  "USAMPLER2D", "USAMPLER3D", "USAMPLERCUBE", "USAMPLER2DARRAY", "SAMPLER",
-  "SAMPLERSHADOW", "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE",
-  "TEXTURE2DARRAY", "ITEXTURE2D", "ITEXTURE3D", "ITEXTURECUBE",
-  "ITEXTURE2DARRAY", "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE",
-  "UTEXTURE2DARRAY", "ATTRIBUTE", "VARYING", "FLOAT16_T", "FLOAT32_T",
-  "DOUBLE", "FLOAT64_T", "INT64_T", "UINT64_T", "INT32_T", "UINT32_T",
-  "INT16_T", "UINT16_T", "INT8_T", "UINT8_T", "I64VEC2", "I64VEC3",
-  "I64VEC4", "U64VEC2", "U64VEC3", "U64VEC4", "I32VEC2", "I32VEC3",
-  "I32VEC4", "U32VEC2", "U32VEC3", "U32VEC4", "I16VEC2", "I16VEC3",
-  "I16VEC4", "U16VEC2", "U16VEC3", "U16VEC4", "I8VEC2", "I8VEC3", "I8VEC4",
-  "U8VEC2", "U8VEC3", "U8VEC4", "DVEC2", "DVEC3", "DVEC4", "DMAT2",
-  "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4", "F16MAT2", "F16MAT3",
-  "F16MAT4", "F32VEC2", "F32VEC3", "F32VEC4", "F32MAT2", "F32MAT3",
-  "F32MAT4", "F64VEC2", "F64VEC3", "F64VEC4", "F64MAT2", "F64MAT3",
-  "F64MAT4", "DMAT2X2", "DMAT2X3", "DMAT2X4", "DMAT3X2", "DMAT3X3",
-  "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4", "F16MAT2X2", "F16MAT2X3",
-  "F16MAT2X4", "F16MAT3X2", "F16MAT3X3", "F16MAT3X4", "F16MAT4X2",
-  "F16MAT4X3", "F16MAT4X4", "F32MAT2X2", "F32MAT2X3", "F32MAT2X4",
-  "F32MAT3X2", "F32MAT3X3", "F32MAT3X4", "F32MAT4X2", "F32MAT4X3",
-  "F32MAT4X4", "F64MAT2X2", "F64MAT2X3", "F64MAT2X4", "F64MAT3X2",
-  "F64MAT3X3", "F64MAT3X4", "F64MAT4X2", "F64MAT4X3", "F64MAT4X4",
-  "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT", "RAYQUERYEXT",
-  "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", "SAMPLERCUBEARRAY",
-  "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", "USAMPLERCUBEARRAY",
-  "SAMPLER1D", "SAMPLER1DARRAY", "SAMPLER1DARRAYSHADOW", "ISAMPLER1D",
-  "SAMPLER1DSHADOW", "SAMPLER2DRECT", "SAMPLER2DRECTSHADOW",
-  "ISAMPLER2DRECT", "USAMPLER2DRECT", "SAMPLERBUFFER", "ISAMPLERBUFFER",
-  "USAMPLERBUFFER", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS",
-  "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", "USAMPLER2DMSARRAY",
-  "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", "ISAMPLER1DARRAY",
-  "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", "F16SAMPLER2D",
-  "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE",
+  "\"end of file\"", "error", "\"invalid token\"", "CONST", "BOOL", "INT",
+  "UINT", "FLOAT", "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4",
+  "UVEC2", "UVEC3", "UVEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3",
+  "MAT4", "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4",
+  "MAT4X2", "MAT4X3", "MAT4X4", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE",
+  "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", "SAMPLER2DARRAY",
+  "SAMPLER2DARRAYSHADOW", "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE",
+  "ISAMPLER2DARRAY", "USAMPLER2D", "USAMPLER3D", "USAMPLERCUBE",
+  "USAMPLER2DARRAY", "SAMPLER", "SAMPLERSHADOW", "TEXTURE2D", "TEXTURE3D",
+  "TEXTURECUBE", "TEXTURE2DARRAY", "ITEXTURE2D", "ITEXTURE3D",
+  "ITEXTURECUBE", "ITEXTURE2DARRAY", "UTEXTURE2D", "UTEXTURE3D",
+  "UTEXTURECUBE", "UTEXTURE2DARRAY", "ATTRIBUTE", "VARYING", "FLOAT16_T",
+  "FLOAT32_T", "DOUBLE", "FLOAT64_T", "INT64_T", "UINT64_T", "INT32_T",
+  "UINT32_T", "INT16_T", "UINT16_T", "INT8_T", "UINT8_T", "I64VEC2",
+  "I64VEC3", "I64VEC4", "U64VEC2", "U64VEC3", "U64VEC4", "I32VEC2",
+  "I32VEC3", "I32VEC4", "U32VEC2", "U32VEC3", "U32VEC4", "I16VEC2",
+  "I16VEC3", "I16VEC4", "U16VEC2", "U16VEC3", "U16VEC4", "I8VEC2",
+  "I8VEC3", "I8VEC4", "U8VEC2", "U8VEC3", "U8VEC4", "DVEC2", "DVEC3",
+  "DVEC4", "DMAT2", "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4",
+  "F16MAT2", "F16MAT3", "F16MAT4", "F32VEC2", "F32VEC3", "F32VEC4",
+  "F32MAT2", "F32MAT3", "F32MAT4", "F64VEC2", "F64VEC3", "F64VEC4",
+  "F64MAT2", "F64MAT3", "F64MAT4", "DMAT2X2", "DMAT2X3", "DMAT2X4",
+  "DMAT3X2", "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4",
+  "F16MAT2X2", "F16MAT2X3", "F16MAT2X4", "F16MAT3X2", "F16MAT3X3",
+  "F16MAT3X4", "F16MAT4X2", "F16MAT4X3", "F16MAT4X4", "F32MAT2X2",
+  "F32MAT2X3", "F32MAT2X4", "F32MAT3X2", "F32MAT3X3", "F32MAT3X4",
+  "F32MAT4X2", "F32MAT4X3", "F32MAT4X4", "F64MAT2X2", "F64MAT2X3",
+  "F64MAT2X4", "F64MAT3X2", "F64MAT3X3", "F64MAT3X4", "F64MAT4X2",
+  "F64MAT4X3", "F64MAT4X4", "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT",
+  "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV",
+  "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY",
+  "USAMPLERCUBEARRAY", "SAMPLER1D", "SAMPLER1DARRAY",
+  "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", "SAMPLER1DSHADOW", "SAMPLER2DRECT",
+  "SAMPLER2DRECTSHADOW", "ISAMPLER2DRECT", "USAMPLER2DRECT",
+  "SAMPLERBUFFER", "ISAMPLERBUFFER", "USAMPLERBUFFER", "SAMPLER2DMS",
+  "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY",
+  "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT",
+  "ISAMPLER1DARRAY", "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D",
+  "F16SAMPLER2D", "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE",
   "F16SAMPLER1DARRAY", "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY",
   "F16SAMPLERBUFFER", "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY",
   "F16SAMPLER1DSHADOW", "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW",
@@ -1076,7 +1237,13 @@
   "F16IMAGE1D", "F16IMAGE2D", "F16IMAGE3D", "F16IMAGE2DRECT",
   "F16IMAGECUBE", "F16IMAGE1DARRAY", "F16IMAGE2DARRAY",
   "F16IMAGECUBEARRAY", "F16IMAGEBUFFER", "F16IMAGE2DMS",
-  "F16IMAGE2DMSARRAY", "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY",
+  "F16IMAGE2DMSARRAY", "I64IMAGE1D", "U64IMAGE1D", "I64IMAGE2D",
+  "U64IMAGE2D", "I64IMAGE3D", "U64IMAGE3D", "I64IMAGE2DRECT",
+  "U64IMAGE2DRECT", "I64IMAGECUBE", "U64IMAGECUBE", "I64IMAGEBUFFER",
+  "U64IMAGEBUFFER", "I64IMAGE1DARRAY", "U64IMAGE1DARRAY",
+  "I64IMAGE2DARRAY", "U64IMAGE2DARRAY", "I64IMAGECUBEARRAY",
+  "U64IMAGECUBEARRAY", "I64IMAGE2DMS", "U64IMAGE2DMS", "I64IMAGE2DMSARRAY",
+  "U64IMAGE2DMSARRAY", "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY",
   "UTEXTURECUBEARRAY", "TEXTURE1D", "ITEXTURE1D", "UTEXTURE1D",
   "TEXTURE1DARRAY", "ITEXTURE1DARRAY", "UTEXTURE1DARRAY", "TEXTURE2DRECT",
   "ITEXTURE2DRECT", "UTEXTURE2DRECT", "TEXTUREBUFFER", "ITEXTUREBUFFER",
@@ -1100,8 +1267,9 @@
   "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT",
   "IDENTIFIER", "TYPE_NAME", "CENTROID", "IN", "OUT", "INOUT", "STRUCT",
   "VOID", "WHILE", "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF",
-  "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "UNIFORM", "SHARED",
-  "BUFFER", "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT",
+  "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "TERMINATE_INVOCATION",
+  "TERMINATE_RAY", "IGNORE_INTERSECTION", "UNIFORM", "SHARED", "BUFFER",
+  "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT",
   "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT",
   "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", "DEMOTE", "PAYLOADNV",
   "PAYLOADINNV", "HITATTRNV", "CALLDATANV", "CALLDATAINNV", "PAYLOADEXT",
@@ -1151,12 +1319,18 @@
   "function_definition", "$@13", "attribute", "attribute_list",
   "single_attribute", YY_NULLPTR
 };
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+  return yytname[yysymbol];
+}
 #endif
 
-# ifdef YYPRINT
+#ifdef YYPRINT
 /* YYTOKNUM[NUM] -- (External) token number corresponding to the
    (internal) symbol number NUM (which must be that of a token).  */
-static const yytype_uint16 yytoknum[] =
+static const yytype_int16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -1199,104 +1373,110 @@
      635,   636,   637,   638,   639,   640,   641,   642,   643,   644,
      645,   646,   647,   648,   649,   650,   651,   652,   653,   654,
      655,   656,   657,   658,   659,   660,   661,   662,   663,   664,
-     665,   666,   667,   668,   669,   670,   671,   672,   673,   674
+     665,   666,   667,   668,   669,   670,   671,   672,   673,   674,
+     675,   676,   677,   678,   679,   680,   681,   682,   683,   684,
+     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
+     695,   696,   697,   698,   699
 };
-# endif
+#endif
 
-#define YYPACT_NINF -457
+#define YYPACT_NINF (-733)
 
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-457)))
+#define yypact_value_is_default(Yyn) \
+  ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF -537
+#define YYTABLE_NINF (-560)
 
-#define yytable_value_is_error(Yytable_value) \
+#define yytable_value_is_error(Yyn) \
   0
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    4075,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,   132,  -457,
-    -457,  -457,  -457,  -457,    -1,  -457,  -457,  -457,  -457,  -457,
-    -457,  -301,  -298,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,    11,  -249,    17,    30,  6160,
-      20,  -457,    28,  -457,  -457,  -457,  -457,  4492,  -457,  -457,
-    -457,  -457,    50,  -457,  -457,   739,  -457,  -457,    16,  -457,
-      81,   -29,    69,  -457,  -313,  -457,   111,  -457,  6160,  -457,
-    -457,  -457,  6160,   103,   106,  -457,  -314,  -457,    72,  -457,
-    -457,  8566,   142,  -457,  -457,  -457,   136,  6160,  -457,   144,
-    -457,    53,  -457,  -457,    76,  6974,  -457,  -312,  1156,  -457,
-    -457,  -457,  -457,   142,  -309,  -457,  7372,  -308,  -457,   119,
-    -457,    65,  8566,  8566,  -457,  8566,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,    36,  -457,  -457,  -457,   171,
-      85,  8964,   173,  -457,  8566,  -457,  -457,  -323,   174,  -457,
-    6160,   139,  4909,  -457,  6160,  8566,  -457,   -29,  -457,   141,
-    -457,  -457,   145,    99,    35,    26,    71,   156,   159,   161,
-     196,   195,    23,   181,  7770,  -457,   183,   182,  -457,  -457,
-     186,   179,   180,  -457,   191,   192,   187,  8168,   193,  8566,
-     188,   189,   127,  -457,  -457,    96,  -457,  -249,   200,   201,
-    -457,  -457,  -457,  -457,  -457,  1573,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,   -24,   174,  7372,    13,  7372,
-    -457,  -457,  7372,  6160,  -457,   166,  -457,  -457,  -457,    86,
-    -457,  -457,  8566,   168,  -457,  -457,  8566,   205,  -457,  -457,
-    -457,  8566,  -457,   139,   142,   124,  -457,  -457,  -457,  5326,
-    -457,  -457,  -457,  -457,  8566,  8566,  8566,  8566,  8566,  8566,
-    8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,  8566,
-    8566,  8566,  8566,  -457,  -457,  -457,   206,   172,  -457,  1990,
-    -457,  -457,  -457,  1990,  -457,  8566,  -457,  -457,   130,  8566,
-     125,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  8566,  8566,  -457,  -457,  -457,  -457,
-    -457,  -457,  -457,  7372,  -457,    94,  -457,  5743,  -457,  -457,
-     207,   204,  -457,  -457,  -457,   131,   174,   139,  -457,  -457,
-    -457,  -457,  -457,   145,   145,    99,    99,    35,    35,    35,
-      35,    26,    26,    71,   156,   159,   161,   196,   195,  8566,
-    -457,   212,    60,  -457,  1990,  3658,   169,  3241,    87,  -457,
-      89,  -457,  -457,  -457,  -457,  -457,  6576,  -457,  -457,  -457,
-    -457,   143,  8566,   211,   172,   210,   204,   184,  6160,   217,
-     219,  -457,  -457,  3658,   218,  -457,  -457,  -457,  8566,   220,
-    -457,  -457,  -457,   214,  2407,  8566,  -457,   216,   223,   185,
-     224,  2824,  -457,   225,  -457,  -457,  7372,  -457,  -457,  -457,
-      97,  8566,  2407,   218,  -457,  -457,  1990,  -457,   222,   204,
-    -457,  -457,  1990,   229,  -457,  -457
+    4304,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+     109,  -733,  -733,  -733,  -733,  -733,     3,  -733,  -733,  -733,
+    -733,  -733,  -733,  -322,  -261,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,    19,   101,   140,
+      79,  6514,    57,  -733,    96,  -733,  -733,  -733,  -733,  4746,
+    -733,  -733,  -733,  -733,   133,  -733,  -733,   768,  -733,  -733,
+      16,  -733,   151,   -32,   125,  -733,  -335,  -733,   158,  -733,
+    6514,  -733,  -733,  -733,  6514,   127,   128,  -733,    13,  -733,
+      72,  -733,  -733,  9493,   163,  -733,  -733,  -733,   156,  6514,
+    -733,   160,  -733,    20,  -733,  -733,    61,  7801,  -733,    10,
+    1210,  -733,  -733,  -733,  -733,   163,  -330,  -733,  8224,    14,
+    -733,   134,  -733,    88,  9493,  9493,  -733,  9493,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,    54,  -733,  -733,
+    -733,   166,    62,  9916,   171,  -733,  9493,  -733,  -733,  -343,
+     173,  -733,  6514,   137,  5188,  -733,  6514,  9493,  -733,   -32,
+    -733,   141,  -733,  -733,   122,    93,    39,    28,    41,   157,
+     159,   161,   192,   195,    21,   181,  8647,  -733,   183,   182,
+    -733,  -733,   186,   178,   179,  -733,   190,   191,   184,  9070,
+     196,  9493,   187,   188,   189,   194,   197,   131,  -733,  -733,
+      99,  -733,   101,   200,   205,  -733,  -733,  -733,  -733,  -733,
+    1652,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -376,   173,  8224,    36,  6955,  -733,  -733,  8224,  6514,  -733,
+     170,  -733,  -733,  -733,    71,  -733,  -733,  9493,   176,  -733,
+    -733,  9493,   208,  -733,  -733,  -733,  9493,  -733,   137,   163,
+     106,  -733,  -733,  -733,  5630,  -733,  -733,  -733,  -733,  9493,
+    9493,  9493,  9493,  9493,  9493,  9493,  9493,  9493,  9493,  9493,
+    9493,  9493,  9493,  9493,  9493,  9493,  9493,  9493,  -733,  -733,
+    -733,   210,   180,  -733,  2094,  -733,  -733,  -733,  2094,  -733,
+    9493,  -733,  -733,   108,  9493,    29,  -733,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  9493,  9493,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  8224,  -733,  -733,   139,  -733,  6072,  -733,  -733,   211,
+     185,  -733,  -733,  -733,   123,   173,   137,  -733,  -733,  -733,
+    -733,  -733,   122,   122,    93,    93,    39,    39,    39,    39,
+      28,    28,    41,   157,   159,   161,   192,   195,  9493,  -733,
+     215,    85,  -733,  2094,  3862,   153,  3420,    76,  -733,    80,
+    -733,  -733,  -733,  -733,  -733,  7378,  -733,  -733,  -733,  -733,
+      86,  9493,   214,   180,   216,   185,   193,  6514,   219,   222,
+    -733,  -733,  3862,   220,  -733,  -733,  -733,  9493,   224,  -733,
+    -733,  -733,   217,  2536,  9493,  -733,   213,   226,   199,   227,
+    2978,  -733,   228,  -733,  -733,  8224,  -733,  -733,  -733,    83,
+    9493,  2536,   220,  -733,  -733,  2094,  -733,   223,   185,  -733,
+    -733,  2094,   225,  -733,  -733
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
-static const yytype_uint16 yydefact[] =
+static const yytype_int16 yydefact[] =
 {
        0,   157,   210,   208,   209,   207,   214,   215,   216,   217,
      218,   219,   220,   221,   222,   211,   212,   213,   223,   224,
@@ -1314,98 +1494,101 @@
      298,   299,   300,   301,   302,   303,   304,   305,   306,   310,
      311,   312,   313,   314,   315,   316,   317,   318,   322,   323,
      324,   325,   326,   327,   328,   329,   330,   334,   331,   332,
-     333,   493,   494,   495,   346,   347,   370,   373,   335,   344,
+     333,   515,   516,   517,   346,   347,   370,   373,   335,   344,
      345,   361,   343,   392,   393,   396,   397,   398,   400,   401,
-     402,   404,   405,   406,   408,   409,   483,   484,   369,   371,
+     402,   404,   405,   406,   408,   409,   505,   506,   369,   371,
      372,   348,   349,   350,   394,   351,   355,   356,   359,   399,
      403,   407,   352,   353,   357,   358,   395,   354,   360,   439,
      441,   442,   443,   445,   446,   447,   449,   450,   451,   453,
      454,   455,   457,   458,   459,   461,   462,   463,   465,   466,
      467,   469,   470,   471,   473,   474,   475,   477,   478,   479,
      481,   482,   440,   444,   448,   452,   456,   464,   468,   472,
-     460,   476,   480,   374,   375,   376,   410,   419,   421,   415,
-     420,   422,   423,   425,   426,   427,   429,   430,   431,   433,
-     434,   435,   437,   438,   411,   412,   413,   424,   414,   416,
-     417,   418,   428,   432,   436,   485,   486,   489,   490,   491,
-     492,   487,   488,   584,   132,   498,   499,   500,     0,   497,
-     161,   159,   160,   158,     0,   206,   162,   163,   164,   134,
-     133,     0,   190,   171,   173,   169,   175,   177,   172,   174,
-     170,   176,   178,   167,   168,   192,   179,   186,   187,   188,
-     189,   180,   181,   182,   183,   184,   185,   135,   136,   137,
-     138,   139,   140,   147,   583,     0,   585,     0,   109,   108,
-       0,   120,   125,   154,   153,   151,   155,     0,   148,   150,
-     156,   130,   202,   152,   496,     0,   580,   582,     0,   503,
-       0,     0,     0,    97,     0,    94,     0,   107,     0,   116,
-     110,   118,     0,   119,     0,    95,   126,   100,     0,   149,
-     131,     0,   195,   201,     1,   581,     0,     0,   501,   144,
-     146,     0,   142,   193,     0,     0,    98,     0,     0,   586,
-     111,   115,   117,   113,   121,   112,     0,   127,   103,     0,
-     101,     0,     0,     0,     9,     0,    43,    42,    44,    41,
-       5,     6,     7,     8,     2,    16,    14,    15,    17,    10,
-      11,    12,    13,     3,    18,    37,    20,    25,    26,     0,
-       0,    30,     0,   204,     0,    36,    34,     0,   196,    96,
-       0,     0,     0,   505,     0,     0,   141,     0,   191,     0,
-     197,    45,    49,    52,    55,    60,    63,    65,    67,    69,
-      71,    73,    75,     0,     0,    99,     0,   531,   540,   544,
-       0,     0,     0,   565,     0,     0,     0,     0,     0,     0,
-       0,     0,    45,    78,    91,     0,   518,     0,   156,   130,
-     521,   542,   520,   528,   519,     0,   522,   523,   546,   524,
-     553,   525,   526,   561,   527,     0,   114,     0,   122,     0,
-     513,   129,     0,     0,   105,     0,   102,    38,    39,     0,
-      22,    23,     0,     0,    28,    27,     0,   206,    31,    33,
-      40,     0,   203,     0,   511,     0,   509,   504,   506,     0,
-      93,   145,   143,   194,     0,     0,     0,     0,     0,     0,
+     460,   476,   480,   483,   484,   485,   486,   487,   488,   489,
+     490,   491,   492,   493,   494,   495,   496,   497,   498,   499,
+     500,   501,   502,   503,   504,   374,   375,   376,   410,   419,
+     421,   415,   420,   422,   423,   425,   426,   427,   429,   430,
+     431,   433,   434,   435,   437,   438,   411,   412,   413,   424,
+     414,   416,   417,   418,   428,   432,   436,   507,   508,   511,
+     512,   513,   514,   509,   510,   610,   132,   520,   521,   522,
+       0,   519,   161,   159,   160,   158,     0,   206,   162,   163,
+     164,   134,   133,     0,   190,   171,   173,   169,   175,   177,
+     172,   174,   170,   176,   178,   167,   168,   192,   179,   186,
+     187,   188,   189,   180,   181,   182,   183,   184,   185,   135,
+     136,   137,   138,   139,   140,   147,   609,     0,   611,     0,
+     109,   108,     0,   120,   125,   154,   153,   151,   155,     0,
+     148,   150,   156,   130,   202,   152,   518,     0,   606,   608,
+       0,   525,     0,     0,     0,    97,     0,    94,     0,   107,
+       0,   116,   110,   118,     0,   119,     0,    95,   126,   100,
+       0,   149,   131,     0,   195,   201,     1,   607,     0,     0,
+     523,   144,   146,     0,   142,   193,     0,     0,    98,     0,
+       0,   612,   111,   115,   117,   113,   121,   112,     0,   127,
+     103,     0,   101,     0,     0,     0,     9,     0,    43,    42,
+      44,    41,     5,     6,     7,     8,     2,    16,    14,    15,
+      17,    10,    11,    12,    13,     3,    18,    37,    20,    25,
+      26,     0,     0,    30,     0,   204,     0,    36,    34,     0,
+     196,    96,     0,     0,     0,   527,     0,     0,   141,     0,
+     191,     0,   197,    45,    49,    52,    55,    60,    63,    65,
+      67,    69,    71,    73,    75,     0,     0,    99,     0,   554,
+     563,   567,     0,     0,     0,   588,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    45,    78,    91,
+       0,   541,     0,   156,   130,   544,   565,   543,   551,   542,
+       0,   545,   546,   569,   547,   576,   548,   549,   584,   550,
+       0,   114,     0,   122,     0,   535,   129,     0,     0,   105,
+       0,   102,    38,    39,     0,    22,    23,     0,     0,    28,
+      27,     0,   206,    31,    33,    40,     0,   203,     0,   533,
+       0,   531,   526,   528,     0,    93,   145,   143,   194,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    76,   198,   199,     0,     0,   530,     0,
-     563,   576,   575,     0,   567,     0,   579,   577,     0,     0,
-       0,   560,   529,    81,    82,    84,    83,    86,    87,    88,
-      89,    90,    85,    80,     0,     0,   545,   541,   543,   547,
-     554,   562,   124,     0,   516,     0,   128,     0,   106,     4,
-       0,    24,    21,    32,   205,     0,   512,     0,   507,   502,
-      46,    47,    48,    51,    50,    53,    54,    58,    59,    56,
-      57,    61,    62,    64,    66,    68,    70,    72,    74,     0,
-     200,   590,     0,   588,   532,     0,     0,     0,     0,   578,
-       0,   559,    79,    92,   123,   514,     0,   104,    19,   508,
-     510,     0,     0,     0,     0,     0,   551,     0,     0,     0,
-       0,   570,   569,   572,   538,   555,   515,   517,     0,     0,
-     587,   589,   533,     0,     0,     0,   571,     0,     0,   550,
-       0,     0,   548,     0,    77,   591,     0,   535,   564,   534,
-       0,   573,     0,   538,   537,   539,   557,   552,     0,   574,
-     568,   549,   558,     0,   566,   556
+       0,     0,     0,     0,     0,     0,     0,     0,    76,   198,
+     199,     0,     0,   553,     0,   586,   599,   598,     0,   590,
+       0,   602,   600,     0,     0,     0,   583,   603,   604,   605,
+     552,    81,    82,    84,    83,    86,    87,    88,    89,    90,
+      85,    80,     0,     0,   568,   564,   566,   570,   577,   585,
+     124,     0,   538,   539,     0,   128,     0,   106,     4,     0,
+      24,    21,    32,   205,     0,   534,     0,   529,   524,    46,
+      47,    48,    51,    50,    53,    54,    58,    59,    56,    57,
+      61,    62,    64,    66,    68,    70,    72,    74,     0,   200,
+     616,     0,   614,   555,     0,     0,     0,     0,   601,     0,
+     582,    79,    92,   123,   536,     0,   104,    19,   530,   532,
+       0,     0,     0,     0,     0,   574,     0,     0,     0,     0,
+     593,   592,   595,   561,   578,   537,   540,     0,     0,   613,
+     615,   556,     0,     0,     0,   594,     0,     0,   573,     0,
+       0,   571,     0,    77,   617,     0,   558,   587,   557,     0,
+     596,     0,   561,   560,   562,   580,   575,     0,   597,   591,
+     572,   581,     0,   589,   579
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,  -457,
-    -457,  -457,  8868,  -457,   -87,   -84,  -127,   -93,   -33,   -31,
-     -27,   -25,   -28,   -26,  -457,   -86,  -457,  -103,  -457,  -111,
-    -125,     2,  -457,  -457,  -457,     4,  -457,  -457,  -457,   176,
-     194,   178,  -457,  -457,  -337,  -457,  -457,  -457,  -457,    95,
-    -457,   -37,   -46,  -457,     9,  -457,     0,   -63,  -457,  -457,
-    -457,  -457,   263,  -457,  -457,  -457,  -456,  -140,    10,   -73,
-    -211,  -457,  -102,  -198,  -321,  -457,  -144,  -457,  -457,  -155,
-    -154,  -457,  -457,   198,  -274,   -97,  -457,    46,  -457,  -118,
-    -457,    51,  -457,  -457,  -457,  -457,    52,  -457,  -457,  -457,
-    -457,  -457,  -457,  -457,  -457,   213,  -457,  -457,  -457,  -457,
-    -105
+    -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,  -733,
+    -733,  -733,  9826,  -733,  -105,   -98,  -156,  -102,   -29,   -28,
+     -30,   -27,   -26,   -31,  -733,   -82,  -733,  -101,  -733,  -109,
+    -134,     2,  -733,  -733,  -733,     4,  -733,  -733,  -733,   177,
+     198,   201,  -733,  -733,  -341,  -733,  -733,  -733,  -733,    94,
+    -733,   -37,   -46,  -733,     9,  -733,     0,   -66,  -733,  -733,
+    -733,  -733,   262,  -733,  -733,  -733,  -481,  -149,    11,   -79,
+    -213,  -733,  -108,  -204,  -732,  -733,  -148,  -733,  -733,  -161,
+    -160,  -733,  -733,   202,  -274,  -100,  -733,    44,  -733,  -127,
+    -733,    47,  -733,  -733,  -733,  -733,    49,  -733,  -733,  -733,
+    -733,  -733,  -733,  -733,  -733,   221,  -733,  -733,  -733,  -733,
+    -112
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   443,   444,   445,   630,   446,   447,   448,   449,   450,
-     451,   452,   502,   454,   472,   473,   474,   475,   476,   477,
-     478,   479,   480,   481,   482,   503,   659,   504,   614,   505,
-     561,   506,   345,   533,   421,   507,   347,   348,   349,   379,
-     380,   381,   350,   351,   352,   353,   354,   355,   401,   402,
-     356,   357,   358,   359,   455,   404,   456,   407,   392,   393,
-     457,   362,   363,   364,   464,   397,   462,   463,   555,   556,
-     531,   625,   510,   511,   512,   513,   514,   589,   685,   718,
-     709,   710,   711,   719,   515,   516,   517,   518,   712,   689,
-     519,   520,   713,   733,   521,   522,   523,   665,   593,   667,
-     693,   707,   708,   524,   365,   366,   367,   376,   525,   662,
-     663
+      -1,   465,   466,   467,   659,   468,   469,   470,   471,   472,
+     473,   474,   527,   476,   494,   495,   496,   497,   498,   499,
+     500,   501,   502,   503,   504,   528,   688,   529,   642,   530,
+     586,   531,   367,   558,   443,   532,   369,   370,   371,   401,
+     402,   403,   372,   373,   374,   375,   376,   377,   423,   424,
+     378,   379,   380,   381,   477,   426,   478,   429,   414,   415,
+     479,   384,   385,   386,   486,   419,   484,   485,   580,   581,
+     556,   654,   535,   536,   537,   538,   539,   614,   714,   747,
+     738,   739,   740,   748,   540,   541,   542,   543,   741,   718,
+     544,   545,   742,   762,   546,   547,   548,   694,   618,   696,
+     722,   736,   737,   549,   387,   388,   389,   398,   550,   691,
+     692
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1413,14 +1596,14 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-     361,   551,   344,   415,   346,   405,   405,   484,   559,   360,
-     405,   484,   416,   552,   406,   485,   371,   527,   532,   372,
+     383,   746,   366,   576,   368,   584,   427,   512,   754,   382,
+     515,   427,   516,   517,   428,   577,   520,   393,   552,   746,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,   627,   375,    61,
+      52,    53,    54,    55,    56,    57,    58,   656,   394,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
@@ -1444,342 +1627,53 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   389,   382,   530,   539,   664,   622,   618,   624,   483,
-     369,   626,   558,   417,   399,   571,   572,   582,   687,   458,
-     569,   570,   484,   540,   541,   377,   389,   490,   373,   623,
-     493,   382,   494,   495,   384,   400,   498,   385,   548,   383,
-     526,   528,   370,   -35,   378,   542,   687,   390,   360,   543,
-     460,   573,   574,   583,   374,   361,   360,   344,   396,   346,
-     299,   466,   575,   576,   360,   304,   305,   467,   383,   560,
-     683,   386,   383,   717,   684,   391,   598,   360,   600,   535,
-     725,   360,   536,   418,   468,   666,   419,   461,   586,   420,
-     469,   717,   398,   545,   629,   694,   360,   695,   509,   546,
-     615,   615,   674,   615,   389,   728,   675,   508,   676,   558,
-     615,   615,   403,   616,   530,   460,   530,   460,   567,   530,
-     568,   631,   408,   603,   604,   605,   606,   607,   608,   609,
-     610,   611,   612,   633,   647,   648,   649,   650,   637,   615,
-     671,   638,   732,   613,   615,   637,   413,   669,   679,   414,
-     553,   405,   461,   459,   461,   697,   618,   615,   698,   360,
-     465,   360,   534,   360,   295,   296,   297,   564,   565,   566,
-     643,   644,   651,   652,   668,   645,   646,   558,   670,   544,
-     549,   636,   554,   484,   563,   577,   460,   578,   579,   580,
-     581,   584,   587,   590,   588,   727,   591,   592,   594,   595,
-     599,   672,   673,   601,   596,   509,   602,   -36,   -34,   628,
-     530,   632,   460,   -29,   508,   661,   660,   678,   615,   682,
-     690,   700,   702,   461,   618,   704,   705,   703,   715,  -536,
-     716,   722,   360,   721,   653,   487,   726,   654,   681,   734,
-     723,   735,   655,   657,   686,   656,   658,   699,   411,   461,
-     412,   368,   562,   635,   680,   691,   724,   730,   360,   731,
-     692,   619,   410,   530,   409,   706,   620,   621,   395,   701,
-       0,     0,   686,     0,     0,     0,     0,     0,     0,   509,
-     460,     0,     0,   509,   720,   714,   560,     0,   508,     0,
-       0,     0,   508,     0,     0,     0,     0,     0,     0,     0,
-     729,     0,     0,   530,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   461,   688,     0,
-       0,     0,     0,     0,     0,     0,   360,     0,     0,     0,
-       0,     0,   389,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   688,     0,     0,     0,
-       0,     0,     0,     0,   509,   509,     0,   509,     0,     0,
-       0,     0,     0,   508,   508,     0,   508,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   390,     0,
-       0,     0,     0,   509,     0,     0,     0,   360,     0,     0,
-       0,     0,   508,     0,   509,     0,     0,     0,     0,     0,
-       0,   509,     0,   508,     0,     0,     0,     0,     0,     0,
-     508,     0,   509,     0,     0,     0,   509,     0,     0,     0,
-       0,   508,   509,     0,     0,   508,     0,     0,     0,   394,
-       0,   508,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
-     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
-     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,     0,     0,     0,     0,     0,     0,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   411,   404,   583,   646,   555,   564,   650,
+     693,   653,   439,   421,   655,   505,   391,   607,   480,   596,
+     597,   506,   437,   716,   427,   506,   594,   595,   411,   507,
+     488,   438,   557,   404,   600,   601,   489,   422,   395,   551,
+     553,   405,   573,   565,   566,   643,   700,   506,   392,   412,
+     382,   716,   482,   608,   651,   598,   599,   383,   382,   366,
+     418,   368,   321,   -35,   396,   567,   382,   326,   327,   568,
+     405,   490,   570,   406,   405,   585,   407,   491,   571,   382,
+     623,   658,   625,   382,   695,   440,   723,   643,   441,   483,
+     724,   442,   643,   757,   611,   400,   643,   712,   382,   643,
+     534,   713,   643,   727,   560,   583,   411,   561,   703,   533,
+     676,   677,   678,   679,   592,   643,   593,   482,   644,   482,
+     397,   555,   666,   555,   643,   667,   555,   698,   660,   631,
+     632,   633,   634,   635,   636,   637,   638,   639,   640,   666,
+     662,   408,   708,   317,   318,   319,   589,   590,   591,   641,
+     399,   761,   578,   704,   483,   705,   483,   672,   673,   646,
+     413,   382,   726,   382,   420,   382,   674,   675,   680,   681,
+     425,   430,   435,   436,   427,   481,   569,   583,   487,   559,
+     574,   697,   579,   665,   506,   699,   588,   605,   602,   603,
+     604,   482,   606,   609,   612,   615,   613,   616,   617,   619,
+     620,   643,   756,   621,   626,   624,   719,   627,   628,   -36,
+     534,   701,   702,   629,   -34,   657,   630,   482,   -29,   533,
+     555,   661,   689,   707,   711,   690,   729,   646,   483,   733,
+     731,   734,   750,  -559,   744,   745,   751,   382,   732,   764,
+     509,   755,   763,   682,   684,   683,   687,   728,   685,   710,
+     686,   433,   390,   587,   483,   715,   752,   709,   720,   664,
+     759,   753,   760,   382,   647,   735,   721,   648,   432,   649,
+     431,   730,     0,     0,   555,   434,     0,     0,   417,     0,
+       0,     0,     0,   715,   534,     0,     0,     0,   534,   482,
+       0,     0,     0,   533,     0,   749,   743,   533,     0,   585,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     294,   295,   296,   297,   298,     0,     0,     0,     0,     0,
-       0,     0,     0,   299,   300,   301,   302,   303,   304,   305,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   306,   307,   308,   309,   310,   311,     0,     0,
-       0,     0,     0,     0,     0,     0,   312,     0,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
-     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
-     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
-     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,   486,     0,   487,   488,     0,
-       0,     0,     0,   489,   426,   427,   428,   429,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   294,   295,   296,
-     297,   298,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,   300,   301,   302,   303,   304,   305,   490,   491,   492,
-     493,     0,   494,   495,   496,   497,   498,   499,   500,   306,
-     307,   308,   309,   310,   311,   435,   436,   437,   438,   439,
-     440,   441,   442,   312,   501,   313,   314,   315,   316,   317,
-     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
-     328,   329,   330,   331,   332,   333,   334,   335,   336,   337,
-     338,   339,   340,   341,   342,   343,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,     0,     0,
-     422,   423,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   424,
-     425,     0,   486,     0,   487,   617,     0,     0,     0,     0,
-     489,   426,   427,   428,   429,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   294,   295,   296,   297,   298,     0,
-       0,     0,   430,   431,   432,   433,   434,   299,   300,   301,
-     302,   303,   304,   305,   490,   491,   492,   493,     0,   494,
-     495,   496,   497,   498,   499,   500,   306,   307,   308,   309,
-     310,   311,   435,   436,   437,   438,   439,   440,   441,   442,
-     312,   501,   313,   314,   315,   316,   317,   318,   319,   320,
-     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
-     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,
-     341,   342,   343,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,   422,   423,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   424,   425,     0,   486,
-       0,   487,     0,     0,     0,     0,     0,   489,   426,   427,
-     428,   429,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   294,   295,   296,   297,   298,     0,     0,     0,   430,
-     431,   432,   433,   434,   299,   300,   301,   302,   303,   304,
-     305,   490,   491,   492,   493,     0,   494,   495,   496,   497,
-     498,   499,   500,   306,   307,   308,   309,   310,   311,   435,
-     436,   437,   438,   439,   440,   441,   442,   312,   501,   313,
-     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
-     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
-     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
-     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
-     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
-     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
-     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
-     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,     0,     0,   422,   423,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   424,   425,     0,   486,     0,   408,     0,
-       0,     0,     0,     0,   489,   426,   427,   428,   429,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   294,   295,
-     296,   297,   298,     0,     0,     0,   430,   431,   432,   433,
-     434,   299,   300,   301,   302,   303,   304,   305,   490,   491,
-     492,   493,     0,   494,   495,   496,   497,   498,   499,   500,
-     306,   307,   308,   309,   310,   311,   435,   436,   437,   438,
-     439,   440,   441,   442,   312,   501,   313,   314,   315,   316,
-     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,
-     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,
-     337,   338,   339,   340,   341,   342,   343,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,     0,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,   486,     0,     0,     0,     0,     0,     0,
-       0,   489,   426,   427,   428,   429,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   294,   295,   296,   297,   298,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,   300,
-     301,   302,   303,   304,   305,   490,   491,   492,   493,     0,
-     494,   495,   496,   497,   498,   499,   500,   306,   307,   308,
-     309,   310,   311,   435,   436,   437,   438,   439,   440,   441,
-     442,   312,   501,   313,   314,   315,   316,   317,   318,   319,
-     320,   321,   322,   323,   324,   325,   326,   327,   328,   329,
-     330,   331,   332,   333,   334,   335,   336,   337,   338,   339,
-     340,   341,   342,   343,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,     0,     0,   422,   423,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   424,   425,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   489,   426,
-     427,   428,   429,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   294,   295,   296,   297,   298,     0,     0,     0,
-     430,   431,   432,   433,   434,   299,   300,   301,   302,   303,
-     304,   305,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   306,   307,   308,   309,   310,   311,
-     435,   436,   437,   438,   439,   440,   441,   442,   312,     0,
-     313,   314,   315,   316,   317,   318,   319,   320,   321,   322,
-     323,   324,   325,   326,   327,   328,   329,   330,   331,   332,
-     333,   334,   335,   336,   337,   338,   339,   340,   341,   342,
-     343,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+       0,   758,     0,     0,   555,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   483,   717,     0,     0,
+       0,     0,     0,     0,     0,   382,     0,     0,     0,     0,
+       0,   411,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   717,     0,     0,     0,     0,
+       0,     0,     0,   534,   534,     0,   534,     0,     0,     0,
+       0,     0,   533,   533,     0,   533,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   412,     0,     0,
+       0,     0,   534,     0,     0,     0,   382,     0,     0,     0,
+       0,   533,     0,   534,     0,     0,     0,     0,     0,     0,
+     534,     0,   533,     0,     0,     0,     0,     0,     0,   533,
+       0,   534,     0,     0,     0,   534,     0,     0,     0,     0,
+     533,   534,     0,     0,   533,     0,     0,     0,   416,     0,
+     533,     1,     2,     3,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
@@ -1808,61 +1702,66 @@
      260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
      270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
      280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,     0,     0,   422,   423,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   424,   425,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   426,   427,   428,   429,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   294,
-     295,   296,   297,     0,     0,     0,     0,   430,   431,   432,
-     433,   434,   299,   300,   301,   302,   303,   304,   305,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   306,   307,   308,   309,   310,   311,   435,   436,   437,
-     438,   439,   440,   441,   442,   312,     0,   313,   314,   315,
-     316,   317,   318,   319,   320,   321,   322,   323,   324,   325,
-     326,   327,   328,   329,   330,   331,   332,   333,   334,   335,
-     336,   337,   338,   339,   340,   341,   342,   343,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
-     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
-     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   315,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   293,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   294,   295,   296,   297,
-     298,     0,     0,     0,     0,     0,     0,     0,     0,   299,
-     300,   301,   302,   303,   304,   305,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   306,   307,
-     308,   309,   310,   311,     0,     0,     0,     0,     0,     0,
-       0,     0,   312,     0,   313,   314,   315,   316,   317,   318,
-     319,   320,   321,   322,   323,   324,   325,   326,   327,   328,
-     329,   330,   331,   332,   333,   334,   335,   336,   337,   338,
-     339,   340,   341,   342,   343,     1,     2,     3,     4,     5,
+       0,   316,   317,   318,   319,   320,     0,     0,     0,     0,
+       0,     0,     0,     0,   321,   322,   323,   324,   325,   326,
+     327,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   328,   329,   330,   331,
+     332,   333,     0,     0,     0,     0,     0,     0,     0,     0,
+     334,     0,   335,   336,   337,   338,   339,   340,   341,   342,
+     343,   344,   345,   346,   347,   348,   349,   350,   351,   352,
+     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
+     363,   364,   365,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,     0,     0,   444,
+     445,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   446,   447,
+       0,   508,     0,   509,   510,     0,     0,     0,     0,   511,
+     448,   449,   450,   451,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   316,   317,   318,   319,   320,     0,     0,
+       0,   452,   453,   454,   455,   456,   321,   322,   323,   324,
+     325,   326,   327,   512,   513,   514,   515,     0,   516,   517,
+     518,   519,   520,   521,   522,   523,   524,   525,   328,   329,
+     330,   331,   332,   333,   457,   458,   459,   460,   461,   462,
+     463,   464,   334,   526,   335,   336,   337,   338,   339,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,   350,
+     351,   352,   353,   354,   355,   356,   357,   358,   359,   360,
+     361,   362,   363,   364,   365,     1,     2,     3,     4,     5,
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
@@ -1891,61 +1790,66 @@
      256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
      266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
      276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,     0,     0,     0,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,     0,
+       0,   444,   445,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     446,   447,     0,   508,     0,   509,   645,     0,     0,     0,
+       0,   511,   448,   449,   450,   451,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   316,   317,   318,   319,   320,
+       0,     0,     0,   452,   453,   454,   455,   456,   321,   322,
+     323,   324,   325,   326,   327,   512,   513,   514,   515,     0,
+     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
+     328,   329,   330,   331,   332,   333,   457,   458,   459,   460,
+     461,   462,   463,   464,   334,   526,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,   352,   353,   354,   355,   356,   357,   358,
+     359,   360,   361,   362,   363,   364,   365,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,     0,     0,   444,   445,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   387,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   294,   295,   296,   297,     0,     0,     0,
-       0,     0,     0,     0,     0,   388,   299,   300,   301,   302,
-     303,   304,   305,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   306,   307,   308,   309,   310,
-     311,     0,     0,     0,     0,     0,     0,     0,     0,   312,
-       0,   313,   314,   315,   316,   317,   318,   319,   320,   321,
-     322,   323,   324,   325,   326,   327,   328,   329,   330,   331,
-     332,   333,   334,   335,   336,   337,   338,   339,   340,   341,
-     342,   343,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
-     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
-     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     294,   295,   296,   297,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   299,   300,   301,   302,   303,   304,   305,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   306,   307,   308,   309,   310,   311,     0,     0,
-       0,     0,     0,     0,     0,     0,   312,     0,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,     1,
+       0,     0,   446,   447,     0,   508,     0,   509,     0,     0,
+       0,     0,     0,   511,   448,   449,   450,   451,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   316,   317,   318,
+     319,   320,     0,     0,     0,   452,   453,   454,   455,   456,
+     321,   322,   323,   324,   325,   326,   327,   512,   513,   514,
+     515,     0,   516,   517,   518,   519,   520,   521,   522,   523,
+     524,   525,   328,   329,   330,   331,   332,   333,   457,   458,
+     459,   460,   461,   462,   463,   464,   334,   526,   335,   336,
+     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,
+     347,   348,   349,   350,   351,   352,   353,   354,   355,   356,
+     357,   358,   359,   360,   361,   362,   363,   364,   365,     1,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
@@ -1975,61 +1879,66 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,     0,     0,   444,   445,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   639,     0,
+       0,     0,     0,     0,   446,   447,     0,   508,     0,   430,
+       0,     0,     0,     0,     0,   511,   448,   449,   450,   451,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   316,
+     317,   318,   319,   320,     0,     0,     0,   452,   453,   454,
+     455,   456,   321,   322,   323,   324,   325,   326,   327,   512,
+     513,   514,   515,     0,   516,   517,   518,   519,   520,   521,
+     522,   523,   524,   525,   328,   329,   330,   331,   332,   333,
+     457,   458,   459,   460,   461,   462,   463,   464,   334,   526,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
+     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,     0,     0,   444,   445,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   294,   295,   296,
-     297,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     299,   300,   301,   302,   303,   304,   305,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   306,
-     307,   308,   309,   310,   311,     0,     0,     0,     0,     0,
-       0,     0,     0,   312,     0,   313,   314,   315,   316,   317,
-     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
-     328,   329,   330,   331,   332,   333,   334,   335,   336,   337,
-     338,   339,   340,   341,   342,   343,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   677,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   294,   295,   296,   297,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   299,   300,   301,
-     302,   303,   304,   305,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   306,   307,   308,   309,
-     310,   311,     0,     0,     0,     0,     0,     0,     0,     0,
-     312,     0,   313,   314,   315,   316,   317,   318,   319,   320,
-     321,   322,   323,   324,   325,   326,   327,   328,   329,   330,
-     331,   332,   333,   334,   335,   336,   337,   338,   339,   340,
-     341,   342,   343,     1,     2,     3,     4,     5,     6,     7,
+       0,     0,     0,     0,     0,     0,   446,   447,     0,   508,
+       0,     0,     0,     0,     0,     0,     0,   511,   448,   449,
+     450,   451,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   316,   317,   318,   319,   320,     0,     0,     0,   452,
+     453,   454,   455,   456,   321,   322,   323,   324,   325,   326,
+     327,   512,   513,   514,   515,     0,   516,   517,   518,   519,
+     520,   521,   522,   523,   524,   525,   328,   329,   330,   331,
+     332,   333,   457,   458,   459,   460,   461,   462,   463,   464,
+     334,   526,   335,   336,   337,   338,   339,   340,   341,   342,
+     343,   344,   345,   346,   347,   348,   349,   350,   351,   352,
+     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
+     363,   364,   365,     1,     2,     3,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
@@ -2058,25 +1967,116 @@
      258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
      268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
      278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,     0,     0,     0,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,     0,     0,   444,
+     445,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   446,   447,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   511,
+     448,   449,   450,   451,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   316,   317,   318,   319,   320,     0,     0,
+       0,   452,   453,   454,   455,   456,   321,   322,   323,   324,
+     325,   326,   327,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   328,   329,
+     330,   331,   332,   333,   457,   458,   459,   460,   461,   462,
+     463,   464,   334,     0,   335,   336,   337,   338,   339,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,   350,
+     351,   352,   353,   354,   355,   356,   357,   358,   359,   360,
+     361,   362,   363,   364,   365,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,     0,
+       0,   444,   445,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     446,   447,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   448,   449,   450,   451,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   316,   317,   318,   319,     0,
+       0,     0,     0,   452,   453,   454,   455,   456,   321,   322,
+     323,   324,   325,   326,   327,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     328,   329,   330,   331,   332,   333,   457,   458,   459,   460,
+     461,   462,   463,   464,   334,     0,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,   352,   353,   354,   355,   356,   357,   358,
+     359,   360,   361,   362,   363,   364,   365,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   315,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   316,   317,   318,
+     319,   320,     0,     0,     0,     0,     0,     0,     0,     0,
+     321,   322,   323,   324,   325,   326,   327,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   294,   295,   296,   297,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   299,   300,   301,   302,   303,   304,
-     305,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   306,   307,   308,   309,   310,   311,     0,
-       0,     0,     0,     0,     0,     0,     0,   312,     0,   313,
-     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
-     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
-     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+       0,     0,   328,   329,   330,   331,   332,   333,     0,     0,
+       0,     0,     0,     0,     0,     0,   334,     0,   335,   336,
+     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,
+     347,   348,   349,   350,   351,   352,   353,   354,   355,   356,
+     357,   358,   359,   360,   361,   362,   363,   364,   365,     1,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,     0,     0,    61,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
@@ -2100,103 +2100,72 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,     0,     0,   529,   696,     0,
-       0,     0,     0,     0,   426,   427,   428,   429,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,     0,     0,     0,     0,   304,   305,     0,     0,     0,
+       0,     0,     0,     0,     0,   409,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   316,
+     317,   318,   319,     0,     0,     0,     0,     0,     0,     0,
+       0,   410,   321,   322,   323,   324,   325,   326,   327,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   435,   436,   437,   438,   439,
-     440,   441,   442,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   325,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,     0,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   328,   329,   330,   331,   332,   333,
+       0,     0,     0,     0,     0,     0,     0,     0,   334,     0,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
+     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,     0,   470,     0,     0,     0,     0,     0,
-       0,     0,   426,   427,   428,   429,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,     0,
-       0,     0,     0,   304,   305,     0,     0,     0,     0,     0,
+       0,     0,   582,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   435,   436,   437,   438,   439,   440,   441,
-     442,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   325,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,     0,     0,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,     0,     0,   422,
-     423,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   424,   425,
-       0,     0,     0,   529,     0,     0,     0,     0,     0,     0,
-     426,   427,   428,   429,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   430,   431,   432,   433,   434,   299,     0,     0,     0,
-       0,   304,   305,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   435,   436,   437,   438,   439,   440,   441,   442,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   325,     2,     3,     4,     5,     6,     7,
+       0,   316,   317,   318,   319,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   321,   322,   323,   324,   325,   326,
+     327,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   328,   329,   330,   331,
+     332,   333,     0,     0,     0,     0,     0,     0,     0,     0,
+     334,     0,   335,   336,   337,   338,   339,   340,   341,   342,
+     343,   344,   345,   346,   347,   348,   349,   350,   351,   352,
+     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
+     363,   364,   365,     1,     2,     3,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
       38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
       68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
       78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
       88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
@@ -2219,18 +2188,153 @@
      258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
      268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
      278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,     0,     0,   422,   423,     0,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   424,   425,     0,     0,
-     585,     0,     0,     0,     0,     0,     0,     0,   426,   427,
-     428,   429,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   430,
-     431,   432,   433,   434,   299,     0,     0,     0,     0,   304,
-     305,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   435,
-     436,   437,   438,   439,   440,   441,   442,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   325,     2,     3,     4,     5,     6,     7,     8,     9,
+       0,     0,     0,     0,   668,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   316,   317,   318,   319,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   321,   322,   323,   324,
+     325,   326,   327,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   328,   329,
+     330,   331,   332,   333,     0,     0,     0,     0,     0,     0,
+       0,     0,   334,     0,   335,   336,   337,   338,   339,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,   350,
+     351,   352,   353,   354,   355,   356,   357,   358,   359,   360,
+     361,   362,   363,   364,   365,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   706,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   316,   317,   318,   319,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   321,   322,
+     323,   324,   325,   326,   327,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     328,   329,   330,   331,   332,   333,     0,     0,     0,     0,
+       0,     0,     0,     0,   334,     0,   335,   336,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,   350,   351,   352,   353,   354,   355,   356,   357,   358,
+     359,   360,   361,   362,   363,   364,   365,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   316,   317,   318,
+     319,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     321,   322,   323,   324,   325,   326,   327,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   328,   329,   330,   331,   332,   333,     0,     0,
+       0,     0,     0,     0,     0,     0,   334,     0,   335,   336,
+     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,
+     347,   348,   349,   350,   351,   352,   353,   354,   355,   356,
+     357,   358,   359,   360,   361,   362,   363,   364,   365,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,     0,     0,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,     0,     0,   444,   445,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   446,   447,     0,     0,     0,   554,   652,
+       0,     0,     0,     0,     0,   448,   449,   450,   451,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   452,   453,   454,   455,
+     456,   321,     0,     0,     0,     0,   326,   327,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   457,
+     458,   459,   460,   461,   462,   463,   464,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   347,     2,     3,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
@@ -2259,17 +2363,231 @@
      260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
      270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
      280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,     0,     0,   422,   423,     0,     0,     0,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,     0,     0,   444,   445,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   424,   425,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   597,   426,   427,   428,   429,
+       0,     0,     0,     0,     0,     0,   446,   447,     0,     0,
+       0,   554,   725,     0,     0,     0,     0,     0,   448,   449,
+     450,   451,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   452,
+     453,   454,   455,   456,   321,     0,     0,     0,     0,   326,
+     327,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   430,   431,   432,
-     433,   434,   299,     0,     0,     0,     0,   304,   305,     0,
+       0,     0,   457,   458,   459,   460,   461,   462,   463,   464,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   435,   436,   437,
-     438,   439,   440,   441,   442,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   325,
+       0,     0,     0,     0,   347,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,     0,     0,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,     0,     0,
+     444,   445,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   446,
+     447,     0,     0,   492,     0,     0,     0,     0,     0,     0,
+       0,   448,   449,   450,   451,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   452,   453,   454,   455,   456,   321,     0,     0,
+       0,     0,   326,   327,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   457,   458,   459,   460,   461,
+     462,   463,   464,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   347,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
+     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
+     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
+     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
+     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
+     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
+     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,     0,     0,   444,   445,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   446,   447,     0,     0,     0,   554,     0,     0,
+       0,     0,     0,     0,   448,   449,   450,   451,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   452,   453,   454,   455,   456,
+     321,     0,     0,     0,     0,   326,   327,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   457,   458,
+     459,   460,   461,   462,   463,   464,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     347,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,     0,     0,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
+     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
+     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
+     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
+     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
+     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   299,   300,
+     301,   302,   303,   304,   305,   306,   307,   308,   309,   310,
+     311,   312,   313,   314,     0,     0,   444,   445,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   446,   447,     0,     0,   610,
+       0,     0,     0,     0,     0,     0,     0,   448,   449,   450,
+     451,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   452,   453,
+     454,   455,   456,   321,     0,     0,     0,     0,   326,   327,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   457,   458,   459,   460,   461,   462,   463,   464,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   347,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,     0,     0,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,     0,     0,   444,
+     445,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   446,   447,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   622,
+     448,   449,   450,   451,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   452,   453,   454,   455,   456,   321,     0,     0,     0,
+       0,   326,   327,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   457,   458,   459,   460,   461,   462,
+     463,   464,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   347,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,     0,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+       0,     0,   444,   445,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   446,   447,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   448,   449,   450,   451,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   452,   453,   454,   455,   456,   321,
+       0,     0,     0,     0,   326,   327,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   457,   458,   459,
+     460,   461,   462,   463,   464,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   347,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
@@ -2299,66 +2617,29 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,     0,     0,   422,   423,     0,     0,     0,     0,     0,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,     0,     0,   444,   445,     0,     0,   475,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   424,   425,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   426,   427,   428,   429,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   430,   431,   432,   433,   434,
-     299,     0,     0,     0,     0,   304,   305,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   435,   436,   437,   438,   439,
-     440,   441,   442,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   325,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,     0,     0,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   453,
-       0,   422,   423,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   471,     0,     0,     0,     0,     0,     0,
-     424,   425,     0,     0,     0,     0,     0,     0,     0,     0,
-     537,   538,   426,   427,   428,   429,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   430,   431,   432,   433,   434,   299,     0,
-       0,     0,   550,   304,   547,     0,     0,     0,     0,     0,
-       0,     0,     0,   471,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   435,   436,   437,   438,   439,   440,   441,
-     442,     0,   471,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   325,     0,     0,     0,     0,
+       0,     0,     0,   493,   446,   447,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   448,   449,   450,   451,
+     562,   563,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   452,   453,   454,
+     455,   456,   321,     0,     0,     0,     0,   326,   572,     0,
+       0,     0,   575,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   493,     0,     0,     0,     0,     0,     0,
+     457,   458,   459,   460,   461,   462,   463,   464,     0,     0,
+       0,     0,   493,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   347,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   634,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   640,   641,   642,   471,   471,   471,   471,   471,
-     471,   471,   471,   471,   471,   471,   471,   471,   471,   471,
-     471,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   663,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   669,   670,   671,   493,   493,
+     493,   493,   493,   493,   493,   493,   493,   493,   493,   493,
+     493,   493,   493,   493,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -2368,19 +2649,19 @@
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     471
+       0,     0,     0,     0,     0,     0,     0,   493
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,   324,     0,   317,     0,   319,   319,   319,   464,     0,
-     319,   319,   326,   336,   327,   327,   317,   326,   326,   317,
+       0,   733,     0,   346,     0,   486,   341,   383,   740,     0,
+     386,   341,   388,   389,   349,   358,   392,   339,   348,   751,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,   533,   327,    63,
+      54,    55,    56,    57,    58,    59,    60,   558,   339,    63,
       64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
@@ -2404,342 +2685,53 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,   357,   349,   416,   425,   589,   527,   515,   529,   405,
-     321,   532,   462,   386,   353,   299,   300,   304,   665,   392,
-     295,   296,   319,   297,   298,   318,   382,   361,   327,   326,
-     364,   378,   366,   367,   324,   374,   370,   327,   451,   349,
-     413,   414,   353,   317,   324,   319,   693,   357,   349,   323,
-     397,   335,   336,   340,   353,   365,   357,   365,   368,   365,
-     354,   318,   301,   302,   365,   359,   360,   324,   378,   465,
-     320,   353,   382,   704,   324,   335,   497,   378,   499,   324,
-     711,   382,   327,   321,   318,   593,   324,   397,   484,   327,
-     324,   722,   321,   318,   318,   318,   397,   318,   408,   324,
-     324,   324,   623,   324,   460,   318,   322,   408,   324,   559,
-     324,   324,   353,   327,   527,   462,   529,   464,   329,   532,
-     331,   542,   321,   306,   307,   308,   309,   310,   311,   312,
-     313,   314,   315,   546,   571,   572,   573,   574,   324,   324,
-     325,   327,   726,   326,   324,   324,   353,   327,   327,   353,
-     460,   319,   462,   327,   464,   676,   664,   324,   325,   460,
-     326,   462,   353,   464,   342,   343,   344,   332,   333,   334,
-     567,   568,   575,   576,   595,   569,   570,   627,   599,   318,
-     317,   554,   353,   319,   353,   339,   533,   338,   337,   303,
-     305,   320,   319,   317,   322,   716,   327,   327,   317,   317,
-     317,   614,   615,   325,   327,   515,   327,   317,   317,   353,
-     623,   353,   559,   318,   515,   353,   320,   320,   324,   317,
-     361,   320,   322,   533,   732,   318,   317,   353,   318,   321,
-     326,   318,   533,   327,   577,   321,   321,   578,   659,   327,
-     365,   322,   579,   581,   665,   580,   582,   682,   382,   559,
-     382,   298,   467,   553,   637,   667,   710,   722,   559,   723,
-     667,   525,   378,   676,   376,   693,   525,   525,   365,   684,
-      -1,    -1,   693,    -1,    -1,    -1,    -1,    -1,    -1,   589,
-     627,    -1,    -1,   593,   705,   698,   682,    -1,   589,    -1,
-      -1,    -1,   593,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     721,    -1,    -1,   716,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   627,   665,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   627,    -1,    -1,    -1,
-      -1,    -1,   688,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   693,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   664,   665,    -1,   667,    -1,    -1,
-      -1,    -1,    -1,   664,   665,    -1,   667,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   688,    -1,
-      -1,    -1,    -1,   693,    -1,    -1,    -1,   688,    -1,    -1,
-      -1,    -1,   693,    -1,   704,    -1,    -1,    -1,    -1,    -1,
-      -1,   711,    -1,   704,    -1,    -1,    -1,    -1,    -1,    -1,
-     711,    -1,   722,    -1,    -1,    -1,   726,    -1,    -1,    -1,
-      -1,   722,   732,    -1,    -1,   726,    -1,    -1,    -1,     0,
-      -1,   732,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
-     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
-     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
-     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
-     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
-     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   379,   371,   484,   540,   438,   447,   552,
+     614,   554,   408,   375,   557,   427,   343,   326,   414,   321,
+     322,   341,   339,   694,   341,   341,   317,   318,   404,   349,
+     340,   348,   348,   400,   323,   324,   346,   399,   349,   435,
+     436,   371,   473,   319,   320,   346,   347,   341,   375,   379,
+     371,   722,   419,   362,   348,   357,   358,   387,   379,   387,
+     390,   387,   376,   339,   375,   341,   387,   381,   382,   345,
+     400,   340,   340,   346,   404,   487,   349,   346,   346,   400,
+     519,   340,   521,   404,   618,   343,   340,   346,   346,   419,
+     340,   349,   346,   340,   506,   346,   346,   342,   419,   346,
+     430,   346,   346,   347,   346,   584,   482,   349,   651,   430,
+     596,   597,   598,   599,   351,   346,   353,   484,   349,   486,
+     349,   552,   346,   554,   346,   349,   557,   349,   567,   328,
+     329,   330,   331,   332,   333,   334,   335,   336,   337,   346,
+     571,   375,   349,   364,   365,   366,   354,   355,   356,   348,
+     340,   755,   482,   344,   484,   346,   486,   592,   593,   693,
+     357,   482,   705,   484,   343,   486,   594,   595,   600,   601,
+     375,   343,   375,   375,   341,   349,   340,   656,   348,   375,
+     339,   620,   375,   579,   341,   624,   375,   325,   361,   360,
+     359,   558,   327,   342,   341,   339,   344,   349,   349,   339,
+     339,   346,   745,   349,   347,   339,   383,   349,   349,   339,
+     540,   642,   643,   349,   339,   375,   349,   584,   340,   540,
+     651,   375,   342,   342,   339,   375,   342,   761,   558,   340,
+     344,   339,   349,   343,   340,   348,   340,   558,   375,   344,
+     343,   343,   349,   602,   604,   603,   607,   711,   605,   688,
+     606,   404,   320,   489,   584,   694,   387,   666,   696,   578,
+     751,   739,   752,   584,   550,   722,   696,   550,   400,   550,
+     398,   713,    -1,    -1,   705,   404,    -1,    -1,   387,    -1,
+      -1,    -1,    -1,   722,   614,    -1,    -1,    -1,   618,   656,
+      -1,    -1,    -1,   614,    -1,   734,   727,   618,    -1,   711,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   327,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     341,   342,   343,   344,   345,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   354,   355,   356,   357,   358,   359,   360,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   373,   374,   375,   376,   377,   378,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,   390,
-     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
-     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
-     411,   412,   413,   414,   415,   416,   417,   418,   419,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
-     114,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   192,   193,
-     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-     264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,   319,    -1,   321,   322,    -1,
-      -1,    -1,    -1,   327,   328,   329,   330,   331,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,
-     344,   345,    -1,    -1,    -1,   349,   350,   351,   352,   353,
-     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
-     364,    -1,   366,   367,   368,   369,   370,   371,   372,   373,
-     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,
-     384,   385,   386,   387,   388,   389,   390,   391,   392,   393,
-     394,   395,   396,   397,   398,   399,   400,   401,   402,   403,
-     404,   405,   406,   407,   408,   409,   410,   411,   412,   413,
-     414,   415,   416,   417,   418,   419,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,    -1,    -1,
-     297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,
-     317,    -1,   319,    -1,   321,   322,    -1,    -1,    -1,    -1,
-     327,   328,   329,   330,   331,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   341,   342,   343,   344,   345,    -1,
-      -1,    -1,   349,   350,   351,   352,   353,   354,   355,   356,
-     357,   358,   359,   360,   361,   362,   363,   364,    -1,   366,
-     367,   368,   369,   370,   371,   372,   373,   374,   375,   376,
-     377,   378,   379,   380,   381,   382,   383,   384,   385,   386,
-     387,   388,   389,   390,   391,   392,   393,   394,   395,   396,
-     397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
-     407,   408,   409,   410,   411,   412,   413,   414,   415,   416,
-     417,   418,   419,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
-     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
-     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
-     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
-     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,   297,   298,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,   319,
-      -1,   321,    -1,    -1,    -1,    -1,    -1,   327,   328,   329,
-     330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   341,   342,   343,   344,   345,    -1,    -1,    -1,   349,
-     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
-     360,   361,   362,   363,   364,    -1,   366,   367,   368,   369,
-     370,   371,   372,   373,   374,   375,   376,   377,   378,   379,
-     380,   381,   382,   383,   384,   385,   386,   387,   388,   389,
-     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
-     400,   401,   402,   403,   404,   405,   406,   407,   408,   409,
-     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
-     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
-     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
-     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
-     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   316,   317,    -1,   319,    -1,   321,    -1,
-      -1,    -1,    -1,    -1,   327,   328,   329,   330,   331,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,
-     343,   344,   345,    -1,    -1,    -1,   349,   350,   351,   352,
-     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
-     363,   364,    -1,   366,   367,   368,   369,   370,   371,   372,
-     373,   374,   375,   376,   377,   378,   379,   380,   381,   382,
-     383,   384,   385,   386,   387,   388,   389,   390,   391,   392,
-     393,   394,   395,   396,   397,   398,   399,   400,   401,   402,
-     403,   404,   405,   406,   407,   408,   409,   410,   411,   412,
-     413,   414,   415,   416,   417,   418,   419,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,    -1,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,   319,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   327,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   341,   342,   343,   344,   345,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,   355,
-     356,   357,   358,   359,   360,   361,   362,   363,   364,    -1,
-     366,   367,   368,   369,   370,   371,   372,   373,   374,   375,
-     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,
-     386,   387,   388,   389,   390,   391,   392,   393,   394,   395,
-     396,   397,   398,   399,   400,   401,   402,   403,   404,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
-     416,   417,   418,   419,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
-     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
-     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
-     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
-     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
-     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
-     289,   290,   291,   292,   293,   294,    -1,    -1,   297,   298,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   327,   328,
-     329,   330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   341,   342,   343,   344,   345,    -1,    -1,    -1,
-     349,   350,   351,   352,   353,   354,   355,   356,   357,   358,
-     359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   373,   374,   375,   376,   377,   378,
-     379,   380,   381,   382,   383,   384,   385,   386,   387,    -1,
-     389,   390,   391,   392,   393,   394,   395,   396,   397,   398,
-     399,   400,   401,   402,   403,   404,   405,   406,   407,   408,
-     409,   410,   411,   412,   413,   414,   415,   416,   417,   418,
-     419,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      -1,   750,    -1,    -1,   745,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   656,   694,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   656,    -1,    -1,    -1,    -1,
+      -1,   717,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   722,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   693,   694,    -1,   696,    -1,    -1,    -1,
+      -1,    -1,   693,   694,    -1,   696,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   717,    -1,    -1,
+      -1,    -1,   722,    -1,    -1,    -1,   717,    -1,    -1,    -1,
+      -1,   722,    -1,   733,    -1,    -1,    -1,    -1,    -1,    -1,
+     740,    -1,   733,    -1,    -1,    -1,    -1,    -1,    -1,   740,
+      -1,   751,    -1,    -1,    -1,   755,    -1,    -1,    -1,    -1,
+     751,   761,    -1,    -1,   755,    -1,    -1,    -1,     0,    -1,
+     761,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
@@ -2768,61 +2760,66 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   316,   317,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   328,   329,   330,   331,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,
-     342,   343,   344,    -1,    -1,    -1,    -1,   349,   350,   351,
-     352,   353,   354,   355,   356,   357,   358,   359,   360,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   373,   374,   375,   376,   377,   378,   379,   380,   381,
-     382,   383,   384,   385,   386,   387,    -1,   389,   390,   391,
-     392,   393,   394,   395,   396,   397,   398,   399,   400,   401,
-     402,   403,   404,   405,   406,   407,   408,   409,   410,   411,
-     412,   413,   414,   415,   416,   417,   418,   419,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
-     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
-     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
-     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
-     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   327,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,   344,
-     345,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   354,
-     355,   356,   357,   358,   359,   360,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,   374,
-     375,   376,   377,   378,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   387,    -1,   389,   390,   391,   392,   393,   394,
-     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
-     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419,     3,     4,     5,     6,     7,
+      -1,   363,   364,   365,   366,   367,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   376,   377,   378,   379,   380,   381,
+     382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   398,   399,   400,   401,
+     402,   403,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     412,    -1,   414,   415,   416,   417,   418,   419,   420,   421,
+     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,
+     432,   433,   434,   435,   436,   437,   438,   439,   440,   441,
+     442,   443,   444,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
+     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,    -1,    -1,   319,
+     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,
+      -1,   341,    -1,   343,   344,    -1,    -1,    -1,    -1,   349,
+     350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   363,   364,   365,   366,   367,    -1,    -1,
+      -1,   371,   372,   373,   374,   375,   376,   377,   378,   379,
+     380,   381,   382,   383,   384,   385,   386,    -1,   388,   389,
+     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
+     400,   401,   402,   403,   404,   405,   406,   407,   408,   409,
+     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+     420,   421,   422,   423,   424,   425,   426,   427,   428,   429,
+     430,   431,   432,   433,   434,   435,   436,   437,   438,   439,
+     440,   441,   442,   443,   444,     3,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
@@ -2851,61 +2848,66 @@
      258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
      268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
      278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,    -1,    -1,    -1,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,    -1,
+      -1,   319,   320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   327,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   341,   342,   343,   344,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   353,   354,   355,   356,   357,
-     358,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   373,   374,   375,   376,   377,
-     378,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   387,
-      -1,   389,   390,   391,   392,   393,   394,   395,   396,   397,
+     338,   339,    -1,   341,    -1,   343,   344,    -1,    -1,    -1,
+      -1,   349,   350,   351,   352,   353,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,   367,
+      -1,    -1,    -1,   371,   372,   373,   374,   375,   376,   377,
+     378,   379,   380,   381,   382,   383,   384,   385,   386,    -1,
+     388,   389,   390,   391,   392,   393,   394,   395,   396,   397,
      398,   399,   400,   401,   402,   403,   404,   405,   406,   407,
      408,   409,   410,   411,   412,   413,   414,   415,   416,   417,
-     418,   419,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,   234,   235,   236,   237,   238,   239,   240,
-     241,   242,   243,   244,   245,   246,   247,   248,   249,   250,
-     251,   252,   253,   254,   255,   256,   257,   258,   259,   260,
-     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
-     271,   272,   273,   274,   275,   276,   277,   278,   279,   280,
-     281,   282,   283,   284,   285,   286,   287,   288,   289,   290,
-     291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,    -1,
+     418,   419,   420,   421,   422,   423,   424,   425,   426,   427,
+     428,   429,   430,   431,   432,   433,   434,   435,   436,   437,
+     438,   439,   440,   441,   442,   443,   444,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,    -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   322,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     341,   342,   343,   344,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   354,   355,   356,   357,   358,   359,   360,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   373,   374,   375,   376,   377,   378,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,   390,
-     391,   392,   393,   394,   395,   396,   397,   398,   399,   400,
-     401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
-     411,   412,   413,   414,   415,   416,   417,   418,   419,     3,
+      -1,    -1,   338,   339,    -1,   341,    -1,   343,    -1,    -1,
+      -1,    -1,    -1,   349,   350,   351,   352,   353,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,
+     366,   367,    -1,    -1,    -1,   371,   372,   373,   374,   375,
+     376,   377,   378,   379,   380,   381,   382,   383,   384,   385,
+     386,    -1,   388,   389,   390,   391,   392,   393,   394,   395,
+     396,   397,   398,   399,   400,   401,   402,   403,   404,   405,
+     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
+     416,   417,   418,   419,   420,   421,   422,   423,   424,   425,
+     426,   427,   428,   429,   430,   431,   432,   433,   434,   435,
+     436,   437,   438,   439,   440,   441,   442,   443,   444,     3,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
@@ -2935,61 +2937,66 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   322,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   341,   342,   343,
-     344,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     354,   355,   356,   357,   358,   359,   360,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   373,
-     374,   375,   376,   377,   378,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   387,    -1,   389,   390,   391,   392,   393,
+      -1,    -1,    -1,    -1,   338,   339,    -1,   341,    -1,   343,
+      -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,
+     364,   365,   366,   367,    -1,    -1,    -1,   371,   372,   373,
+     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,
+     384,   385,   386,    -1,   388,   389,   390,   391,   392,   393,
      394,   395,   396,   397,   398,   399,   400,   401,   402,   403,
      404,   405,   406,   407,   408,   409,   410,   411,   412,   413,
-     414,   415,   416,   417,   418,   419,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
-     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
-     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
-     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
-     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
-     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
-     287,   288,   289,   290,   291,   292,   293,   294,    -1,    -1,
+     414,   415,   416,   417,   418,   419,   420,   421,   422,   423,
+     424,   425,   426,   427,   428,   429,   430,   431,   432,   433,
+     434,   435,   436,   437,   438,   439,   440,   441,   442,   443,
+     444,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
+     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
+     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
+     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
+     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,    -1,    -1,   319,   320,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   322,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   341,   342,   343,   344,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   354,   355,   356,
-     357,   358,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   373,   374,   375,   376,
-     377,   378,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     387,    -1,   389,   390,   391,   392,   393,   394,   395,   396,
-     397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
-     407,   408,   409,   410,   411,   412,   413,   414,   415,   416,
-     417,   418,   419,     3,     4,     5,     6,     7,     8,     9,
+      -1,    -1,    -1,    -1,    -1,    -1,   338,   339,    -1,   341,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,   350,   351,
+     352,   353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   363,   364,   365,   366,   367,    -1,    -1,    -1,   371,
+     372,   373,   374,   375,   376,   377,   378,   379,   380,   381,
+     382,   383,   384,   385,   386,    -1,   388,   389,   390,   391,
+     392,   393,   394,   395,   396,   397,   398,   399,   400,   401,
+     402,   403,   404,   405,   406,   407,   408,   409,   410,   411,
+     412,   413,   414,   415,   416,   417,   418,   419,   420,   421,
+     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,
+     432,   433,   434,   435,   436,   437,   438,   439,   440,   441,
+     442,   443,   444,     3,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
@@ -3018,25 +3025,116 @@
      260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
      270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
      280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   341,   342,   343,   344,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   354,   355,   356,   357,   358,   359,
-     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   373,   374,   375,   376,   377,   378,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   387,    -1,   389,
-     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,    -1,    -1,   319,
+     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,
+     350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   363,   364,   365,   366,   367,    -1,    -1,
+      -1,   371,   372,   373,   374,   375,   376,   377,   378,   379,
+     380,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,   399,
      400,   401,   402,   403,   404,   405,   406,   407,   408,   409,
-     410,   411,   412,   413,   414,   415,   416,   417,   418,   419,
+     410,   411,   412,    -1,   414,   415,   416,   417,   418,   419,
+     420,   421,   422,   423,   424,   425,   426,   427,   428,   429,
+     430,   431,   432,   433,   434,   435,   436,   437,   438,   439,
+     440,   441,   442,   443,   444,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,    -1,
+      -1,   319,   320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     338,   339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   350,   351,   352,   353,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,    -1,
+      -1,    -1,    -1,   371,   372,   373,   374,   375,   376,   377,
+     378,   379,   380,   381,   382,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     398,   399,   400,   401,   402,   403,   404,   405,   406,   407,
+     408,   409,   410,   411,   412,    -1,   414,   415,   416,   417,
+     418,   419,   420,   421,   422,   423,   424,   425,   426,   427,
+     428,   429,   430,   431,   432,   433,   434,   435,   436,   437,
+     438,   439,   440,   441,   442,   443,   444,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   349,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,
+     366,   367,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     376,   377,   378,   379,   380,   381,   382,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   398,   399,   400,   401,   402,   403,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   412,    -1,   414,   415,
+     416,   417,   418,   419,   420,   421,   422,   423,   424,   425,
+     426,   427,   428,   429,   430,   431,   432,   433,   434,   435,
+     436,   437,   438,   439,   440,   441,   442,   443,   444,     3,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
       64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
@@ -3060,103 +3158,72 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,    -1,    -1,   321,   322,    -1,
-      -1,    -1,    -1,    -1,   328,   329,   330,   331,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,
-     354,    -1,    -1,    -1,    -1,   359,   360,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   349,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,
+     364,   365,   366,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   375,   376,   377,   378,   379,   380,   381,   382,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   379,   380,   381,   382,   383,
-     384,   385,   386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,    -1,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   398,   399,   400,   401,   402,   403,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   412,    -1,
+     414,   415,   416,   417,   418,   419,   420,   421,   422,   423,
+     424,   425,   426,   427,   428,   429,   430,   431,   432,   433,
+     434,   435,   436,   437,   438,   439,   440,   441,   442,   443,
+     444,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
+     132,   133,   134,   135,   136,   137,   138,   139,   140,   141,
+     142,   143,   144,   145,   146,   147,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   239,   240,   241,
+     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
+     252,   253,   254,   255,   256,   257,   258,   259,   260,   261,
+     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
+     282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,    -1,   320,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,    -1,
-      -1,    -1,    -1,   359,   360,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   344,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   379,   380,   381,   382,   383,   384,   385,
-     386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   401,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    -1,    -1,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
-     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
-     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
-     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
-     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
-     288,   289,   290,   291,   292,   293,   294,    -1,    -1,   297,
-     298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   316,   317,
-      -1,    -1,    -1,   321,    -1,    -1,    -1,    -1,    -1,    -1,
-     328,   329,   330,   331,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   349,   350,   351,   352,   353,   354,    -1,    -1,    -1,
-      -1,   359,   360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   379,   380,   381,   382,   383,   384,   385,   386,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   401,     4,     5,     6,     7,     8,     9,
+      -1,   363,   364,   365,   366,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   376,   377,   378,   379,   380,   381,
+     382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   398,   399,   400,   401,
+     402,   403,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     412,    -1,   414,   415,   416,   417,   418,   419,   420,   421,
+     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,
+     432,   433,   434,   435,   436,   437,   438,   439,   440,   441,
+     442,   443,   444,     3,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
       40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    -1,    -1,    63,    64,    65,    66,    67,    68,    69,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
       70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
       80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
       90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
@@ -3179,18 +3246,153 @@
      260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
      270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
      280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
-     290,   291,   292,   293,   294,    -1,    -1,   297,   298,    -1,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   316,   317,    -1,    -1,
-     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   328,   329,
-     330,   331,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,
-     350,   351,   352,   353,   354,    -1,    -1,    -1,    -1,   359,
-     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   379,
-     380,   381,   382,   383,   384,   385,   386,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   401,     4,     5,     6,     7,     8,     9,    10,    11,
+      -1,    -1,    -1,    -1,   344,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   363,   364,   365,   366,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   376,   377,   378,   379,
+     380,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,   399,
+     400,   401,   402,   403,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   412,    -1,   414,   415,   416,   417,   418,   419,
+     420,   421,   422,   423,   424,   425,   426,   427,   428,   429,
+     430,   431,   432,   433,   434,   435,   436,   437,   438,   439,
+     440,   441,   442,   443,   444,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   234,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     258,   259,   260,   261,   262,   263,   264,   265,   266,   267,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   316,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   344,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   363,   364,   365,   366,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   376,   377,
+     378,   379,   380,   381,   382,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     398,   399,   400,   401,   402,   403,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   412,    -1,   414,   415,   416,   417,
+     418,   419,   420,   421,   422,   423,   424,   425,   426,   427,
+     428,   429,   430,   431,   432,   433,   434,   435,   436,   437,
+     438,   439,   440,   441,   442,   443,   444,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,   364,   365,
+     366,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     376,   377,   378,   379,   380,   381,   382,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   398,   399,   400,   401,   402,   403,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   412,    -1,   414,   415,
+     416,   417,   418,   419,   420,   421,   422,   423,   424,   425,
+     426,   427,   428,   429,   430,   431,   432,   433,   434,   435,
+     436,   437,   438,   439,   440,   441,   442,   443,   444,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    -1,    -1,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,    -1,    -1,   319,   320,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   338,   339,    -1,    -1,    -1,   343,   344,
+      -1,    -1,    -1,    -1,    -1,   350,   351,   352,   353,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   371,   372,   373,   374,
+     375,   376,    -1,    -1,    -1,    -1,   381,   382,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   404,
+     405,   406,   407,   408,   409,   410,   411,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   426,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
@@ -3219,17 +3421,231 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,    -1,    -1,   297,   298,    -1,    -1,    -1,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,    -1,    -1,   319,   320,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   316,   317,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   327,   328,   329,   330,   331,
+      -1,    -1,    -1,    -1,    -1,    -1,   338,   339,    -1,    -1,
+      -1,   343,   344,    -1,    -1,    -1,    -1,    -1,   350,   351,
+     352,   353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   371,
+     372,   373,   374,   375,   376,    -1,    -1,    -1,    -1,   381,
+     382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,   350,   351,
-     352,   353,   354,    -1,    -1,    -1,    -1,   359,   360,    -1,
+      -1,    -1,   404,   405,   406,   407,   408,   409,   410,   411,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   379,   380,   381,
-     382,   383,   384,   385,   386,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,
+      -1,    -1,    -1,    -1,   426,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    -1,    -1,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,   234,   235,   236,   237,   238,
+     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
+     249,   250,   251,   252,   253,   254,   255,   256,   257,   258,
+     259,   260,   261,   262,   263,   264,   265,   266,   267,   268,
+     269,   270,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   296,   297,   298,
+     299,   300,   301,   302,   303,   304,   305,   306,   307,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,    -1,    -1,
+     319,   320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,
+     339,    -1,    -1,   342,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   371,   372,   373,   374,   375,   376,    -1,    -1,
+      -1,    -1,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   404,   405,   406,   407,   408,
+     409,   410,   411,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   426,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
+     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
+     296,   297,   298,   299,   300,   301,   302,   303,   304,   305,
+     306,   307,   308,   309,   310,   311,   312,   313,   314,   315,
+     316,    -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   338,   339,    -1,    -1,    -1,   343,    -1,    -1,
+      -1,    -1,    -1,    -1,   350,   351,   352,   353,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   371,   372,   373,   374,   375,
+     376,    -1,    -1,    -1,    -1,   381,   382,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   404,   405,
+     406,   407,   408,   409,   410,   411,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     426,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    -1,    -1,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,   145,   146,   147,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
+     243,   244,   245,   246,   247,   248,   249,   250,   251,   252,
+     253,   254,   255,   256,   257,   258,   259,   260,   261,   262,
+     263,   264,   265,   266,   267,   268,   269,   270,   271,   272,
+     273,   274,   275,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   286,   287,   288,   289,   290,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,   300,   301,   302,
+     303,   304,   305,   306,   307,   308,   309,   310,   311,   312,
+     313,   314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   338,   339,    -1,    -1,   342,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   350,   351,   352,
+     353,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   371,   372,
+     373,   374,   375,   376,    -1,    -1,    -1,    -1,   381,   382,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   404,   405,   406,   407,   408,   409,   410,   411,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   426,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    -1,    -1,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
+     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,   163,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,   173,   174,   175,   176,   177,   178,   179,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+     190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
+     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+     290,   291,   292,   293,   294,   295,   296,   297,   298,   299,
+     300,   301,   302,   303,   304,   305,   306,   307,   308,   309,
+     310,   311,   312,   313,   314,   315,   316,    -1,    -1,   319,
+     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   338,   339,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   349,
+     350,   351,   352,   353,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   371,   372,   373,   374,   375,   376,    -1,    -1,    -1,
+      -1,   381,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   404,   405,   406,   407,   408,   409,
+     410,   411,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   426,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    -1,    -1,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+     177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   192,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   234,   235,   236,
+     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
+     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,   279,   280,   281,   282,   283,   284,   285,   286,
+     287,   288,   289,   290,   291,   292,   293,   294,   295,   296,
+     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
+     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
+      -1,    -1,   319,   320,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   338,   339,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   350,   351,   352,   353,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   371,   372,   373,   374,   375,   376,
+      -1,    -1,    -1,    -1,   381,   382,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   404,   405,   406,
+     407,   408,   409,   410,   411,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   426,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
@@ -3259,66 +3675,29 @@
      264,   265,   266,   267,   268,   269,   270,   271,   272,   273,
      274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
      284,   285,   286,   287,   288,   289,   290,   291,   292,   293,
-     294,    -1,    -1,   297,   298,    -1,    -1,    -1,    -1,    -1,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,    -1,    -1,   319,   320,    -1,    -1,   413,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   316,   317,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   328,   329,   330,   331,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   349,   350,   351,   352,   353,
-     354,    -1,    -1,    -1,    -1,   359,   360,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   379,   380,   381,   382,   383,
-     384,   385,   386,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   401,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    -1,    -1,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
-     116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
-     126,   127,   128,   129,   130,   131,   132,   133,   134,   135,
-     136,   137,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
-     166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   234,   235,
-     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,   258,   259,   260,   261,   262,   263,   264,   265,
-     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
-     276,   277,   278,   279,   280,   281,   282,   283,   284,   285,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   391,
-      -1,   297,   298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   405,    -1,    -1,    -1,    -1,    -1,    -1,
-     316,   317,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     422,   423,   328,   329,   330,   331,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   349,   350,   351,   352,   353,   354,    -1,
-      -1,    -1,   454,   359,   360,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   465,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   379,   380,   381,   382,   383,   384,   385,
-     386,    -1,   484,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   401,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   427,   338,   339,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   350,   351,   352,   353,
+     444,   445,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   371,   372,   373,
+     374,   375,   376,    -1,    -1,    -1,    -1,   381,   382,    -1,
+      -1,    -1,   476,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   487,    -1,    -1,    -1,    -1,    -1,    -1,
+     404,   405,   406,   407,   408,   409,   410,   411,    -1,    -1,
+      -1,    -1,   506,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   426,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   551,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   564,   565,   566,   567,   568,   569,   570,   571,
-     572,   573,   574,   575,   576,   577,   578,   579,   580,   581,
-     582,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   576,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   589,   590,   591,   592,   593,
+     594,   595,   596,   597,   598,   599,   600,   601,   602,   603,
+     604,   605,   606,   607,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -3328,12 +3707,12 @@
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     682
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   711
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
-static const yytype_uint16 yystos[] =
+static const yytype_int16 yystos[] =
 {
        0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
@@ -3364,120 +3743,125 @@
      262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
      272,   273,   274,   275,   276,   277,   278,   279,   280,   281,
      282,   283,   284,   285,   286,   287,   288,   289,   290,   291,
-     292,   293,   294,   327,   341,   342,   343,   344,   345,   354,
-     355,   356,   357,   358,   359,   360,   373,   374,   375,   376,
-     377,   378,   387,   389,   390,   391,   392,   393,   394,   395,
-     396,   397,   398,   399,   400,   401,   402,   403,   404,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,   414,   415,
-     416,   417,   418,   419,   451,   452,   455,   456,   457,   458,
-     462,   463,   464,   465,   466,   467,   470,   471,   472,   473,
-     474,   476,   481,   482,   483,   524,   525,   526,   482,   321,
-     353,   317,   317,   327,   353,   327,   527,   318,   324,   459,
-     460,   461,   471,   476,   324,   327,   353,   327,   353,   472,
-     476,   335,   478,   479,     0,   525,   476,   485,   321,   353,
-     374,   468,   469,   353,   475,   319,   327,   477,   321,   503,
-     460,   459,   461,   353,   353,   317,   326,   477,   321,   324,
-     327,   454,   297,   298,   316,   317,   328,   329,   330,   331,
-     349,   350,   351,   352,   353,   379,   380,   381,   382,   383,
-     384,   385,   386,   421,   422,   423,   425,   426,   427,   428,
-     429,   430,   431,   432,   433,   474,   476,   480,   477,   327,
-     471,   476,   486,   487,   484,   326,   318,   324,   318,   324,
-     320,   432,   434,   435,   436,   437,   438,   439,   440,   441,
-     442,   443,   444,   445,   319,   327,   319,   321,   322,   327,
-     361,   362,   363,   364,   366,   367,   368,   369,   370,   371,
-     372,   388,   432,   445,   447,   449,   451,   455,   474,   476,
-     492,   493,   494,   495,   496,   504,   505,   506,   507,   510,
-     511,   514,   515,   516,   523,   528,   477,   326,   477,   321,
-     447,   490,   326,   453,   353,   324,   327,   432,   432,   449,
-     297,   298,   319,   323,   318,   318,   324,   360,   447,   317,
-     432,   324,   336,   476,   353,   488,   489,   322,   487,   486,
-     445,   450,   469,   353,   332,   333,   334,   329,   331,   295,
-     296,   299,   300,   335,   336,   301,   302,   339,   338,   337,
-     303,   305,   304,   340,   320,   320,   445,   319,   322,   497,
-     317,   327,   327,   518,   317,   317,   327,   327,   449,   317,
-     449,   325,   327,   306,   307,   308,   309,   310,   311,   312,
-     313,   314,   315,   326,   448,   324,   327,   322,   493,   507,
-     511,   516,   490,   326,   490,   491,   490,   486,   353,   318,
-     424,   449,   353,   447,   432,   488,   477,   324,   327,   322,
-     432,   432,   432,   434,   434,   435,   435,   436,   436,   436,
-     436,   437,   437,   438,   439,   440,   441,   442,   443,   446,
-     320,   353,   529,   530,   504,   517,   493,   519,   449,   327,
-     449,   325,   447,   447,   490,   322,   324,   322,   320,   327,
-     489,   449,   317,   320,   324,   498,   449,   464,   471,   509,
-     361,   492,   505,   520,   318,   318,   322,   490,   325,   450,
-     320,   530,   322,   353,   318,   317,   509,   521,   522,   500,
-     501,   502,   508,   512,   447,   318,   326,   494,   499,   503,
-     449,   327,   318,   365,   496,   494,   321,   490,   318,   449,
-     499,   500,   504,   513,   327,   322
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,   349,   363,   364,   365,   366,
+     367,   376,   377,   378,   379,   380,   381,   382,   398,   399,
+     400,   401,   402,   403,   412,   414,   415,   416,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,   426,   427,   428,
+     429,   430,   431,   432,   433,   434,   435,   436,   437,   438,
+     439,   440,   441,   442,   443,   444,   476,   477,   480,   481,
+     482,   483,   487,   488,   489,   490,   491,   492,   495,   496,
+     497,   498,   499,   501,   506,   507,   508,   549,   550,   551,
+     507,   343,   375,   339,   339,   349,   375,   349,   552,   340,
+     346,   484,   485,   486,   496,   501,   346,   349,   375,   349,
+     375,   497,   501,   357,   503,   504,     0,   550,   501,   510,
+     343,   375,   399,   493,   494,   375,   500,   341,   349,   502,
+     343,   528,   485,   484,   486,   375,   375,   339,   348,   502,
+     343,   346,   349,   479,   319,   320,   338,   339,   350,   351,
+     352,   353,   371,   372,   373,   374,   375,   404,   405,   406,
+     407,   408,   409,   410,   411,   446,   447,   448,   450,   451,
+     452,   453,   454,   455,   456,   457,   458,   499,   501,   505,
+     502,   349,   496,   501,   511,   512,   509,   348,   340,   346,
+     340,   346,   342,   457,   459,   460,   461,   462,   463,   464,
+     465,   466,   467,   468,   469,   470,   341,   349,   341,   343,
+     344,   349,   383,   384,   385,   386,   388,   389,   390,   391,
+     392,   393,   394,   395,   396,   397,   413,   457,   470,   472,
+     474,   476,   480,   499,   501,   517,   518,   519,   520,   521,
+     529,   530,   531,   532,   535,   536,   539,   540,   541,   548,
+     553,   502,   348,   502,   343,   472,   515,   348,   478,   375,
+     346,   349,   457,   457,   474,   319,   320,   341,   345,   340,
+     340,   346,   382,   472,   339,   457,   346,   358,   501,   375,
+     513,   514,   344,   512,   511,   470,   475,   494,   375,   354,
+     355,   356,   351,   353,   317,   318,   321,   322,   357,   358,
+     323,   324,   361,   360,   359,   325,   327,   326,   362,   342,
+     342,   470,   341,   344,   522,   339,   349,   349,   543,   339,
+     339,   349,   349,   474,   339,   474,   347,   349,   349,   349,
+     349,   328,   329,   330,   331,   332,   333,   334,   335,   336,
+     337,   348,   473,   346,   349,   344,   518,   532,   536,   541,
+     515,   348,   344,   515,   516,   515,   511,   375,   340,   449,
+     474,   375,   472,   457,   513,   502,   346,   349,   344,   457,
+     457,   457,   459,   459,   460,   460,   461,   461,   461,   461,
+     462,   462,   463,   464,   465,   466,   467,   468,   471,   342,
+     375,   554,   555,   529,   542,   518,   544,   474,   349,   474,
+     347,   472,   472,   515,   344,   346,   344,   342,   349,   514,
+     474,   339,   342,   346,   523,   474,   489,   496,   534,   383,
+     517,   530,   545,   340,   340,   344,   515,   347,   475,   342,
+     555,   344,   375,   340,   339,   534,   546,   547,   525,   526,
+     527,   533,   537,   472,   340,   348,   519,   524,   528,   474,
+     349,   340,   387,   521,   519,   343,   515,   340,   474,   524,
+     525,   529,   538,   349,   344
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint16 yyr1[] =
+static const yytype_int16 yyr1[] =
 {
-       0,   420,   421,   422,   422,   422,   422,   422,   422,   422,
-     422,   422,   422,   422,   422,   422,   422,   422,   423,   423,
-     423,   423,   423,   423,   424,   425,   426,   427,   427,   428,
-     428,   429,   429,   430,   431,   431,   431,   432,   432,   432,
-     432,   433,   433,   433,   433,   434,   434,   434,   434,   435,
-     435,   435,   436,   436,   436,   437,   437,   437,   437,   437,
-     438,   438,   438,   439,   439,   440,   440,   441,   441,   442,
-     442,   443,   443,   444,   444,   445,   446,   445,   447,   447,
-     448,   448,   448,   448,   448,   448,   448,   448,   448,   448,
-     448,   449,   449,   450,   451,   451,   451,   451,   451,   451,
-     451,   451,   451,   453,   452,   454,   454,   455,   456,   456,
-     457,   457,   458,   459,   459,   460,   460,   460,   460,   461,
-     462,   462,   462,   462,   462,   463,   463,   463,   463,   463,
-     464,   464,   465,   466,   466,   466,   466,   466,   466,   466,
-     466,   467,   468,   468,   469,   469,   469,   470,   471,   471,
-     472,   472,   472,   472,   472,   472,   472,   473,   473,   473,
+       0,   445,   446,   447,   447,   447,   447,   447,   447,   447,
+     447,   447,   447,   447,   447,   447,   447,   447,   448,   448,
+     448,   448,   448,   448,   449,   450,   451,   452,   452,   453,
+     453,   454,   454,   455,   456,   456,   456,   457,   457,   457,
+     457,   458,   458,   458,   458,   459,   459,   459,   459,   460,
+     460,   460,   461,   461,   461,   462,   462,   462,   462,   462,
+     463,   463,   463,   464,   464,   465,   465,   466,   466,   467,
+     467,   468,   468,   469,   469,   470,   471,   470,   472,   472,
      473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   474,   475,   475,   476,   476,   477,   477,   477,
-     477,   478,   478,   479,   480,   480,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   481,   481,
-     481,   481,   481,   481,   481,   481,   481,   481,   482,   482,
-     482,   484,   483,   485,   483,   486,   486,   487,   487,   488,
-     488,   489,   489,   490,   490,   490,   491,   491,   492,   493,
-     493,   494,   494,   494,   494,   494,   494,   494,   494,   495,
-     496,   497,   498,   496,   499,   499,   501,   500,   502,   500,
-     503,   503,   504,   504,   505,   505,   506,   506,   507,   508,
-     508,   509,   509,   510,   510,   512,   511,   513,   513,   514,
-     514,   515,   515,   517,   516,   518,   516,   519,   516,   520,
-     520,   521,   521,   522,   522,   523,   523,   523,   523,   523,
-     524,   524,   525,   525,   525,   527,   526,   528,   529,   529,
-     530,   530
+     473,   474,   474,   475,   476,   476,   476,   476,   476,   476,
+     476,   476,   476,   478,   477,   479,   479,   480,   481,   481,
+     482,   482,   483,   484,   484,   485,   485,   485,   485,   486,
+     487,   487,   487,   487,   487,   488,   488,   488,   488,   488,
+     489,   489,   490,   491,   491,   491,   491,   491,   491,   491,
+     491,   492,   493,   493,   494,   494,   494,   495,   496,   496,
+     497,   497,   497,   497,   497,   497,   497,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   498,   498,   498,   498,   498,   498,   498,   498,
+     498,   498,   499,   500,   500,   501,   501,   502,   502,   502,
+     502,   503,   503,   504,   505,   505,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     506,   506,   506,   506,   506,   506,   506,   506,   506,   506,
+     507,   507,   507,   509,   508,   510,   508,   511,   511,   512,
+     512,   513,   513,   514,   514,   515,   515,   515,   515,   516,
+     516,   517,   518,   518,   519,   519,   519,   519,   519,   519,
+     519,   519,   520,   521,   522,   523,   521,   524,   524,   526,
+     525,   527,   525,   528,   528,   529,   529,   530,   530,   531,
+     531,   532,   533,   533,   534,   534,   535,   535,   537,   536,
+     538,   538,   539,   539,   540,   540,   542,   541,   543,   541,
+     544,   541,   545,   545,   546,   546,   547,   547,   548,   548,
+     548,   548,   548,   548,   548,   548,   549,   549,   550,   550,
+     550,   552,   551,   553,   554,   554,   555,   555
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
+static const yytype_int8 yyr2[] =
 {
        0,     2,     1,     1,     3,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     4,
@@ -3529,23 +3913,25 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     0,     6,     0,     5,     1,     2,     3,     4,     1,
-       3,     1,     2,     1,     3,     4,     1,     3,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
-       2,     0,     0,     5,     1,     1,     0,     2,     0,     2,
-       2,     3,     1,     2,     1,     2,     1,     2,     5,     3,
-       1,     1,     4,     1,     2,     0,     8,     0,     1,     3,
-       2,     1,     2,     0,     6,     0,     8,     0,     7,     1,
-       1,     1,     0,     2,     3,     2,     2,     2,     3,     2,
-       1,     2,     1,     1,     1,     0,     3,     5,     1,     3,
-       1,     4
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     6,     0,     5,     1,     2,     3,
+       4,     1,     3,     1,     2,     1,     3,     4,     2,     1,
+       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     2,     2,     0,     0,     5,     1,     1,     0,
+       2,     0,     2,     2,     3,     1,     2,     1,     2,     1,
+       2,     5,     3,     1,     1,     4,     1,     2,     0,     8,
+       0,     1,     3,     2,     1,     2,     0,     6,     0,     8,
+       0,     7,     1,     1,     1,     0,     2,     3,     2,     2,
+       2,     3,     2,     2,     2,     2,     1,     2,     1,     1,
+       1,     0,     3,     5,     1,     3,     1,     4
 };
 
 
+enum { YYENOMEM = -2 };
+
 #define yyerrok         (yyerrstatus = 0)
 #define yyclearin       (yychar = YYEMPTY)
-#define YYEMPTY         (-2)
-#define YYEOF           0
 
 #define YYACCEPT        goto yyacceptlab
 #define YYABORT         goto yyabortlab
@@ -3554,27 +3940,26 @@
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                  \
-do                                                              \
-  if (yychar == YYEMPTY)                                        \
-    {                                                           \
-      yychar = (Token);                                         \
-      yylval = (Value);                                         \
-      YYPOPSTACK (yylen);                                       \
-      yystate = *yyssp;                                         \
-      goto yybackup;                                            \
-    }                                                           \
-  else                                                          \
-    {                                                           \
-      yyerror (pParseContext, YY_("syntax error: cannot back up")); \
-      YYERROR;                                                  \
-    }                                                           \
-while (0)
+#define YYBACKUP(Token, Value)                                    \
+  do                                                              \
+    if (yychar == YYEMPTY)                                        \
+      {                                                           \
+        yychar = (Token);                                         \
+        yylval = (Value);                                         \
+        YYPOPSTACK (yylen);                                       \
+        yystate = *yyssp;                                         \
+        goto yybackup;                                            \
+      }                                                           \
+    else                                                          \
+      {                                                           \
+        yyerror (pParseContext, YY_("syntax error: cannot back up")); \
+        YYERROR;                                                  \
+      }                                                           \
+  while (0)
 
-/* Error token number */
-#define YYTERROR        1
-#define YYERRCODE       256
-
+/* Backward compatibility with an undocumented macro.
+   Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
 
 
 /* Enable debugging if requested.  */
@@ -3592,55 +3977,59 @@
 } while (0)
 
 /* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
+# ifndef YY_LOCATION_PRINT
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
 
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \
 do {                                                                      \
   if (yydebug)                                                            \
     {                                                                     \
       YYFPRINTF (stderr, "%s ", Title);                                   \
       yy_symbol_print (stderr,                                            \
-                  Type, Value, pParseContext); \
+                  Kind, Value, pParseContext); \
       YYFPRINTF (stderr, "\n");                                           \
     }                                                                     \
 } while (0)
 
 
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT.  |
-`----------------------------------------*/
+/*-----------------------------------.
+| Print this symbol's value on YYO.  |
+`-----------------------------------*/
 
 static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
+yy_symbol_value_print (FILE *yyo,
+                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
 {
-  FILE *yyo = yyoutput;
-  YYUSE (yyo);
+  FILE *yyoutput = yyo;
+  YYUSE (yyoutput);
   YYUSE (pParseContext);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+  if (yykind < YYNTOKENS)
+    YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
 # endif
-  YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  YYUSE (yykind);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+/*---------------------------.
+| Print this symbol on YYO.  |
+`---------------------------*/
 
 static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
+yy_symbol_print (FILE *yyo,
+                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext)
 {
-  YYFPRINTF (yyoutput, "%s %s (",
-             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+  YYFPRINTF (yyo, "%s %s (",
+             yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
 
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, pParseContext);
-  YYFPRINTF (yyoutput, ")");
+  yy_symbol_value_print (yyo, yykind, yyvaluep, pParseContext);
+  YYFPRINTF (yyo, ")");
 }
 
 /*------------------------------------------------------------------.
@@ -3649,7 +4038,7 @@
 `------------------------------------------------------------------*/
 
 static void
-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -3672,21 +4061,21 @@
 `------------------------------------------------*/
 
 static void
-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, glslang::TParseContext* pParseContext)
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+                 int yyrule, glslang::TParseContext* pParseContext)
 {
-  unsigned long int yylno = yyrline[yyrule];
+  int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
              yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr,
-                       yystos[yyssp[yyi + 1 - yynrhs]],
-                       &(yyvsp[(yyi + 1) - (yynrhs)])
-                                              , pParseContext);
+                       YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+                       &yyvsp[(yyi + 1) - (yynrhs)], pParseContext);
       YYFPRINTF (stderr, "\n");
     }
 }
@@ -3701,8 +4090,8 @@
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
 # define YY_STACK_PRINT(Bottom, Top)
 # define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
@@ -3725,28 +4114,76 @@
 #endif
 
 
-#if YYERROR_VERBOSE
+/* Context of a parse error.  */
+typedef struct
+{
+  yy_state_t *yyssp;
+  yysymbol_kind_t yytoken;
+} yypcontext_t;
 
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
+/* Put in YYARG at most YYARGN of the expected tokens given the
+   current YYCTX, and return the number of tokens stored in YYARG.  If
+   YYARG is null, return the number of expected tokens (guaranteed to
+   be less than YYNTOKENS).  Return YYENOMEM on memory exhaustion.
+   Return 0 if there are more than YYARGN expected tokens, yet fill
+   YYARG up to YYARGN. */
+static int
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+                            yysymbol_kind_t yyarg[], int yyargn)
+{
+  /* Actual size of YYARG. */
+  int yycount = 0;
+  int yyn = yypact[+*yyctx->yyssp];
+  if (!yypact_value_is_default (yyn))
+    {
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+         YYCHECK.  In other words, skip the first -YYN actions for
+         this state because they are default actions.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yyx;
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+        if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror
+            && !yytable_value_is_error (yytable[yyx + yyn]))
+          {
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx);
+          }
+    }
+  if (yyarg && yycount == 0 && 0 < yyargn)
+    yyarg[0] = YYSYMBOL_YYEMPTY;
+  return yycount;
+}
+
+
+
+
+#ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+#  define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+# else
 /* Return the length of YYSTR.  */
-static YYSIZE_T
+static YYPTRDIFF_T
 yystrlen (const char *yystr)
 {
-  YYSIZE_T yylen;
+  YYPTRDIFF_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
     continue;
   return yylen;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
+#ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#  define yystpcpy stpcpy
+# else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
 static char *
@@ -3760,10 +4197,10 @@
 
   return yyd - 1;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yytnamerr
+#ifndef yytnamerr
 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
    quotes and backslashes, so that it's suitable for yyerror.  The
    heuristic is that double-quoting is unnecessary unless the string
@@ -3771,14 +4208,13 @@
    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
    null, do not copy; instead, return the length of what the result
    would have been.  */
-static YYSIZE_T
+static YYPTRDIFF_T
 yytnamerr (char *yyres, const char *yystr)
 {
   if (*yystr == '"')
     {
-      YYSIZE_T yyn = 0;
+      YYPTRDIFF_T yyn = 0;
       char const *yyp = yystr;
-
       for (;;)
         switch (*++yyp)
           {
@@ -3789,7 +4225,10 @@
           case '\\':
             if (*++yyp != '\\')
               goto do_not_strip_quotes;
-            /* Fall through.  */
+            else
+              goto append;
+
+          append:
           default:
             if (yyres)
               yyres[yyn] = *yyp;
@@ -3804,36 +4243,20 @@
     do_not_strip_quotes: ;
     }
 
-  if (! yyres)
+  if (yyres)
+    return yystpcpy (yyres, yystr) - yyres;
+  else
     return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
 }
-# endif
+#endif
 
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.
 
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store.  */
 static int
-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
-                yytype_int16 *yyssp, int yytoken)
+yy_syntax_error_arguments (const yypcontext_t *yyctx,
+                           yysymbol_kind_t yyarg[], int yyargn)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
-  YYSIZE_T yysize = yysize0;
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat. */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-  /* Number of reported tokens (one for the "unexpected", one per
-     "expected"). */
+  /* Actual size of YYARG. */
   int yycount = 0;
-
   /* There are many possibilities here to consider:
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
@@ -3857,63 +4280,78 @@
        one exception: it will still contain any token that will not be
        accepted due to an error action in a later state.
   */
-  if (yytoken != YYEMPTY)
+  if (yyctx->yytoken != YYSYMBOL_YYEMPTY)
     {
-      int yyn = yypact[*yyssp];
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for
-             this state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (! (yysize <= yysize1
-                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                    return 2;
-                  yysize = yysize1;
-                }
-              }
-        }
+      int yyn;
+      if (yyarg)
+        yyarg[yycount] = yyctx->yytoken;
+      ++yycount;
+      yyn = yypcontext_expected_tokens (yyctx,
+                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+      if (yyn == YYENOMEM)
+        return YYENOMEM;
+      else
+        yycount += yyn;
     }
+  return yycount;
+}
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return -1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return YYENOMEM if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
+                const yypcontext_t *yyctx)
+{
+  enum { YYARGS_MAX = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  yysymbol_kind_t yyarg[YYARGS_MAX];
+  /* Cumulated lengths of YYARG.  */
+  YYPTRDIFF_T yysize = 0;
+
+  /* Actual size of YYARG. */
+  int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);
+  if (yycount == YYENOMEM)
+    return YYENOMEM;
 
   switch (yycount)
     {
-# define YYCASE_(N, S)                      \
+#define YYCASE_(N, S)                       \
       case N:                               \
         yyformat = S;                       \
-      break
+        break
+    default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
       YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
       YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
       YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
+#undef YYCASE_
     }
 
+  /* Compute error message size.  Don't count the "%s"s, but reserve
+     room for the terminator.  */
+  yysize = yystrlen (yyformat) - 2 * yycount + 1;
   {
-    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
-    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-      return 2;
-    yysize = yysize1;
+    int yyi;
+    for (yyi = 0; yyi < yycount; ++yyi)
+      {
+        YYPTRDIFF_T yysize1
+          = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]);
+        if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+          yysize = yysize1;
+        else
+          return YYENOMEM;
+      }
   }
 
   if (*yymsg_alloc < yysize)
@@ -3922,7 +4360,7 @@
       if (! (yysize <= *yymsg_alloc
              && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
         *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
+      return -1;
     }
 
   /* Avoid sprintf, as that infringes on the user's name space.
@@ -3934,40 +4372,43 @@
     while ((*yyp = *yyformat) != '\0')
       if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
         {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);
           yyformat += 2;
         }
       else
         {
-          yyp++;
-          yyformat++;
+          ++yyp;
+          ++yyformat;
         }
   }
   return 0;
 }
-#endif /* YYERROR_VERBOSE */
+
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
 static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext)
+yydestruct (const char *yymsg,
+            yysymbol_kind_t yykind, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext)
 {
   YYUSE (yyvaluep);
   YYUSE (pParseContext);
   if (!yymsg)
     yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  YYUSE (yytype);
+  YYUSE (yykind);
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
 
 
+
+
 /*----------.
 | yyparse.  |
 `----------*/
@@ -3975,7 +4416,7 @@
 int
 yyparse (glslang::TParseContext* pParseContext)
 {
-/* The lookahead symbol.  */
+/* Lookahead token kind.  */
 int yychar;
 
 
@@ -3986,45 +4427,41 @@
 YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
 
     /* Number of syntax errors so far.  */
-    int yynerrs;
+    int yynerrs = 0;
 
-    int yystate;
+    yy_state_fast_t yystate = 0;
     /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
+    int yyerrstatus = 0;
 
-    /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.
-
-       Refer to the stacks through separate pointers, to allow yyoverflow
+    /* Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
-    /* The state stack.  */
-    yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyss;
-    yytype_int16 *yyssp;
+    /* Their size.  */
+    YYPTRDIFF_T yystacksize = YYINITDEPTH;
 
-    /* The semantic value stack.  */
+    /* The state stack: array, bottom, top.  */
+    yy_state_t yyssa[YYINITDEPTH];
+    yy_state_t *yyss = yyssa;
+    yy_state_t *yyssp = yyss;
+
+    /* The semantic value stack: array, bottom, top.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
-
-    YYSIZE_T yystacksize;
+    YYSTYPE *yyvs = yyvsa;
+    YYSTYPE *yyvsp = yyvs;
 
   int yyn;
+  /* The return value of yyparse.  */
   int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  /* Lookahead symbol kind.  */
+  yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
-#if YYERROR_VERBOSE
   /* Buffer for error messages, and its allocated size.  */
   char yymsgbuf[128];
   char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
+  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
 
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
@@ -4032,58 +4469,60 @@
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;
-  yystacksize = YYINITDEPTH;
-
   YYDPRINTF ((stderr, "Starting parse\n"));
 
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
   goto yysetstate;
 
+
 /*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
+| yynewstate -- push a new state, which is found in yystate.  |
 `------------------------------------------------------------*/
- yynewstate:
+yynewstate:
   /* In all cases, when you get here, the value and location stacks
      have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
- yysetstate:
-  *yyssp = yystate;
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate.  |
+`--------------------------------------------------------------------*/
+yysetstate:
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+  YY_IGNORE_USELESS_CAST_BEGIN
+  *yyssp = YY_CAST (yy_state_t, yystate);
+  YY_IGNORE_USELESS_CAST_END
+  YY_STACK_PRINT (yyss, yyssp);
 
   if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+    goto yyexhaustedlab;
+#else
     {
       /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
+      YYPTRDIFF_T yysize = yyssp - yyss + 1;
 
-#ifdef yyoverflow
+# if defined yyoverflow
       {
         /* Give user a chance to reallocate the stack.  Use copies of
            these so that the &'s don't force the real ones into
            memory.  */
+        yy_state_t *yyss1 = yyss;
         YYSTYPE *yyvs1 = yyvs;
-        yytype_int16 *yyss1 = yyss;
 
         /* Each stack pointer address is followed by the size of the
            data in use in that stack, in bytes.  This used to be a
            conditional around just the two extra args, but that might
            be undefined if yyoverflow is a macro.  */
         yyoverflow (YY_("memory exhausted"),
-                    &yyss1, yysize * sizeof (*yyssp),
-                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yyss1, yysize * YYSIZEOF (*yyssp),
+                    &yyvs1, yysize * YYSIZEOF (*yyvsp),
                     &yystacksize);
-
         yyss = yyss1;
         yyvs = yyvs1;
       }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
+# else /* defined YYSTACK_RELOCATE */
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
         goto yyexhaustedlab;
@@ -4092,9 +4531,10 @@
         yystacksize = YYMAXDEPTH;
 
       {
-        yytype_int16 *yyss1 = yyss;
+        yy_state_t *yyss1 = yyss;
         union yyalloc *yyptr =
-          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+          YY_CAST (union yyalloc *,
+                   YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
         if (! yyptr)
           goto yyexhaustedlab;
         YYSTACK_RELOCATE (yyss_alloc, yyss);
@@ -4104,30 +4544,30 @@
           YYSTACK_FREE (yyss1);
       }
 # endif
-#endif /* no yyoverflow */
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-                  (unsigned long int) yystacksize));
+      YY_IGNORE_USELESS_CAST_BEGIN
+      YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+                  YY_CAST (long, yystacksize)));
+      YY_IGNORE_USELESS_CAST_END
 
       if (yyss + yystacksize - 1 <= yyssp)
         YYABORT;
     }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 
   if (yystate == YYFINAL)
     YYACCEPT;
 
   goto yybackup;
 
+
 /*-----------.
 | yybackup.  |
 `-----------*/
 yybackup:
-
   /* Do appropriate processing given the current state.  Read a
      lookahead token if we need one and don't already have one.  */
 
@@ -4138,18 +4578,29 @@
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
   if (yychar == YYEMPTY)
     {
-      YYDPRINTF ((stderr, "Reading a token: "));
+      YYDPRINTF ((stderr, "Reading a token\n"));
       yychar = yylex (&yylval, parseContext);
     }
 
   if (yychar <= YYEOF)
     {
-      yychar = yytoken = YYEOF;
+      yychar = YYEOF;
+      yytoken = YYSYMBOL_YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
+  else if (yychar == YYerror)
+    {
+      /* The scanner already issued an error message, process directly
+         to error recovery.  But do not keep the error token as
+         lookahead, it is too special and may lead us to an endless
+         loop in error recovery. */
+      yychar = YYUNDEF;
+      yytoken = YYSYMBOL_YYerror;
+      goto yyerrlab1;
+    }
   else
     {
       yytoken = YYTRANSLATE (yychar);
@@ -4177,15 +4628,13 @@
 
   /* Shift the lookahead token.  */
   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token.  */
-  yychar = YYEMPTY;
-
   yystate = yyn;
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
   goto yynewstate;
 
 
@@ -4200,7 +4649,7 @@
 
 
 /*-----------------------------.
-| yyreduce -- Do a reduction.  |
+| yyreduce -- do a reduction.  |
 `-----------------------------*/
 yyreduce:
   /* yyn is the number of a rule to reduce with.  */
@@ -4220,304 +4669,304 @@
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 2:
-#line 357 "glslang.y" /* yacc.c:1646  */
-    {
+  case 2: /* variable_identifier: IDENTIFIER  */
+#line 371 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string);
     }
-#line 4229 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4678 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 3:
-#line 363 "glslang.y" /* yacc.c:1646  */
-    {
+  case 3: /* primary_expression: variable_identifier  */
+#line 377 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4237 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4686 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 4:
-#line 366 "glslang.y" /* yacc.c:1646  */
-    {
+  case 4: /* primary_expression: LEFT_PAREN expression RIGHT_PAREN  */
+#line 380 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
         if ((yyval.interm.intermTypedNode)->getAsConstantUnion())
             (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
     }
-#line 4247 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4696 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 5:
-#line 371 "glslang.y" /* yacc.c:1646  */
-    {
+  case 5: /* primary_expression: FLOATCONSTANT  */
+#line 385 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);
     }
-#line 4255 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4704 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 6:
-#line 374 "glslang.y" /* yacc.c:1646  */
-    {
+  case 6: /* primary_expression: INTCONSTANT  */
+#line 388 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4263 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4712 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 7:
-#line 377 "glslang.y" /* yacc.c:1646  */
-    {
+  case 7: /* primary_expression: UINTCONSTANT  */
+#line 391 "MachineIndependent/glslang.y"
+                   {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4272 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4721 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 8:
-#line 381 "glslang.y" /* yacc.c:1646  */
-    {
+  case 8: /* primary_expression: BOOLCONSTANT  */
+#line 395 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);
     }
-#line 4280 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4729 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 9:
-#line 385 "glslang.y" /* yacc.c:1646  */
-    {
+  case 9: /* primary_expression: STRING_LITERAL  */
+#line 399 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true);
     }
-#line 4288 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4737 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 10:
-#line 388 "glslang.y" /* yacc.c:1646  */
-    {
+  case 10: /* primary_expression: INT32CONSTANT  */
+#line 402 "MachineIndependent/glslang.y"
+                    {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4297 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4746 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 11:
-#line 392 "glslang.y" /* yacc.c:1646  */
-    {
+  case 11: /* primary_expression: UINT32CONSTANT  */
+#line 406 "MachineIndependent/glslang.y"
+                     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4306 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4755 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 12:
-#line 396 "glslang.y" /* yacc.c:1646  */
-    {
+  case 12: /* primary_expression: INT64CONSTANT  */
+#line 410 "MachineIndependent/glslang.y"
+                    {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true);
     }
-#line 4315 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4764 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 13:
-#line 400 "glslang.y" /* yacc.c:1646  */
-    {
+  case 13: /* primary_expression: UINT64CONSTANT  */
+#line 414 "MachineIndependent/glslang.y"
+                     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true);
     }
-#line 4324 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4773 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 14:
-#line 404 "glslang.y" /* yacc.c:1646  */
-    {
+  case 14: /* primary_expression: INT16CONSTANT  */
+#line 418 "MachineIndependent/glslang.y"
+                    {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4333 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4782 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 15:
-#line 408 "glslang.y" /* yacc.c:1646  */
-    {
+  case 15: /* primary_expression: UINT16CONSTANT  */
+#line 422 "MachineIndependent/glslang.y"
+                     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4342 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4791 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 16:
-#line 412 "glslang.y" /* yacc.c:1646  */
-    {
+  case 16: /* primary_expression: DOUBLECONSTANT  */
+#line 426 "MachineIndependent/glslang.y"
+                     {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double literal");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true);
     }
-#line 4353 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4802 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 17:
-#line 418 "glslang.y" /* yacc.c:1646  */
-    {
+  case 17: /* primary_expression: FLOAT16CONSTANT  */
+#line 432 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true);
     }
-#line 4362 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4811 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 18:
-#line 426 "glslang.y" /* yacc.c:1646  */
-    {
+  case 18: /* postfix_expression: primary_expression  */
+#line 440 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4370 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4819 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 19:
-#line 429 "glslang.y" /* yacc.c:1646  */
-    {
+  case 19: /* postfix_expression: postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET  */
+#line 443 "MachineIndependent/glslang.y"
+                                                                       {
         (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4378 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4827 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 20:
-#line 432 "glslang.y" /* yacc.c:1646  */
-    {
+  case 20: /* postfix_expression: function_call  */
+#line 446 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4386 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4835 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 21:
-#line 435 "glslang.y" /* yacc.c:1646  */
-    {
+  case 21: /* postfix_expression: postfix_expression DOT IDENTIFIER  */
+#line 449 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);
     }
-#line 4394 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4843 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 22:
-#line 438 "glslang.y" /* yacc.c:1646  */
-    {
+  case 22: /* postfix_expression: postfix_expression INC_OP  */
+#line 452 "MachineIndependent/glslang.y"
+                                {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4404 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4853 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 23:
-#line 443 "glslang.y" /* yacc.c:1646  */
-    {
+  case 23: /* postfix_expression: postfix_expression DEC_OP  */
+#line 457 "MachineIndependent/glslang.y"
+                                {
         parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode));
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4414 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4863 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 24:
-#line 451 "glslang.y" /* yacc.c:1646  */
-    {
+  case 24: /* integer_expression: expression  */
+#line 465 "MachineIndependent/glslang.y"
+                 {
         parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4423 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4872 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 25:
-#line 458 "glslang.y" /* yacc.c:1646  */
-    {
+  case 25: /* function_call: function_call_or_method  */
+#line 472 "MachineIndependent/glslang.y"
+                              {
         (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode);
         delete (yyvsp[0].interm).function;
     }
-#line 4432 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4881 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 26:
-#line 465 "glslang.y" /* yacc.c:1646  */
-    {
+  case 26: /* function_call_or_method: function_call_generic  */
+#line 479 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4440 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4889 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 27:
-#line 471 "glslang.y" /* yacc.c:1646  */
-    {
+  case 27: /* function_call_generic: function_call_header_with_parameters RIGHT_PAREN  */
+#line 485 "MachineIndependent/glslang.y"
+                                                       {
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4449 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4898 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 28:
-#line 475 "glslang.y" /* yacc.c:1646  */
-    {
+  case 28: /* function_call_generic: function_call_header_no_parameters RIGHT_PAREN  */
+#line 489 "MachineIndependent/glslang.y"
+                                                     {
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4458 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4907 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 29:
-#line 482 "glslang.y" /* yacc.c:1646  */
-    {
+  case 29: /* function_call_header_no_parameters: function_call_header VOID  */
+#line 496 "MachineIndependent/glslang.y"
+                                {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4466 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4915 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 30:
-#line 485 "glslang.y" /* yacc.c:1646  */
-    {
+  case 30: /* function_call_header_no_parameters: function_call_header  */
+#line 499 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4474 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4923 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 31:
-#line 491 "glslang.y" /* yacc.c:1646  */
-    {
+  case 31: /* function_call_header_with_parameters: function_call_header assignment_expression  */
+#line 505 "MachineIndependent/glslang.y"
+                                                 {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
         (yyvsp[-1].interm).function->addParameter(param);
         (yyval.interm).function = (yyvsp[-1].interm).function;
         (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4486 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4935 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 32:
-#line 498 "glslang.y" /* yacc.c:1646  */
-    {
+  case 32: /* function_call_header_with_parameters: function_call_header_with_parameters COMMA assignment_expression  */
+#line 512 "MachineIndependent/glslang.y"
+                                                                       {
         TParameter param = { 0, new TType };
         param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType());
         (yyvsp[-2].interm).function->addParameter(param);
         (yyval.interm).function = (yyvsp[-2].interm).function;
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
     }
-#line 4498 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4947 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 33:
-#line 508 "glslang.y" /* yacc.c:1646  */
-    {
+  case 33: /* function_call_header: function_identifier LEFT_PAREN  */
+#line 522 "MachineIndependent/glslang.y"
+                                     {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4506 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4955 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 34:
-#line 516 "glslang.y" /* yacc.c:1646  */
-    {
+  case 34: /* function_identifier: type_specifier  */
+#line 530 "MachineIndependent/glslang.y"
+                     {
         // Constructor
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 4516 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4965 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 35:
-#line 521 "glslang.y" /* yacc.c:1646  */
-    {
+  case 35: /* function_identifier: postfix_expression  */
+#line 535 "MachineIndependent/glslang.y"
+                         {
         //
         // Should be a method or subroutine call, but we haven't recognized the arguments yet.
         //
@@ -4544,51 +4993,51 @@
             (yyval.interm).function = new TFunction(empty, TType(EbtVoid), EOpNull);
         }
     }
-#line 4548 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 4997 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 36:
-#line 549 "glslang.y" /* yacc.c:1646  */
-    {
+  case 36: /* function_identifier: non_uniform_qualifier  */
+#line 563 "MachineIndependent/glslang.y"
+                            {
         // Constructor
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 4558 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5007 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 37:
-#line 558 "glslang.y" /* yacc.c:1646  */
-    {
+  case 37: /* unary_expression: postfix_expression  */
+#line 572 "MachineIndependent/glslang.y"
+                         {
         parseContext.variableCheck((yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode())
             parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), "");
     }
-#line 4569 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5018 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 38:
-#line 564 "glslang.y" /* yacc.c:1646  */
-    {
+  case 38: /* unary_expression: INC_OP unary_expression  */
+#line 578 "MachineIndependent/glslang.y"
+                              {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4578 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5027 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 39:
-#line 568 "glslang.y" /* yacc.c:1646  */
-    {
+  case 39: /* unary_expression: DEC_OP unary_expression  */
+#line 582 "MachineIndependent/glslang.y"
+                              {
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4587 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5036 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 40:
-#line 572 "glslang.y" /* yacc.c:1646  */
-    {
+  case 40: /* unary_expression: unary_operator unary_expression  */
+#line 586 "MachineIndependent/glslang.y"
+                                      {
         if ((yyvsp[-1].interm).op != EOpNull) {
             char errorOp[2] = {0, 0};
             switch((yyvsp[-1].interm).op) {
@@ -4604,180 +5053,180 @@
                 (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
         }
     }
-#line 4608 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5057 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 41:
-#line 592 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
-#line 4614 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 41: /* unary_operator: PLUS  */
+#line 606 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
+#line 5063 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 42:
-#line 593 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
-#line 4620 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 42: /* unary_operator: DASH  */
+#line 607 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
+#line 5069 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 43:
-#line 594 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
-#line 4626 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 43: /* unary_operator: BANG  */
+#line 608 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
+#line 5075 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 44:
-#line 595 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
+  case 44: /* unary_operator: TILDE  */
+#line 609 "MachineIndependent/glslang.y"
+            { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
               parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); }
-#line 4633 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5082 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 45:
-#line 601 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4639 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 45: /* multiplicative_expression: unary_expression  */
+#line 615 "MachineIndependent/glslang.y"
+                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5088 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 46:
-#line 602 "glslang.y" /* yacc.c:1646  */
-    {
+  case 46: /* multiplicative_expression: multiplicative_expression STAR unary_expression  */
+#line 616 "MachineIndependent/glslang.y"
+                                                      {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4649 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5098 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 47:
-#line 607 "glslang.y" /* yacc.c:1646  */
-    {
+  case 47: /* multiplicative_expression: multiplicative_expression SLASH unary_expression  */
+#line 621 "MachineIndependent/glslang.y"
+                                                       {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4659 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5108 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 48:
-#line 612 "glslang.y" /* yacc.c:1646  */
-    {
+  case 48: /* multiplicative_expression: multiplicative_expression PERCENT unary_expression  */
+#line 626 "MachineIndependent/glslang.y"
+                                                         {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4670 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5119 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 49:
-#line 621 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4676 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 49: /* additive_expression: multiplicative_expression  */
+#line 635 "MachineIndependent/glslang.y"
+                                { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5125 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 50:
-#line 622 "glslang.y" /* yacc.c:1646  */
-    {
+  case 50: /* additive_expression: additive_expression PLUS multiplicative_expression  */
+#line 636 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4686 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5135 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 51:
-#line 627 "glslang.y" /* yacc.c:1646  */
-    {
+  case 51: /* additive_expression: additive_expression DASH multiplicative_expression  */
+#line 641 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4696 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5145 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 52:
-#line 635 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4702 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 52: /* shift_expression: additive_expression  */
+#line 649 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5151 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 53:
-#line 636 "glslang.y" /* yacc.c:1646  */
-    {
+  case 53: /* shift_expression: shift_expression LEFT_OP additive_expression  */
+#line 650 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4713 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5162 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 54:
-#line 642 "glslang.y" /* yacc.c:1646  */
-    {
+  case 54: /* shift_expression: shift_expression RIGHT_OP additive_expression  */
+#line 656 "MachineIndependent/glslang.y"
+                                                    {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4724 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5173 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 55:
-#line 651 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4730 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 55: /* relational_expression: shift_expression  */
+#line 665 "MachineIndependent/glslang.y"
+                       { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5179 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 56:
-#line 652 "glslang.y" /* yacc.c:1646  */
-    {
+  case 56: /* relational_expression: relational_expression LEFT_ANGLE shift_expression  */
+#line 666 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4740 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5189 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 57:
-#line 657 "glslang.y" /* yacc.c:1646  */
-    {
+  case 57: /* relational_expression: relational_expression RIGHT_ANGLE shift_expression  */
+#line 671 "MachineIndependent/glslang.y"
+                                                          {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4750 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5199 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 58:
-#line 662 "glslang.y" /* yacc.c:1646  */
-    {
+  case 58: /* relational_expression: relational_expression LE_OP shift_expression  */
+#line 676 "MachineIndependent/glslang.y"
+                                                    {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4760 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5209 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 59:
-#line 667 "glslang.y" /* yacc.c:1646  */
-    {
+  case 59: /* relational_expression: relational_expression GE_OP shift_expression  */
+#line 681 "MachineIndependent/glslang.y"
+                                                    {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4770 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5219 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 60:
-#line 675 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4776 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 60: /* equality_expression: relational_expression  */
+#line 689 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5225 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 61:
-#line 676 "glslang.y" /* yacc.c:1646  */
-    {
+  case 61: /* equality_expression: equality_expression EQ_OP relational_expression  */
+#line 690 "MachineIndependent/glslang.y"
+                                                       {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "==");
         parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "==");
@@ -4786,12 +5235,12 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4790 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5239 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 62:
-#line 685 "glslang.y" /* yacc.c:1646  */
-    {
+  case 62: /* equality_expression: equality_expression NE_OP relational_expression  */
+#line 699 "MachineIndependent/glslang.y"
+                                                      {
         parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison");
         parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!=");
         parseContext.specializationCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!=");
@@ -4800,125 +5249,125 @@
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4804 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5253 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 63:
-#line 697 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4810 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 63: /* and_expression: equality_expression  */
+#line 711 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5259 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 64:
-#line 698 "glslang.y" /* yacc.c:1646  */
-    {
+  case 64: /* and_expression: and_expression AMPERSAND equality_expression  */
+#line 712 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4821 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5270 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 65:
-#line 707 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4827 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 65: /* exclusive_or_expression: and_expression  */
+#line 721 "MachineIndependent/glslang.y"
+                     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5276 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 66:
-#line 708 "glslang.y" /* yacc.c:1646  */
-    {
+  case 66: /* exclusive_or_expression: exclusive_or_expression CARET and_expression  */
+#line 722 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4838 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5287 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 67:
-#line 717 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4844 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 67: /* inclusive_or_expression: exclusive_or_expression  */
+#line 731 "MachineIndependent/glslang.y"
+                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5293 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 68:
-#line 718 "glslang.y" /* yacc.c:1646  */
-    {
+  case 68: /* inclusive_or_expression: inclusive_or_expression VERTICAL_BAR exclusive_or_expression  */
+#line 732 "MachineIndependent/glslang.y"
+                                                                   {
         parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or");
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4855 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5304 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 69:
-#line 727 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4861 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 69: /* logical_and_expression: inclusive_or_expression  */
+#line 741 "MachineIndependent/glslang.y"
+                              { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5310 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 70:
-#line 728 "glslang.y" /* yacc.c:1646  */
-    {
+  case 70: /* logical_and_expression: logical_and_expression AND_OP inclusive_or_expression  */
+#line 742 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4871 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5320 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 71:
-#line 736 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4877 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 71: /* logical_xor_expression: logical_and_expression  */
+#line 750 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5326 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 72:
-#line 737 "glslang.y" /* yacc.c:1646  */
-    {
+  case 72: /* logical_xor_expression: logical_xor_expression XOR_OP logical_and_expression  */
+#line 751 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4887 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5336 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 73:
-#line 745 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4893 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 73: /* logical_or_expression: logical_xor_expression  */
+#line 759 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5342 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 74:
-#line 746 "glslang.y" /* yacc.c:1646  */
-    {
+  case 74: /* logical_or_expression: logical_or_expression OR_OP logical_xor_expression  */
+#line 760 "MachineIndependent/glslang.y"
+                                                          {
         (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4903 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5352 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 75:
-#line 754 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4909 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 75: /* conditional_expression: logical_or_expression  */
+#line 768 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5358 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 76:
-#line 755 "glslang.y" /* yacc.c:1646  */
-    {
+  case 76: /* $@1: %empty  */
+#line 769 "MachineIndependent/glslang.y"
+                                     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 4917 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5366 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 77:
-#line 758 "glslang.y" /* yacc.c:1646  */
-    {
+  case 77: /* conditional_expression: logical_or_expression QUESTION $@1 expression COLON assignment_expression  */
+#line 772 "MachineIndependent/glslang.y"
+                                             {
         --parseContext.controlFlowNestingLevel;
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode));
         parseContext.rValueErrorCheck((yyvsp[-4].lex).loc, "?", (yyvsp[-5].interm.intermTypedNode));
@@ -4930,144 +5379,144 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 4934 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5383 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 78:
-#line 773 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4940 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 78: /* assignment_expression: conditional_expression  */
+#line 787 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+#line 5389 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 79:
-#line 774 "glslang.y" /* yacc.c:1646  */
-    {
+  case 79: /* assignment_expression: unary_expression assignment_operator assignment_expression  */
+#line 788 "MachineIndependent/glslang.y"
+                                                                 {
         parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment");
         parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.storage16BitAssignmentCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.specializationCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=");
         parseContext.lValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode));
         parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode));
-        (yyval.interm.intermTypedNode) = parseContext.intermediate.addAssign((yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].interm).loc);
+        (yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
         if ((yyval.interm.intermTypedNode) == 0) {
             parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
-#line 4958 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5407 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 80:
-#line 790 "glslang.y" /* yacc.c:1646  */
-    {
+  case 80: /* assignment_operator: EQUAL  */
+#line 804 "MachineIndependent/glslang.y"
+            {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAssign;
     }
-#line 4967 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5416 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 81:
-#line 794 "glslang.y" /* yacc.c:1646  */
-    {
+  case 81: /* assignment_operator: MUL_ASSIGN  */
+#line 808 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpMulAssign;
     }
-#line 4976 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5425 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 82:
-#line 798 "glslang.y" /* yacc.c:1646  */
-    {
+  case 82: /* assignment_operator: DIV_ASSIGN  */
+#line 812 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpDivAssign;
     }
-#line 4985 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5434 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 83:
-#line 802 "glslang.y" /* yacc.c:1646  */
-    {
+  case 83: /* assignment_operator: MOD_ASSIGN  */
+#line 816 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%=");
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpModAssign;
     }
-#line 4995 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5444 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 84:
-#line 807 "glslang.y" /* yacc.c:1646  */
-    {
+  case 84: /* assignment_operator: ADD_ASSIGN  */
+#line 821 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAddAssign;
     }
-#line 5004 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5453 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 85:
-#line 811 "glslang.y" /* yacc.c:1646  */
-    {
+  case 85: /* assignment_operator: SUB_ASSIGN  */
+#line 825 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpSubAssign;
     }
-#line 5013 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5462 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 86:
-#line 815 "glslang.y" /* yacc.c:1646  */
-    {
+  case 86: /* assignment_operator: LEFT_ASSIGN  */
+#line 829 "MachineIndependent/glslang.y"
+                  {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign;
     }
-#line 5022 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5471 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 87:
-#line 819 "glslang.y" /* yacc.c:1646  */
-    {
+  case 87: /* assignment_operator: RIGHT_ASSIGN  */
+#line 833 "MachineIndependent/glslang.y"
+                   {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign;
     }
-#line 5031 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5480 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 88:
-#line 823 "glslang.y" /* yacc.c:1646  */
-    {
+  case 88: /* assignment_operator: AND_ASSIGN  */
+#line 837 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign;
     }
-#line 5040 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5489 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 89:
-#line 827 "glslang.y" /* yacc.c:1646  */
-    {
+  case 89: /* assignment_operator: XOR_ASSIGN  */
+#line 841 "MachineIndependent/glslang.y"
+                 {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign;
     }
-#line 5049 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5498 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 90:
-#line 831 "glslang.y" /* yacc.c:1646  */
-    {
+  case 90: /* assignment_operator: OR_ASSIGN  */
+#line 845 "MachineIndependent/glslang.y"
+                {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign;
     }
-#line 5058 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5507 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 91:
-#line 838 "glslang.y" /* yacc.c:1646  */
-    {
+  case 91: /* expression: assignment_expression  */
+#line 852 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 5066 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5515 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 92:
-#line 841 "glslang.y" /* yacc.c:1646  */
-    {
+  case 92: /* expression: expression COMMA assignment_expression  */
+#line 855 "MachineIndependent/glslang.y"
+                                             {
         parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -5075,118 +5524,118 @@
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 5079 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5528 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 93:
-#line 852 "glslang.y" /* yacc.c:1646  */
-    {
+  case 93: /* constant_expression: conditional_expression  */
+#line 866 "MachineIndependent/glslang.y"
+                             {
         parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), "");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 5088 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5537 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 94:
-#line 859 "glslang.y" /* yacc.c:1646  */
-    {
+  case 94: /* declaration: function_prototype SEMICOLON  */
+#line 873 "MachineIndependent/glslang.y"
+                                   {
         parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */);
         (yyval.interm.intermNode) = 0;
         // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature
     }
-#line 5098 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5547 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 95:
-#line 864 "glslang.y" /* yacc.c:1646  */
-    {
+  case 95: /* declaration: init_declarator_list SEMICOLON  */
+#line 878 "MachineIndependent/glslang.y"
+                                     {
         if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate())
             (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode;
     }
-#line 5108 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5557 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 96:
-#line 869 "glslang.y" /* yacc.c:1646  */
-    {
+  case 96: /* declaration: PRECISION precision_qualifier type_specifier SEMICOLON  */
+#line 883 "MachineIndependent/glslang.y"
+                                                             {
         parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement");
         // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope
         parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]);
         parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision);
         (yyval.interm.intermNode) = 0;
     }
-#line 5120 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5569 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 97:
-#line 876 "glslang.y" /* yacc.c:1646  */
-    {
+  case 97: /* declaration: block_structure SEMICOLON  */
+#line 890 "MachineIndependent/glslang.y"
+                                {
         parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList);
         (yyval.interm.intermNode) = 0;
     }
-#line 5129 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5578 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 98:
-#line 880 "glslang.y" /* yacc.c:1646  */
-    {
+  case 98: /* declaration: block_structure IDENTIFIER SEMICOLON  */
+#line 894 "MachineIndependent/glslang.y"
+                                           {
         parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 5138 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5587 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 99:
-#line 884 "glslang.y" /* yacc.c:1646  */
-    {
+  case 99: /* declaration: block_structure IDENTIFIER array_specifier SEMICOLON  */
+#line 898 "MachineIndependent/glslang.y"
+                                                           {
         parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes);
         (yyval.interm.intermNode) = 0;
     }
-#line 5147 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5596 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 100:
-#line 888 "glslang.y" /* yacc.c:1646  */
-    {
+  case 100: /* declaration: type_qualifier SEMICOLON  */
+#line 902 "MachineIndependent/glslang.y"
+                               {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type));
         (yyval.interm.intermNode) = 0;
     }
-#line 5157 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5606 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 101:
-#line 893 "glslang.y" /* yacc.c:1646  */
-    {
+  case 101: /* declaration: type_qualifier IDENTIFIER SEMICOLON  */
+#line 907 "MachineIndependent/glslang.y"
+                                          {
         parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers);
         parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 5167 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5616 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 102:
-#line 898 "glslang.y" /* yacc.c:1646  */
-    {
+  case 102: /* declaration: type_qualifier IDENTIFIER identifier_list SEMICOLON  */
+#line 912 "MachineIndependent/glslang.y"
+                                                          {
         parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);
         (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string);
         parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList));
         (yyval.interm.intermNode) = 0;
     }
-#line 5178 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5627 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 103:
-#line 907 "glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
-#line 5184 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 103: /* $@2: %empty  */
+#line 921 "MachineIndependent/glslang.y"
+                                           { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
+#line 5633 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 104:
-#line 907 "glslang.y" /* yacc.c:1646  */
-    {
-        --parseContext.structNestingLevel;
+  case 104: /* block_structure: type_qualifier IDENTIFIER LEFT_BRACE $@2 struct_declaration_list RIGHT_BRACE  */
+#line 921 "MachineIndependent/glslang.y"
+                                                                                                                          {
+        --parseContext.blockNestingLevel;
         parseContext.blockName = (yyvsp[-4].lex).string;
         parseContext.globalQualifierFixCheck((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).qualifier);
         parseContext.checkNoShaderLayouts((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).shaderQualifiers);
@@ -5194,55 +5643,55 @@
         (yyval.interm).loc = (yyvsp[-5].interm.type).loc;
         (yyval.interm).typeList = (yyvsp[-1].interm.typeList);
     }
-#line 5198 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5647 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 105:
-#line 918 "glslang.y" /* yacc.c:1646  */
-    {
+  case 105: /* identifier_list: COMMA IDENTIFIER  */
+#line 932 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.identifierList) = new TIdentifierList;
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 5207 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5656 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 106:
-#line 922 "glslang.y" /* yacc.c:1646  */
-    {
+  case 106: /* identifier_list: identifier_list COMMA IDENTIFIER  */
+#line 936 "MachineIndependent/glslang.y"
+                                       {
         (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList);
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 5216 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5665 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 107:
-#line 929 "glslang.y" /* yacc.c:1646  */
-    {
+  case 107: /* function_prototype: function_declarator RIGHT_PAREN  */
+#line 943 "MachineIndependent/glslang.y"
+                                       {
         (yyval.interm).function = (yyvsp[-1].interm.function);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 5225 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5674 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 108:
-#line 936 "glslang.y" /* yacc.c:1646  */
-    {
+  case 108: /* function_declarator: function_header  */
+#line 950 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 5233 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5682 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 109:
-#line 939 "glslang.y" /* yacc.c:1646  */
-    {
+  case 109: /* function_declarator: function_header_with_parameters  */
+#line 953 "MachineIndependent/glslang.y"
+                                      {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 5241 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5690 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 110:
-#line 946 "glslang.y" /* yacc.c:1646  */
-    {
+  case 110: /* function_header_with_parameters: function_header parameter_declaration  */
+#line 960 "MachineIndependent/glslang.y"
+                                            {
         // Add the parameter
         (yyval.interm.function) = (yyvsp[-1].interm.function);
         if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid)
@@ -5250,12 +5699,12 @@
         else
             delete (yyvsp[0].interm).param.type;
     }
-#line 5254 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5703 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 111:
-#line 954 "glslang.y" /* yacc.c:1646  */
-    {
+  case 111: /* function_header_with_parameters: function_header_with_parameters COMMA parameter_declaration  */
+#line 968 "MachineIndependent/glslang.y"
+                                                                  {
         //
         // Only first parameter of one-parameter functions can be void
         // The check for named parameters not being void is done in parameter_declarator
@@ -5272,12 +5721,12 @@
             (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param);
         }
     }
-#line 5276 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5725 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 112:
-#line 974 "glslang.y" /* yacc.c:1646  */
-    {
+  case 112: /* function_header: fully_specified_type IDENTIFIER LEFT_PAREN  */
+#line 988 "MachineIndependent/glslang.y"
+                                                 {
         if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) {
             parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return",
                                GetStorageQualifierString((yyvsp[-2].interm.type).qualifier.storage), "");
@@ -5296,12 +5745,12 @@
         function = new TFunction((yyvsp[-1].lex).string, type);
         (yyval.interm.function) = function;
     }
-#line 5300 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5749 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 113:
-#line 997 "glslang.y" /* yacc.c:1646  */
-    {
+  case 113: /* parameter_declarator: type_specifier IDENTIFIER  */
+#line 1011 "MachineIndependent/glslang.y"
+                                {
         if ((yyvsp[-1].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-1].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -5316,12 +5765,12 @@
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5320 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5769 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 114:
-#line 1012 "glslang.y" /* yacc.c:1646  */
-    {
+  case 114: /* parameter_declarator: type_specifier IDENTIFIER array_specifier  */
+#line 1026 "MachineIndependent/glslang.y"
+                                                {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -5340,12 +5789,12 @@
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5344 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5793 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 115:
-#line 1037 "glslang.y" /* yacc.c:1646  */
-    {
+  case 115: /* parameter_declaration: type_qualifier parameter_declarator  */
+#line 1051 "MachineIndependent/glslang.y"
+                                          {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
             (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;
@@ -5356,24 +5805,24 @@
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
 
     }
-#line 5360 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5809 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 116:
-#line 1048 "glslang.y" /* yacc.c:1646  */
-    {
+  case 116: /* parameter_declaration: parameter_declarator  */
+#line 1062 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
         parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5372 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5821 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 117:
-#line 1058 "glslang.y" /* yacc.c:1646  */
-    {
+  case 117: /* parameter_declaration: type_qualifier parameter_type_specifier  */
+#line 1072 "MachineIndependent/glslang.y"
+                                              {
         (yyval.interm) = (yyvsp[0].interm);
         if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone)
             (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision;
@@ -5383,133 +5832,133 @@
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
     }
-#line 5387 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5836 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 118:
-#line 1068 "glslang.y" /* yacc.c:1646  */
-    {
+  case 118: /* parameter_declaration: parameter_type_specifier  */
+#line 1082 "MachineIndependent/glslang.y"
+                               {
         (yyval.interm) = (yyvsp[0].interm);
 
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
         parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5399 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5848 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 119:
-#line 1078 "glslang.y" /* yacc.c:1646  */
-    {
+  case 119: /* parameter_type_specifier: type_specifier  */
+#line 1092 "MachineIndependent/glslang.y"
+                     {
         TParameter param = { 0, new TType((yyvsp[0].interm.type)) };
         (yyval.interm).param = param;
         if ((yyvsp[0].interm.type).arraySizes)
             parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes);
     }
-#line 5410 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5859 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 120:
-#line 1087 "glslang.y" /* yacc.c:1646  */
-    {
+  case 120: /* init_declarator_list: single_declaration  */
+#line 1101 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 5418 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5867 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 121:
-#line 1090 "glslang.y" /* yacc.c:1646  */
-    {
+  case 121: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER  */
+#line 1104 "MachineIndependent/glslang.y"
+                                            {
         (yyval.interm) = (yyvsp[-2].interm);
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type);
     }
-#line 5427 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5876 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 122:
-#line 1094 "glslang.y" /* yacc.c:1646  */
-    {
+  case 122: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier  */
+#line 1108 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm) = (yyvsp[-3].interm);
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes);
     }
-#line 5436 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5885 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 123:
-#line 1098 "glslang.y" /* yacc.c:1646  */
-    {
+  case 123: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer  */
+#line 1112 "MachineIndependent/glslang.y"
+                                                                              {
         (yyval.interm).type = (yyvsp[-5].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5446 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5895 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 124:
-#line 1103 "glslang.y" /* yacc.c:1646  */
-    {
+  case 124: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER EQUAL initializer  */
+#line 1117 "MachineIndependent/glslang.y"
+                                                              {
         (yyval.interm).type = (yyvsp[-4].interm).type;
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5456 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5905 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 125:
-#line 1111 "glslang.y" /* yacc.c:1646  */
-    {
+  case 125: /* single_declaration: fully_specified_type  */
+#line 1125 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm).type = (yyvsp[0].interm.type);
         (yyval.interm).intermNode = 0;
 
         parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type);
 
     }
-#line 5468 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5917 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 126:
-#line 1118 "glslang.y" /* yacc.c:1646  */
-    {
+  case 126: /* single_declaration: fully_specified_type IDENTIFIER  */
+#line 1132 "MachineIndependent/glslang.y"
+                                      {
         (yyval.interm).type = (yyvsp[-1].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type));
     }
-#line 5478 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5927 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 127:
-#line 1123 "glslang.y" /* yacc.c:1646  */
-    {
+  case 127: /* single_declaration: fully_specified_type IDENTIFIER array_specifier  */
+#line 1137 "MachineIndependent/glslang.y"
+                                                      {
         (yyval.interm).type = (yyvsp[-2].interm.type);
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes);
     }
-#line 5488 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5937 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 128:
-#line 1128 "glslang.y" /* yacc.c:1646  */
-    {
+  case 128: /* single_declaration: fully_specified_type IDENTIFIER array_specifier EQUAL initializer  */
+#line 1142 "MachineIndependent/glslang.y"
+                                                                        {
         (yyval.interm).type = (yyvsp[-4].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5498 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5947 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 129:
-#line 1133 "glslang.y" /* yacc.c:1646  */
-    {
+  case 129: /* single_declaration: fully_specified_type IDENTIFIER EQUAL initializer  */
+#line 1147 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm).type = (yyvsp[-3].interm.type);
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5508 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5957 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 130:
-#line 1142 "glslang.y" /* yacc.c:1646  */
-    {
+  case 130: /* fully_specified_type: type_specifier  */
+#line 1156 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
 
         parseContext.globalQualifierTypeCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyval.interm.type));
@@ -5519,12 +5968,12 @@
         }
         parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier);
     }
-#line 5523 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 5972 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 131:
-#line 1152 "glslang.y" /* yacc.c:1646  */
-    {
+  case 131: /* fully_specified_type: type_qualifier type_specifier  */
+#line 1166 "MachineIndependent/glslang.y"
+                                     {
         parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier);
         parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type));
 
@@ -5548,71 +5997,71 @@
              (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn)))
             (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5552 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6001 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 132:
-#line 1179 "glslang.y" /* yacc.c:1646  */
-    {
+  case 132: /* invariant_qualifier: INVARIANT  */
+#line 1193 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "invariant");
         parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.invariant = true;
     }
-#line 5563 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6012 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 133:
-#line 1188 "glslang.y" /* yacc.c:1646  */
-    {
+  case 133: /* interpolation_qualifier: SMOOTH  */
+#line 1202 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "smooth");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "smooth");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5575 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6024 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 134:
-#line 1195 "glslang.y" /* yacc.c:1646  */
-    {
+  case 134: /* interpolation_qualifier: FLAT  */
+#line 1209 "MachineIndependent/glslang.y"
+           {
         parseContext.globalCheck((yyvsp[0].lex).loc, "flat");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "flat");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.flat = true;
     }
-#line 5587 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6036 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 135:
-#line 1203 "glslang.y" /* yacc.c:1646  */
-    {
+  case 135: /* interpolation_qualifier: NOPERSPECTIVE  */
+#line 1217 "MachineIndependent/glslang.y"
+                    {
         parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nopersp = true;
     }
-#line 5599 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6048 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 136:
-#line 1210 "glslang.y" /* yacc.c:1646  */
-    {
+  case 136: /* interpolation_qualifier: EXPLICITINTERPAMD  */
+#line 1224 "MachineIndependent/glslang.y"
+                        {
         parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.explicitInterp = true;
     }
-#line 5611 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6060 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 137:
-#line 1217 "glslang.y" /* yacc.c:1646  */
-    {
+  case 137: /* interpolation_qualifier: PERVERTEXNV  */
+#line 1231 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexNV");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric");
@@ -5620,12 +6069,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.pervertexNV = true;
     }
-#line 5624 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6073 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 138:
-#line 1225 "glslang.y" /* yacc.c:1646  */
-    {
+  case 138: /* interpolation_qualifier: PERPRIMITIVENV  */
+#line 1239 "MachineIndependent/glslang.y"
+                     {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV");
@@ -5635,109 +6084,109 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perPrimitiveNV = true;
     }
-#line 5639 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6088 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 139:
-#line 1235 "glslang.y" /* yacc.c:1646  */
-    {
+  case 139: /* interpolation_qualifier: PERVIEWNV  */
+#line 1249 "MachineIndependent/glslang.y"
+                {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "perviewNV");
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangMeshNV, "perviewNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perViewNV = true;
     }
-#line 5651 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6100 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 140:
-#line 1242 "glslang.y" /* yacc.c:1646  */
-    {
+  case 140: /* interpolation_qualifier: PERTASKNV  */
+#line 1256 "MachineIndependent/glslang.y"
+                {
         // No need for profile version or extension check. Shader stage already checks both.
         parseContext.globalCheck((yyvsp[0].lex).loc, "taskNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.perTaskNV = true;
     }
-#line 5663 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6112 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 141:
-#line 1253 "glslang.y" /* yacc.c:1646  */
-    {
+  case 141: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN  */
+#line 1267 "MachineIndependent/glslang.y"
+                                                             {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
     }
-#line 5671 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6120 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 142:
-#line 1259 "glslang.y" /* yacc.c:1646  */
-    {
+  case 142: /* layout_qualifier_id_list: layout_qualifier_id  */
+#line 1273 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5679 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6128 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 143:
-#line 1262 "glslang.y" /* yacc.c:1646  */
-    {
+  case 143: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id  */
+#line 1276 "MachineIndependent/glslang.y"
+                                                         {
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5689 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6138 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 144:
-#line 1269 "glslang.y" /* yacc.c:1646  */
-    {
+  case 144: /* layout_qualifier_id: IDENTIFIER  */
+#line 1283 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string);
     }
-#line 5698 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6147 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 145:
-#line 1273 "glslang.y" /* yacc.c:1646  */
-    {
+  case 145: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression  */
+#line 1287 "MachineIndependent/glslang.y"
+                                           {
         (yyval.interm.type).init((yyvsp[-2].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode));
     }
-#line 5707 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6156 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 146:
-#line 1277 "glslang.y" /* yacc.c:1646  */
-    { // because "shared" is both an identifier and a keyword
+  case 146: /* layout_qualifier_id: SHARED  */
+#line 1291 "MachineIndependent/glslang.y"
+             { // because "shared" is both an identifier and a keyword
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         TString strShared("shared");
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared);
     }
-#line 5717 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6166 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 147:
-#line 1286 "glslang.y" /* yacc.c:1646  */
-    {
+  case 147: /* precise_qualifier: PRECISE  */
+#line 1300 "MachineIndependent/glslang.y"
+              {
         parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.noContraction = true;
     }
-#line 5728 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6177 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 148:
-#line 1296 "glslang.y" /* yacc.c:1646  */
-    {
+  case 148: /* type_qualifier: single_type_qualifier  */
+#line 1310 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5736 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6185 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 149:
-#line 1299 "glslang.y" /* yacc.c:1646  */
-    {
+  case 149: /* type_qualifier: type_qualifier single_type_qualifier  */
+#line 1313 "MachineIndependent/glslang.y"
+                                           {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         if ((yyval.interm.type).basicType == EbtVoid)
             (yyval.interm.type).basicType = (yyvsp[0].interm.type).basicType;
@@ -5745,135 +6194,135 @@
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5749 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6198 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 150:
-#line 1310 "glslang.y" /* yacc.c:1646  */
-    {
+  case 150: /* single_type_qualifier: storage_qualifier  */
+#line 1324 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5757 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6206 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 151:
-#line 1313 "glslang.y" /* yacc.c:1646  */
-    {
+  case 151: /* single_type_qualifier: layout_qualifier  */
+#line 1327 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5765 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6214 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 152:
-#line 1316 "glslang.y" /* yacc.c:1646  */
-    {
+  case 152: /* single_type_qualifier: precision_qualifier  */
+#line 1330 "MachineIndependent/glslang.y"
+                          {
         parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5774 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6223 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 153:
-#line 1320 "glslang.y" /* yacc.c:1646  */
-    {
+  case 153: /* single_type_qualifier: interpolation_qualifier  */
+#line 1334 "MachineIndependent/glslang.y"
+                              {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5783 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6232 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 154:
-#line 1324 "glslang.y" /* yacc.c:1646  */
-    {
+  case 154: /* single_type_qualifier: invariant_qualifier  */
+#line 1338 "MachineIndependent/glslang.y"
+                          {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5792 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6241 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 155:
-#line 1329 "glslang.y" /* yacc.c:1646  */
-    {
+  case 155: /* single_type_qualifier: precise_qualifier  */
+#line 1343 "MachineIndependent/glslang.y"
+                        {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5801 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6250 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 156:
-#line 1333 "glslang.y" /* yacc.c:1646  */
-    {
+  case 156: /* single_type_qualifier: non_uniform_qualifier  */
+#line 1347 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5809 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6258 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 157:
-#line 1340 "glslang.y" /* yacc.c:1646  */
-    {
+  case 157: /* storage_qualifier: CONST  */
+#line 1354 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant
     }
-#line 5818 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6267 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 158:
-#line 1344 "glslang.y" /* yacc.c:1646  */
-    {
+  case 158: /* storage_qualifier: INOUT  */
+#line 1358 "MachineIndependent/glslang.y"
+            {
         parseContext.globalCheck((yyvsp[0].lex).loc, "inout");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqInOut;
     }
-#line 5828 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6277 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 159:
-#line 1349 "glslang.y" /* yacc.c:1646  */
-    {
+  case 159: /* storage_qualifier: IN  */
+#line 1363 "MachineIndependent/glslang.y"
+         {
         parseContext.globalCheck((yyvsp[0].lex).loc, "in");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqIn;
     }
-#line 5839 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6288 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 160:
-#line 1355 "glslang.y" /* yacc.c:1646  */
-    {
+  case 160: /* storage_qualifier: OUT  */
+#line 1369 "MachineIndependent/glslang.y"
+          {
         parseContext.globalCheck((yyvsp[0].lex).loc, "out");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqOut;
     }
-#line 5850 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6299 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 161:
-#line 1361 "glslang.y" /* yacc.c:1646  */
-    {
+  case 161: /* storage_qualifier: CENTROID  */
+#line 1375 "MachineIndependent/glslang.y"
+               {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid");
         parseContext.globalCheck((yyvsp[0].lex).loc, "centroid");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.centroid = true;
     }
-#line 5862 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6311 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 162:
-#line 1368 "glslang.y" /* yacc.c:1646  */
-    {
+  case 162: /* storage_qualifier: UNIFORM  */
+#line 1382 "MachineIndependent/glslang.y"
+              {
         parseContext.globalCheck((yyvsp[0].lex).loc, "uniform");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 5872 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6321 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 163:
-#line 1373 "glslang.y" /* yacc.c:1646  */
-    {
+  case 163: /* storage_qualifier: SHARED  */
+#line 1387 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared");
@@ -5881,22 +6330,22 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqShared;
     }
-#line 5885 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6334 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 164:
-#line 1381 "glslang.y" /* yacc.c:1646  */
-    {
+  case 164: /* storage_qualifier: BUFFER  */
+#line 1395 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "buffer");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqBuffer;
     }
-#line 5895 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6344 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 165:
-#line 1387 "glslang.y" /* yacc.c:1646  */
-    {
+  case 165: /* storage_qualifier: ATTRIBUTE  */
+#line 1401 "MachineIndependent/glslang.y"
+                {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "attribute");
@@ -5908,12 +6357,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5912 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6361 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 166:
-#line 1399 "glslang.y" /* yacc.c:1646  */
-    {
+  case 166: /* storage_qualifier: VARYING  */
+#line 1413 "MachineIndependent/glslang.y"
+              {
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying");
         parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "varying");
@@ -5927,33 +6376,33 @@
         else
             (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5931 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6380 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 167:
-#line 1413 "glslang.y" /* yacc.c:1646  */
-    {
+  case 167: /* storage_qualifier: PATCH  */
+#line 1427 "MachineIndependent/glslang.y"
+            {
         parseContext.globalCheck((yyvsp[0].lex).loc, "patch");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.patch = true;
     }
-#line 5942 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6391 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 168:
-#line 1419 "glslang.y" /* yacc.c:1646  */
-    {
+  case 168: /* storage_qualifier: SAMPLE  */
+#line 1433 "MachineIndependent/glslang.y"
+             {
         parseContext.globalCheck((yyvsp[0].lex).loc, "sample");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.sample = true;
     }
-#line 5952 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6401 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 169:
-#line 1424 "glslang.y" /* yacc.c:1646  */
-    {
+  case 169: /* storage_qualifier: HITATTRNV  */
+#line 1438 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask
             | EShLangAnyHitMask), "hitAttributeNV");
@@ -5961,12 +6410,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqHitAttr;
     }
-#line 5965 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6414 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 170:
-#line 1432 "glslang.y" /* yacc.c:1646  */
-    {
+  case 170: /* storage_qualifier: HITATTREXT  */
+#line 1446 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask
             | EShLangAnyHitMask), "hitAttributeEXT");
@@ -5974,12 +6423,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqHitAttr;
     }
-#line 5978 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6427 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 171:
-#line 1440 "glslang.y" /* yacc.c:1646  */
-    {
+  case 171: /* storage_qualifier: PAYLOADNV  */
+#line 1454 "MachineIndependent/glslang.y"
+                {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadNV");
@@ -5987,12 +6436,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayload;
     }
-#line 5991 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6440 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 172:
-#line 1448 "glslang.y" /* yacc.c:1646  */
-    {
+  case 172: /* storage_qualifier: PAYLOADEXT  */
+#line 1462 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadEXT");
@@ -6000,12 +6449,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayload;
     }
-#line 6004 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6453 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 173:
-#line 1456 "glslang.y" /* yacc.c:1646  */
-    {
+  case 173: /* storage_qualifier: PAYLOADINNV  */
+#line 1470 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadInNV");
@@ -6013,12 +6462,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayloadIn;
     }
-#line 6017 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6466 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 174:
-#line 1464 "glslang.y" /* yacc.c:1646  */
-    {
+  case 174: /* storage_qualifier: PAYLOADINEXT  */
+#line 1478 "MachineIndependent/glslang.y"
+                   {
         parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask |
             EShLangAnyHitMask | EShLangMissMask), "rayPayloadInEXT");
@@ -6026,12 +6475,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqPayloadIn;
     }
-#line 6030 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6479 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 175:
-#line 1472 "glslang.y" /* yacc.c:1646  */
-    {
+  case 175: /* storage_qualifier: CALLDATANV  */
+#line 1486 "MachineIndependent/glslang.y"
+                 {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |
             EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataNV");
@@ -6039,12 +6488,12 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableData;
     }
-#line 6043 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6492 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 176:
-#line 1480 "glslang.y" /* yacc.c:1646  */
-    {
+  case 176: /* storage_qualifier: CALLDATAEXT  */
+#line 1494 "MachineIndependent/glslang.y"
+                  {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask |
             EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataEXT");
@@ -6052,222 +6501,222 @@
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableData;
     }
-#line 6056 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6505 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 177:
-#line 1488 "glslang.y" /* yacc.c:1646  */
-    {
+  case 177: /* storage_qualifier: CALLDATAINNV  */
+#line 1502 "MachineIndependent/glslang.y"
+                   {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInNV");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableDataIn;
     }
-#line 6068 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6517 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 178:
-#line 1495 "glslang.y" /* yacc.c:1646  */
-    {
+  case 178: /* storage_qualifier: CALLDATAINEXT  */
+#line 1509 "MachineIndependent/glslang.y"
+                    {
         parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInEXT");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInEXT");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "callableDataInEXT");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqCallableDataIn;
     }
-#line 6080 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6529 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 179:
-#line 1502 "glslang.y" /* yacc.c:1646  */
-    {
+  case 179: /* storage_qualifier: COHERENT  */
+#line 1516 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.coherent = true;
     }
-#line 6089 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6538 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 180:
-#line 1506 "glslang.y" /* yacc.c:1646  */
-    {
+  case 180: /* storage_qualifier: DEVICECOHERENT  */
+#line 1520 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent");
         (yyval.interm.type).qualifier.devicecoherent = true;
     }
-#line 6099 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6548 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 181:
-#line 1511 "glslang.y" /* yacc.c:1646  */
-    {
+  case 181: /* storage_qualifier: QUEUEFAMILYCOHERENT  */
+#line 1525 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent");
         (yyval.interm.type).qualifier.queuefamilycoherent = true;
     }
-#line 6109 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6558 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 182:
-#line 1516 "glslang.y" /* yacc.c:1646  */
-    {
+  case 182: /* storage_qualifier: WORKGROUPCOHERENT  */
+#line 1530 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent");
         (yyval.interm.type).qualifier.workgroupcoherent = true;
     }
-#line 6119 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6568 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 183:
-#line 1521 "glslang.y" /* yacc.c:1646  */
-    {
+  case 183: /* storage_qualifier: SUBGROUPCOHERENT  */
+#line 1535 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent");
         (yyval.interm.type).qualifier.subgroupcoherent = true;
     }
-#line 6129 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6578 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 184:
-#line 1526 "glslang.y" /* yacc.c:1646  */
-    {
+  case 184: /* storage_qualifier: NONPRIVATE  */
+#line 1540 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate");
         (yyval.interm.type).qualifier.nonprivate = true;
     }
-#line 6139 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6588 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 185:
-#line 1531 "glslang.y" /* yacc.c:1646  */
-    {
+  case 185: /* storage_qualifier: SHADERCALLCOHERENT  */
+#line 1545 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_ray_tracing, "shadercallcoherent");
         (yyval.interm.type).qualifier.shadercallcoherent = true;
     }
-#line 6149 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6598 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 186:
-#line 1536 "glslang.y" /* yacc.c:1646  */
-    {
+  case 186: /* storage_qualifier: VOLATILE  */
+#line 1550 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.volatil = true;
     }
-#line 6158 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6607 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 187:
-#line 1540 "glslang.y" /* yacc.c:1646  */
-    {
+  case 187: /* storage_qualifier: RESTRICT  */
+#line 1554 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.restrict = true;
     }
-#line 6167 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6616 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 188:
-#line 1544 "glslang.y" /* yacc.c:1646  */
-    {
+  case 188: /* storage_qualifier: READONLY  */
+#line 1558 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.readonly = true;
     }
-#line 6176 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6625 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 189:
-#line 1548 "glslang.y" /* yacc.c:1646  */
-    {
+  case 189: /* storage_qualifier: WRITEONLY  */
+#line 1562 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.writeonly = true;
     }
-#line 6185 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6634 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 190:
-#line 1552 "glslang.y" /* yacc.c:1646  */
-    {
+  case 190: /* storage_qualifier: SUBROUTINE  */
+#line 1566 "MachineIndependent/glslang.y"
+                 {
         parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
     }
-#line 6196 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6645 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 191:
-#line 1558 "glslang.y" /* yacc.c:1646  */
-    {
+  case 191: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN  */
+#line 1572 "MachineIndependent/glslang.y"
+                                                       {
         parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[-3].lex).loc);
     }
-#line 6207 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6656 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 192:
-#line 1569 "glslang.y" /* yacc.c:1646  */
-    {
+  case 192: /* non_uniform_qualifier: NONUNIFORM  */
+#line 1583 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nonUniform = true;
     }
-#line 6216 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6665 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 193:
-#line 1576 "glslang.y" /* yacc.c:1646  */
-    {
+  case 193: /* type_name_list: IDENTIFIER  */
+#line 1590 "MachineIndependent/glslang.y"
+                 {
         // TODO
     }
-#line 6224 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6673 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 194:
-#line 1579 "glslang.y" /* yacc.c:1646  */
-    {
+  case 194: /* type_name_list: type_name_list COMMA IDENTIFIER  */
+#line 1593 "MachineIndependent/glslang.y"
+                                      {
         // TODO: 4.0 semantics: subroutines
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
-#line 6234 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6683 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 195:
-#line 1588 "glslang.y" /* yacc.c:1646  */
-    {
+  case 195: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt  */
+#line 1602 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).typeParameters = (yyvsp[0].interm.typeParameters);
     }
-#line 6244 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6693 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 196:
-#line 1593 "glslang.y" /* yacc.c:1646  */
-    {
+  case 196: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier  */
+#line 1607 "MachineIndependent/glslang.y"
+                                                                           {
         parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes);
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).typeParameters = (yyvsp[-1].interm.typeParameters);
         (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
     }
-#line 6256 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6705 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 197:
-#line 1603 "glslang.y" /* yacc.c:1646  */
-    {
+  case 197: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET  */
+#line 1617 "MachineIndependent/glslang.y"
+                                 {
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 6266 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6715 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 198:
-#line 1608 "glslang.y" /* yacc.c:1646  */
-    {
+  case 198: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET  */
+#line 1622 "MachineIndependent/glslang.y"
+                                                        {
         (yyval.interm).loc = (yyvsp[-2].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
 
@@ -6275,492 +6724,492 @@
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size");
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 6279 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6728 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 199:
-#line 1616 "glslang.y" /* yacc.c:1646  */
-    {
+  case 199: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET  */
+#line 1630 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm) = (yyvsp[-2].interm);
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 6288 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6737 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 200:
-#line 1620 "glslang.y" /* yacc.c:1646  */
-    {
+  case 200: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET  */
+#line 1634 "MachineIndependent/glslang.y"
+                                                                        {
         (yyval.interm) = (yyvsp[-3].interm);
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size");
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 6300 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6749 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 201:
-#line 1630 "glslang.y" /* yacc.c:1646  */
-    {
+  case 201: /* type_parameter_specifier_opt: type_parameter_specifier  */
+#line 1644 "MachineIndependent/glslang.y"
+                               {
         (yyval.interm.typeParameters) = (yyvsp[0].interm.typeParameters);
     }
-#line 6308 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6757 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 202:
-#line 1633 "glslang.y" /* yacc.c:1646  */
-    {
+  case 202: /* type_parameter_specifier_opt: %empty  */
+#line 1647 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.typeParameters) = 0;
     }
-#line 6316 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6765 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 203:
-#line 1639 "glslang.y" /* yacc.c:1646  */
-    {
+  case 203: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE  */
+#line 1653 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.typeParameters) = (yyvsp[-1].interm.typeParameters);
     }
-#line 6324 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6773 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 204:
-#line 1645 "glslang.y" /* yacc.c:1646  */
-    {
+  case 204: /* type_parameter_specifier_list: unary_expression  */
+#line 1659 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.typeParameters) = new TArraySizes;
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter");
         (yyval.interm.typeParameters)->addInnerSize(size);
     }
-#line 6336 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6785 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 205:
-#line 1652 "glslang.y" /* yacc.c:1646  */
-    {
+  case 205: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression  */
+#line 1666 "MachineIndependent/glslang.y"
+                                                           {
         (yyval.interm.typeParameters) = (yyvsp[-2].interm.typeParameters);
 
         TArraySize size;
         parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter");
         (yyval.interm.typeParameters)->addInnerSize(size);
     }
-#line 6348 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6797 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 206:
-#line 1662 "glslang.y" /* yacc.c:1646  */
-    {
+  case 206: /* type_specifier_nonarray: VOID  */
+#line 1676 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtVoid;
     }
-#line 6357 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6806 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 207:
-#line 1666 "glslang.y" /* yacc.c:1646  */
-    {
+  case 207: /* type_specifier_nonarray: FLOAT  */
+#line 1680 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 6366 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6815 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 208:
-#line 1670 "glslang.y" /* yacc.c:1646  */
-    {
+  case 208: /* type_specifier_nonarray: INT  */
+#line 1684 "MachineIndependent/glslang.y"
+          {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 6375 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6824 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 209:
-#line 1674 "glslang.y" /* yacc.c:1646  */
-    {
+  case 209: /* type_specifier_nonarray: UINT  */
+#line 1688 "MachineIndependent/glslang.y"
+           {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 6385 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6834 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 210:
-#line 1679 "glslang.y" /* yacc.c:1646  */
-    {
+  case 210: /* type_specifier_nonarray: BOOL  */
+#line 1693 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
     }
-#line 6394 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6843 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 211:
-#line 1683 "glslang.y" /* yacc.c:1646  */
-    {
+  case 211: /* type_specifier_nonarray: VEC2  */
+#line 1697 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 6404 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6853 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 212:
-#line 1688 "glslang.y" /* yacc.c:1646  */
-    {
+  case 212: /* type_specifier_nonarray: VEC3  */
+#line 1702 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 6414 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6863 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 213:
-#line 1693 "glslang.y" /* yacc.c:1646  */
-    {
+  case 213: /* type_specifier_nonarray: VEC4  */
+#line 1707 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 6424 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6873 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 214:
-#line 1698 "glslang.y" /* yacc.c:1646  */
-    {
+  case 214: /* type_specifier_nonarray: BVEC2  */
+#line 1712 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(2);
     }
-#line 6434 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6883 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 215:
-#line 1703 "glslang.y" /* yacc.c:1646  */
-    {
+  case 215: /* type_specifier_nonarray: BVEC3  */
+#line 1717 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(3);
     }
-#line 6444 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6893 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 216:
-#line 1708 "glslang.y" /* yacc.c:1646  */
-    {
+  case 216: /* type_specifier_nonarray: BVEC4  */
+#line 1722 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(4);
     }
-#line 6454 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6903 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 217:
-#line 1713 "glslang.y" /* yacc.c:1646  */
-    {
+  case 217: /* type_specifier_nonarray: IVEC2  */
+#line 1727 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6464 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6913 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 218:
-#line 1718 "glslang.y" /* yacc.c:1646  */
-    {
+  case 218: /* type_specifier_nonarray: IVEC3  */
+#line 1732 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6474 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6923 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 219:
-#line 1723 "glslang.y" /* yacc.c:1646  */
-    {
+  case 219: /* type_specifier_nonarray: IVEC4  */
+#line 1737 "MachineIndependent/glslang.y"
+            {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6484 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6933 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 220:
-#line 1728 "glslang.y" /* yacc.c:1646  */
-    {
+  case 220: /* type_specifier_nonarray: UVEC2  */
+#line 1742 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 6495 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6944 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 221:
-#line 1734 "glslang.y" /* yacc.c:1646  */
-    {
+  case 221: /* type_specifier_nonarray: UVEC3  */
+#line 1748 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 6506 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6955 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 222:
-#line 1740 "glslang.y" /* yacc.c:1646  */
-    {
+  case 222: /* type_specifier_nonarray: UVEC4  */
+#line 1754 "MachineIndependent/glslang.y"
+            {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 6517 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6966 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 223:
-#line 1746 "glslang.y" /* yacc.c:1646  */
-    {
+  case 223: /* type_specifier_nonarray: MAT2  */
+#line 1760 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6527 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6976 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 224:
-#line 1751 "glslang.y" /* yacc.c:1646  */
-    {
+  case 224: /* type_specifier_nonarray: MAT3  */
+#line 1765 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6537 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6986 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 225:
-#line 1756 "glslang.y" /* yacc.c:1646  */
-    {
+  case 225: /* type_specifier_nonarray: MAT4  */
+#line 1770 "MachineIndependent/glslang.y"
+           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6547 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 6996 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 226:
-#line 1761 "glslang.y" /* yacc.c:1646  */
-    {
+  case 226: /* type_specifier_nonarray: MAT2X2  */
+#line 1775 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6557 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7006 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 227:
-#line 1766 "glslang.y" /* yacc.c:1646  */
-    {
+  case 227: /* type_specifier_nonarray: MAT2X3  */
+#line 1780 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 6567 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7016 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 228:
-#line 1771 "glslang.y" /* yacc.c:1646  */
-    {
+  case 228: /* type_specifier_nonarray: MAT2X4  */
+#line 1785 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 6577 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7026 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 229:
-#line 1776 "glslang.y" /* yacc.c:1646  */
-    {
+  case 229: /* type_specifier_nonarray: MAT3X2  */
+#line 1790 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 6587 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7036 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 230:
-#line 1781 "glslang.y" /* yacc.c:1646  */
-    {
+  case 230: /* type_specifier_nonarray: MAT3X3  */
+#line 1795 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6597 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7046 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 231:
-#line 1786 "glslang.y" /* yacc.c:1646  */
-    {
+  case 231: /* type_specifier_nonarray: MAT3X4  */
+#line 1800 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 6607 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7056 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 232:
-#line 1791 "glslang.y" /* yacc.c:1646  */
-    {
+  case 232: /* type_specifier_nonarray: MAT4X2  */
+#line 1805 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 6617 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7066 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 233:
-#line 1796 "glslang.y" /* yacc.c:1646  */
-    {
+  case 233: /* type_specifier_nonarray: MAT4X3  */
+#line 1810 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 6627 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7076 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 234:
-#line 1801 "glslang.y" /* yacc.c:1646  */
-    {
+  case 234: /* type_specifier_nonarray: MAT4X4  */
+#line 1815 "MachineIndependent/glslang.y"
+             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6637 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7086 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 235:
-#line 1807 "glslang.y" /* yacc.c:1646  */
-    {
+  case 235: /* type_specifier_nonarray: DOUBLE  */
+#line 1821 "MachineIndependent/glslang.y"
+             {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 6649 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7098 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 236:
-#line 1814 "glslang.y" /* yacc.c:1646  */
-    {
+  case 236: /* type_specifier_nonarray: FLOAT16_T  */
+#line 1828 "MachineIndependent/glslang.y"
+                {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
     }
-#line 6659 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7108 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 237:
-#line 1819 "glslang.y" /* yacc.c:1646  */
-    {
+  case 237: /* type_specifier_nonarray: FLOAT32_T  */
+#line 1833 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 6669 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7118 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 238:
-#line 1824 "glslang.y" /* yacc.c:1646  */
-    {
+  case 238: /* type_specifier_nonarray: FLOAT64_T  */
+#line 1838 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 6679 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7128 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 239:
-#line 1829 "glslang.y" /* yacc.c:1646  */
-    {
+  case 239: /* type_specifier_nonarray: INT8_T  */
+#line 1843 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
     }
-#line 6689 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7138 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 240:
-#line 1834 "glslang.y" /* yacc.c:1646  */
-    {
+  case 240: /* type_specifier_nonarray: UINT8_T  */
+#line 1848 "MachineIndependent/glslang.y"
+              {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
     }
-#line 6699 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7148 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 241:
-#line 1839 "glslang.y" /* yacc.c:1646  */
-    {
+  case 241: /* type_specifier_nonarray: INT16_T  */
+#line 1853 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
     }
-#line 6709 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7158 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 242:
-#line 1844 "glslang.y" /* yacc.c:1646  */
-    {
+  case 242: /* type_specifier_nonarray: UINT16_T  */
+#line 1858 "MachineIndependent/glslang.y"
+               {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
     }
-#line 6719 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7168 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 243:
-#line 1849 "glslang.y" /* yacc.c:1646  */
-    {
+  case 243: /* type_specifier_nonarray: INT32_T  */
+#line 1863 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 6729 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7178 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 244:
-#line 1854 "glslang.y" /* yacc.c:1646  */
-    {
+  case 244: /* type_specifier_nonarray: UINT32_T  */
+#line 1868 "MachineIndependent/glslang.y"
+               {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 6739 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7188 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 245:
-#line 1859 "glslang.y" /* yacc.c:1646  */
-    {
+  case 245: /* type_specifier_nonarray: INT64_T  */
+#line 1873 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
     }
-#line 6749 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7198 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 246:
-#line 1864 "glslang.y" /* yacc.c:1646  */
-    {
+  case 246: /* type_specifier_nonarray: UINT64_T  */
+#line 1878 "MachineIndependent/glslang.y"
+               {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
     }
-#line 6759 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7208 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 247:
-#line 1869 "glslang.y" /* yacc.c:1646  */
-    {
+  case 247: /* type_specifier_nonarray: DVEC2  */
+#line 1883 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6768,12 +7217,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 6772 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7221 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 248:
-#line 1877 "glslang.y" /* yacc.c:1646  */
-    {
+  case 248: /* type_specifier_nonarray: DVEC3  */
+#line 1891 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6781,12 +7230,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 6785 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7234 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 249:
-#line 1885 "glslang.y" /* yacc.c:1646  */
-    {
+  case 249: /* type_specifier_nonarray: DVEC4  */
+#line 1899 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
@@ -6794,375 +7243,375 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 6798 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7247 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 250:
-#line 1893 "glslang.y" /* yacc.c:1646  */
-    {
+  case 250: /* type_specifier_nonarray: F16VEC2  */
+#line 1907 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(2);
     }
-#line 6809 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7258 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 251:
-#line 1899 "glslang.y" /* yacc.c:1646  */
-    {
+  case 251: /* type_specifier_nonarray: F16VEC3  */
+#line 1913 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(3);
     }
-#line 6820 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7269 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 252:
-#line 1905 "glslang.y" /* yacc.c:1646  */
-    {
+  case 252: /* type_specifier_nonarray: F16VEC4  */
+#line 1919 "MachineIndependent/glslang.y"
+              {
         parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(4);
     }
-#line 6831 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7280 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 253:
-#line 1911 "glslang.y" /* yacc.c:1646  */
-    {
+  case 253: /* type_specifier_nonarray: F32VEC2  */
+#line 1925 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 6842 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7291 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 254:
-#line 1917 "glslang.y" /* yacc.c:1646  */
-    {
+  case 254: /* type_specifier_nonarray: F32VEC3  */
+#line 1931 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 6853 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7302 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 255:
-#line 1923 "glslang.y" /* yacc.c:1646  */
-    {
+  case 255: /* type_specifier_nonarray: F32VEC4  */
+#line 1937 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 6864 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7313 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 256:
-#line 1929 "glslang.y" /* yacc.c:1646  */
-    {
+  case 256: /* type_specifier_nonarray: F64VEC2  */
+#line 1943 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 6875 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7324 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 257:
-#line 1935 "glslang.y" /* yacc.c:1646  */
-    {
+  case 257: /* type_specifier_nonarray: F64VEC3  */
+#line 1949 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 6886 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7335 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 258:
-#line 1941 "glslang.y" /* yacc.c:1646  */
-    {
+  case 258: /* type_specifier_nonarray: F64VEC4  */
+#line 1955 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 6897 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7346 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 259:
-#line 1947 "glslang.y" /* yacc.c:1646  */
-    {
+  case 259: /* type_specifier_nonarray: I8VEC2  */
+#line 1961 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(2);
     }
-#line 6908 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7357 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 260:
-#line 1953 "glslang.y" /* yacc.c:1646  */
-    {
+  case 260: /* type_specifier_nonarray: I8VEC3  */
+#line 1967 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(3);
     }
-#line 6919 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7368 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 261:
-#line 1959 "glslang.y" /* yacc.c:1646  */
-    {
+  case 261: /* type_specifier_nonarray: I8VEC4  */
+#line 1973 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(4);
     }
-#line 6930 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7379 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 262:
-#line 1965 "glslang.y" /* yacc.c:1646  */
-    {
+  case 262: /* type_specifier_nonarray: I16VEC2  */
+#line 1979 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(2);
     }
-#line 6941 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7390 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 263:
-#line 1971 "glslang.y" /* yacc.c:1646  */
-    {
+  case 263: /* type_specifier_nonarray: I16VEC3  */
+#line 1985 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(3);
     }
-#line 6952 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7401 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 264:
-#line 1977 "glslang.y" /* yacc.c:1646  */
-    {
+  case 264: /* type_specifier_nonarray: I16VEC4  */
+#line 1991 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
         (yyval.interm.type).setVector(4);
     }
-#line 6963 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7412 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 265:
-#line 1983 "glslang.y" /* yacc.c:1646  */
-    {
+  case 265: /* type_specifier_nonarray: I32VEC2  */
+#line 1997 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6974 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7423 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 266:
-#line 1989 "glslang.y" /* yacc.c:1646  */
-    {
+  case 266: /* type_specifier_nonarray: I32VEC3  */
+#line 2003 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6985 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7434 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 267:
-#line 1995 "glslang.y" /* yacc.c:1646  */
-    {
+  case 267: /* type_specifier_nonarray: I32VEC4  */
+#line 2009 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6996 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7445 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 268:
-#line 2001 "glslang.y" /* yacc.c:1646  */
-    {
+  case 268: /* type_specifier_nonarray: I64VEC2  */
+#line 2015 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(2);
     }
-#line 7007 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7456 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 269:
-#line 2007 "glslang.y" /* yacc.c:1646  */
-    {
+  case 269: /* type_specifier_nonarray: I64VEC3  */
+#line 2021 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(3);
     }
-#line 7018 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7467 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 270:
-#line 2013 "glslang.y" /* yacc.c:1646  */
-    {
+  case 270: /* type_specifier_nonarray: I64VEC4  */
+#line 2027 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(4);
     }
-#line 7029 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7478 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 271:
-#line 2019 "glslang.y" /* yacc.c:1646  */
-    {
+  case 271: /* type_specifier_nonarray: U8VEC2  */
+#line 2033 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(2);
     }
-#line 7040 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7489 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 272:
-#line 2025 "glslang.y" /* yacc.c:1646  */
-    {
+  case 272: /* type_specifier_nonarray: U8VEC3  */
+#line 2039 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(3);
     }
-#line 7051 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7500 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 273:
-#line 2031 "glslang.y" /* yacc.c:1646  */
-    {
+  case 273: /* type_specifier_nonarray: U8VEC4  */
+#line 2045 "MachineIndependent/glslang.y"
+             {
         parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(4);
     }
-#line 7062 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7511 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 274:
-#line 2037 "glslang.y" /* yacc.c:1646  */
-    {
+  case 274: /* type_specifier_nonarray: U16VEC2  */
+#line 2051 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(2);
     }
-#line 7073 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7522 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 275:
-#line 2043 "glslang.y" /* yacc.c:1646  */
-    {
+  case 275: /* type_specifier_nonarray: U16VEC3  */
+#line 2057 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(3);
     }
-#line 7084 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7533 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 276:
-#line 2049 "glslang.y" /* yacc.c:1646  */
-    {
+  case 276: /* type_specifier_nonarray: U16VEC4  */
+#line 2063 "MachineIndependent/glslang.y"
+              {
         parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(4);
     }
-#line 7095 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7544 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 277:
-#line 2055 "glslang.y" /* yacc.c:1646  */
-    {
+  case 277: /* type_specifier_nonarray: U32VEC2  */
+#line 2069 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 7106 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7555 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 278:
-#line 2061 "glslang.y" /* yacc.c:1646  */
-    {
+  case 278: /* type_specifier_nonarray: U32VEC3  */
+#line 2075 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 7117 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7566 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 279:
-#line 2067 "glslang.y" /* yacc.c:1646  */
-    {
+  case 279: /* type_specifier_nonarray: U32VEC4  */
+#line 2081 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 7128 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7577 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 280:
-#line 2073 "glslang.y" /* yacc.c:1646  */
-    {
+  case 280: /* type_specifier_nonarray: U64VEC2  */
+#line 2087 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(2);
     }
-#line 7139 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7588 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 281:
-#line 2079 "glslang.y" /* yacc.c:1646  */
-    {
+  case 281: /* type_specifier_nonarray: U64VEC3  */
+#line 2093 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(3);
     }
-#line 7150 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7599 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 282:
-#line 2085 "glslang.y" /* yacc.c:1646  */
-    {
+  case 282: /* type_specifier_nonarray: U64VEC4  */
+#line 2099 "MachineIndependent/glslang.y"
+              {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(4);
     }
-#line 7161 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7610 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 283:
-#line 2091 "glslang.y" /* yacc.c:1646  */
-    {
+  case 283: /* type_specifier_nonarray: DMAT2  */
+#line 2105 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7170,12 +7619,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7174 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7623 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 284:
-#line 2099 "glslang.y" /* yacc.c:1646  */
-    {
+  case 284: /* type_specifier_nonarray: DMAT3  */
+#line 2113 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7183,12 +7632,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7187 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7636 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 285:
-#line 2107 "glslang.y" /* yacc.c:1646  */
-    {
+  case 285: /* type_specifier_nonarray: DMAT4  */
+#line 2121 "MachineIndependent/glslang.y"
+            {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7196,12 +7645,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7200 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7649 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 286:
-#line 2115 "glslang.y" /* yacc.c:1646  */
-    {
+  case 286: /* type_specifier_nonarray: DMAT2X2  */
+#line 2129 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7209,12 +7658,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7213 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7662 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 287:
-#line 2123 "glslang.y" /* yacc.c:1646  */
-    {
+  case 287: /* type_specifier_nonarray: DMAT2X3  */
+#line 2137 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7222,12 +7671,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7226 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7675 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 288:
-#line 2131 "glslang.y" /* yacc.c:1646  */
-    {
+  case 288: /* type_specifier_nonarray: DMAT2X4  */
+#line 2145 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7235,12 +7684,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7239 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7688 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 289:
-#line 2139 "glslang.y" /* yacc.c:1646  */
-    {
+  case 289: /* type_specifier_nonarray: DMAT3X2  */
+#line 2153 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7248,12 +7697,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7252 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7701 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 290:
-#line 2147 "glslang.y" /* yacc.c:1646  */
-    {
+  case 290: /* type_specifier_nonarray: DMAT3X3  */
+#line 2161 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7261,12 +7710,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7265 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7714 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 291:
-#line 2155 "glslang.y" /* yacc.c:1646  */
-    {
+  case 291: /* type_specifier_nonarray: DMAT3X4  */
+#line 2169 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7274,12 +7723,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7278 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7727 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 292:
-#line 2163 "glslang.y" /* yacc.c:1646  */
-    {
+  case 292: /* type_specifier_nonarray: DMAT4X2  */
+#line 2177 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7287,12 +7736,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7291 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7740 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 293:
-#line 2171 "glslang.y" /* yacc.c:1646  */
-    {
+  case 293: /* type_specifier_nonarray: DMAT4X3  */
+#line 2185 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7300,12 +7749,12 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7304 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7753 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 294:
-#line 2179 "glslang.y" /* yacc.c:1646  */
-    {
+  case 294: /* type_specifier_nonarray: DMAT4X4  */
+#line 2193 "MachineIndependent/glslang.y"
+              {
         parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix");
         if (! parseContext.symbolTable.atBuiltInLevel())
             parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
@@ -7313,2120 +7762,2340 @@
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7317 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7766 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 295:
-#line 2187 "glslang.y" /* yacc.c:1646  */
-    {
+  case 295: /* type_specifier_nonarray: F16MAT2  */
+#line 2201 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7328 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7777 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 296:
-#line 2193 "glslang.y" /* yacc.c:1646  */
-    {
+  case 296: /* type_specifier_nonarray: F16MAT3  */
+#line 2207 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7339 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7788 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 297:
-#line 2199 "glslang.y" /* yacc.c:1646  */
-    {
+  case 297: /* type_specifier_nonarray: F16MAT4  */
+#line 2213 "MachineIndependent/glslang.y"
+              {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7350 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7799 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 298:
-#line 2205 "glslang.y" /* yacc.c:1646  */
-    {
+  case 298: /* type_specifier_nonarray: F16MAT2X2  */
+#line 2219 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7361 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7810 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 299:
-#line 2211 "glslang.y" /* yacc.c:1646  */
-    {
+  case 299: /* type_specifier_nonarray: F16MAT2X3  */
+#line 2225 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7372 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7821 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 300:
-#line 2217 "glslang.y" /* yacc.c:1646  */
-    {
+  case 300: /* type_specifier_nonarray: F16MAT2X4  */
+#line 2231 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7383 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7832 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 301:
-#line 2223 "glslang.y" /* yacc.c:1646  */
-    {
+  case 301: /* type_specifier_nonarray: F16MAT3X2  */
+#line 2237 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7394 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7843 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 302:
-#line 2229 "glslang.y" /* yacc.c:1646  */
-    {
+  case 302: /* type_specifier_nonarray: F16MAT3X3  */
+#line 2243 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7405 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7854 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 303:
-#line 2235 "glslang.y" /* yacc.c:1646  */
-    {
+  case 303: /* type_specifier_nonarray: F16MAT3X4  */
+#line 2249 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7416 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7865 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 304:
-#line 2241 "glslang.y" /* yacc.c:1646  */
-    {
+  case 304: /* type_specifier_nonarray: F16MAT4X2  */
+#line 2255 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7427 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7876 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 305:
-#line 2247 "glslang.y" /* yacc.c:1646  */
-    {
+  case 305: /* type_specifier_nonarray: F16MAT4X3  */
+#line 2261 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7438 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7887 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 306:
-#line 2253 "glslang.y" /* yacc.c:1646  */
-    {
+  case 306: /* type_specifier_nonarray: F16MAT4X4  */
+#line 2267 "MachineIndependent/glslang.y"
+                {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7449 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7898 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 307:
-#line 2259 "glslang.y" /* yacc.c:1646  */
-    {
+  case 307: /* type_specifier_nonarray: F32MAT2  */
+#line 2273 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7460 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7909 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 308:
-#line 2265 "glslang.y" /* yacc.c:1646  */
-    {
+  case 308: /* type_specifier_nonarray: F32MAT3  */
+#line 2279 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7471 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7920 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 309:
-#line 2271 "glslang.y" /* yacc.c:1646  */
-    {
+  case 309: /* type_specifier_nonarray: F32MAT4  */
+#line 2285 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7482 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7931 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 310:
-#line 2277 "glslang.y" /* yacc.c:1646  */
-    {
+  case 310: /* type_specifier_nonarray: F32MAT2X2  */
+#line 2291 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7493 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7942 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 311:
-#line 2283 "glslang.y" /* yacc.c:1646  */
-    {
+  case 311: /* type_specifier_nonarray: F32MAT2X3  */
+#line 2297 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7504 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7953 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 312:
-#line 2289 "glslang.y" /* yacc.c:1646  */
-    {
+  case 312: /* type_specifier_nonarray: F32MAT2X4  */
+#line 2303 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7515 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7964 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 313:
-#line 2295 "glslang.y" /* yacc.c:1646  */
-    {
+  case 313: /* type_specifier_nonarray: F32MAT3X2  */
+#line 2309 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7526 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7975 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 314:
-#line 2301 "glslang.y" /* yacc.c:1646  */
-    {
+  case 314: /* type_specifier_nonarray: F32MAT3X3  */
+#line 2315 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7537 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7986 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 315:
-#line 2307 "glslang.y" /* yacc.c:1646  */
-    {
+  case 315: /* type_specifier_nonarray: F32MAT3X4  */
+#line 2321 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7548 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 7997 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 316:
-#line 2313 "glslang.y" /* yacc.c:1646  */
-    {
+  case 316: /* type_specifier_nonarray: F32MAT4X2  */
+#line 2327 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7559 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8008 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 317:
-#line 2319 "glslang.y" /* yacc.c:1646  */
-    {
+  case 317: /* type_specifier_nonarray: F32MAT4X3  */
+#line 2333 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7570 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8019 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 318:
-#line 2325 "glslang.y" /* yacc.c:1646  */
-    {
+  case 318: /* type_specifier_nonarray: F32MAT4X4  */
+#line 2339 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7581 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8030 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 319:
-#line 2331 "glslang.y" /* yacc.c:1646  */
-    {
+  case 319: /* type_specifier_nonarray: F64MAT2  */
+#line 2345 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7592 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8041 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 320:
-#line 2337 "glslang.y" /* yacc.c:1646  */
-    {
+  case 320: /* type_specifier_nonarray: F64MAT3  */
+#line 2351 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7603 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8052 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 321:
-#line 2343 "glslang.y" /* yacc.c:1646  */
-    {
+  case 321: /* type_specifier_nonarray: F64MAT4  */
+#line 2357 "MachineIndependent/glslang.y"
+              {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7614 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8063 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 322:
-#line 2349 "glslang.y" /* yacc.c:1646  */
-    {
+  case 322: /* type_specifier_nonarray: F64MAT2X2  */
+#line 2363 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 7625 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8074 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 323:
-#line 2355 "glslang.y" /* yacc.c:1646  */
-    {
+  case 323: /* type_specifier_nonarray: F64MAT2X3  */
+#line 2369 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 7636 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8085 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 324:
-#line 2361 "glslang.y" /* yacc.c:1646  */
-    {
+  case 324: /* type_specifier_nonarray: F64MAT2X4  */
+#line 2375 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 7647 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8096 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 325:
-#line 2367 "glslang.y" /* yacc.c:1646  */
-    {
+  case 325: /* type_specifier_nonarray: F64MAT3X2  */
+#line 2381 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 7658 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8107 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 326:
-#line 2373 "glslang.y" /* yacc.c:1646  */
-    {
+  case 326: /* type_specifier_nonarray: F64MAT3X3  */
+#line 2387 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 7669 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8118 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 327:
-#line 2379 "glslang.y" /* yacc.c:1646  */
-    {
+  case 327: /* type_specifier_nonarray: F64MAT3X4  */
+#line 2393 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 7680 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8129 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 328:
-#line 2385 "glslang.y" /* yacc.c:1646  */
-    {
+  case 328: /* type_specifier_nonarray: F64MAT4X2  */
+#line 2399 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 7691 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8140 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 329:
-#line 2391 "glslang.y" /* yacc.c:1646  */
-    {
+  case 329: /* type_specifier_nonarray: F64MAT4X3  */
+#line 2405 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 7702 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8151 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 330:
-#line 2397 "glslang.y" /* yacc.c:1646  */
-    {
+  case 330: /* type_specifier_nonarray: F64MAT4X4  */
+#line 2411 "MachineIndependent/glslang.y"
+                {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 7713 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8162 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 331:
-#line 2403 "glslang.y" /* yacc.c:1646  */
-    {
+  case 331: /* type_specifier_nonarray: ACCSTRUCTNV  */
+#line 2417 "MachineIndependent/glslang.y"
+                  {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtAccStruct;
     }
-#line 7722 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8171 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 332:
-#line 2407 "glslang.y" /* yacc.c:1646  */
-    {
+  case 332: /* type_specifier_nonarray: ACCSTRUCTEXT  */
+#line 2421 "MachineIndependent/glslang.y"
+                   {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtAccStruct;
     }
-#line 7731 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8180 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 333:
-#line 2411 "glslang.y" /* yacc.c:1646  */
-    {
+  case 333: /* type_specifier_nonarray: RAYQUERYEXT  */
+#line 2425 "MachineIndependent/glslang.y"
+                  {
        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
        (yyval.interm.type).basicType = EbtRayQuery;
     }
-#line 7740 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8189 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 334:
-#line 2415 "glslang.y" /* yacc.c:1646  */
-    {
+  case 334: /* type_specifier_nonarray: ATOMIC_UINT  */
+#line 2429 "MachineIndependent/glslang.y"
+                  {
         parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtAtomicUint;
     }
-#line 7750 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8199 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 335:
-#line 2420 "glslang.y" /* yacc.c:1646  */
-    {
+  case 335: /* type_specifier_nonarray: SAMPLER1D  */
+#line 2434 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D);
     }
-#line 7760 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8209 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 336:
-#line 2426 "glslang.y" /* yacc.c:1646  */
-    {
+  case 336: /* type_specifier_nonarray: SAMPLER2D  */
+#line 2440 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
     }
-#line 7770 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8219 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 337:
-#line 2431 "glslang.y" /* yacc.c:1646  */
-    {
+  case 337: /* type_specifier_nonarray: SAMPLER3D  */
+#line 2445 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd3D);
     }
-#line 7780 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8229 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 338:
-#line 2436 "glslang.y" /* yacc.c:1646  */
-    {
+  case 338: /* type_specifier_nonarray: SAMPLERCUBE  */
+#line 2450 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube);
     }
-#line 7790 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8239 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 339:
-#line 2441 "glslang.y" /* yacc.c:1646  */
-    {
+  case 339: /* type_specifier_nonarray: SAMPLER2DSHADOW  */
+#line 2455 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);
     }
-#line 7800 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8249 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 340:
-#line 2446 "glslang.y" /* yacc.c:1646  */
-    {
+  case 340: /* type_specifier_nonarray: SAMPLERCUBESHADOW  */
+#line 2460 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);
     }
-#line 7810 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8259 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 341:
-#line 2451 "glslang.y" /* yacc.c:1646  */
-    {
+  case 341: /* type_specifier_nonarray: SAMPLER2DARRAY  */
+#line 2465 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);
     }
-#line 7820 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8269 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 342:
-#line 2456 "glslang.y" /* yacc.c:1646  */
-    {
+  case 342: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW  */
+#line 2470 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);
     }
-#line 7830 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8279 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 343:
-#line 2462 "glslang.y" /* yacc.c:1646  */
-    {
+  case 343: /* type_specifier_nonarray: SAMPLER1DSHADOW  */
+#line 2476 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);
     }
-#line 7840 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8289 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 344:
-#line 2467 "glslang.y" /* yacc.c:1646  */
-    {
+  case 344: /* type_specifier_nonarray: SAMPLER1DARRAY  */
+#line 2481 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);
     }
-#line 7850 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8299 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 345:
-#line 2472 "glslang.y" /* yacc.c:1646  */
-    {
+  case 345: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW  */
+#line 2486 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);
     }
-#line 7860 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8309 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 346:
-#line 2477 "glslang.y" /* yacc.c:1646  */
-    {
+  case 346: /* type_specifier_nonarray: SAMPLERCUBEARRAY  */
+#line 2491 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);
     }
-#line 7870 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8319 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 347:
-#line 2482 "glslang.y" /* yacc.c:1646  */
-    {
+  case 347: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW  */
+#line 2496 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);
     }
-#line 7880 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8329 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 348:
-#line 2487 "glslang.y" /* yacc.c:1646  */
-    {
+  case 348: /* type_specifier_nonarray: F16SAMPLER1D  */
+#line 2501 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D);
     }
-#line 7891 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8340 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 349:
-#line 2493 "glslang.y" /* yacc.c:1646  */
-    {
+  case 349: /* type_specifier_nonarray: F16SAMPLER2D  */
+#line 2507 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D);
     }
-#line 7902 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8351 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 350:
-#line 2499 "glslang.y" /* yacc.c:1646  */
-    {
+  case 350: /* type_specifier_nonarray: F16SAMPLER3D  */
+#line 2513 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd3D);
     }
-#line 7913 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8362 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 351:
-#line 2505 "glslang.y" /* yacc.c:1646  */
-    {
+  case 351: /* type_specifier_nonarray: F16SAMPLERCUBE  */
+#line 2519 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube);
     }
-#line 7924 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8373 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 352:
-#line 2511 "glslang.y" /* yacc.c:1646  */
-    {
+  case 352: /* type_specifier_nonarray: F16SAMPLER1DSHADOW  */
+#line 2525 "MachineIndependent/glslang.y"
+                         {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true);
     }
-#line 7935 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8384 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 353:
-#line 2517 "glslang.y" /* yacc.c:1646  */
-    {
+  case 353: /* type_specifier_nonarray: F16SAMPLER2DSHADOW  */
+#line 2531 "MachineIndependent/glslang.y"
+                         {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true);
     }
-#line 7946 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8395 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 354:
-#line 2523 "glslang.y" /* yacc.c:1646  */
-    {
+  case 354: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW  */
+#line 2537 "MachineIndependent/glslang.y"
+                           {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true);
     }
-#line 7957 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8406 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 355:
-#line 2529 "glslang.y" /* yacc.c:1646  */
-    {
+  case 355: /* type_specifier_nonarray: F16SAMPLER1DARRAY  */
+#line 2543 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true);
     }
-#line 7968 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8417 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 356:
-#line 2535 "glslang.y" /* yacc.c:1646  */
-    {
+  case 356: /* type_specifier_nonarray: F16SAMPLER2DARRAY  */
+#line 2549 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true);
     }
-#line 7979 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8428 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 357:
-#line 2541 "glslang.y" /* yacc.c:1646  */
-    {
+  case 357: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW  */
+#line 2555 "MachineIndependent/glslang.y"
+                              {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true);
     }
-#line 7990 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8439 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 358:
-#line 2547 "glslang.y" /* yacc.c:1646  */
-    {
+  case 358: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW  */
+#line 2561 "MachineIndependent/glslang.y"
+                              {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true);
     }
-#line 8001 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8450 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 359:
-#line 2553 "glslang.y" /* yacc.c:1646  */
-    {
+  case 359: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY  */
+#line 2567 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true);
     }
-#line 8012 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8461 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 360:
-#line 2559 "glslang.y" /* yacc.c:1646  */
-    {
+  case 360: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW  */
+#line 2573 "MachineIndependent/glslang.y"
+                                {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true);
     }
-#line 8023 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8472 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 361:
-#line 2565 "glslang.y" /* yacc.c:1646  */
-    {
+  case 361: /* type_specifier_nonarray: ISAMPLER1D  */
+#line 2579 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D);
     }
-#line 8033 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8482 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 362:
-#line 2571 "glslang.y" /* yacc.c:1646  */
-    {
+  case 362: /* type_specifier_nonarray: ISAMPLER2D  */
+#line 2585 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D);
     }
-#line 8043 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8492 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 363:
-#line 2576 "glslang.y" /* yacc.c:1646  */
-    {
+  case 363: /* type_specifier_nonarray: ISAMPLER3D  */
+#line 2590 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd3D);
     }
-#line 8053 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8502 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 364:
-#line 2581 "glslang.y" /* yacc.c:1646  */
-    {
+  case 364: /* type_specifier_nonarray: ISAMPLERCUBE  */
+#line 2595 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube);
     }
-#line 8063 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8512 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 365:
-#line 2586 "glslang.y" /* yacc.c:1646  */
-    {
+  case 365: /* type_specifier_nonarray: ISAMPLER2DARRAY  */
+#line 2600 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);
     }
-#line 8073 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8522 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 366:
-#line 2591 "glslang.y" /* yacc.c:1646  */
-    {
+  case 366: /* type_specifier_nonarray: USAMPLER2D  */
+#line 2605 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D);
     }
-#line 8083 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8532 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 367:
-#line 2596 "glslang.y" /* yacc.c:1646  */
-    {
+  case 367: /* type_specifier_nonarray: USAMPLER3D  */
+#line 2610 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd3D);
     }
-#line 8093 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8542 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 368:
-#line 2601 "glslang.y" /* yacc.c:1646  */
-    {
+  case 368: /* type_specifier_nonarray: USAMPLERCUBE  */
+#line 2615 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube);
     }
-#line 8103 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8552 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 369:
-#line 2607 "glslang.y" /* yacc.c:1646  */
-    {
+  case 369: /* type_specifier_nonarray: ISAMPLER1DARRAY  */
+#line 2621 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);
     }
-#line 8113 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8562 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 370:
-#line 2612 "glslang.y" /* yacc.c:1646  */
-    {
+  case 370: /* type_specifier_nonarray: ISAMPLERCUBEARRAY  */
+#line 2626 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);
     }
-#line 8123 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8572 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 371:
-#line 2617 "glslang.y" /* yacc.c:1646  */
-    {
+  case 371: /* type_specifier_nonarray: USAMPLER1D  */
+#line 2631 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D);
     }
-#line 8133 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8582 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 372:
-#line 2622 "glslang.y" /* yacc.c:1646  */
-    {
+  case 372: /* type_specifier_nonarray: USAMPLER1DARRAY  */
+#line 2636 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);
     }
-#line 8143 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8592 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 373:
-#line 2627 "glslang.y" /* yacc.c:1646  */
-    {
+  case 373: /* type_specifier_nonarray: USAMPLERCUBEARRAY  */
+#line 2641 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);
     }
-#line 8153 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8602 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 374:
-#line 2632 "glslang.y" /* yacc.c:1646  */
-    {
+  case 374: /* type_specifier_nonarray: TEXTURECUBEARRAY  */
+#line 2646 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);
     }
-#line 8163 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8612 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 375:
-#line 2637 "glslang.y" /* yacc.c:1646  */
-    {
+  case 375: /* type_specifier_nonarray: ITEXTURECUBEARRAY  */
+#line 2651 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);
     }
-#line 8173 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8622 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 376:
-#line 2642 "glslang.y" /* yacc.c:1646  */
-    {
+  case 376: /* type_specifier_nonarray: UTEXTURECUBEARRAY  */
+#line 2656 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);
     }
-#line 8183 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8632 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 377:
-#line 2648 "glslang.y" /* yacc.c:1646  */
-    {
+  case 377: /* type_specifier_nonarray: USAMPLER2DARRAY  */
+#line 2662 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);
     }
-#line 8193 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8642 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 378:
-#line 2653 "glslang.y" /* yacc.c:1646  */
-    {
+  case 378: /* type_specifier_nonarray: TEXTURE2D  */
+#line 2667 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);
     }
-#line 8203 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8652 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 379:
-#line 2658 "glslang.y" /* yacc.c:1646  */
-    {
+  case 379: /* type_specifier_nonarray: TEXTURE3D  */
+#line 2672 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);
     }
-#line 8213 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8662 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 380:
-#line 2663 "glslang.y" /* yacc.c:1646  */
-    {
+  case 380: /* type_specifier_nonarray: TEXTURE2DARRAY  */
+#line 2677 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);
     }
-#line 8223 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8672 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 381:
-#line 2668 "glslang.y" /* yacc.c:1646  */
-    {
+  case 381: /* type_specifier_nonarray: TEXTURECUBE  */
+#line 2682 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);
     }
-#line 8233 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8682 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 382:
-#line 2673 "glslang.y" /* yacc.c:1646  */
-    {
+  case 382: /* type_specifier_nonarray: ITEXTURE2D  */
+#line 2687 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);
     }
-#line 8243 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8692 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 383:
-#line 2678 "glslang.y" /* yacc.c:1646  */
-    {
+  case 383: /* type_specifier_nonarray: ITEXTURE3D  */
+#line 2692 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);
     }
-#line 8253 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8702 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 384:
-#line 2683 "glslang.y" /* yacc.c:1646  */
-    {
+  case 384: /* type_specifier_nonarray: ITEXTURECUBE  */
+#line 2697 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);
     }
-#line 8263 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8712 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 385:
-#line 2688 "glslang.y" /* yacc.c:1646  */
-    {
+  case 385: /* type_specifier_nonarray: ITEXTURE2DARRAY  */
+#line 2702 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);
     }
-#line 8273 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8722 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 386:
-#line 2693 "glslang.y" /* yacc.c:1646  */
-    {
+  case 386: /* type_specifier_nonarray: UTEXTURE2D  */
+#line 2707 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);
     }
-#line 8283 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8732 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 387:
-#line 2698 "glslang.y" /* yacc.c:1646  */
-    {
+  case 387: /* type_specifier_nonarray: UTEXTURE3D  */
+#line 2712 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);
     }
-#line 8293 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8742 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 388:
-#line 2703 "glslang.y" /* yacc.c:1646  */
-    {
+  case 388: /* type_specifier_nonarray: UTEXTURECUBE  */
+#line 2717 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);
     }
-#line 8303 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8752 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 389:
-#line 2708 "glslang.y" /* yacc.c:1646  */
-    {
+  case 389: /* type_specifier_nonarray: UTEXTURE2DARRAY  */
+#line 2722 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);
     }
-#line 8313 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8762 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 390:
-#line 2713 "glslang.y" /* yacc.c:1646  */
-    {
+  case 390: /* type_specifier_nonarray: SAMPLER  */
+#line 2727 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(false);
     }
-#line 8323 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8772 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 391:
-#line 2718 "glslang.y" /* yacc.c:1646  */
-    {
+  case 391: /* type_specifier_nonarray: SAMPLERSHADOW  */
+#line 2732 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(true);
     }
-#line 8333 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8782 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 392:
-#line 2724 "glslang.y" /* yacc.c:1646  */
-    {
+  case 392: /* type_specifier_nonarray: SAMPLER2DRECT  */
+#line 2738 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect);
     }
-#line 8343 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8792 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 393:
-#line 2729 "glslang.y" /* yacc.c:1646  */
-    {
+  case 393: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW  */
+#line 2743 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);
     }
-#line 8353 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8802 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 394:
-#line 2734 "glslang.y" /* yacc.c:1646  */
-    {
+  case 394: /* type_specifier_nonarray: F16SAMPLER2DRECT  */
+#line 2748 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect);
     }
-#line 8364 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8813 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 395:
-#line 2740 "glslang.y" /* yacc.c:1646  */
-    {
+  case 395: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW  */
+#line 2754 "MachineIndependent/glslang.y"
+                             {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true);
     }
-#line 8375 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8824 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 396:
-#line 2746 "glslang.y" /* yacc.c:1646  */
-    {
+  case 396: /* type_specifier_nonarray: ISAMPLER2DRECT  */
+#line 2760 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdRect);
     }
-#line 8385 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8834 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 397:
-#line 2751 "glslang.y" /* yacc.c:1646  */
-    {
+  case 397: /* type_specifier_nonarray: USAMPLER2DRECT  */
+#line 2765 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdRect);
     }
-#line 8395 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8844 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 398:
-#line 2756 "glslang.y" /* yacc.c:1646  */
-    {
+  case 398: /* type_specifier_nonarray: SAMPLERBUFFER  */
+#line 2770 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);
     }
-#line 8405 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8854 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 399:
-#line 2761 "glslang.y" /* yacc.c:1646  */
-    {
+  case 399: /* type_specifier_nonarray: F16SAMPLERBUFFER  */
+#line 2775 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer);
     }
-#line 8416 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8865 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 400:
-#line 2767 "glslang.y" /* yacc.c:1646  */
-    {
+  case 400: /* type_specifier_nonarray: ISAMPLERBUFFER  */
+#line 2781 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);
     }
-#line 8426 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8875 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 401:
-#line 2772 "glslang.y" /* yacc.c:1646  */
-    {
+  case 401: /* type_specifier_nonarray: USAMPLERBUFFER  */
+#line 2786 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);
     }
-#line 8436 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8885 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 402:
-#line 2777 "glslang.y" /* yacc.c:1646  */
-    {
+  case 402: /* type_specifier_nonarray: SAMPLER2DMS  */
+#line 2791 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);
     }
-#line 8446 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8895 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 403:
-#line 2782 "glslang.y" /* yacc.c:1646  */
-    {
+  case 403: /* type_specifier_nonarray: F16SAMPLER2DMS  */
+#line 2796 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true);
     }
-#line 8457 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8906 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 404:
-#line 2788 "glslang.y" /* yacc.c:1646  */
-    {
+  case 404: /* type_specifier_nonarray: ISAMPLER2DMS  */
+#line 2802 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);
     }
-#line 8467 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8916 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 405:
-#line 2793 "glslang.y" /* yacc.c:1646  */
-    {
+  case 405: /* type_specifier_nonarray: USAMPLER2DMS  */
+#line 2807 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);
     }
-#line 8477 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8926 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 406:
-#line 2798 "glslang.y" /* yacc.c:1646  */
-    {
+  case 406: /* type_specifier_nonarray: SAMPLER2DMSARRAY  */
+#line 2812 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);
     }
-#line 8487 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8936 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 407:
-#line 2803 "glslang.y" /* yacc.c:1646  */
-    {
+  case 407: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY  */
+#line 2817 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true);
     }
-#line 8498 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8947 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 408:
-#line 2809 "glslang.y" /* yacc.c:1646  */
-    {
+  case 408: /* type_specifier_nonarray: ISAMPLER2DMSARRAY  */
+#line 2823 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);
     }
-#line 8508 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8957 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 409:
-#line 2814 "glslang.y" /* yacc.c:1646  */
-    {
+  case 409: /* type_specifier_nonarray: USAMPLER2DMSARRAY  */
+#line 2828 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);
     }
-#line 8518 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8967 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 410:
-#line 2819 "glslang.y" /* yacc.c:1646  */
-    {
+  case 410: /* type_specifier_nonarray: TEXTURE1D  */
+#line 2833 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);
     }
-#line 8528 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8977 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 411:
-#line 2824 "glslang.y" /* yacc.c:1646  */
-    {
+  case 411: /* type_specifier_nonarray: F16TEXTURE1D  */
+#line 2838 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D);
     }
-#line 8539 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8988 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 412:
-#line 2830 "glslang.y" /* yacc.c:1646  */
-    {
+  case 412: /* type_specifier_nonarray: F16TEXTURE2D  */
+#line 2844 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D);
     }
-#line 8550 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 8999 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 413:
-#line 2836 "glslang.y" /* yacc.c:1646  */
-    {
+  case 413: /* type_specifier_nonarray: F16TEXTURE3D  */
+#line 2850 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D);
     }
-#line 8561 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9010 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 414:
-#line 2842 "glslang.y" /* yacc.c:1646  */
-    {
+  case 414: /* type_specifier_nonarray: F16TEXTURECUBE  */
+#line 2856 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube);
     }
-#line 8572 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9021 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 415:
-#line 2848 "glslang.y" /* yacc.c:1646  */
-    {
+  case 415: /* type_specifier_nonarray: TEXTURE1DARRAY  */
+#line 2862 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);
     }
-#line 8582 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9031 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 416:
-#line 2853 "glslang.y" /* yacc.c:1646  */
-    {
+  case 416: /* type_specifier_nonarray: F16TEXTURE1DARRAY  */
+#line 2867 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true);
     }
-#line 8593 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9042 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 417:
-#line 2859 "glslang.y" /* yacc.c:1646  */
-    {
+  case 417: /* type_specifier_nonarray: F16TEXTURE2DARRAY  */
+#line 2873 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true);
     }
-#line 8604 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9053 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 418:
-#line 2865 "glslang.y" /* yacc.c:1646  */
-    {
+  case 418: /* type_specifier_nonarray: F16TEXTURECUBEARRAY  */
+#line 2879 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true);
     }
-#line 8615 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9064 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 419:
-#line 2871 "glslang.y" /* yacc.c:1646  */
-    {
+  case 419: /* type_specifier_nonarray: ITEXTURE1D  */
+#line 2885 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);
     }
-#line 8625 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9074 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 420:
-#line 2876 "glslang.y" /* yacc.c:1646  */
-    {
+  case 420: /* type_specifier_nonarray: ITEXTURE1DARRAY  */
+#line 2890 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);
     }
-#line 8635 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9084 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 421:
-#line 2881 "glslang.y" /* yacc.c:1646  */
-    {
+  case 421: /* type_specifier_nonarray: UTEXTURE1D  */
+#line 2895 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);
     }
-#line 8645 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9094 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 422:
-#line 2886 "glslang.y" /* yacc.c:1646  */
-    {
+  case 422: /* type_specifier_nonarray: UTEXTURE1DARRAY  */
+#line 2900 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);
     }
-#line 8655 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9104 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 423:
-#line 2891 "glslang.y" /* yacc.c:1646  */
-    {
+  case 423: /* type_specifier_nonarray: TEXTURE2DRECT  */
+#line 2905 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);
     }
-#line 8665 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9114 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 424:
-#line 2896 "glslang.y" /* yacc.c:1646  */
-    {
+  case 424: /* type_specifier_nonarray: F16TEXTURE2DRECT  */
+#line 2910 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect);
     }
-#line 8676 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9125 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 425:
-#line 2902 "glslang.y" /* yacc.c:1646  */
-    {
+  case 425: /* type_specifier_nonarray: ITEXTURE2DRECT  */
+#line 2916 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);
     }
-#line 8686 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9135 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 426:
-#line 2907 "glslang.y" /* yacc.c:1646  */
-    {
+  case 426: /* type_specifier_nonarray: UTEXTURE2DRECT  */
+#line 2921 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);
     }
-#line 8696 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9145 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 427:
-#line 2912 "glslang.y" /* yacc.c:1646  */
-    {
+  case 427: /* type_specifier_nonarray: TEXTUREBUFFER  */
+#line 2926 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);
     }
-#line 8706 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9155 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 428:
-#line 2917 "glslang.y" /* yacc.c:1646  */
-    {
+  case 428: /* type_specifier_nonarray: F16TEXTUREBUFFER  */
+#line 2931 "MachineIndependent/glslang.y"
+                       {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer);
     }
-#line 8717 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9166 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 429:
-#line 2923 "glslang.y" /* yacc.c:1646  */
-    {
+  case 429: /* type_specifier_nonarray: ITEXTUREBUFFER  */
+#line 2937 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);
     }
-#line 8727 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9176 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 430:
-#line 2928 "glslang.y" /* yacc.c:1646  */
-    {
+  case 430: /* type_specifier_nonarray: UTEXTUREBUFFER  */
+#line 2942 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);
     }
-#line 8737 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9186 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 431:
-#line 2933 "glslang.y" /* yacc.c:1646  */
-    {
+  case 431: /* type_specifier_nonarray: TEXTURE2DMS  */
+#line 2947 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
-#line 8747 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9196 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 432:
-#line 2938 "glslang.y" /* yacc.c:1646  */
-    {
+  case 432: /* type_specifier_nonarray: F16TEXTURE2DMS  */
+#line 2952 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
     }
-#line 8758 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9207 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 433:
-#line 2944 "glslang.y" /* yacc.c:1646  */
-    {
+  case 433: /* type_specifier_nonarray: ITEXTURE2DMS  */
+#line 2958 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);
     }
-#line 8768 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9217 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 434:
-#line 2949 "glslang.y" /* yacc.c:1646  */
-    {
+  case 434: /* type_specifier_nonarray: UTEXTURE2DMS  */
+#line 2963 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);
     }
-#line 8778 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9227 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 435:
-#line 2954 "glslang.y" /* yacc.c:1646  */
-    {
+  case 435: /* type_specifier_nonarray: TEXTURE2DMSARRAY  */
+#line 2968 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
-#line 8788 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9237 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 436:
-#line 2959 "glslang.y" /* yacc.c:1646  */
-    {
+  case 436: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY  */
+#line 2973 "MachineIndependent/glslang.y"
+                          {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
     }
-#line 8799 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9248 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 437:
-#line 2965 "glslang.y" /* yacc.c:1646  */
-    {
+  case 437: /* type_specifier_nonarray: ITEXTURE2DMSARRAY  */
+#line 2979 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);
     }
-#line 8809 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9258 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 438:
-#line 2970 "glslang.y" /* yacc.c:1646  */
-    {
+  case 438: /* type_specifier_nonarray: UTEXTURE2DMSARRAY  */
+#line 2984 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);
     }
-#line 8819 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9268 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 439:
-#line 2975 "glslang.y" /* yacc.c:1646  */
-    {
+  case 439: /* type_specifier_nonarray: IMAGE1D  */
+#line 2989 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);
     }
-#line 8829 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9278 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 440:
-#line 2980 "glslang.y" /* yacc.c:1646  */
-    {
+  case 440: /* type_specifier_nonarray: F16IMAGE1D  */
+#line 2994 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D);
     }
-#line 8840 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9289 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 441:
-#line 2986 "glslang.y" /* yacc.c:1646  */
-    {
+  case 441: /* type_specifier_nonarray: IIMAGE1D  */
+#line 3000 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);
     }
-#line 8850 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9299 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 442:
-#line 2991 "glslang.y" /* yacc.c:1646  */
-    {
+  case 442: /* type_specifier_nonarray: UIMAGE1D  */
+#line 3005 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);
     }
-#line 8860 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9309 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 443:
-#line 2996 "glslang.y" /* yacc.c:1646  */
-    {
+  case 443: /* type_specifier_nonarray: IMAGE2D  */
+#line 3010 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);
     }
-#line 8870 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9319 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 444:
-#line 3001 "glslang.y" /* yacc.c:1646  */
-    {
+  case 444: /* type_specifier_nonarray: F16IMAGE2D  */
+#line 3015 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D);
     }
-#line 8881 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9330 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 445:
-#line 3007 "glslang.y" /* yacc.c:1646  */
-    {
+  case 445: /* type_specifier_nonarray: IIMAGE2D  */
+#line 3021 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);
     }
-#line 8891 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9340 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 446:
-#line 3012 "glslang.y" /* yacc.c:1646  */
-    {
+  case 446: /* type_specifier_nonarray: UIMAGE2D  */
+#line 3026 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);
     }
-#line 8901 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9350 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 447:
-#line 3017 "glslang.y" /* yacc.c:1646  */
-    {
+  case 447: /* type_specifier_nonarray: IMAGE3D  */
+#line 3031 "MachineIndependent/glslang.y"
+              {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);
     }
-#line 8911 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9360 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 448:
-#line 3022 "glslang.y" /* yacc.c:1646  */
-    {
+  case 448: /* type_specifier_nonarray: F16IMAGE3D  */
+#line 3036 "MachineIndependent/glslang.y"
+                 {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D);
     }
-#line 8922 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9371 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 449:
-#line 3028 "glslang.y" /* yacc.c:1646  */
-    {
+  case 449: /* type_specifier_nonarray: IIMAGE3D  */
+#line 3042 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);
     }
-#line 8932 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9381 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 450:
-#line 3033 "glslang.y" /* yacc.c:1646  */
-    {
+  case 450: /* type_specifier_nonarray: UIMAGE3D  */
+#line 3047 "MachineIndependent/glslang.y"
+               {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);
     }
-#line 8942 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9391 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 451:
-#line 3038 "glslang.y" /* yacc.c:1646  */
-    {
+  case 451: /* type_specifier_nonarray: IMAGE2DRECT  */
+#line 3052 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);
     }
-#line 8952 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9401 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 452:
-#line 3043 "glslang.y" /* yacc.c:1646  */
-    {
+  case 452: /* type_specifier_nonarray: F16IMAGE2DRECT  */
+#line 3057 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect);
     }
-#line 8963 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9412 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 453:
-#line 3049 "glslang.y" /* yacc.c:1646  */
-    {
+  case 453: /* type_specifier_nonarray: IIMAGE2DRECT  */
+#line 3063 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);
     }
-#line 8973 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9422 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 454:
-#line 3054 "glslang.y" /* yacc.c:1646  */
-    {
+  case 454: /* type_specifier_nonarray: UIMAGE2DRECT  */
+#line 3068 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);
     }
-#line 8983 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9432 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 455:
-#line 3059 "glslang.y" /* yacc.c:1646  */
-    {
+  case 455: /* type_specifier_nonarray: IMAGECUBE  */
+#line 3073 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);
     }
-#line 8993 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9442 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 456:
-#line 3064 "glslang.y" /* yacc.c:1646  */
-    {
+  case 456: /* type_specifier_nonarray: F16IMAGECUBE  */
+#line 3078 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube);
     }
-#line 9004 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9453 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 457:
-#line 3070 "glslang.y" /* yacc.c:1646  */
-    {
+  case 457: /* type_specifier_nonarray: IIMAGECUBE  */
+#line 3084 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);
     }
-#line 9014 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9463 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 458:
-#line 3075 "glslang.y" /* yacc.c:1646  */
-    {
+  case 458: /* type_specifier_nonarray: UIMAGECUBE  */
+#line 3089 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);
     }
-#line 9024 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9473 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 459:
-#line 3080 "glslang.y" /* yacc.c:1646  */
-    {
+  case 459: /* type_specifier_nonarray: IMAGEBUFFER  */
+#line 3094 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);
     }
-#line 9034 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9483 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 460:
-#line 3085 "glslang.y" /* yacc.c:1646  */
-    {
+  case 460: /* type_specifier_nonarray: F16IMAGEBUFFER  */
+#line 3099 "MachineIndependent/glslang.y"
+                     {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer);
     }
-#line 9045 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9494 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 461:
-#line 3091 "glslang.y" /* yacc.c:1646  */
-    {
+  case 461: /* type_specifier_nonarray: IIMAGEBUFFER  */
+#line 3105 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);
     }
-#line 9055 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9504 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 462:
-#line 3096 "glslang.y" /* yacc.c:1646  */
-    {
+  case 462: /* type_specifier_nonarray: UIMAGEBUFFER  */
+#line 3110 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);
     }
-#line 9065 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9514 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 463:
-#line 3101 "glslang.y" /* yacc.c:1646  */
-    {
+  case 463: /* type_specifier_nonarray: IMAGE1DARRAY  */
+#line 3115 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);
     }
-#line 9075 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9524 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 464:
-#line 3106 "glslang.y" /* yacc.c:1646  */
-    {
+  case 464: /* type_specifier_nonarray: F16IMAGE1DARRAY  */
+#line 3120 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true);
     }
-#line 9086 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9535 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 465:
-#line 3112 "glslang.y" /* yacc.c:1646  */
-    {
+  case 465: /* type_specifier_nonarray: IIMAGE1DARRAY  */
+#line 3126 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);
     }
-#line 9096 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9545 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 466:
-#line 3117 "glslang.y" /* yacc.c:1646  */
-    {
+  case 466: /* type_specifier_nonarray: UIMAGE1DARRAY  */
+#line 3131 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);
     }
-#line 9106 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9555 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 467:
-#line 3122 "glslang.y" /* yacc.c:1646  */
-    {
+  case 467: /* type_specifier_nonarray: IMAGE2DARRAY  */
+#line 3136 "MachineIndependent/glslang.y"
+                   {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);
     }
-#line 9116 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9565 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 468:
-#line 3127 "glslang.y" /* yacc.c:1646  */
-    {
+  case 468: /* type_specifier_nonarray: F16IMAGE2DARRAY  */
+#line 3141 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true);
     }
-#line 9127 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9576 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 469:
-#line 3133 "glslang.y" /* yacc.c:1646  */
-    {
+  case 469: /* type_specifier_nonarray: IIMAGE2DARRAY  */
+#line 3147 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);
     }
-#line 9137 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9586 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 470:
-#line 3138 "glslang.y" /* yacc.c:1646  */
-    {
+  case 470: /* type_specifier_nonarray: UIMAGE2DARRAY  */
+#line 3152 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);
     }
-#line 9147 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9596 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 471:
-#line 3143 "glslang.y" /* yacc.c:1646  */
-    {
+  case 471: /* type_specifier_nonarray: IMAGECUBEARRAY  */
+#line 3157 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);
     }
-#line 9157 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9606 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 472:
-#line 3148 "glslang.y" /* yacc.c:1646  */
-    {
+  case 472: /* type_specifier_nonarray: F16IMAGECUBEARRAY  */
+#line 3162 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true);
     }
-#line 9168 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9617 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 473:
-#line 3154 "glslang.y" /* yacc.c:1646  */
-    {
+  case 473: /* type_specifier_nonarray: IIMAGECUBEARRAY  */
+#line 3168 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);
     }
-#line 9178 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9627 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 474:
-#line 3159 "glslang.y" /* yacc.c:1646  */
-    {
+  case 474: /* type_specifier_nonarray: UIMAGECUBEARRAY  */
+#line 3173 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);
     }
-#line 9188 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9637 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 475:
-#line 3164 "glslang.y" /* yacc.c:1646  */
-    {
+  case 475: /* type_specifier_nonarray: IMAGE2DMS  */
+#line 3178 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
-#line 9198 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9647 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 476:
-#line 3169 "glslang.y" /* yacc.c:1646  */
-    {
+  case 476: /* type_specifier_nonarray: F16IMAGE2DMS  */
+#line 3183 "MachineIndependent/glslang.y"
+                   {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true);
     }
-#line 9209 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9658 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 477:
-#line 3175 "glslang.y" /* yacc.c:1646  */
-    {
+  case 477: /* type_specifier_nonarray: IIMAGE2DMS  */
+#line 3189 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);
     }
-#line 9219 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9668 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 478:
-#line 3180 "glslang.y" /* yacc.c:1646  */
-    {
+  case 478: /* type_specifier_nonarray: UIMAGE2DMS  */
+#line 3194 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);
     }
-#line 9229 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9678 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 479:
-#line 3185 "glslang.y" /* yacc.c:1646  */
-    {
+  case 479: /* type_specifier_nonarray: IMAGE2DMSARRAY  */
+#line 3199 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
-#line 9239 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9688 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 480:
-#line 3190 "glslang.y" /* yacc.c:1646  */
-    {
+  case 480: /* type_specifier_nonarray: F16IMAGE2DMSARRAY  */
+#line 3204 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true);
     }
-#line 9250 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9699 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 481:
-#line 3196 "glslang.y" /* yacc.c:1646  */
-    {
+  case 481: /* type_specifier_nonarray: IIMAGE2DMSARRAY  */
+#line 3210 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);
     }
-#line 9260 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9709 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 482:
-#line 3201 "glslang.y" /* yacc.c:1646  */
-    {
+  case 482: /* type_specifier_nonarray: UIMAGE2DMSARRAY  */
+#line 3215 "MachineIndependent/glslang.y"
+                      {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
-#line 9270 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9719 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 483:
-#line 3206 "glslang.y" /* yacc.c:1646  */
-    {  // GL_OES_EGL_image_external
+  case 483: /* type_specifier_nonarray: I64IMAGE1D  */
+#line 3220 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D);
+    }
+#line 9729 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 484: /* type_specifier_nonarray: U64IMAGE1D  */
+#line 3225 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D);
+    }
+#line 9739 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 485: /* type_specifier_nonarray: I64IMAGE2D  */
+#line 3230 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D);
+    }
+#line 9749 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 486: /* type_specifier_nonarray: U64IMAGE2D  */
+#line 3235 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D);
+    }
+#line 9759 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 487: /* type_specifier_nonarray: I64IMAGE3D  */
+#line 3240 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd3D);
+    }
+#line 9769 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 488: /* type_specifier_nonarray: U64IMAGE3D  */
+#line 3245 "MachineIndependent/glslang.y"
+                 {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd3D);
+    }
+#line 9779 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 489: /* type_specifier_nonarray: I64IMAGE2DRECT  */
+#line 3250 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdRect);
+    }
+#line 9789 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 490: /* type_specifier_nonarray: U64IMAGE2DRECT  */
+#line 3255 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdRect);
+    }
+#line 9799 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 491: /* type_specifier_nonarray: I64IMAGECUBE  */
+#line 3260 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube);
+    }
+#line 9809 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 492: /* type_specifier_nonarray: U64IMAGECUBE  */
+#line 3265 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube);
+    }
+#line 9819 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 493: /* type_specifier_nonarray: I64IMAGEBUFFER  */
+#line 3270 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdBuffer);
+    }
+#line 9829 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 494: /* type_specifier_nonarray: U64IMAGEBUFFER  */
+#line 3275 "MachineIndependent/glslang.y"
+                     {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdBuffer);
+    }
+#line 9839 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 495: /* type_specifier_nonarray: I64IMAGE1DARRAY  */
+#line 3280 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D, true);
+    }
+#line 9849 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 496: /* type_specifier_nonarray: U64IMAGE1DARRAY  */
+#line 3285 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D, true);
+    }
+#line 9859 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 497: /* type_specifier_nonarray: I64IMAGE2DARRAY  */
+#line 3290 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true);
+    }
+#line 9869 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 498: /* type_specifier_nonarray: U64IMAGE2DARRAY  */
+#line 3295 "MachineIndependent/glslang.y"
+                      {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true);
+    }
+#line 9879 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 499: /* type_specifier_nonarray: I64IMAGECUBEARRAY  */
+#line 3300 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube, true);
+    }
+#line 9889 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 500: /* type_specifier_nonarray: U64IMAGECUBEARRAY  */
+#line 3305 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube, true);
+    }
+#line 9899 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 501: /* type_specifier_nonarray: I64IMAGE2DMS  */
+#line 3310 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, false, false, true);
+    }
+#line 9909 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 502: /* type_specifier_nonarray: U64IMAGE2DMS  */
+#line 3315 "MachineIndependent/glslang.y"
+                   {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, false, false, true);
+    }
+#line 9919 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 503: /* type_specifier_nonarray: I64IMAGE2DMSARRAY  */
+#line 3320 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true, false, true);
+    }
+#line 9929 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 504: /* type_specifier_nonarray: U64IMAGE2DMSARRAY  */
+#line 3325 "MachineIndependent/glslang.y"
+                        {
+        (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
+        (yyval.interm.type).basicType = EbtSampler;
+        (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true, false, true);
+    }
+#line 9939 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 505: /* type_specifier_nonarray: SAMPLEREXTERNALOES  */
+#line 3330 "MachineIndependent/glslang.y"
+                         {  // GL_OES_EGL_image_external
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.external = true;
     }
-#line 9281 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9950 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 484:
-#line 3212 "glslang.y" /* yacc.c:1646  */
-    { // GL_EXT_YUV_target
+  case 506: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT  */
+#line 3336 "MachineIndependent/glslang.y"
+                              { // GL_EXT_YUV_target
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.yuv = true;
     }
-#line 9292 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9961 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 485:
-#line 3218 "glslang.y" /* yacc.c:1646  */
-    {
+  case 507: /* type_specifier_nonarray: SUBPASSINPUT  */
+#line 3342 "MachineIndependent/glslang.y"
+                   {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat);
     }
-#line 9303 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9972 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 486:
-#line 3224 "glslang.y" /* yacc.c:1646  */
-    {
+  case 508: /* type_specifier_nonarray: SUBPASSINPUTMS  */
+#line 3348 "MachineIndependent/glslang.y"
+                     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat, true);
     }
-#line 9314 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9983 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 487:
-#line 3230 "glslang.y" /* yacc.c:1646  */
-    {
+  case 509: /* type_specifier_nonarray: F16SUBPASSINPUT  */
+#line 3354 "MachineIndependent/glslang.y"
+                      {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat16);
     }
-#line 9326 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 9995 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 488:
-#line 3237 "glslang.y" /* yacc.c:1646  */
-    {
+  case 510: /* type_specifier_nonarray: F16SUBPASSINPUTMS  */
+#line 3361 "MachineIndependent/glslang.y"
+                        {
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat16, true);
     }
-#line 9338 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10007 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 489:
-#line 3244 "glslang.y" /* yacc.c:1646  */
-    {
+  case 511: /* type_specifier_nonarray: ISUBPASSINPUT  */
+#line 3368 "MachineIndependent/glslang.y"
+                    {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt);
     }
-#line 9349 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10018 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 490:
-#line 3250 "glslang.y" /* yacc.c:1646  */
-    {
+  case 512: /* type_specifier_nonarray: ISUBPASSINPUTMS  */
+#line 3374 "MachineIndependent/glslang.y"
+                      {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt, true);
     }
-#line 9360 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10029 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 491:
-#line 3256 "glslang.y" /* yacc.c:1646  */
-    {
+  case 513: /* type_specifier_nonarray: USUBPASSINPUT  */
+#line 3380 "MachineIndependent/glslang.y"
+                    {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint);
     }
-#line 9371 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10040 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 492:
-#line 3262 "glslang.y" /* yacc.c:1646  */
-    {
+  case 514: /* type_specifier_nonarray: USUBPASSINPUTMS  */
+#line 3386 "MachineIndependent/glslang.y"
+                      {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint, true);
     }
-#line 9382 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10051 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 493:
-#line 3268 "glslang.y" /* yacc.c:1646  */
-    {
+  case 515: /* type_specifier_nonarray: FCOOPMATNV  */
+#line 3392 "MachineIndependent/glslang.y"
+                 {
         parseContext.fcoopmatCheck((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).coopmat = true;
     }
-#line 9393 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10062 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 494:
-#line 3274 "glslang.y" /* yacc.c:1646  */
-    {
+  case 516: /* type_specifier_nonarray: ICOOPMATNV  */
+#line 3398 "MachineIndependent/glslang.y"
+                 {
         parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).coopmat = true;
     }
-#line 9404 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10073 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 495:
-#line 3280 "glslang.y" /* yacc.c:1646  */
-    {
+  case 517: /* type_specifier_nonarray: UCOOPMATNV  */
+#line 3404 "MachineIndependent/glslang.y"
+                 {
         parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).coopmat = true;
     }
-#line 9415 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10084 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 496:
-#line 3287 "glslang.y" /* yacc.c:1646  */
-    {
+  case 518: /* type_specifier_nonarray: struct_specifier  */
+#line 3411 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));
     }
-#line 9425 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10094 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 497:
-#line 3292 "glslang.y" /* yacc.c:1646  */
-    {
+  case 519: /* type_specifier_nonarray: TYPE_NAME  */
+#line 3416 "MachineIndependent/glslang.y"
+                {
         //
         // This is for user defined type names.  The lexical phase looked up the
         // type.
@@ -9439,48 +10108,48 @@
         } else
             parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), "");
     }
-#line 9443 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10112 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 498:
-#line 3308 "glslang.y" /* yacc.c:1646  */
-    {
+  case 520: /* precision_qualifier: HIGH_PRECISION  */
+#line 3432 "MachineIndependent/glslang.y"
+                     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);
     }
-#line 9453 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10122 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 499:
-#line 3313 "glslang.y" /* yacc.c:1646  */
-    {
+  case 521: /* precision_qualifier: MEDIUM_PRECISION  */
+#line 3437 "MachineIndependent/glslang.y"
+                       {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);
     }
-#line 9463 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10132 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 500:
-#line 3318 "glslang.y" /* yacc.c:1646  */
-    {
+  case 522: /* precision_qualifier: LOW_PRECISION  */
+#line 3442 "MachineIndependent/glslang.y"
+                    {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);
     }
-#line 9473 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10142 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 501:
-#line 3326 "glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
-#line 9479 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 523: /* $@3: %empty  */
+#line 3450 "MachineIndependent/glslang.y"
+                                   { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
+#line 10148 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 502:
-#line 3326 "glslang.y" /* yacc.c:1646  */
-    {
+  case 524: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE  */
+#line 3450 "MachineIndependent/glslang.y"
+                                                                                                                   {
         TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);
         parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);
         TVariable* userTypeDef = new TVariable((yyvsp[-4].lex).string, *structure, true);
@@ -9491,38 +10160,38 @@
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 9495 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10164 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 503:
-#line 3337 "glslang.y" /* yacc.c:1646  */
-    { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
-#line 9501 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 525: /* $@4: %empty  */
+#line 3461 "MachineIndependent/glslang.y"
+                        { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
+#line 10170 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 504:
-#line 3337 "glslang.y" /* yacc.c:1646  */
-    {
+  case 526: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE  */
+#line 3461 "MachineIndependent/glslang.y"
+                                                                                                        {
         TType* structure = new TType((yyvsp[-1].interm.typeList), TString(""));
         (yyval.interm.type).init((yyvsp[-4].lex).loc);
         (yyval.interm.type).basicType = EbtStruct;
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 9513 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10182 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 505:
-#line 3347 "glslang.y" /* yacc.c:1646  */
-    {
+  case 527: /* struct_declaration_list: struct_declaration  */
+#line 3471 "MachineIndependent/glslang.y"
+                         {
         (yyval.interm.typeList) = (yyvsp[0].interm.typeList);
     }
-#line 9521 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10190 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 506:
-#line 3350 "glslang.y" /* yacc.c:1646  */
-    {
+  case 528: /* struct_declaration_list: struct_declaration_list struct_declaration  */
+#line 3474 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
         for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {
             for (unsigned int j = 0; j < (yyval.interm.typeList)->size(); ++j) {
@@ -9532,12 +10201,12 @@
             (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);
         }
     }
-#line 9536 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10205 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 507:
-#line 3363 "glslang.y" /* yacc.c:1646  */
-    {
+  case 529: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON  */
+#line 3487 "MachineIndependent/glslang.y"
+                                                      {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -9559,12 +10228,12 @@
             (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 9563 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10232 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 508:
-#line 3385 "glslang.y" /* yacc.c:1646  */
-    {
+  case 530: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON  */
+#line 3509 "MachineIndependent/glslang.y"
+                                                                     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
@@ -9588,39 +10257,39 @@
             (*(yyval.interm.typeList))[i].type->shallowCopy(type);
         }
     }
-#line 9592 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10261 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 509:
-#line 3412 "glslang.y" /* yacc.c:1646  */
-    {
+  case 531: /* struct_declarator_list: struct_declarator  */
+#line 3536 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.typeList) = new TTypeList;
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9601 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10270 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 510:
-#line 3416 "glslang.y" /* yacc.c:1646  */
-    {
+  case 532: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator  */
+#line 3540 "MachineIndependent/glslang.y"
+                                                     {
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9609 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10278 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 511:
-#line 3422 "glslang.y" /* yacc.c:1646  */
-    {
+  case 533: /* struct_declarator: IDENTIFIER  */
+#line 3546 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
     }
-#line 9619 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10288 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 512:
-#line 3427 "glslang.y" /* yacc.c:1646  */
-    {
+  case 534: /* struct_declarator: IDENTIFIER array_specifier  */
+#line 3551 "MachineIndependent/glslang.y"
+                                 {
         parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes);
 
         (yyval.interm.typeLine).type = new TType(EbtVoid);
@@ -9628,236 +10297,247 @@
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
         (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes);
     }
-#line 9632 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10301 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 513:
-#line 3438 "glslang.y" /* yacc.c:1646  */
-    {
+  case 535: /* initializer: assignment_expression  */
+#line 3562 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 9640 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10309 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 514:
-#line 3442 "glslang.y" /* yacc.c:1646  */
-    {
+  case 536: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE  */
+#line 3566 "MachineIndependent/glslang.y"
+                                              {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
     }
-#line 9651 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10320 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 515:
-#line 3448 "glslang.y" /* yacc.c:1646  */
-    {
+  case 537: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE  */
+#line 3572 "MachineIndependent/glslang.y"
+                                                    {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 9662 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10331 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 516:
-#line 3459 "glslang.y" /* yacc.c:1646  */
-    {
+  case 538: /* initializer: LEFT_BRACE RIGHT_BRACE  */
+#line 3578 "MachineIndependent/glslang.y"
+                             {
+        const char* initFeature = "empty { } initializer";
+        parseContext.profileRequires((yyvsp[-1].lex).loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        parseContext.profileRequires((yyvsp[-1].lex).loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature);
+        (yyval.interm.intermTypedNode) = parseContext.intermediate.makeAggregate((yyvsp[-1].lex).loc);
+    }
+#line 10342 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 539: /* initializer_list: initializer  */
+#line 3589 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
     }
-#line 9670 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10350 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 517:
-#line 3462 "glslang.y" /* yacc.c:1646  */
-    {
+  case 540: /* initializer_list: initializer_list COMMA initializer  */
+#line 3592 "MachineIndependent/glslang.y"
+                                         {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9678 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10358 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 518:
-#line 3469 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9684 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 541: /* declaration_statement: declaration  */
+#line 3599 "MachineIndependent/glslang.y"
+                  { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10364 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 519:
-#line 3473 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9690 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 542: /* statement: compound_statement  */
+#line 3603 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10370 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 520:
-#line 3474 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9696 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 543: /* statement: simple_statement  */
+#line 3604 "MachineIndependent/glslang.y"
+                          { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10376 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 521:
-#line 3480 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9702 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 544: /* simple_statement: declaration_statement  */
+#line 3610 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10382 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 522:
-#line 3481 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9708 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 545: /* simple_statement: expression_statement  */
+#line 3611 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10388 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 523:
-#line 3482 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9714 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 546: /* simple_statement: selection_statement  */
+#line 3612 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10394 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 524:
-#line 3483 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9720 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 547: /* simple_statement: switch_statement  */
+#line 3613 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10400 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 525:
-#line 3484 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9726 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 548: /* simple_statement: case_label  */
+#line 3614 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10406 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 526:
-#line 3485 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9732 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 549: /* simple_statement: iteration_statement  */
+#line 3615 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10412 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 527:
-#line 3486 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9738 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 550: /* simple_statement: jump_statement  */
+#line 3616 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10418 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 528:
-#line 3488 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9744 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 551: /* simple_statement: demote_statement  */
+#line 3618 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10424 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 529:
-#line 3494 "glslang.y" /* yacc.c:1646  */
-    {
+  case 552: /* demote_statement: DEMOTE SEMICOLON  */
+#line 3624 "MachineIndependent/glslang.y"
+                       {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "demote");
         parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_demote_to_helper_invocation, "demote");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDemote, (yyvsp[-1].lex).loc);
     }
-#line 9754 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10434 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 530:
-#line 3503 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = 0; }
-#line 9760 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 553: /* compound_statement: LEFT_BRACE RIGHT_BRACE  */
+#line 3633 "MachineIndependent/glslang.y"
+                             { (yyval.interm.intermNode) = 0; }
+#line 10440 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 531:
-#line 3504 "glslang.y" /* yacc.c:1646  */
-    {
+  case 554: /* $@5: %empty  */
+#line 3634 "MachineIndependent/glslang.y"
+                 {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
     }
-#line 9769 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10449 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 532:
-#line 3508 "glslang.y" /* yacc.c:1646  */
-    {
+  case 555: /* $@6: %empty  */
+#line 3638 "MachineIndependent/glslang.y"
+                     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
     }
-#line 9778 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10458 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 533:
-#line 3512 "glslang.y" /* yacc.c:1646  */
-    {
+  case 556: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE  */
+#line 3642 "MachineIndependent/glslang.y"
+                  {
         if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
             (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
     }
-#line 9788 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10468 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 534:
-#line 3520 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9794 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 557: /* statement_no_new_scope: compound_statement_no_new_scope  */
+#line 3650 "MachineIndependent/glslang.y"
+                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10474 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 535:
-#line 3521 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9800 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 558: /* statement_no_new_scope: simple_statement  */
+#line 3651 "MachineIndependent/glslang.y"
+                                      { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+#line 10480 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 536:
-#line 3525 "glslang.y" /* yacc.c:1646  */
-    {
+  case 559: /* $@7: %empty  */
+#line 3655 "MachineIndependent/glslang.y"
+      {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9808 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10488 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 537:
-#line 3528 "glslang.y" /* yacc.c:1646  */
-    {
+  case 560: /* statement_scoped: $@7 compound_statement  */
+#line 3658 "MachineIndependent/glslang.y"
+                          {
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9817 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10497 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 538:
-#line 3532 "glslang.y" /* yacc.c:1646  */
-    {
+  case 561: /* $@8: %empty  */
+#line 3662 "MachineIndependent/glslang.y"
+      {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9827 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10507 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 539:
-#line 3537 "glslang.y" /* yacc.c:1646  */
-    {
+  case 562: /* statement_scoped: $@8 simple_statement  */
+#line 3667 "MachineIndependent/glslang.y"
+                       {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9838 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10518 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 540:
-#line 3546 "glslang.y" /* yacc.c:1646  */
-    {
+  case 563: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE  */
+#line 3676 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.intermNode) = 0;
     }
-#line 9846 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10526 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 541:
-#line 3549 "glslang.y" /* yacc.c:1646  */
-    {
+  case 564: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE  */
+#line 3679 "MachineIndependent/glslang.y"
+                                            {
         if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
             (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
     }
-#line 9856 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10536 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 542:
-#line 3557 "glslang.y" /* yacc.c:1646  */
-    {
+  case 565: /* statement_list: statement  */
+#line 3687 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
@@ -9865,12 +10545,12 @@
             (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case
         }
     }
-#line 9869 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10549 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 543:
-#line 3565 "glslang.y" /* yacc.c:1646  */
-    {
+  case 566: /* statement_list: statement_list statement  */
+#line 3695 "MachineIndependent/glslang.y"
+                               {
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
             parseContext.wrapupSwitchSubsequence((yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0, (yyvsp[0].interm.intermNode));
@@ -9878,77 +10558,77 @@
         } else
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
     }
-#line 9882 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10562 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 544:
-#line 3576 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = 0; }
-#line 9888 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 567: /* expression_statement: SEMICOLON  */
+#line 3706 "MachineIndependent/glslang.y"
+                 { (yyval.interm.intermNode) = 0; }
+#line 10568 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 545:
-#line 3577 "glslang.y" /* yacc.c:1646  */
-    { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
-#line 9894 "glslang_tab.cpp" /* yacc.c:1646  */
+  case 568: /* expression_statement: expression SEMICOLON  */
+#line 3707 "MachineIndependent/glslang.y"
+                            { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
+#line 10574 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 546:
-#line 3581 "glslang.y" /* yacc.c:1646  */
-    {
+  case 569: /* selection_statement: selection_statement_nonattributed  */
+#line 3711 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9902 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10582 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 547:
-#line 3585 "glslang.y" /* yacc.c:1646  */
-    {
+  case 570: /* selection_statement: attribute selection_statement_nonattributed  */
+#line 3715 "MachineIndependent/glslang.y"
+                                                  {
         parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9911 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10591 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 548:
-#line 3592 "glslang.y" /* yacc.c:1646  */
-    {
+  case 571: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement  */
+#line 3722 "MachineIndependent/glslang.y"
+                                                                    {
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
         (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
     }
-#line 9920 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10600 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 549:
-#line 3599 "glslang.y" /* yacc.c:1646  */
-    {
+  case 572: /* selection_rest_statement: statement_scoped ELSE statement_scoped  */
+#line 3729 "MachineIndependent/glslang.y"
+                                             {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
     }
-#line 9929 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10609 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 550:
-#line 3603 "glslang.y" /* yacc.c:1646  */
-    {
+  case 573: /* selection_rest_statement: statement_scoped  */
+#line 3733 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 9938 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10618 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 551:
-#line 3611 "glslang.y" /* yacc.c:1646  */
-    {
+  case 574: /* condition: expression  */
+#line 3741 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9947 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10627 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 552:
-#line 3615 "glslang.y" /* yacc.c:1646  */
-    {
+  case 575: /* condition: fully_specified_type IDENTIFIER EQUAL initializer  */
+#line 3745 "MachineIndependent/glslang.y"
+                                                        {
         parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
 
         TType type((yyvsp[-3].interm.type));
@@ -9958,29 +10638,29 @@
         else
             (yyval.interm.intermTypedNode) = 0;
     }
-#line 9962 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10642 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 553:
-#line 3628 "glslang.y" /* yacc.c:1646  */
-    {
+  case 576: /* switch_statement: switch_statement_nonattributed  */
+#line 3758 "MachineIndependent/glslang.y"
+                                     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9970 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10650 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 554:
-#line 3632 "glslang.y" /* yacc.c:1646  */
-    {
+  case 577: /* switch_statement: attribute switch_statement_nonattributed  */
+#line 3762 "MachineIndependent/glslang.y"
+                                               {
         parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9979 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10659 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 555:
-#line 3639 "glslang.y" /* yacc.c:1646  */
-    {
+  case 578: /* $@9: %empty  */
+#line 3769 "MachineIndependent/glslang.y"
+                                               {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
         ++parseContext.statementNestingLevel;
@@ -9988,12 +10668,12 @@
         parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
         parseContext.symbolTable.push();
     }
-#line 9992 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10672 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 556:
-#line 3647 "glslang.y" /* yacc.c:1646  */
-    {
+  case 579: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE  */
+#line 3777 "MachineIndependent/glslang.y"
+                                                 {
         (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
         delete parseContext.switchSequenceStack.back();
         parseContext.switchSequenceStack.pop_back();
@@ -10002,28 +10682,28 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10006 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10686 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 557:
-#line 3659 "glslang.y" /* yacc.c:1646  */
-    {
+  case 580: /* switch_statement_list: %empty  */
+#line 3789 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermNode) = 0;
     }
-#line 10014 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10694 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 558:
-#line 3662 "glslang.y" /* yacc.c:1646  */
-    {
+  case 581: /* switch_statement_list: statement_list  */
+#line 3792 "MachineIndependent/glslang.y"
+                     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10022 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10702 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 559:
-#line 3668 "glslang.y" /* yacc.c:1646  */
-    {
+  case 582: /* case_label: CASE expression COLON  */
+#line 3798 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
             parseContext.error((yyvsp[-2].lex).loc, "cannot appear outside switch statement", "case", "");
@@ -10035,12 +10715,12 @@
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
         }
     }
-#line 10039 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10719 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 560:
-#line 3680 "glslang.y" /* yacc.c:1646  */
-    {
+  case 583: /* case_label: DEFAULT COLON  */
+#line 3810 "MachineIndependent/glslang.y"
+                    {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
             parseContext.error((yyvsp[-1].lex).loc, "cannot appear outside switch statement", "default", "");
@@ -10049,29 +10729,29 @@
         else
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
     }
-#line 10053 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10733 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 561:
-#line 3692 "glslang.y" /* yacc.c:1646  */
-    {
+  case 584: /* iteration_statement: iteration_statement_nonattributed  */
+#line 3822 "MachineIndependent/glslang.y"
+                                        {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10061 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10741 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 562:
-#line 3696 "glslang.y" /* yacc.c:1646  */
-    {
+  case 585: /* iteration_statement: attribute iteration_statement_nonattributed  */
+#line 3826 "MachineIndependent/glslang.y"
+                                                  {
         parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10070 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10750 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 563:
-#line 3703 "glslang.y" /* yacc.c:1646  */
-    {
+  case 586: /* $@10: %empty  */
+#line 3833 "MachineIndependent/glslang.y"
+                       {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
         parseContext.symbolTable.push();
@@ -10079,34 +10759,34 @@
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10083 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10763 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 564:
-#line 3711 "glslang.y" /* yacc.c:1646  */
-    {
+  case 587: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope  */
+#line 3841 "MachineIndependent/glslang.y"
+                                                   {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
         --parseContext.loopNestingLevel;
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10095 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10775 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 565:
-#line 3718 "glslang.y" /* yacc.c:1646  */
-    {
+  case 588: /* $@11: %empty  */
+#line 3848 "MachineIndependent/glslang.y"
+         {
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10105 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10785 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 566:
-#line 3723 "glslang.y" /* yacc.c:1646  */
-    {
+  case 589: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON  */
+#line 3853 "MachineIndependent/glslang.y"
+                                                                  {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
 
@@ -10117,23 +10797,23 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10121 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10801 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 567:
-#line 3734 "glslang.y" /* yacc.c:1646  */
-    {
+  case 590: /* $@12: %empty  */
+#line 3864 "MachineIndependent/glslang.y"
+                     {
         parseContext.symbolTable.push();
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 10132 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10812 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 568:
-#line 3740 "glslang.y" /* yacc.c:1646  */
-    {
+  case 591: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope  */
+#line 3870 "MachineIndependent/glslang.y"
+                                                                               {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
         TIntermLoop* forLoop = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), true, (yyvsp[-6].lex).loc);
@@ -10145,166 +10825,201 @@
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 10149 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10829 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 569:
-#line 3755 "glslang.y" /* yacc.c:1646  */
-    {
+  case 592: /* for_init_statement: expression_statement  */
+#line 3885 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10157 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10837 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 570:
-#line 3758 "glslang.y" /* yacc.c:1646  */
-    {
+  case 593: /* for_init_statement: declaration_statement  */
+#line 3888 "MachineIndependent/glslang.y"
+                            {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10165 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10845 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 571:
-#line 3764 "glslang.y" /* yacc.c:1646  */
-    {
+  case 594: /* conditionopt: condition  */
+#line 3894 "MachineIndependent/glslang.y"
+                {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 10173 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10853 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 572:
-#line 3767 "glslang.y" /* yacc.c:1646  */
-    {
+  case 595: /* conditionopt: %empty  */
+#line 3897 "MachineIndependent/glslang.y"
+                        {
         (yyval.interm.intermTypedNode) = 0;
     }
-#line 10181 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10861 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 573:
-#line 3773 "glslang.y" /* yacc.c:1646  */
-    {
+  case 596: /* for_rest_statement: conditionopt SEMICOLON  */
+#line 3903 "MachineIndependent/glslang.y"
+                             {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 10190 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10870 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 574:
-#line 3777 "glslang.y" /* yacc.c:1646  */
-    {
+  case 597: /* for_rest_statement: conditionopt SEMICOLON expression  */
+#line 3907 "MachineIndependent/glslang.y"
+                                         {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
     }
-#line 10199 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10879 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 575:
-#line 3784 "glslang.y" /* yacc.c:1646  */
-    {
+  case 598: /* jump_statement: CONTINUE SEMICOLON  */
+#line 3914 "MachineIndependent/glslang.y"
+                         {
         if (parseContext.loopNestingLevel <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
     }
-#line 10209 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10889 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 576:
-#line 3789 "glslang.y" /* yacc.c:1646  */
-    {
+  case 599: /* jump_statement: BREAK SEMICOLON  */
+#line 3919 "MachineIndependent/glslang.y"
+                      {
         if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
     }
-#line 10219 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10899 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 577:
-#line 3794 "glslang.y" /* yacc.c:1646  */
-    {
+  case 600: /* jump_statement: RETURN SEMICOLON  */
+#line 3924 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
             parseContext.error((yyvsp[-1].lex).loc, "non-void function must return a value", "return", "");
         if (parseContext.inMain)
             parseContext.postEntryPointReturn = true;
     }
-#line 10231 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10911 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 578:
-#line 3801 "glslang.y" /* yacc.c:1646  */
-    {
+  case 601: /* jump_statement: RETURN expression SEMICOLON  */
+#line 3931 "MachineIndependent/glslang.y"
+                                  {
         (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 10239 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10919 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 579:
-#line 3804 "glslang.y" /* yacc.c:1646  */
-    {
+  case 602: /* jump_statement: DISCARD SEMICOLON  */
+#line 3934 "MachineIndependent/glslang.y"
+                        {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
     }
-#line 10248 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10928 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 580:
-#line 3813 "glslang.y" /* yacc.c:1646  */
-    {
+  case 603: /* jump_statement: TERMINATE_INVOCATION SEMICOLON  */
+#line 3938 "MachineIndependent/glslang.y"
+                                     {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "terminateInvocation");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateInvocation, (yyvsp[-1].lex).loc);
+    }
+#line 10937 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 604: /* jump_statement: TERMINATE_RAY SEMICOLON  */
+#line 3943 "MachineIndependent/glslang.y"
+                              {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "terminateRayEXT");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateRayKHR, (yyvsp[-1].lex).loc);
+    }
+#line 10946 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 605: /* jump_statement: IGNORE_INTERSECTION SEMICOLON  */
+#line 3947 "MachineIndependent/glslang.y"
+                                    {
+        parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "ignoreIntersectionEXT");
+        (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, (yyvsp[-1].lex).loc);
+    }
+#line 10955 "MachineIndependent/glslang_tab.cpp"
+    break;
+
+  case 606: /* translation_unit: external_declaration  */
+#line 3957 "MachineIndependent/glslang.y"
+                           {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 10257 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10964 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 581:
-#line 3817 "glslang.y" /* yacc.c:1646  */
-    {
+  case 607: /* translation_unit: translation_unit external_declaration  */
+#line 3961 "MachineIndependent/glslang.y"
+                                            {
         if ((yyvsp[0].interm.intermNode) != nullptr) {
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
             parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
         }
     }
-#line 10268 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10975 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 582:
-#line 3826 "glslang.y" /* yacc.c:1646  */
-    {
+  case 608: /* external_declaration: function_definition  */
+#line 3970 "MachineIndependent/glslang.y"
+                          {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10276 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10983 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 583:
-#line 3829 "glslang.y" /* yacc.c:1646  */
-    {
+  case 609: /* external_declaration: declaration  */
+#line 3973 "MachineIndependent/glslang.y"
+                  {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 10284 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 10991 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 584:
-#line 3833 "glslang.y" /* yacc.c:1646  */
-    {
+  case 610: /* external_declaration: SEMICOLON  */
+#line 3977 "MachineIndependent/glslang.y"
+                {
         parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon");
         parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
         (yyval.interm.intermNode) = nullptr;
     }
-#line 10294 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11001 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 585:
-#line 3842 "glslang.y" /* yacc.c:1646  */
-    {
+  case 611: /* $@13: %empty  */
+#line 3986 "MachineIndependent/glslang.y"
+                         {
         (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
         (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.push();
+            ++parseContext.statementNestingLevel;
+        }
     }
-#line 10303 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11018 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 586:
-#line 3846 "glslang.y" /* yacc.c:1646  */
-    {
+  case 612: /* function_definition: function_prototype $@13 compound_statement_no_new_scope  */
+#line 3998 "MachineIndependent/glslang.y"
+                                    {
         //   May be best done as post process phase on intermediate code
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
             parseContext.error((yyvsp[-2].interm).loc, "function does not return a value:", "", (yyvsp[-2].interm).function->getName().c_str());
@@ -10318,53 +11033,65 @@
         (yyval.interm.intermNode)->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize);
         (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
         (yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
+
+        // Set currentFunctionType to empty pointer when goes outside of the function
+        parseContext.currentFunctionType = nullptr;
+
+        // For ES 100 only, according to ES shading language 100 spec: A function
+        // body has a scope nested inside the function's definition.
+        if (parseContext.profile == EEsProfile && parseContext.version == 100)
+        {
+            parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
+            --parseContext.statementNestingLevel;
+        }
     }
-#line 10323 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11049 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 587:
-#line 3865 "glslang.y" /* yacc.c:1646  */
-    {
+  case 613: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET  */
+#line 4028 "MachineIndependent/glslang.y"
+                                                                           {
         (yyval.interm.attributes) = (yyvsp[-2].interm.attributes);
         parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
     }
-#line 10332 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11058 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 588:
-#line 3871 "glslang.y" /* yacc.c:1646  */
-    {
+  case 614: /* attribute_list: single_attribute  */
+#line 4034 "MachineIndependent/glslang.y"
+                       {
         (yyval.interm.attributes) = (yyvsp[0].interm.attributes);
     }
-#line 10340 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11066 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 589:
-#line 3874 "glslang.y" /* yacc.c:1646  */
-    {
+  case 615: /* attribute_list: attribute_list COMMA single_attribute  */
+#line 4037 "MachineIndependent/glslang.y"
+                                            {
         (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));
     }
-#line 10348 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11074 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 590:
-#line 3879 "glslang.y" /* yacc.c:1646  */
-    {
+  case 616: /* single_attribute: IDENTIFIER  */
+#line 4042 "MachineIndependent/glslang.y"
+                 {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);
     }
-#line 10356 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11082 "MachineIndependent/glslang_tab.cpp"
     break;
 
-  case 591:
-#line 3882 "glslang.y" /* yacc.c:1646  */
-    {
+  case 617: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN  */
+#line 4045 "MachineIndependent/glslang.y"
+                                                            {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 10364 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11090 "MachineIndependent/glslang_tab.cpp"
     break;
 
 
-#line 10368 "glslang_tab.cpp" /* yacc.c:1646  */
+#line 11094 "MachineIndependent/glslang_tab.cpp"
+
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -10378,25 +11105,23 @@
      case of YYERROR or YYBACKUP, subsequent parser actions might lead
      to an incorrect destructor call or verbose syntax error message
      before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
 
   YYPOPSTACK (yylen);
   yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
   /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
+  {
+    const int yylhs = yyr1[yyn] - YYNTOKENS;
+    const int yyi = yypgoto[yylhs] + *yyssp;
+    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+               ? yytable[yyi]
+               : yydefgoto[yylhs]);
+  }
 
   goto yynewstate;
 
@@ -10407,50 +11132,44 @@
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
+  yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (pParseContext, YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
-                                        yyssp, yytoken)
       {
+        yypcontext_t yyctx
+          = {yyssp, yytoken};
         char const *yymsgp = YY_("syntax error");
         int yysyntax_error_status;
-        yysyntax_error_status = YYSYNTAX_ERROR;
+        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
         if (yysyntax_error_status == 0)
           yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
+        else if (yysyntax_error_status == -1)
           {
             if (yymsg != yymsgbuf)
               YYSTACK_FREE (yymsg);
-            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
-            if (!yymsg)
+            yymsg = YY_CAST (char *,
+                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
+            if (yymsg)
               {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
+                yysyntax_error_status
+                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
+                yymsgp = yymsg;
               }
             else
               {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = YYENOMEM;
               }
           }
         yyerror (pParseContext, yymsgp);
-        if (yysyntax_error_status == 2)
+        if (yysyntax_error_status == YYENOMEM)
           goto yyexhaustedlab;
       }
-# undef YYSYNTAX_ERROR
-#endif
     }
 
-
-
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
@@ -10479,12 +11198,10 @@
 | yyerrorlab -- error raised explicitly by YYERROR.  |
 `---------------------------------------------------*/
 yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
+  /* Pacify compilers when the user code never invokes YYERROR and the
+     label yyerrorlab therefore never appears in user code.  */
+  if (0)
+    YYERROR;
 
   /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
@@ -10501,13 +11218,14 @@
 yyerrlab1:
   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
+  /* Pop stack until we find a state that shifts the error token.  */
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
         {
-          yyn += YYTERROR;
-          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+          yyn += YYSYMBOL_YYerror;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
             {
               yyn = yytable[yyn];
               if (0 < yyn)
@@ -10521,7 +11239,7 @@
 
 
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp, pParseContext);
+                  YY_ACCESSING_SYMBOL (yystate), yyvsp, pParseContext);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -10533,7 +11251,7 @@
 
 
   /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
 
   yystate = yyn;
   goto yynewstate;
@@ -10546,6 +11264,7 @@
   yyresult = 0;
   goto yyreturn;
 
+
 /*-----------------------------------.
 | yyabortlab -- YYABORT comes here.  |
 `-----------------------------------*/
@@ -10553,16 +11272,21 @@
   yyresult = 1;
   goto yyreturn;
 
-#if !defined yyoverflow || YYERROR_VERBOSE
+
+#if 1
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
 yyexhaustedlab:
   yyerror (pParseContext, YY_("memory exhausted"));
   yyresult = 2;
-  /* Fall through.  */
+  goto yyreturn;
 #endif
 
+
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return.  |
+`-------------------------------------------------------*/
 yyreturn:
   if (yychar != YYEMPTY)
     {
@@ -10579,19 +11303,17 @@
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                  yystos[*yyssp], yyvsp, pParseContext);
+                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, pParseContext);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-#if YYERROR_VERBOSE
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
-#endif
   return yyresult;
 }
-#line 3887 "glslang.y" /* yacc.c:1906  */
 
+#line 4050 "MachineIndependent/glslang.y"
 
diff --git a/glslang/MachineIndependent/glslang_tab.cpp.h b/glslang/MachineIndependent/glslang_tab.cpp.h
index 31c8f90..d6bc00d 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp.h
+++ b/glslang/MachineIndependent/glslang_tab.cpp.h
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -30,8 +31,12 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-#ifndef YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
-# define YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
+
+#ifndef YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
+# define YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
 /* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 1
@@ -40,437 +45,466 @@
 extern int yydebug;
 #endif
 
-/* Token type.  */
+/* Token kinds.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
   enum yytokentype
   {
-    CONST = 258,
-    BOOL = 259,
-    INT = 260,
-    UINT = 261,
-    FLOAT = 262,
-    BVEC2 = 263,
-    BVEC3 = 264,
-    BVEC4 = 265,
-    IVEC2 = 266,
-    IVEC3 = 267,
-    IVEC4 = 268,
-    UVEC2 = 269,
-    UVEC3 = 270,
-    UVEC4 = 271,
-    VEC2 = 272,
-    VEC3 = 273,
-    VEC4 = 274,
-    MAT2 = 275,
-    MAT3 = 276,
-    MAT4 = 277,
-    MAT2X2 = 278,
-    MAT2X3 = 279,
-    MAT2X4 = 280,
-    MAT3X2 = 281,
-    MAT3X3 = 282,
-    MAT3X4 = 283,
-    MAT4X2 = 284,
-    MAT4X3 = 285,
-    MAT4X4 = 286,
-    SAMPLER2D = 287,
-    SAMPLER3D = 288,
-    SAMPLERCUBE = 289,
-    SAMPLER2DSHADOW = 290,
-    SAMPLERCUBESHADOW = 291,
-    SAMPLER2DARRAY = 292,
-    SAMPLER2DARRAYSHADOW = 293,
-    ISAMPLER2D = 294,
-    ISAMPLER3D = 295,
-    ISAMPLERCUBE = 296,
-    ISAMPLER2DARRAY = 297,
-    USAMPLER2D = 298,
-    USAMPLER3D = 299,
-    USAMPLERCUBE = 300,
-    USAMPLER2DARRAY = 301,
-    SAMPLER = 302,
-    SAMPLERSHADOW = 303,
-    TEXTURE2D = 304,
-    TEXTURE3D = 305,
-    TEXTURECUBE = 306,
-    TEXTURE2DARRAY = 307,
-    ITEXTURE2D = 308,
-    ITEXTURE3D = 309,
-    ITEXTURECUBE = 310,
-    ITEXTURE2DARRAY = 311,
-    UTEXTURE2D = 312,
-    UTEXTURE3D = 313,
-    UTEXTURECUBE = 314,
-    UTEXTURE2DARRAY = 315,
-    ATTRIBUTE = 316,
-    VARYING = 317,
-    FLOAT16_T = 318,
-    FLOAT32_T = 319,
-    DOUBLE = 320,
-    FLOAT64_T = 321,
-    INT64_T = 322,
-    UINT64_T = 323,
-    INT32_T = 324,
-    UINT32_T = 325,
-    INT16_T = 326,
-    UINT16_T = 327,
-    INT8_T = 328,
-    UINT8_T = 329,
-    I64VEC2 = 330,
-    I64VEC3 = 331,
-    I64VEC4 = 332,
-    U64VEC2 = 333,
-    U64VEC3 = 334,
-    U64VEC4 = 335,
-    I32VEC2 = 336,
-    I32VEC3 = 337,
-    I32VEC4 = 338,
-    U32VEC2 = 339,
-    U32VEC3 = 340,
-    U32VEC4 = 341,
-    I16VEC2 = 342,
-    I16VEC3 = 343,
-    I16VEC4 = 344,
-    U16VEC2 = 345,
-    U16VEC3 = 346,
-    U16VEC4 = 347,
-    I8VEC2 = 348,
-    I8VEC3 = 349,
-    I8VEC4 = 350,
-    U8VEC2 = 351,
-    U8VEC3 = 352,
-    U8VEC4 = 353,
-    DVEC2 = 354,
-    DVEC3 = 355,
-    DVEC4 = 356,
-    DMAT2 = 357,
-    DMAT3 = 358,
-    DMAT4 = 359,
-    F16VEC2 = 360,
-    F16VEC3 = 361,
-    F16VEC4 = 362,
-    F16MAT2 = 363,
-    F16MAT3 = 364,
-    F16MAT4 = 365,
-    F32VEC2 = 366,
-    F32VEC3 = 367,
-    F32VEC4 = 368,
-    F32MAT2 = 369,
-    F32MAT3 = 370,
-    F32MAT4 = 371,
-    F64VEC2 = 372,
-    F64VEC3 = 373,
-    F64VEC4 = 374,
-    F64MAT2 = 375,
-    F64MAT3 = 376,
-    F64MAT4 = 377,
-    DMAT2X2 = 378,
-    DMAT2X3 = 379,
-    DMAT2X4 = 380,
-    DMAT3X2 = 381,
-    DMAT3X3 = 382,
-    DMAT3X4 = 383,
-    DMAT4X2 = 384,
-    DMAT4X3 = 385,
-    DMAT4X4 = 386,
-    F16MAT2X2 = 387,
-    F16MAT2X3 = 388,
-    F16MAT2X4 = 389,
-    F16MAT3X2 = 390,
-    F16MAT3X3 = 391,
-    F16MAT3X4 = 392,
-    F16MAT4X2 = 393,
-    F16MAT4X3 = 394,
-    F16MAT4X4 = 395,
-    F32MAT2X2 = 396,
-    F32MAT2X3 = 397,
-    F32MAT2X4 = 398,
-    F32MAT3X2 = 399,
-    F32MAT3X3 = 400,
-    F32MAT3X4 = 401,
-    F32MAT4X2 = 402,
-    F32MAT4X3 = 403,
-    F32MAT4X4 = 404,
-    F64MAT2X2 = 405,
-    F64MAT2X3 = 406,
-    F64MAT2X4 = 407,
-    F64MAT3X2 = 408,
-    F64MAT3X3 = 409,
-    F64MAT3X4 = 410,
-    F64MAT4X2 = 411,
-    F64MAT4X3 = 412,
-    F64MAT4X4 = 413,
-    ATOMIC_UINT = 414,
-    ACCSTRUCTNV = 415,
-    ACCSTRUCTEXT = 416,
-    RAYQUERYEXT = 417,
-    FCOOPMATNV = 418,
-    ICOOPMATNV = 419,
-    UCOOPMATNV = 420,
-    SAMPLERCUBEARRAY = 421,
-    SAMPLERCUBEARRAYSHADOW = 422,
-    ISAMPLERCUBEARRAY = 423,
-    USAMPLERCUBEARRAY = 424,
-    SAMPLER1D = 425,
-    SAMPLER1DARRAY = 426,
-    SAMPLER1DARRAYSHADOW = 427,
-    ISAMPLER1D = 428,
-    SAMPLER1DSHADOW = 429,
-    SAMPLER2DRECT = 430,
-    SAMPLER2DRECTSHADOW = 431,
-    ISAMPLER2DRECT = 432,
-    USAMPLER2DRECT = 433,
-    SAMPLERBUFFER = 434,
-    ISAMPLERBUFFER = 435,
-    USAMPLERBUFFER = 436,
-    SAMPLER2DMS = 437,
-    ISAMPLER2DMS = 438,
-    USAMPLER2DMS = 439,
-    SAMPLER2DMSARRAY = 440,
-    ISAMPLER2DMSARRAY = 441,
-    USAMPLER2DMSARRAY = 442,
-    SAMPLEREXTERNALOES = 443,
-    SAMPLEREXTERNAL2DY2YEXT = 444,
-    ISAMPLER1DARRAY = 445,
-    USAMPLER1D = 446,
-    USAMPLER1DARRAY = 447,
-    F16SAMPLER1D = 448,
-    F16SAMPLER2D = 449,
-    F16SAMPLER3D = 450,
-    F16SAMPLER2DRECT = 451,
-    F16SAMPLERCUBE = 452,
-    F16SAMPLER1DARRAY = 453,
-    F16SAMPLER2DARRAY = 454,
-    F16SAMPLERCUBEARRAY = 455,
-    F16SAMPLERBUFFER = 456,
-    F16SAMPLER2DMS = 457,
-    F16SAMPLER2DMSARRAY = 458,
-    F16SAMPLER1DSHADOW = 459,
-    F16SAMPLER2DSHADOW = 460,
-    F16SAMPLER1DARRAYSHADOW = 461,
-    F16SAMPLER2DARRAYSHADOW = 462,
-    F16SAMPLER2DRECTSHADOW = 463,
-    F16SAMPLERCUBESHADOW = 464,
-    F16SAMPLERCUBEARRAYSHADOW = 465,
-    IMAGE1D = 466,
-    IIMAGE1D = 467,
-    UIMAGE1D = 468,
-    IMAGE2D = 469,
-    IIMAGE2D = 470,
-    UIMAGE2D = 471,
-    IMAGE3D = 472,
-    IIMAGE3D = 473,
-    UIMAGE3D = 474,
-    IMAGE2DRECT = 475,
-    IIMAGE2DRECT = 476,
-    UIMAGE2DRECT = 477,
-    IMAGECUBE = 478,
-    IIMAGECUBE = 479,
-    UIMAGECUBE = 480,
-    IMAGEBUFFER = 481,
-    IIMAGEBUFFER = 482,
-    UIMAGEBUFFER = 483,
-    IMAGE1DARRAY = 484,
-    IIMAGE1DARRAY = 485,
-    UIMAGE1DARRAY = 486,
-    IMAGE2DARRAY = 487,
-    IIMAGE2DARRAY = 488,
-    UIMAGE2DARRAY = 489,
-    IMAGECUBEARRAY = 490,
-    IIMAGECUBEARRAY = 491,
-    UIMAGECUBEARRAY = 492,
-    IMAGE2DMS = 493,
-    IIMAGE2DMS = 494,
-    UIMAGE2DMS = 495,
-    IMAGE2DMSARRAY = 496,
-    IIMAGE2DMSARRAY = 497,
-    UIMAGE2DMSARRAY = 498,
-    F16IMAGE1D = 499,
-    F16IMAGE2D = 500,
-    F16IMAGE3D = 501,
-    F16IMAGE2DRECT = 502,
-    F16IMAGECUBE = 503,
-    F16IMAGE1DARRAY = 504,
-    F16IMAGE2DARRAY = 505,
-    F16IMAGECUBEARRAY = 506,
-    F16IMAGEBUFFER = 507,
-    F16IMAGE2DMS = 508,
-    F16IMAGE2DMSARRAY = 509,
-    TEXTURECUBEARRAY = 510,
-    ITEXTURECUBEARRAY = 511,
-    UTEXTURECUBEARRAY = 512,
-    TEXTURE1D = 513,
-    ITEXTURE1D = 514,
-    UTEXTURE1D = 515,
-    TEXTURE1DARRAY = 516,
-    ITEXTURE1DARRAY = 517,
-    UTEXTURE1DARRAY = 518,
-    TEXTURE2DRECT = 519,
-    ITEXTURE2DRECT = 520,
-    UTEXTURE2DRECT = 521,
-    TEXTUREBUFFER = 522,
-    ITEXTUREBUFFER = 523,
-    UTEXTUREBUFFER = 524,
-    TEXTURE2DMS = 525,
-    ITEXTURE2DMS = 526,
-    UTEXTURE2DMS = 527,
-    TEXTURE2DMSARRAY = 528,
-    ITEXTURE2DMSARRAY = 529,
-    UTEXTURE2DMSARRAY = 530,
-    F16TEXTURE1D = 531,
-    F16TEXTURE2D = 532,
-    F16TEXTURE3D = 533,
-    F16TEXTURE2DRECT = 534,
-    F16TEXTURECUBE = 535,
-    F16TEXTURE1DARRAY = 536,
-    F16TEXTURE2DARRAY = 537,
-    F16TEXTURECUBEARRAY = 538,
-    F16TEXTUREBUFFER = 539,
-    F16TEXTURE2DMS = 540,
-    F16TEXTURE2DMSARRAY = 541,
-    SUBPASSINPUT = 542,
-    SUBPASSINPUTMS = 543,
-    ISUBPASSINPUT = 544,
-    ISUBPASSINPUTMS = 545,
-    USUBPASSINPUT = 546,
-    USUBPASSINPUTMS = 547,
-    F16SUBPASSINPUT = 548,
-    F16SUBPASSINPUTMS = 549,
-    LEFT_OP = 550,
-    RIGHT_OP = 551,
-    INC_OP = 552,
-    DEC_OP = 553,
-    LE_OP = 554,
-    GE_OP = 555,
-    EQ_OP = 556,
-    NE_OP = 557,
-    AND_OP = 558,
-    OR_OP = 559,
-    XOR_OP = 560,
-    MUL_ASSIGN = 561,
-    DIV_ASSIGN = 562,
-    ADD_ASSIGN = 563,
-    MOD_ASSIGN = 564,
-    LEFT_ASSIGN = 565,
-    RIGHT_ASSIGN = 566,
-    AND_ASSIGN = 567,
-    XOR_ASSIGN = 568,
-    OR_ASSIGN = 569,
-    SUB_ASSIGN = 570,
-    STRING_LITERAL = 571,
-    LEFT_PAREN = 572,
-    RIGHT_PAREN = 573,
-    LEFT_BRACKET = 574,
-    RIGHT_BRACKET = 575,
-    LEFT_BRACE = 576,
-    RIGHT_BRACE = 577,
-    DOT = 578,
-    COMMA = 579,
-    COLON = 580,
-    EQUAL = 581,
-    SEMICOLON = 582,
-    BANG = 583,
-    DASH = 584,
-    TILDE = 585,
-    PLUS = 586,
-    STAR = 587,
-    SLASH = 588,
-    PERCENT = 589,
-    LEFT_ANGLE = 590,
-    RIGHT_ANGLE = 591,
-    VERTICAL_BAR = 592,
-    CARET = 593,
-    AMPERSAND = 594,
-    QUESTION = 595,
-    INVARIANT = 596,
-    HIGH_PRECISION = 597,
-    MEDIUM_PRECISION = 598,
-    LOW_PRECISION = 599,
-    PRECISION = 600,
-    PACKED = 601,
-    RESOURCE = 602,
-    SUPERP = 603,
-    FLOATCONSTANT = 604,
-    INTCONSTANT = 605,
-    UINTCONSTANT = 606,
-    BOOLCONSTANT = 607,
-    IDENTIFIER = 608,
-    TYPE_NAME = 609,
-    CENTROID = 610,
-    IN = 611,
-    OUT = 612,
-    INOUT = 613,
-    STRUCT = 614,
-    VOID = 615,
-    WHILE = 616,
-    BREAK = 617,
-    CONTINUE = 618,
-    DO = 619,
-    ELSE = 620,
-    FOR = 621,
-    IF = 622,
-    DISCARD = 623,
-    RETURN = 624,
-    SWITCH = 625,
-    CASE = 626,
-    DEFAULT = 627,
-    UNIFORM = 628,
-    SHARED = 629,
-    BUFFER = 630,
-    FLAT = 631,
-    SMOOTH = 632,
-    LAYOUT = 633,
-    DOUBLECONSTANT = 634,
-    INT16CONSTANT = 635,
-    UINT16CONSTANT = 636,
-    FLOAT16CONSTANT = 637,
-    INT32CONSTANT = 638,
-    UINT32CONSTANT = 639,
-    INT64CONSTANT = 640,
-    UINT64CONSTANT = 641,
-    SUBROUTINE = 642,
-    DEMOTE = 643,
-    PAYLOADNV = 644,
-    PAYLOADINNV = 645,
-    HITATTRNV = 646,
-    CALLDATANV = 647,
-    CALLDATAINNV = 648,
-    PAYLOADEXT = 649,
-    PAYLOADINEXT = 650,
-    HITATTREXT = 651,
-    CALLDATAEXT = 652,
-    CALLDATAINEXT = 653,
-    PATCH = 654,
-    SAMPLE = 655,
-    NONUNIFORM = 656,
-    COHERENT = 657,
-    VOLATILE = 658,
-    RESTRICT = 659,
-    READONLY = 660,
-    WRITEONLY = 661,
-    DEVICECOHERENT = 662,
-    QUEUEFAMILYCOHERENT = 663,
-    WORKGROUPCOHERENT = 664,
-    SUBGROUPCOHERENT = 665,
-    NONPRIVATE = 666,
-    SHADERCALLCOHERENT = 667,
-    NOPERSPECTIVE = 668,
-    EXPLICITINTERPAMD = 669,
-    PERVERTEXNV = 670,
-    PERPRIMITIVENV = 671,
-    PERVIEWNV = 672,
-    PERTASKNV = 673,
-    PRECISE = 674
+    YYEMPTY = -2,
+    YYEOF = 0,                     /* "end of file"  */
+    YYerror = 256,                 /* error  */
+    YYUNDEF = 257,                 /* "invalid token"  */
+    CONST = 258,                   /* CONST  */
+    BOOL = 259,                    /* BOOL  */
+    INT = 260,                     /* INT  */
+    UINT = 261,                    /* UINT  */
+    FLOAT = 262,                   /* FLOAT  */
+    BVEC2 = 263,                   /* BVEC2  */
+    BVEC3 = 264,                   /* BVEC3  */
+    BVEC4 = 265,                   /* BVEC4  */
+    IVEC2 = 266,                   /* IVEC2  */
+    IVEC3 = 267,                   /* IVEC3  */
+    IVEC4 = 268,                   /* IVEC4  */
+    UVEC2 = 269,                   /* UVEC2  */
+    UVEC3 = 270,                   /* UVEC3  */
+    UVEC4 = 271,                   /* UVEC4  */
+    VEC2 = 272,                    /* VEC2  */
+    VEC3 = 273,                    /* VEC3  */
+    VEC4 = 274,                    /* VEC4  */
+    MAT2 = 275,                    /* MAT2  */
+    MAT3 = 276,                    /* MAT3  */
+    MAT4 = 277,                    /* MAT4  */
+    MAT2X2 = 278,                  /* MAT2X2  */
+    MAT2X3 = 279,                  /* MAT2X3  */
+    MAT2X4 = 280,                  /* MAT2X4  */
+    MAT3X2 = 281,                  /* MAT3X2  */
+    MAT3X3 = 282,                  /* MAT3X3  */
+    MAT3X4 = 283,                  /* MAT3X4  */
+    MAT4X2 = 284,                  /* MAT4X2  */
+    MAT4X3 = 285,                  /* MAT4X3  */
+    MAT4X4 = 286,                  /* MAT4X4  */
+    SAMPLER2D = 287,               /* SAMPLER2D  */
+    SAMPLER3D = 288,               /* SAMPLER3D  */
+    SAMPLERCUBE = 289,             /* SAMPLERCUBE  */
+    SAMPLER2DSHADOW = 290,         /* SAMPLER2DSHADOW  */
+    SAMPLERCUBESHADOW = 291,       /* SAMPLERCUBESHADOW  */
+    SAMPLER2DARRAY = 292,          /* SAMPLER2DARRAY  */
+    SAMPLER2DARRAYSHADOW = 293,    /* SAMPLER2DARRAYSHADOW  */
+    ISAMPLER2D = 294,              /* ISAMPLER2D  */
+    ISAMPLER3D = 295,              /* ISAMPLER3D  */
+    ISAMPLERCUBE = 296,            /* ISAMPLERCUBE  */
+    ISAMPLER2DARRAY = 297,         /* ISAMPLER2DARRAY  */
+    USAMPLER2D = 298,              /* USAMPLER2D  */
+    USAMPLER3D = 299,              /* USAMPLER3D  */
+    USAMPLERCUBE = 300,            /* USAMPLERCUBE  */
+    USAMPLER2DARRAY = 301,         /* USAMPLER2DARRAY  */
+    SAMPLER = 302,                 /* SAMPLER  */
+    SAMPLERSHADOW = 303,           /* SAMPLERSHADOW  */
+    TEXTURE2D = 304,               /* TEXTURE2D  */
+    TEXTURE3D = 305,               /* TEXTURE3D  */
+    TEXTURECUBE = 306,             /* TEXTURECUBE  */
+    TEXTURE2DARRAY = 307,          /* TEXTURE2DARRAY  */
+    ITEXTURE2D = 308,              /* ITEXTURE2D  */
+    ITEXTURE3D = 309,              /* ITEXTURE3D  */
+    ITEXTURECUBE = 310,            /* ITEXTURECUBE  */
+    ITEXTURE2DARRAY = 311,         /* ITEXTURE2DARRAY  */
+    UTEXTURE2D = 312,              /* UTEXTURE2D  */
+    UTEXTURE3D = 313,              /* UTEXTURE3D  */
+    UTEXTURECUBE = 314,            /* UTEXTURECUBE  */
+    UTEXTURE2DARRAY = 315,         /* UTEXTURE2DARRAY  */
+    ATTRIBUTE = 316,               /* ATTRIBUTE  */
+    VARYING = 317,                 /* VARYING  */
+    FLOAT16_T = 318,               /* FLOAT16_T  */
+    FLOAT32_T = 319,               /* FLOAT32_T  */
+    DOUBLE = 320,                  /* DOUBLE  */
+    FLOAT64_T = 321,               /* FLOAT64_T  */
+    INT64_T = 322,                 /* INT64_T  */
+    UINT64_T = 323,                /* UINT64_T  */
+    INT32_T = 324,                 /* INT32_T  */
+    UINT32_T = 325,                /* UINT32_T  */
+    INT16_T = 326,                 /* INT16_T  */
+    UINT16_T = 327,                /* UINT16_T  */
+    INT8_T = 328,                  /* INT8_T  */
+    UINT8_T = 329,                 /* UINT8_T  */
+    I64VEC2 = 330,                 /* I64VEC2  */
+    I64VEC3 = 331,                 /* I64VEC3  */
+    I64VEC4 = 332,                 /* I64VEC4  */
+    U64VEC2 = 333,                 /* U64VEC2  */
+    U64VEC3 = 334,                 /* U64VEC3  */
+    U64VEC4 = 335,                 /* U64VEC4  */
+    I32VEC2 = 336,                 /* I32VEC2  */
+    I32VEC3 = 337,                 /* I32VEC3  */
+    I32VEC4 = 338,                 /* I32VEC4  */
+    U32VEC2 = 339,                 /* U32VEC2  */
+    U32VEC3 = 340,                 /* U32VEC3  */
+    U32VEC4 = 341,                 /* U32VEC4  */
+    I16VEC2 = 342,                 /* I16VEC2  */
+    I16VEC3 = 343,                 /* I16VEC3  */
+    I16VEC4 = 344,                 /* I16VEC4  */
+    U16VEC2 = 345,                 /* U16VEC2  */
+    U16VEC3 = 346,                 /* U16VEC3  */
+    U16VEC4 = 347,                 /* U16VEC4  */
+    I8VEC2 = 348,                  /* I8VEC2  */
+    I8VEC3 = 349,                  /* I8VEC3  */
+    I8VEC4 = 350,                  /* I8VEC4  */
+    U8VEC2 = 351,                  /* U8VEC2  */
+    U8VEC3 = 352,                  /* U8VEC3  */
+    U8VEC4 = 353,                  /* U8VEC4  */
+    DVEC2 = 354,                   /* DVEC2  */
+    DVEC3 = 355,                   /* DVEC3  */
+    DVEC4 = 356,                   /* DVEC4  */
+    DMAT2 = 357,                   /* DMAT2  */
+    DMAT3 = 358,                   /* DMAT3  */
+    DMAT4 = 359,                   /* DMAT4  */
+    F16VEC2 = 360,                 /* F16VEC2  */
+    F16VEC3 = 361,                 /* F16VEC3  */
+    F16VEC4 = 362,                 /* F16VEC4  */
+    F16MAT2 = 363,                 /* F16MAT2  */
+    F16MAT3 = 364,                 /* F16MAT3  */
+    F16MAT4 = 365,                 /* F16MAT4  */
+    F32VEC2 = 366,                 /* F32VEC2  */
+    F32VEC3 = 367,                 /* F32VEC3  */
+    F32VEC4 = 368,                 /* F32VEC4  */
+    F32MAT2 = 369,                 /* F32MAT2  */
+    F32MAT3 = 370,                 /* F32MAT3  */
+    F32MAT4 = 371,                 /* F32MAT4  */
+    F64VEC2 = 372,                 /* F64VEC2  */
+    F64VEC3 = 373,                 /* F64VEC3  */
+    F64VEC4 = 374,                 /* F64VEC4  */
+    F64MAT2 = 375,                 /* F64MAT2  */
+    F64MAT3 = 376,                 /* F64MAT3  */
+    F64MAT4 = 377,                 /* F64MAT4  */
+    DMAT2X2 = 378,                 /* DMAT2X2  */
+    DMAT2X3 = 379,                 /* DMAT2X3  */
+    DMAT2X4 = 380,                 /* DMAT2X4  */
+    DMAT3X2 = 381,                 /* DMAT3X2  */
+    DMAT3X3 = 382,                 /* DMAT3X3  */
+    DMAT3X4 = 383,                 /* DMAT3X4  */
+    DMAT4X2 = 384,                 /* DMAT4X2  */
+    DMAT4X3 = 385,                 /* DMAT4X3  */
+    DMAT4X4 = 386,                 /* DMAT4X4  */
+    F16MAT2X2 = 387,               /* F16MAT2X2  */
+    F16MAT2X3 = 388,               /* F16MAT2X3  */
+    F16MAT2X4 = 389,               /* F16MAT2X4  */
+    F16MAT3X2 = 390,               /* F16MAT3X2  */
+    F16MAT3X3 = 391,               /* F16MAT3X3  */
+    F16MAT3X4 = 392,               /* F16MAT3X4  */
+    F16MAT4X2 = 393,               /* F16MAT4X2  */
+    F16MAT4X3 = 394,               /* F16MAT4X3  */
+    F16MAT4X4 = 395,               /* F16MAT4X4  */
+    F32MAT2X2 = 396,               /* F32MAT2X2  */
+    F32MAT2X3 = 397,               /* F32MAT2X3  */
+    F32MAT2X4 = 398,               /* F32MAT2X4  */
+    F32MAT3X2 = 399,               /* F32MAT3X2  */
+    F32MAT3X3 = 400,               /* F32MAT3X3  */
+    F32MAT3X4 = 401,               /* F32MAT3X4  */
+    F32MAT4X2 = 402,               /* F32MAT4X2  */
+    F32MAT4X3 = 403,               /* F32MAT4X3  */
+    F32MAT4X4 = 404,               /* F32MAT4X4  */
+    F64MAT2X2 = 405,               /* F64MAT2X2  */
+    F64MAT2X3 = 406,               /* F64MAT2X3  */
+    F64MAT2X4 = 407,               /* F64MAT2X4  */
+    F64MAT3X2 = 408,               /* F64MAT3X2  */
+    F64MAT3X3 = 409,               /* F64MAT3X3  */
+    F64MAT3X4 = 410,               /* F64MAT3X4  */
+    F64MAT4X2 = 411,               /* F64MAT4X2  */
+    F64MAT4X3 = 412,               /* F64MAT4X3  */
+    F64MAT4X4 = 413,               /* F64MAT4X4  */
+    ATOMIC_UINT = 414,             /* ATOMIC_UINT  */
+    ACCSTRUCTNV = 415,             /* ACCSTRUCTNV  */
+    ACCSTRUCTEXT = 416,            /* ACCSTRUCTEXT  */
+    RAYQUERYEXT = 417,             /* RAYQUERYEXT  */
+    FCOOPMATNV = 418,              /* FCOOPMATNV  */
+    ICOOPMATNV = 419,              /* ICOOPMATNV  */
+    UCOOPMATNV = 420,              /* UCOOPMATNV  */
+    SAMPLERCUBEARRAY = 421,        /* SAMPLERCUBEARRAY  */
+    SAMPLERCUBEARRAYSHADOW = 422,  /* SAMPLERCUBEARRAYSHADOW  */
+    ISAMPLERCUBEARRAY = 423,       /* ISAMPLERCUBEARRAY  */
+    USAMPLERCUBEARRAY = 424,       /* USAMPLERCUBEARRAY  */
+    SAMPLER1D = 425,               /* SAMPLER1D  */
+    SAMPLER1DARRAY = 426,          /* SAMPLER1DARRAY  */
+    SAMPLER1DARRAYSHADOW = 427,    /* SAMPLER1DARRAYSHADOW  */
+    ISAMPLER1D = 428,              /* ISAMPLER1D  */
+    SAMPLER1DSHADOW = 429,         /* SAMPLER1DSHADOW  */
+    SAMPLER2DRECT = 430,           /* SAMPLER2DRECT  */
+    SAMPLER2DRECTSHADOW = 431,     /* SAMPLER2DRECTSHADOW  */
+    ISAMPLER2DRECT = 432,          /* ISAMPLER2DRECT  */
+    USAMPLER2DRECT = 433,          /* USAMPLER2DRECT  */
+    SAMPLERBUFFER = 434,           /* SAMPLERBUFFER  */
+    ISAMPLERBUFFER = 435,          /* ISAMPLERBUFFER  */
+    USAMPLERBUFFER = 436,          /* USAMPLERBUFFER  */
+    SAMPLER2DMS = 437,             /* SAMPLER2DMS  */
+    ISAMPLER2DMS = 438,            /* ISAMPLER2DMS  */
+    USAMPLER2DMS = 439,            /* USAMPLER2DMS  */
+    SAMPLER2DMSARRAY = 440,        /* SAMPLER2DMSARRAY  */
+    ISAMPLER2DMSARRAY = 441,       /* ISAMPLER2DMSARRAY  */
+    USAMPLER2DMSARRAY = 442,       /* USAMPLER2DMSARRAY  */
+    SAMPLEREXTERNALOES = 443,      /* SAMPLEREXTERNALOES  */
+    SAMPLEREXTERNAL2DY2YEXT = 444, /* SAMPLEREXTERNAL2DY2YEXT  */
+    ISAMPLER1DARRAY = 445,         /* ISAMPLER1DARRAY  */
+    USAMPLER1D = 446,              /* USAMPLER1D  */
+    USAMPLER1DARRAY = 447,         /* USAMPLER1DARRAY  */
+    F16SAMPLER1D = 448,            /* F16SAMPLER1D  */
+    F16SAMPLER2D = 449,            /* F16SAMPLER2D  */
+    F16SAMPLER3D = 450,            /* F16SAMPLER3D  */
+    F16SAMPLER2DRECT = 451,        /* F16SAMPLER2DRECT  */
+    F16SAMPLERCUBE = 452,          /* F16SAMPLERCUBE  */
+    F16SAMPLER1DARRAY = 453,       /* F16SAMPLER1DARRAY  */
+    F16SAMPLER2DARRAY = 454,       /* F16SAMPLER2DARRAY  */
+    F16SAMPLERCUBEARRAY = 455,     /* F16SAMPLERCUBEARRAY  */
+    F16SAMPLERBUFFER = 456,        /* F16SAMPLERBUFFER  */
+    F16SAMPLER2DMS = 457,          /* F16SAMPLER2DMS  */
+    F16SAMPLER2DMSARRAY = 458,     /* F16SAMPLER2DMSARRAY  */
+    F16SAMPLER1DSHADOW = 459,      /* F16SAMPLER1DSHADOW  */
+    F16SAMPLER2DSHADOW = 460,      /* F16SAMPLER2DSHADOW  */
+    F16SAMPLER1DARRAYSHADOW = 461, /* F16SAMPLER1DARRAYSHADOW  */
+    F16SAMPLER2DARRAYSHADOW = 462, /* F16SAMPLER2DARRAYSHADOW  */
+    F16SAMPLER2DRECTSHADOW = 463,  /* F16SAMPLER2DRECTSHADOW  */
+    F16SAMPLERCUBESHADOW = 464,    /* F16SAMPLERCUBESHADOW  */
+    F16SAMPLERCUBEARRAYSHADOW = 465, /* F16SAMPLERCUBEARRAYSHADOW  */
+    IMAGE1D = 466,                 /* IMAGE1D  */
+    IIMAGE1D = 467,                /* IIMAGE1D  */
+    UIMAGE1D = 468,                /* UIMAGE1D  */
+    IMAGE2D = 469,                 /* IMAGE2D  */
+    IIMAGE2D = 470,                /* IIMAGE2D  */
+    UIMAGE2D = 471,                /* UIMAGE2D  */
+    IMAGE3D = 472,                 /* IMAGE3D  */
+    IIMAGE3D = 473,                /* IIMAGE3D  */
+    UIMAGE3D = 474,                /* UIMAGE3D  */
+    IMAGE2DRECT = 475,             /* IMAGE2DRECT  */
+    IIMAGE2DRECT = 476,            /* IIMAGE2DRECT  */
+    UIMAGE2DRECT = 477,            /* UIMAGE2DRECT  */
+    IMAGECUBE = 478,               /* IMAGECUBE  */
+    IIMAGECUBE = 479,              /* IIMAGECUBE  */
+    UIMAGECUBE = 480,              /* UIMAGECUBE  */
+    IMAGEBUFFER = 481,             /* IMAGEBUFFER  */
+    IIMAGEBUFFER = 482,            /* IIMAGEBUFFER  */
+    UIMAGEBUFFER = 483,            /* UIMAGEBUFFER  */
+    IMAGE1DARRAY = 484,            /* IMAGE1DARRAY  */
+    IIMAGE1DARRAY = 485,           /* IIMAGE1DARRAY  */
+    UIMAGE1DARRAY = 486,           /* UIMAGE1DARRAY  */
+    IMAGE2DARRAY = 487,            /* IMAGE2DARRAY  */
+    IIMAGE2DARRAY = 488,           /* IIMAGE2DARRAY  */
+    UIMAGE2DARRAY = 489,           /* UIMAGE2DARRAY  */
+    IMAGECUBEARRAY = 490,          /* IMAGECUBEARRAY  */
+    IIMAGECUBEARRAY = 491,         /* IIMAGECUBEARRAY  */
+    UIMAGECUBEARRAY = 492,         /* UIMAGECUBEARRAY  */
+    IMAGE2DMS = 493,               /* IMAGE2DMS  */
+    IIMAGE2DMS = 494,              /* IIMAGE2DMS  */
+    UIMAGE2DMS = 495,              /* UIMAGE2DMS  */
+    IMAGE2DMSARRAY = 496,          /* IMAGE2DMSARRAY  */
+    IIMAGE2DMSARRAY = 497,         /* IIMAGE2DMSARRAY  */
+    UIMAGE2DMSARRAY = 498,         /* UIMAGE2DMSARRAY  */
+    F16IMAGE1D = 499,              /* F16IMAGE1D  */
+    F16IMAGE2D = 500,              /* F16IMAGE2D  */
+    F16IMAGE3D = 501,              /* F16IMAGE3D  */
+    F16IMAGE2DRECT = 502,          /* F16IMAGE2DRECT  */
+    F16IMAGECUBE = 503,            /* F16IMAGECUBE  */
+    F16IMAGE1DARRAY = 504,         /* F16IMAGE1DARRAY  */
+    F16IMAGE2DARRAY = 505,         /* F16IMAGE2DARRAY  */
+    F16IMAGECUBEARRAY = 506,       /* F16IMAGECUBEARRAY  */
+    F16IMAGEBUFFER = 507,          /* F16IMAGEBUFFER  */
+    F16IMAGE2DMS = 508,            /* F16IMAGE2DMS  */
+    F16IMAGE2DMSARRAY = 509,       /* F16IMAGE2DMSARRAY  */
+    I64IMAGE1D = 510,              /* I64IMAGE1D  */
+    U64IMAGE1D = 511,              /* U64IMAGE1D  */
+    I64IMAGE2D = 512,              /* I64IMAGE2D  */
+    U64IMAGE2D = 513,              /* U64IMAGE2D  */
+    I64IMAGE3D = 514,              /* I64IMAGE3D  */
+    U64IMAGE3D = 515,              /* U64IMAGE3D  */
+    I64IMAGE2DRECT = 516,          /* I64IMAGE2DRECT  */
+    U64IMAGE2DRECT = 517,          /* U64IMAGE2DRECT  */
+    I64IMAGECUBE = 518,            /* I64IMAGECUBE  */
+    U64IMAGECUBE = 519,            /* U64IMAGECUBE  */
+    I64IMAGEBUFFER = 520,          /* I64IMAGEBUFFER  */
+    U64IMAGEBUFFER = 521,          /* U64IMAGEBUFFER  */
+    I64IMAGE1DARRAY = 522,         /* I64IMAGE1DARRAY  */
+    U64IMAGE1DARRAY = 523,         /* U64IMAGE1DARRAY  */
+    I64IMAGE2DARRAY = 524,         /* I64IMAGE2DARRAY  */
+    U64IMAGE2DARRAY = 525,         /* U64IMAGE2DARRAY  */
+    I64IMAGECUBEARRAY = 526,       /* I64IMAGECUBEARRAY  */
+    U64IMAGECUBEARRAY = 527,       /* U64IMAGECUBEARRAY  */
+    I64IMAGE2DMS = 528,            /* I64IMAGE2DMS  */
+    U64IMAGE2DMS = 529,            /* U64IMAGE2DMS  */
+    I64IMAGE2DMSARRAY = 530,       /* I64IMAGE2DMSARRAY  */
+    U64IMAGE2DMSARRAY = 531,       /* U64IMAGE2DMSARRAY  */
+    TEXTURECUBEARRAY = 532,        /* TEXTURECUBEARRAY  */
+    ITEXTURECUBEARRAY = 533,       /* ITEXTURECUBEARRAY  */
+    UTEXTURECUBEARRAY = 534,       /* UTEXTURECUBEARRAY  */
+    TEXTURE1D = 535,               /* TEXTURE1D  */
+    ITEXTURE1D = 536,              /* ITEXTURE1D  */
+    UTEXTURE1D = 537,              /* UTEXTURE1D  */
+    TEXTURE1DARRAY = 538,          /* TEXTURE1DARRAY  */
+    ITEXTURE1DARRAY = 539,         /* ITEXTURE1DARRAY  */
+    UTEXTURE1DARRAY = 540,         /* UTEXTURE1DARRAY  */
+    TEXTURE2DRECT = 541,           /* TEXTURE2DRECT  */
+    ITEXTURE2DRECT = 542,          /* ITEXTURE2DRECT  */
+    UTEXTURE2DRECT = 543,          /* UTEXTURE2DRECT  */
+    TEXTUREBUFFER = 544,           /* TEXTUREBUFFER  */
+    ITEXTUREBUFFER = 545,          /* ITEXTUREBUFFER  */
+    UTEXTUREBUFFER = 546,          /* UTEXTUREBUFFER  */
+    TEXTURE2DMS = 547,             /* TEXTURE2DMS  */
+    ITEXTURE2DMS = 548,            /* ITEXTURE2DMS  */
+    UTEXTURE2DMS = 549,            /* UTEXTURE2DMS  */
+    TEXTURE2DMSARRAY = 550,        /* TEXTURE2DMSARRAY  */
+    ITEXTURE2DMSARRAY = 551,       /* ITEXTURE2DMSARRAY  */
+    UTEXTURE2DMSARRAY = 552,       /* UTEXTURE2DMSARRAY  */
+    F16TEXTURE1D = 553,            /* F16TEXTURE1D  */
+    F16TEXTURE2D = 554,            /* F16TEXTURE2D  */
+    F16TEXTURE3D = 555,            /* F16TEXTURE3D  */
+    F16TEXTURE2DRECT = 556,        /* F16TEXTURE2DRECT  */
+    F16TEXTURECUBE = 557,          /* F16TEXTURECUBE  */
+    F16TEXTURE1DARRAY = 558,       /* F16TEXTURE1DARRAY  */
+    F16TEXTURE2DARRAY = 559,       /* F16TEXTURE2DARRAY  */
+    F16TEXTURECUBEARRAY = 560,     /* F16TEXTURECUBEARRAY  */
+    F16TEXTUREBUFFER = 561,        /* F16TEXTUREBUFFER  */
+    F16TEXTURE2DMS = 562,          /* F16TEXTURE2DMS  */
+    F16TEXTURE2DMSARRAY = 563,     /* F16TEXTURE2DMSARRAY  */
+    SUBPASSINPUT = 564,            /* SUBPASSINPUT  */
+    SUBPASSINPUTMS = 565,          /* SUBPASSINPUTMS  */
+    ISUBPASSINPUT = 566,           /* ISUBPASSINPUT  */
+    ISUBPASSINPUTMS = 567,         /* ISUBPASSINPUTMS  */
+    USUBPASSINPUT = 568,           /* USUBPASSINPUT  */
+    USUBPASSINPUTMS = 569,         /* USUBPASSINPUTMS  */
+    F16SUBPASSINPUT = 570,         /* F16SUBPASSINPUT  */
+    F16SUBPASSINPUTMS = 571,       /* F16SUBPASSINPUTMS  */
+    LEFT_OP = 572,                 /* LEFT_OP  */
+    RIGHT_OP = 573,                /* RIGHT_OP  */
+    INC_OP = 574,                  /* INC_OP  */
+    DEC_OP = 575,                  /* DEC_OP  */
+    LE_OP = 576,                   /* LE_OP  */
+    GE_OP = 577,                   /* GE_OP  */
+    EQ_OP = 578,                   /* EQ_OP  */
+    NE_OP = 579,                   /* NE_OP  */
+    AND_OP = 580,                  /* AND_OP  */
+    OR_OP = 581,                   /* OR_OP  */
+    XOR_OP = 582,                  /* XOR_OP  */
+    MUL_ASSIGN = 583,              /* MUL_ASSIGN  */
+    DIV_ASSIGN = 584,              /* DIV_ASSIGN  */
+    ADD_ASSIGN = 585,              /* ADD_ASSIGN  */
+    MOD_ASSIGN = 586,              /* MOD_ASSIGN  */
+    LEFT_ASSIGN = 587,             /* LEFT_ASSIGN  */
+    RIGHT_ASSIGN = 588,            /* RIGHT_ASSIGN  */
+    AND_ASSIGN = 589,              /* AND_ASSIGN  */
+    XOR_ASSIGN = 590,              /* XOR_ASSIGN  */
+    OR_ASSIGN = 591,               /* OR_ASSIGN  */
+    SUB_ASSIGN = 592,              /* SUB_ASSIGN  */
+    STRING_LITERAL = 593,          /* STRING_LITERAL  */
+    LEFT_PAREN = 594,              /* LEFT_PAREN  */
+    RIGHT_PAREN = 595,             /* RIGHT_PAREN  */
+    LEFT_BRACKET = 596,            /* LEFT_BRACKET  */
+    RIGHT_BRACKET = 597,           /* RIGHT_BRACKET  */
+    LEFT_BRACE = 598,              /* LEFT_BRACE  */
+    RIGHT_BRACE = 599,             /* RIGHT_BRACE  */
+    DOT = 600,                     /* DOT  */
+    COMMA = 601,                   /* COMMA  */
+    COLON = 602,                   /* COLON  */
+    EQUAL = 603,                   /* EQUAL  */
+    SEMICOLON = 604,               /* SEMICOLON  */
+    BANG = 605,                    /* BANG  */
+    DASH = 606,                    /* DASH  */
+    TILDE = 607,                   /* TILDE  */
+    PLUS = 608,                    /* PLUS  */
+    STAR = 609,                    /* STAR  */
+    SLASH = 610,                   /* SLASH  */
+    PERCENT = 611,                 /* PERCENT  */
+    LEFT_ANGLE = 612,              /* LEFT_ANGLE  */
+    RIGHT_ANGLE = 613,             /* RIGHT_ANGLE  */
+    VERTICAL_BAR = 614,            /* VERTICAL_BAR  */
+    CARET = 615,                   /* CARET  */
+    AMPERSAND = 616,               /* AMPERSAND  */
+    QUESTION = 617,                /* QUESTION  */
+    INVARIANT = 618,               /* INVARIANT  */
+    HIGH_PRECISION = 619,          /* HIGH_PRECISION  */
+    MEDIUM_PRECISION = 620,        /* MEDIUM_PRECISION  */
+    LOW_PRECISION = 621,           /* LOW_PRECISION  */
+    PRECISION = 622,               /* PRECISION  */
+    PACKED = 623,                  /* PACKED  */
+    RESOURCE = 624,                /* RESOURCE  */
+    SUPERP = 625,                  /* SUPERP  */
+    FLOATCONSTANT = 626,           /* FLOATCONSTANT  */
+    INTCONSTANT = 627,             /* INTCONSTANT  */
+    UINTCONSTANT = 628,            /* UINTCONSTANT  */
+    BOOLCONSTANT = 629,            /* BOOLCONSTANT  */
+    IDENTIFIER = 630,              /* IDENTIFIER  */
+    TYPE_NAME = 631,               /* TYPE_NAME  */
+    CENTROID = 632,                /* CENTROID  */
+    IN = 633,                      /* IN  */
+    OUT = 634,                     /* OUT  */
+    INOUT = 635,                   /* INOUT  */
+    STRUCT = 636,                  /* STRUCT  */
+    VOID = 637,                    /* VOID  */
+    WHILE = 638,                   /* WHILE  */
+    BREAK = 639,                   /* BREAK  */
+    CONTINUE = 640,                /* CONTINUE  */
+    DO = 641,                      /* DO  */
+    ELSE = 642,                    /* ELSE  */
+    FOR = 643,                     /* FOR  */
+    IF = 644,                      /* IF  */
+    DISCARD = 645,                 /* DISCARD  */
+    RETURN = 646,                  /* RETURN  */
+    SWITCH = 647,                  /* SWITCH  */
+    CASE = 648,                    /* CASE  */
+    DEFAULT = 649,                 /* DEFAULT  */
+    TERMINATE_INVOCATION = 650,    /* TERMINATE_INVOCATION  */
+    TERMINATE_RAY = 651,           /* TERMINATE_RAY  */
+    IGNORE_INTERSECTION = 652,     /* IGNORE_INTERSECTION  */
+    UNIFORM = 653,                 /* UNIFORM  */
+    SHARED = 654,                  /* SHARED  */
+    BUFFER = 655,                  /* BUFFER  */
+    FLAT = 656,                    /* FLAT  */
+    SMOOTH = 657,                  /* SMOOTH  */
+    LAYOUT = 658,                  /* LAYOUT  */
+    DOUBLECONSTANT = 659,          /* DOUBLECONSTANT  */
+    INT16CONSTANT = 660,           /* INT16CONSTANT  */
+    UINT16CONSTANT = 661,          /* UINT16CONSTANT  */
+    FLOAT16CONSTANT = 662,         /* FLOAT16CONSTANT  */
+    INT32CONSTANT = 663,           /* INT32CONSTANT  */
+    UINT32CONSTANT = 664,          /* UINT32CONSTANT  */
+    INT64CONSTANT = 665,           /* INT64CONSTANT  */
+    UINT64CONSTANT = 666,          /* UINT64CONSTANT  */
+    SUBROUTINE = 667,              /* SUBROUTINE  */
+    DEMOTE = 668,                  /* DEMOTE  */
+    PAYLOADNV = 669,               /* PAYLOADNV  */
+    PAYLOADINNV = 670,             /* PAYLOADINNV  */
+    HITATTRNV = 671,               /* HITATTRNV  */
+    CALLDATANV = 672,              /* CALLDATANV  */
+    CALLDATAINNV = 673,            /* CALLDATAINNV  */
+    PAYLOADEXT = 674,              /* PAYLOADEXT  */
+    PAYLOADINEXT = 675,            /* PAYLOADINEXT  */
+    HITATTREXT = 676,              /* HITATTREXT  */
+    CALLDATAEXT = 677,             /* CALLDATAEXT  */
+    CALLDATAINEXT = 678,           /* CALLDATAINEXT  */
+    PATCH = 679,                   /* PATCH  */
+    SAMPLE = 680,                  /* SAMPLE  */
+    NONUNIFORM = 681,              /* NONUNIFORM  */
+    COHERENT = 682,                /* COHERENT  */
+    VOLATILE = 683,                /* VOLATILE  */
+    RESTRICT = 684,                /* RESTRICT  */
+    READONLY = 685,                /* READONLY  */
+    WRITEONLY = 686,               /* WRITEONLY  */
+    DEVICECOHERENT = 687,          /* DEVICECOHERENT  */
+    QUEUEFAMILYCOHERENT = 688,     /* QUEUEFAMILYCOHERENT  */
+    WORKGROUPCOHERENT = 689,       /* WORKGROUPCOHERENT  */
+    SUBGROUPCOHERENT = 690,        /* SUBGROUPCOHERENT  */
+    NONPRIVATE = 691,              /* NONPRIVATE  */
+    SHADERCALLCOHERENT = 692,      /* SHADERCALLCOHERENT  */
+    NOPERSPECTIVE = 693,           /* NOPERSPECTIVE  */
+    EXPLICITINTERPAMD = 694,       /* EXPLICITINTERPAMD  */
+    PERVERTEXNV = 695,             /* PERVERTEXNV  */
+    PERPRIMITIVENV = 696,          /* PERPRIMITIVENV  */
+    PERVIEWNV = 697,               /* PERVIEWNV  */
+    PERTASKNV = 698,               /* PERTASKNV  */
+    PRECISE = 699                  /* PRECISE  */
   };
+  typedef enum yytokentype yytoken_kind_t;
 #endif
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
 union YYSTYPE
 {
-#line 97 "glslang.y" /* yacc.c:1909  */
+#line 97 "MachineIndependent/glslang.y"
 
     struct {
         glslang::TSourceLoc loc;
@@ -506,9 +540,9 @@
         glslang::TArraySizes* typeParameters;
     } interm;
 
-#line 510 "glslang_tab.cpp.h" /* yacc.c:1909  */
-};
+#line 544 "MachineIndependent/glslang_tab.cpp.h"
 
+};
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
@@ -518,4 +552,4 @@
 
 int yyparse (glslang::TParseContext* pParseContext);
 
-#endif /* !YY_YY_GLSLANG_TAB_CPP_H_INCLUDED  */
+#endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED  */
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index 86edcfe..5ce3e47 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -36,7 +36,7 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #include "localintermediate.h"
 #include "../Include/InfoSink.h"
@@ -438,6 +438,9 @@
     case EOpConvUint64ToPtr:  out.debug << "Convert uint64_t to pointer";   break;
     case EOpConvPtrToUint64:  out.debug << "Convert pointer to uint64_t";   break;
 
+    case EOpConvUint64ToAccStruct: out.debug << "Convert uint64_t to acceleration structure"; break;
+    case EOpConvUvec2ToAccStruct:  out.debug << "Convert uvec2 to acceleration strucuture "; break;
+
     case EOpRadians:        out.debug << "radians";              break;
     case EOpDegrees:        out.debug << "degrees";              break;
     case EOpSin:            out.debug << "sine";                 break;
@@ -829,6 +832,7 @@
     case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break;
     case EOpConstructReference:  out.debug << "Construct reference";  break;
     case EOpConstructCooperativeMatrix:  out.debug << "Construct cooperative matrix";  break;
+    case EOpConstructAccStruct: out.debug << "Construct acceleration structure"; break;
 
     case EOpLessThan:         out.debug << "Compare Less Than";             break;
     case EOpGreaterThan:      out.debug << "Compare Greater Than";          break;
@@ -1079,11 +1083,15 @@
     case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
     case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 
-    case EOpTrace:                            out.debug << "traceNV"; break;
+    case EOpTraceNV:                          out.debug << "traceNV"; break;
+    case EOpTraceKHR:                         out.debug << "traceRayKHR"; break;
     case EOpReportIntersection:               out.debug << "reportIntersectionNV"; break;
-    case EOpIgnoreIntersection:               out.debug << "ignoreIntersectionNV"; break;
-    case EOpTerminateRay:                     out.debug << "terminateRayNV"; break;
-    case EOpExecuteCallable:                  out.debug << "executeCallableNV"; break;
+    case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
+    case EOpIgnoreIntersectionKHR:            out.debug << "ignoreIntersectionKHR"; break;
+    case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
+    case EOpTerminateRayKHR:                  out.debug << "terminateRayKHR"; break;
+    case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
+    case EOpExecuteCallableKHR:               out.debug << "executeCallableKHR"; break;
     case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
 
     case EOpRayQueryInitialize:                                            out.debug << "rayQueryInitializeEXT"; break;
@@ -1321,6 +1329,9 @@
                 out.debug << buf << "\n";
             }
             break;
+        case EbtString:
+            out.debug << "\"" << constUnion[i].getSConst()->c_str() << "\"\n";
+            break;
         default:
             out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc());
             break;
@@ -1406,14 +1417,17 @@
     OutputTreeText(out, node, depth);
 
     switch (node->getFlowOp()) {
-    case EOpKill:      out.debug << "Branch: Kill";           break;
-    case EOpBreak:     out.debug << "Branch: Break";          break;
-    case EOpContinue:  out.debug << "Branch: Continue";       break;
-    case EOpReturn:    out.debug << "Branch: Return";         break;
-    case EOpCase:      out.debug << "case: ";                 break;
-    case EOpDemote:    out.debug << "Demote";                 break;
-    case EOpDefault:   out.debug << "default: ";              break;
-    default:               out.debug << "Branch: Unknown Branch"; break;
+    case EOpKill:                   out.debug << "Branch: Kill";                  break;
+    case EOpTerminateInvocation:    out.debug << "Branch: TerminateInvocation";   break;
+    case EOpIgnoreIntersectionKHR:  out.debug << "Branch: IgnoreIntersectionKHR"; break;
+    case EOpTerminateRayKHR:        out.debug << "Branch: TerminateRayKHR";       break;
+    case EOpBreak:                  out.debug << "Branch: Break";                 break;
+    case EOpContinue:               out.debug << "Branch: Continue";              break;
+    case EOpReturn:                 out.debug << "Branch: Return";                break;
+    case EOpCase:                   out.debug << "case: ";                        break;
+    case EOpDemote:                 out.debug << "Demote";                        break;
+    case EOpDefault:                out.debug << "default: ";                     break;
+    default:                        out.debug << "Branch: Unknown Branch";        break;
     }
 
     if (node->getExpression()) {
@@ -1466,7 +1480,7 @@
     infoSink.debug << "Shader version: " << version << "\n";
     if (requestedExtensions.size() > 0) {
         for (auto extIt = requestedExtensions.begin(); extIt != requestedExtensions.end(); ++extIt)
-            infoSink.debug << "Requested " << extIt->first << "\n";
+            infoSink.debug << "Requested " << *extIt << "\n";
     }
 
     if (xfbMode)
@@ -1562,4 +1576,4 @@
 
 } // end namespace glslang
 
-#endif // not GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp
index 9dc1da2..c42e74f 100644
--- a/glslang/MachineIndependent/iomapper.cpp
+++ b/glslang/MachineIndependent/iomapper.cpp
@@ -33,13 +33,15 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #include "../Include/Common.h"
 #include "../Include/InfoSink.h"
+#include "../Include/Types.h"
 
 #include "gl_types.h"
 #include "iomapper.h"
+#include "SymbolTable.h"
 
 //
 // Map IO bindings.
@@ -79,15 +81,20 @@
             target = &outputList;
         else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant())
             target = &uniformList;
+        // If a global is being visited, then we should also traverse it incase it's evaluation
+        // ends up visiting inputs we want to tag as live
+        else if (base->getQualifier().storage == EvqGlobal)
+            addGlobalReference(base->getAccessName());
+
         if (target) {
             TVarEntryInfo ent = {base->getId(), base, ! traverseAll};
             ent.stage = intermediate.getStage();
             TVarLiveMap::iterator at = target->find(
-                ent.symbol->getName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById());
+                ent.symbol->getAccessName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById());
             if (at != target->end() && at->second.id == ent.id)
                 at->second.live = at->second.live || ! traverseAll; // update live state
             else
-                (*target)[ent.symbol->getName()] = ent;
+                (*target)[ent.symbol->getAccessName()] = ent;
         }
     }
 
@@ -120,7 +127,8 @@
             return;
 
         TVarEntryInfo ent = { base->getId() };
-        TVarLiveMap::const_iterator at = source->find(base->getName());
+        // Fix a defect, when block has no instance name, we need to find its block name
+        TVarLiveMap::const_iterator at = source->find(base->getAccessName());
         if (at == source->end())
             return;
 
@@ -176,7 +184,7 @@
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)
     {
-        resolver.notifyInOut(stage, entKey.second);
+        resolver.notifyInOut(entKey.second.stage, entKey.second);
     }
 
 private:
@@ -184,12 +192,13 @@
 };
 
 struct TResolverUniformAdaptor {
-    TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TInfoSink& i, bool& e)
+    TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TVarLiveMap* uniform[EShLangCount], TInfoSink& i, bool& e)
       : stage(s)
       , resolver(r)
       , infoSink(i)
       , error(e)
     {
+        memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));
     }
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
@@ -201,9 +210,9 @@
         ent.newIndex = -1;
         const bool isValid = resolver.validateBinding(stage, ent);
         if (isValid) {
-            resolver.resolveBinding(stage, ent);
-            resolver.resolveSet(stage, ent);
-            resolver.resolveUniformLocation(stage, ent);
+            resolver.resolveBinding(ent.stage, ent);
+            resolver.resolveSet(ent.stage, ent);
+            resolver.resolveUniformLocation(ent.stage, ent);
 
             if (ent.newBinding != -1) {
                 if (ent.newBinding >= int(TQualifier::layoutBindingEnd)) {
@@ -212,6 +221,17 @@
                     infoSink.info.message(EPrefixInternalError, err.c_str());
                     error = true;
                 }
+
+                if (ent.symbol->getQualifier().hasBinding()) {
+                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {
+                        if (idx == ent.stage || uniformVarMap[idx] == nullptr)
+                            continue;
+                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);
+                        if (entKey2 != uniformVarMap[idx]->end()) {
+                            entKey2->second.newBinding = ent.newBinding;
+                        }
+                    }
+                }
             }
             if (ent.newSet != -1) {
                 if (ent.newSet >= int(TQualifier::layoutSetEnd)) {
@@ -220,6 +240,16 @@
                     infoSink.info.message(EPrefixInternalError, err.c_str());
                     error = true;
                 }
+                if (ent.symbol->getQualifier().hasSet()) {
+                    for (uint32_t idx = EShLangVertex; idx < EShLangCount; ++idx) {
+                        if ((idx == stage) || (uniformVarMap[idx] == nullptr))
+                            continue;
+                        auto entKey2 = uniformVarMap[idx]->find(entKey.first);
+                        if (entKey2 != uniformVarMap[idx]->end()) {
+                            entKey2->second.newSet = ent.newSet;
+                        }
+                    }
+                }
             }
         } else {
             TString errorMsg = "Invalid binding: " + entKey.first;
@@ -234,7 +264,7 @@
     TIoMapResolver& resolver;
     TInfoSink&      infoSink;
     bool&           error;
-
+    TVarLiveMap*    uniformVarMap[EShLangCount];
 private:
     TResolverUniformAdaptor& operator=(TResolverUniformAdaptor&) = delete;
 };
@@ -256,7 +286,7 @@
         ent.newBinding = -1;
         ent.newSet = -1;
         ent.newIndex = -1;
-        const bool isValid = resolver.validateInOut(stage, ent);
+        const bool isValid = resolver.validateInOut(ent.stage, ent);
         if (isValid) {
             resolver.resolveInOutLocation(stage, ent);
             resolver.resolveInOutComponent(stage, ent);
@@ -291,17 +321,116 @@
 struct TSymbolValidater
 {
     TSymbolValidater(TIoMapResolver& r, TInfoSink& i, TVarLiveMap* in[EShLangCount], TVarLiveMap* out[EShLangCount],
-                     TVarLiveMap* uniform[EShLangCount], bool& hadError)
+                     TVarLiveMap* uniform[EShLangCount], bool& hadError, EProfile profile, int version)
         : preStage(EShLangCount)
         , currentStage(EShLangCount)
         , nextStage(EShLangCount)
         , resolver(r)
         , infoSink(i)
         , hadError(hadError)
+        , profile(profile)
+        , version(version)
     {
         memcpy(inVarMaps, in, EShLangCount * (sizeof(TVarLiveMap*)));
         memcpy(outVarMaps, out, EShLangCount * (sizeof(TVarLiveMap*)));
         memcpy(uniformVarMap, uniform, EShLangCount * (sizeof(TVarLiveMap*)));
+
+        std::map<TString, TString> anonymousMemberMap;
+        std::vector<TRange> usedUniformLocation;
+        std::vector<TString> usedUniformName;
+        usedUniformLocation.clear();
+        usedUniformName.clear();
+        for (int i = 0; i < EShLangCount; i++) {
+            if (uniformVarMap[i]) {
+                for (auto uniformVar : *uniformVarMap[i])
+                {
+                    TIntermSymbol* pSymbol = uniformVar.second.symbol;
+                    TQualifier qualifier = uniformVar.second.symbol->getQualifier();
+                    TString symbolName = pSymbol->getAccessName();
+
+                    // All the uniform needs multi-stage location check (block/default)
+                    int uniformLocation = qualifier.layoutLocation;
+
+                    if (uniformLocation != TQualifier::layoutLocationEnd) {
+                        // Total size of current uniform, could be block, struct or other types.
+                        int size = TIntermediate::computeTypeUniformLocationSize(pSymbol->getType());
+
+                        TRange locationRange(uniformLocation, uniformLocation + size - 1);
+
+                        // Combine location and component ranges
+                        int overlapLocation = -1;
+                        bool diffLocation = false;
+
+                        // Check for collisions, except for vertex inputs on desktop targeting OpenGL
+                        overlapLocation = checkLocationOverlap(locationRange, usedUniformLocation, symbolName, usedUniformName, diffLocation);
+
+                        // Overlap locations of uniforms, regardless of components (multi stages)
+                        if (overlapLocation == -1) {
+                            usedUniformLocation.push_back(locationRange);
+                            usedUniformName.push_back(symbolName);
+                        }
+                        else if (overlapLocation >= 0) {
+                            if (diffLocation == true) {
+                                TString err = ("Uniform location should be equal for same uniforms: " +std::to_string(overlapLocation)).c_str();
+                                infoSink.info.message(EPrefixInternalError, err.c_str());
+                                hadError = true;
+                                break;
+                            }
+                            else {
+                                TString err = ("Uniform location overlaps across stages: " + std::to_string(overlapLocation)).c_str();
+                                infoSink.info.message(EPrefixInternalError, err.c_str());
+                                hadError = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if ((uniformVar.second.symbol->getBasicType() == EbtBlock) &&
+                        IsAnonymous(uniformVar.second.symbol->getName()))
+                    {
+                        auto blockType = uniformVar.second.symbol->getType().getStruct();
+                        for (size_t memberIdx = 0; memberIdx < blockType->size(); ++memberIdx) {
+                            auto memberName = (*blockType)[memberIdx].type->getFieldName();
+                            if (anonymousMemberMap.find(memberName) != anonymousMemberMap.end())
+                            {
+                                if (anonymousMemberMap[memberName] != uniformVar.second.symbol->getType().getTypeName())
+                                {
+                                    TString err = "Invalid block member name: " + memberName;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                    break;
+                                }
+                            }
+                            else
+                            {
+                                anonymousMemberMap[memberName] = uniformVar.second.symbol->getType().getTypeName();
+                            }
+                        }
+                    }
+                    if (hadError)
+                        break;
+                }
+            }
+        }
+    }
+
+    // In case we need to new an intermediate, which costs too much
+    int checkLocationOverlap(const TRange& locationRange, std::vector<TRange>& usedUniformLocation, const TString symbolName, std::vector<TString>& usedUniformName, bool& diffLocation)
+    {
+        for (size_t r = 0; r < usedUniformLocation.size(); ++r) {
+            if (usedUniformName[r] == symbolName) {
+                diffLocation = true;
+                return (usedUniformLocation[r].start == locationRange.start &&
+                        usedUniformLocation[r].last == locationRange.last)
+                       ? -2 : std::max(locationRange.start, usedUniformLocation[r].start);
+            }
+            if (locationRange.overlap(usedUniformLocation[r])) {
+                // there is a collision; pick one
+                return std::max(locationRange.start, usedUniformLocation[r].start);
+            }
+        }
+
+        return -1; // no collision
     }
 
     inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
@@ -309,44 +438,108 @@
         TIntermSymbol* base = ent1.symbol;
         const TType& type = ent1.symbol->getType();
         const TString& name = entKey.first;
-        TString mangleName1, mangleName2;
-        type.appendMangledName(mangleName1);
         EShLanguage stage = ent1.stage;
+        TString mangleName1, mangleName2;
         if (currentStage != stage) {
             preStage = currentStage;
             currentStage = stage;
             nextStage = EShLangCount;
             for (int i = currentStage + 1; i < EShLangCount; i++) {
-                if (inVarMaps[i] != nullptr)
+                if (inVarMaps[i] != nullptr) {
                     nextStage = static_cast<EShLanguage>(i);
+                    break;
+                }
             }
         }
+
+        if (type.getQualifier().isArrayedIo(stage)) {
+            TType subType(type, 0);
+            subType.appendMangledName(mangleName1);
+        } else {
+            type.appendMangledName(mangleName1);
+        }
+
         if (base->getQualifier().storage == EvqVaryingIn) {
             // validate stage in;
             if (preStage == EShLangCount)
                 return;
+            if (TSymbolTable::isBuiltInSymbol(base->getId()))
+                return;
             if (outVarMaps[preStage] != nullptr) {
                 auto ent2 = outVarMaps[preStage]->find(name);
+                uint32_t location = base->getType().getQualifier().layoutLocation;
+                if (ent2 == outVarMaps[preStage]->end() &&
+                    location != glslang::TQualifier::layoutLocationEnd) {
+                    for (auto var = outVarMaps[preStage]->begin(); var != ent2; var++) {
+                        if (var->second.symbol->getType().getQualifier().layoutLocation == location) {
+                            ent2 = var;
+                            break;
+                        }
+                    }
+                }
                 if (ent2 != outVarMaps[preStage]->end()) {
-                    ent2->second.symbol->getType().appendMangledName(mangleName2);
-                    if (mangleName1 == mangleName2)
+                    auto& type1 = base->getType();
+                    auto& type2 = ent2->second.symbol->getType();
+                    hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);
+                    if (ent2->second.symbol->getType().getQualifier().isArrayedIo(preStage)) {
+                        TType subType(ent2->second.symbol->getType(), 0);
+                        subType.appendMangledName(mangleName2);
+                    }
+                    else {
+                        ent2->second.symbol->getType().appendMangledName(mangleName2);
+                    }
+
+                    if (mangleName1 == mangleName2) {
+                        // For ES 3.0 only, other versions have no such restrictions
+                        // According to ES 3.0 spec: The type and presence of the interpolation qualifiers and
+                        // storage qualifiers  of variables with the same name declared in all linked shaders must
+                        // match, otherwise the link command will fail.
+                        if (profile == EEsProfile && version == 300) {
+                            // Don't need to check smooth qualifier, as it uses the default interpolation mode
+                            if (ent1.stage == EShLangFragment && type1.isBuiltIn() == false) {
+                                if (type1.getQualifier().flat != type2.getQualifier().flat ||
+                                    type1.getQualifier().nopersp != type2.getQualifier().nopersp) {
+                                    TString err = "Interpolation qualifier mismatch : " + entKey.first;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                }
+                            }
+                        }
                         return;
+                    }
                     else {
                         TString err = "Invalid In/Out variable type : " + entKey.first;
                         infoSink.info.message(EPrefixInternalError, err.c_str());
                         hadError = true;
                     }
                 }
+                else if (!base->getType().isBuiltIn()) {
+                    // According to spec: A link error is generated if any statically referenced input variable
+                    // or block does not have a matching output
+                    if (profile == EEsProfile && ent1.live) {
+                        hadError = true;
+                        TString errorStr = name + ": not been declare as a output variable in pre shader stage.";
+                        infoSink.info.message(EPrefixError, errorStr.c_str());
+                    }
+                }
                 return;
             }
         } else if (base->getQualifier().storage == EvqVaryingOut) {
             // validate stage out;
             if (nextStage == EShLangCount)
                 return;
-            if (outVarMaps[nextStage] != nullptr) {
+            if (TSymbolTable::isBuiltInSymbol(base->getId()))
+                return;
+            if (inVarMaps[nextStage] != nullptr) {
                 auto ent2 = inVarMaps[nextStage]->find(name);
                 if (ent2 != inVarMaps[nextStage]->end()) {
-                    ent2->second.symbol->getType().appendMangledName(mangleName2);
+                    if (ent2->second.symbol->getType().getQualifier().isArrayedIo(nextStage)) {
+                        TType subType(ent2->second.symbol->getType(), 0);
+                        subType.appendMangledName(mangleName2);
+                    }
+                    else {
+                        ent2->second.symbol->getType().appendMangledName(mangleName2);
+                    }
                     if (mangleName1 == mangleName2)
                         return;
                     else {
@@ -370,11 +563,50 @@
                             hadError = true;
                         }
                         mangleName2.clear();
+
+                        // validate instance name of blocks
+                        if (hadError == false &&
+                            base->getType().getBasicType() == EbtBlock &&
+                            IsAnonymous(base->getName()) != IsAnonymous(ent2->second.symbol->getName())) {
+                            TString err = "Matched uniform block names must also either all be lacking "
+                                          "an instance name or all having an instance name: " + entKey.first;
+                            infoSink.info.message(EPrefixInternalError, err.c_str());
+                            hadError = true;
+                        }
+
+                        // validate uniform block member qualifier and member names
+                        auto& type1 = base->getType();
+                        auto& type2 = ent2->second.symbol->getType();
+                        if (hadError == false && base->getType().getBasicType() == EbtBlock) {
+                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), true);
+                        }
+                        else {
+                            hadError = hadError || typeCheck(&type1, &type2, name.c_str(), false);
+                        }
+                    }
+                    else if (base->getBasicType() == EbtBlock)
+                    {
+                        if (IsAnonymous(base->getName()))
+                        {
+                            // The name of anonymous block member can't same with default uniform variable.
+                            auto blockType1 = base->getType().getStruct();
+                            for (size_t memberIdx = 0; memberIdx < blockType1->size(); ++memberIdx) {
+                                auto memberName = (*blockType1)[memberIdx].type->getFieldName();
+                                if (uniformVarMap[i]->find(memberName) != uniformVarMap[i]->end())
+                                {
+                                    TString err = "Invalid Uniform variable name : " + memberName;
+                                    infoSink.info.message(EPrefixInternalError, err.c_str());
+                                    hadError = true;
+                                    break;
+                                }
+                            }
+                        }
                     }
                 }
             }
         }
     }
+
     TVarLiveMap *inVarMaps[EShLangCount], *outVarMaps[EShLangCount], *uniformVarMap[EShLangCount];
     // Use for mark pre stage, to get more interface symbol information.
     EShLanguage preStage, currentStage, nextStage;
@@ -382,9 +614,118 @@
     TIoMapResolver& resolver;
     TInfoSink& infoSink;
     bool& hadError;
+    EProfile profile;
+    int version;
 
 private:
     TSymbolValidater& operator=(TSymbolValidater&) = delete;
+
+    bool qualifierCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)
+    {
+        bool hasError = false;
+        const TQualifier& qualifier1 = type1->getQualifier();
+        const TQualifier& qualifier2 = type2->getQualifier();
+
+        if (((isBlock == false) &&
+            (type1->getQualifier().storage == EvqUniform && type2->getQualifier().storage == EvqUniform)) ||
+            (type1->getQualifier().storage == EvqGlobal && type2->getQualifier().storage == EvqGlobal)) {
+            if (qualifier1.precision != qualifier2.precision) {
+                hasError = true;
+                std::string errorStr = name + ": have precision conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.hasFormat() && qualifier2.hasFormat()) {
+                if (qualifier1.layoutFormat != qualifier2.layoutFormat) {
+                    hasError = true;
+                    std::string errorStr = name + ": have layout format conflict cross stage.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                }
+
+            }
+        }
+
+        if (isBlock == true) {
+            if (qualifier1.layoutPacking != qualifier2.layoutPacking) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutPacking conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutMatrix != qualifier2.layoutMatrix) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutMatrix conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutOffset != qualifier2.layoutOffset) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutOffset conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+            if (qualifier1.layoutAlign != qualifier2.layoutAlign) {
+                hasError = true;
+                std::string errorStr = name + ": have layoutAlign conflict cross stage.";
+                infoSink.info.message(EPrefixError, errorStr.c_str());
+            }
+        }
+
+        return hasError;
+    }
+
+    bool typeCheck(const TType* const type1, const TType* const type2, const std::string& name, bool isBlock)
+    {
+        bool hasError = false;
+        if (!(type1->isStruct() && type2->isStruct())) {
+            hasError = hasError || qualifierCheck(type1, type2, name, isBlock);
+        }
+        else {
+            if (type1->getBasicType() == EbtBlock && type2->getBasicType() == EbtBlock)
+                isBlock = true;
+            const TTypeList* typeList1 = type1->getStruct();
+            const TTypeList* typeList2 = type2->getStruct();
+
+            std::string newName = name;
+            size_t memberCount = typeList1->size();
+            size_t index2 = 0;
+            for (size_t index = 0; index < memberCount; index++, index2++) {
+                // Skip inactive member
+                if (typeList1->at(index).type->getBasicType() == EbtVoid)
+                    continue;
+                while (index2 < typeList2->size() && typeList2->at(index2).type->getBasicType() == EbtVoid) {
+                    ++index2;
+                }
+
+                // TypeList1 has more members in list
+                if (index2 == typeList2->size()) {
+                    std::string errorStr = name + ": struct mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                    break;
+                }
+
+                if (typeList1->at(index).type->getFieldName() != typeList2->at(index2).type->getFieldName()) {
+                    std::string errorStr = name + ": member name mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                }
+                else {
+                    newName = typeList1->at(index).type->getFieldName().c_str();
+                }
+                hasError = hasError || typeCheck(typeList1->at(index).type, typeList2->at(index2).type, newName, isBlock);
+            }
+
+            while (index2 < typeList2->size())
+            {
+                // TypeList2 has more members
+                if (typeList2->at(index2).type->getBasicType() != EbtVoid) {
+                    std::string errorStr = name + ": struct mismatch.";
+                    infoSink.info.message(EPrefixError, errorStr.c_str());
+                    hasError = true;
+                    break;
+                }
+                ++index2;
+            }
+        }
+        return hasError;
+    }
 };
 
 struct TSlotCollector {
@@ -470,7 +811,7 @@
 
 int TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const char* name = ent.symbol->getName().c_str();
+    const char* name =  ent.symbol->getAccessName().c_str();
     // kick out of not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
@@ -579,10 +920,7 @@
 
 int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = IsAnonymous(ent.symbol->getName()) ?
-                            ent.symbol->getType().getTypeName()
-                            :
-                            ent.symbol->getName();
+    const TString& name = ent.symbol->getAccessName();
     if (currentStage != stage) {
         preStage = currentStage;
         currentStage = stage;
@@ -630,7 +968,7 @@
         TVarSlotMap::iterator iter = storageSlotMap[resourceKey].find(name);
         if (iter != storageSlotMap[resourceKey].end()) {
             // If interface resource be found, set it has location and this symbol's new location
-            // equal the symbol's explicit location declarated in pre or next stage.
+            // equal the symbol's explicit location declaration in pre or next stage.
             //
             // vs:    out vec4 a;
             // fs:    layout(..., location = 3,...) in vec4 a;
@@ -666,10 +1004,7 @@
 
 int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = IsAnonymous(ent.symbol->getName()) ?
-                            ent.symbol->getType().getTypeName()
-                            :
-                            ent.symbol->getName();
+    const TString& name = ent.symbol->getAccessName();
     // kick out of not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
@@ -712,7 +1047,7 @@
         TVarSlotMap::iterator iter = slotMap.find(name);
         if (iter != slotMap.end()) {
             // If uniform resource be found, set it has location and this symbol's new location
-            // equal the uniform's explicit location declarated in other stage.
+            // equal the uniform's explicit location declaration in other stage.
             //
             // vs:    uniform vec4 a;
             // fs:    layout(..., location = 3,...) uniform vec4 a;
@@ -720,7 +1055,7 @@
             location = iter->second;
         }
         if (! hasLocation) {
-            // No explicit location declaraten in other stage.
+            // No explicit location declaration in other stage.
             // So we should find a new slot for this uniform.
             //
             // vs:    uniform vec4 a;
@@ -729,7 +1064,7 @@
             storageSlotMap[resourceKey][name] = location;
         }
     } else {
-        // the first uniform declarated in a program.
+        // the first uniform declaration in a program.
         TVarSlotMap varSlotMap;
         location = getFreeSlot(resourceKey, 0, size);
         varSlotMap[name] = location;
@@ -740,11 +1075,8 @@
 
 int TDefaultGlslIoResolver::resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = IsAnonymous(ent.symbol->getName()) ?
-                            ent.symbol->getType().getTypeName()
-                            :
-                            ent.symbol->getName();
-    // On OpenGL arrays of opaque types take a seperate binding for each element
+    const TString& name = ent.symbol->getAccessName();
+    // On OpenGL arrays of opaque types take a separate binding for each element
     int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;
     TResourceType resource = getResourceType(type);
     // don't need to handle uniform symbol, it will be handled in resolveUniformLocation
@@ -818,10 +1150,7 @@
 
 void TDefaultGlslIoResolver::reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = IsAnonymous(ent.symbol->getName()) ?
-                            ent.symbol->getType().getTypeName()
-                            :
-                            ent.symbol->getName();
+    const TString& name = ent.symbol->getAccessName();
     TStorageQualifier storage = type.getQualifier().storage;
     EShLanguage stage(EShLangCount);
     switch (storage) {
@@ -881,10 +1210,7 @@
 
 void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = IsAnonymous(ent.symbol->getName()) ?
-                            ent.symbol->getType().getTypeName()
-                            :
-                            ent.symbol->getName();
+    const TString& name = ent.symbol->getAccessName();
     int resource = getResourceType(type);
     if (type.getQualifier().hasBinding()) {
         TVarSlotMap& varSlotMap = resourceSlotMap[resource];
@@ -1088,31 +1414,30 @@
     TVarGatherTraverser iter_binding_live(intermediate, false, inVarMap, outVarMap, uniformVarMap);
     root->traverse(&iter_binding_all);
     iter_binding_live.pushFunction(intermediate.getEntryPointMangledName().c_str());
-    while (! iter_binding_live.functions.empty()) {
-        TIntermNode* function = iter_binding_live.functions.back();
-        iter_binding_live.functions.pop_back();
-        function->traverse(&iter_binding_live);
+    while (! iter_binding_live.destinations.empty()) {
+        TIntermNode* destination = iter_binding_live.destinations.back();
+        iter_binding_live.destinations.pop_back();
+        destination->traverse(&iter_binding_live);
     }
+
     // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info.
-    std::for_each(inVarMap.begin(), inVarMap.end(),
-                  [&inVector](TVarLivePair p) { inVector.push_back(p); });
+    for (auto& var : inVarMap) { inVector.push_back(var); }
     std::sort(inVector.begin(), inVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
-    std::for_each(outVarMap.begin(), outVarMap.end(),
-                  [&outVector](TVarLivePair p) { outVector.push_back(p); });
+    for (auto& var : outVarMap) { outVector.push_back(var); }
     std::sort(outVector.begin(), outVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
-    std::for_each(uniformVarMap.begin(), uniformVarMap.end(),
-                  [&uniformVector](TVarLivePair p) { uniformVector.push_back(p); });
+    for (auto& var : uniformVarMap) { uniformVector.push_back(var); }
     std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
         return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
     });
     bool hadError = false;
+    TVarLiveMap* dummyUniformVarMap[EShLangCount] = {};
     TNotifyInOutAdaptor inOutNotify(stage, *resolver);
     TNotifyUniformAdaptor uniformNotify(stage, *resolver);
-    TResolverUniformAdaptor uniformResolve(stage, *resolver, infoSink, hadError);
+    TResolverUniformAdaptor uniformResolve(stage, *resolver, dummyUniformVarMap, infoSink, hadError);
     TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError);
     resolver->beginNotifications(stage);
     std::for_each(inVector.begin(), inVector.end(), inOutNotify);
@@ -1120,22 +1445,22 @@
     std::for_each(uniformVector.begin(), uniformVector.end(), uniformNotify);
     resolver->endNotifications(stage);
     resolver->beginResolve(stage);
-    std::for_each(inVector.begin(), inVector.end(), inOutResolve);
+    for (auto& var : inVector) { inOutResolve(var); }
     std::for_each(inVector.begin(), inVector.end(), [&inVarMap](TVarLivePair p) {
-        auto at = inVarMap.find(p.second.symbol->getName());
-        if (at != inVarMap.end())
+        auto at = inVarMap.find(p.second.symbol->getAccessName());
+        if (at != inVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
-    std::for_each(outVector.begin(), outVector.end(), inOutResolve);
+    for (auto& var : outVector) { inOutResolve(var); }
     std::for_each(outVector.begin(), outVector.end(), [&outVarMap](TVarLivePair p) {
-        auto at = outVarMap.find(p.second.symbol->getName());
-        if (at != outVarMap.end())
+        auto at = outVarMap.find(p.second.symbol->getAccessName());
+        if (at != outVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
     std::for_each(uniformVector.begin(), uniformVector.end(), uniformResolve);
     std::for_each(uniformVector.begin(), uniformVector.end(), [&uniformVarMap](TVarLivePair p) {
-        auto at = uniformVarMap.find(p.second.symbol->getName());
-        if (at != uniformVarMap.end())
+        auto at = uniformVarMap.find(p.second.symbol->getAccessName());
+        if (at != uniformVarMap.end() && p.second.id == at->second.id)
             at->second = p.second;
     });
     resolver->endResolve(stage);
@@ -1151,9 +1476,14 @@
 //
 // Returns false if the input is too malformed to do this.
 bool TGlslIoMapper::addStage(EShLanguage stage, TIntermediate& intermediate, TInfoSink& infoSink, TIoMapResolver* resolver) {
+    bool somethingToDo = !intermediate.getResourceSetBinding().empty() ||
+        intermediate.getAutoMapBindings() ||
+        intermediate.getAutoMapLocations();
 
-    bool somethingToDo = ! intermediate.getResourceSetBinding().empty() || intermediate.getAutoMapBindings() ||
-                         intermediate.getAutoMapLocations();
+    // Profile and version are use for symbol validate.
+    profile = intermediate.getProfile();
+    version = intermediate.getVersion();
+
     // Restrict the stricter condition to further check 'somethingToDo' only if 'somethingToDo' has not been set, reduce
     // unnecessary or insignificant for-loop operation after 'somethingToDo' have been true.
     for (int res = 0; (res < EResCount && !somethingToDo); ++res) {
@@ -1183,11 +1513,12 @@
                                           *uniformVarMap[stage]);
     root->traverse(&iter_binding_all);
     iter_binding_live.pushFunction(intermediate.getEntryPointMangledName().c_str());
-    while (! iter_binding_live.functions.empty()) {
-        TIntermNode* function = iter_binding_live.functions.back();
-        iter_binding_live.functions.pop_back();
-        function->traverse(&iter_binding_live);
+    while (! iter_binding_live.destinations.empty()) {
+        TIntermNode* destination = iter_binding_live.destinations.back();
+        iter_binding_live.destinations.pop_back();
+        destination->traverse(&iter_binding_live);
     }
+
     TNotifyInOutAdaptor inOutNotify(stage, *resolver);
     TNotifyUniformAdaptor uniformNotify(stage, *resolver);
     // Resolve current stage input symbol location with previous stage output here,
@@ -1212,31 +1543,30 @@
     resolver->endResolve(EShLangCount);
     if (!hadError) {
         //Resolve uniform location, ubo/ssbo/opaque bindings across stages
-        TResolverUniformAdaptor uniformResolve(EShLangCount, *resolver, infoSink, hadError);
+        TResolverUniformAdaptor uniformResolve(EShLangCount, *resolver, uniformVarMap, infoSink, hadError);
         TResolverInOutAdaptor inOutResolve(EShLangCount, *resolver, infoSink, hadError);
-        TSymbolValidater symbolValidater(*resolver, infoSink, inVarMaps, outVarMaps, uniformVarMap, hadError);
+        TSymbolValidater symbolValidater(*resolver, infoSink, inVarMaps,
+                                         outVarMaps, uniformVarMap, hadError, profile, version);
         TVarLiveVector uniformVector;
         resolver->beginResolve(EShLangCount);
         for (int stage = EShLangVertex; stage < EShLangCount; stage++) {
             if (inVarMaps[stage] != nullptr) {
                 inOutResolve.setStage(EShLanguage(stage));
-                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), symbolValidater);
-                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(), inOutResolve);
-                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), symbolValidater);
-                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(), inOutResolve);
+                for (auto& var : *(inVarMaps[stage])) { symbolValidater(var); }
+                for (auto& var : *(inVarMaps[stage])) { inOutResolve(var); }
+                for (auto& var : *(outVarMaps[stage])) { symbolValidater(var); }
+                for (auto& var : *(outVarMaps[stage])) { inOutResolve(var); }
             }
             if (uniformVarMap[stage] != nullptr) {
                 uniformResolve.setStage(EShLanguage(stage));
-                // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info.
-                std::for_each(uniformVarMap[stage]->begin(), uniformVarMap[stage]->end(),
-                              [&uniformVector](TVarLivePair p) { uniformVector.push_back(p); });
+                for (auto& var : *(uniformVarMap[stage])) { uniformVector.push_back(var); }
             }
         }
         std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
             return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
         });
-        std::for_each(uniformVector.begin(), uniformVector.end(), symbolValidater);
-        std::for_each(uniformVector.begin(), uniformVector.end(), uniformResolve);
+        for (auto& var : uniformVector) { symbolValidater(var); }
+        for (auto& var : uniformVector) { uniformResolve(var); }
         std::sort(uniformVector.begin(), uniformVector.end(), [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
             return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
         });
@@ -1245,14 +1575,18 @@
             if (intermediates[stage] != nullptr) {
                 // traverse each stage, set new location to each input/output and unifom symbol, set new binding to
                 // ubo, ssbo and opaque symbols
-                TVarLiveMap** pUniformVarMap = uniformVarMap;
+                TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap;
                 std::for_each(uniformVector.begin(), uniformVector.end(), [pUniformVarMap, stage](TVarLivePair p) {
-                    auto at = pUniformVarMap[stage]->find(p.second.symbol->getName());
-                    if (at != pUniformVarMap[stage]->end())
+                    auto at = pUniformVarMap[stage]->find(p.second.symbol->getAccessName());
+                    if (at != pUniformVarMap[stage]->end() && at->second.id == p.second.id){
+                        int resolvedBinding = at->second.newBinding;
                         at->second = p.second;
+                        if (resolvedBinding > 0)
+                            at->second.newBinding = resolvedBinding;
+                    }
                 });
                 TVarSetTraverser iter_iomap(*intermediates[stage], *inVarMaps[stage], *outVarMaps[stage],
-                                            *uniformVarMap[stage]);
+                                            *uniformResolve.uniformVarMap[stage]);
                 intermediates[stage]->getTreeRoot()->traverse(&iter_iomap);
             }
         }
@@ -1264,4 +1598,4 @@
 
 } // end namespace glslang
 
-#endif // GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
diff --git a/glslang/MachineIndependent/iomapper.h b/glslang/MachineIndependent/iomapper.h
index e91a150..7934c4a 100644
--- a/glslang/MachineIndependent/iomapper.h
+++ b/glslang/MachineIndependent/iomapper.h
@@ -33,7 +33,7 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #ifndef _IOMAPPER_INCLUDED
 #define _IOMAPPER_INCLUDED
@@ -186,7 +186,7 @@
     }
 };
 
-// Defaulf I/O resolver for OpenGL
+// Default I/O resolver for OpenGL
 struct TDefaultGlslIoResolver : public TDefaultIoResolverBase {
 public:
     typedef std::map<TString, int> TVarSlotMap;  // <resourceName, location/binding>
@@ -244,7 +244,7 @@
         second = _Right.second;
         return (*this);
     }
-    TVarLivePair(const TVarLivePair& src) { *this = src; }
+    TVarLivePair(const TVarLivePair& src) : pair(src) { }
 };
 typedef std::vector<TVarLivePair> TVarLiveVector;
 
@@ -262,10 +262,12 @@
 class TGlslIoMapper : public TIoMapper {
 public:
     TGlslIoMapper() {
-        memset(inVarMaps,     0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(outVarMaps,    0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(uniformVarMap, 0, sizeof(TVarLiveMap*)   * EShLangCount);
-        memset(intermediates, 0, sizeof(TIntermediate*) * EShLangCount);
+        memset(inVarMaps,     0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(outVarMaps,    0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(uniformVarMap, 0, sizeof(TVarLiveMap*)   * (EShLangCount + 1));
+        memset(intermediates, 0, sizeof(TIntermediate*) * (EShLangCount + 1));
+        profile = ENoProfile;
+        version = 0;
     }
     virtual ~TGlslIoMapper() {
         for (size_t stage = 0; stage < EShLangCount; stage++) {
@@ -292,10 +294,12 @@
                 *uniformVarMap[EShLangCount];
     TIntermediate* intermediates[EShLangCount];
     bool hadError = false;
+    EProfile profile;
+    int version;
 };
 
 } // end namespace glslang
 
 #endif // _IOMAPPER_INCLUDED
 
-#endif //  GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
old mode 100755
new mode 100644
index dcb1cc8..2d14031
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -82,7 +82,7 @@
 //
 void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
 {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     mergeCallGraphs(infoSink, unit);
     mergeModes(infoSink, unit);
     mergeTrees(infoSink, unit);
@@ -104,7 +104,7 @@
     callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end());
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #define MERGE_MAX(member) member = std::max(member, unit.member)
 #define MERGE_TRUE(member) if (unit.member) member = unit.member;
@@ -153,7 +153,7 @@
 
     if (vertices == TQualifier::layoutNotSet)
         vertices = unit.vertices;
-    else if (vertices != unit.vertices) {
+    else if (unit.vertices != TQualifier::layoutNotSet && vertices != unit.vertices) {
         if (language == EShLangGeometry || language == EShLangMeshNV)
             error(infoSink, "Contradictory layout max_vertices values");
         else if (language == EShLangTessControl)
@@ -172,12 +172,12 @@
 
     if (inputPrimitive == ElgNone)
         inputPrimitive = unit.inputPrimitive;
-    else if (inputPrimitive != unit.inputPrimitive)
+    else if (unit.inputPrimitive != ElgNone && inputPrimitive != unit.inputPrimitive)
         error(infoSink, "Contradictory input layout primitives");
 
     if (outputPrimitive == ElgNone)
         outputPrimitive = unit.outputPrimitive;
-    else if (outputPrimitive != unit.outputPrimitive)
+    else if (unit.outputPrimitive != ElgNone && outputPrimitive != unit.outputPrimitive)
         error(infoSink, "Contradictory output layout primitives");
 
     if (originUpperLeft != unit.originUpperLeft || pixelCenterInteger != unit.pixelCenterInteger)
@@ -196,12 +196,14 @@
     MERGE_TRUE(pointMode);
 
     for (int i = 0; i < 3; ++i) {
-        if (!localSizeNotDefault[i] && unit.localSizeNotDefault[i]) {
-            localSize[i] = unit.localSize[i];
-            localSizeNotDefault[i] = true;
+        if (unit.localSizeNotDefault[i]) {
+            if (!localSizeNotDefault[i]) {
+                localSize[i] = unit.localSize[i];
+                localSizeNotDefault[i] = true;
+            }
+            else if (localSize[i] != unit.localSize[i])
+                error(infoSink, "Contradictory local size");
         }
-        else if (localSize[i] != unit.localSize[i])
-            error(infoSink, "Contradictory local size");
 
         if (localSizeSpecId[i] == TQualifier::layoutNotSet)
             localSizeSpecId[i] = unit.localSizeSpecId[i];
@@ -533,7 +535,7 @@
 //
 void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, bool crossStage)
 {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     bool writeTypeComparison = false;
 
     // Types have to match
@@ -651,6 +653,25 @@
 #endif
 }
 
+void TIntermediate::sharedBlockCheck(TInfoSink& infoSink)
+{
+    bool has_shared_block = false;
+    bool has_shared_non_block = false;
+    TIntermSequence& linkObjects = findLinkerObjects()->getSequence();
+    for (size_t i = 0; i < linkObjects.size(); ++i) {
+        const TType& type = linkObjects[i]->getAsTyped()->getType();
+        const TQualifier& qualifier = type.getQualifier();
+        if (qualifier.storage == glslang::EvqShared) {
+            if (type.getBasicType() == glslang::EbtBlock)
+                has_shared_block = true;
+            else
+                has_shared_non_block = true;
+        }
+    }
+    if (has_shared_block && has_shared_non_block)
+        error(infoSink, "cannot mix use of shared variables inside and outside blocks");
+}
+
 //
 // Do final link-time error checking of a complete (merged) intermediate representation.
 // (Much error checking was done during merging).
@@ -736,10 +757,10 @@
 
         // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
         // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
-        if (xfbBuffers[b].stride > (unsigned int)(4 * resources.maxTransformFeedbackInterleavedComponents)) {
+        if (xfbBuffers[b].stride > (unsigned int)(4 * resources->maxTransformFeedbackInterleavedComponents)) {
             error(infoSink, "xfb_stride is too large:");
             infoSink.info.prefix(EPrefixError);
-            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", components (1/4 stride) needed are " << xfbBuffers[b].stride/4 << ", gl_MaxTransformFeedbackInterleavedComponents is " << resources.maxTransformFeedbackInterleavedComponents << "\n";
+            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", components (1/4 stride) needed are " << xfbBuffers[b].stride/4 << ", gl_MaxTransformFeedbackInterleavedComponents is " << resources->maxTransformFeedbackInterleavedComponents << "\n";
         }
     }
 
@@ -776,6 +797,7 @@
             error(infoSink, "post_depth_coverage requires early_fragment_tests");
         break;
     case EShLangCompute:
+        sharedBlockCheck(infoSink);
         break;
     case EShLangRayGen:
     case EShLangIntersect:
@@ -808,6 +830,7 @@
     case EShLangTaskNV:
         if (numTaskNVBlocks > 1)
             error(infoSink, "Only one taskNV interface block is allowed per shader");
+        sharedBlockCheck(infoSink);
         break;
     default:
         error(infoSink, "Unknown Stage.");
@@ -1055,8 +1078,8 @@
     return found;
 }
 
-// Accumulate locations used for inputs, outputs, and uniforms, and check for collisions
-// as the accumulation is done.
+// Accumulate locations used for inputs, outputs, and uniforms, payload and callable data
+// and check for collisions as the accumulation is done.
 //
 // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
 //
@@ -1068,6 +1091,7 @@
     typeCollision = false;
 
     int set;
+    int setRT;
     if (qualifier.isPipeInput())
         set = 0;
     else if (qualifier.isPipeOutput())
@@ -1076,11 +1100,17 @@
         set = 2;
     else if (qualifier.storage == EvqBuffer)
         set = 3;
+    else if (qualifier.isAnyPayload())
+        setRT = 0;
+    else if (qualifier.isAnyCallable())
+        setRT = 1;
     else
         return -1;
 
     int size;
-    if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {
+    if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {
+        size = 1;
+    } else if (qualifier.isUniformOrBuffer() || qualifier.isTaskMemory()) {
         if (type.isSizedArray())
             size = type.getCumulativeArraySize();
         else
@@ -1108,10 +1138,17 @@
     // (A vertex shader input will show using only one location, even for a dvec3/4.)
     //
     // So, for the case of dvec3, we need two independent ioRanges.
-
+    //
+    // For raytracing IO (payloads and callabledata) each declaration occupies a single
+    // slot irrespective of type.
     int collision = -1; // no collision
 #ifndef GLSLANG_WEB
-    if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&
+    if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) {
+        TRange range(qualifier.layoutLocation, qualifier.layoutLocation);
+        collision = checkLocationRT(setRT, qualifier.layoutLocation);
+        if (collision < 0)
+            usedIoRT[setRT].push_back(range);
+    } else if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 &&
         (qualifier.isPipeInput() || qualifier.isPipeOutput())) {
         // Dealing with dvec3 in/out split across two locations.
         // Need two io-ranges.
@@ -1187,6 +1224,16 @@
     return -1; // no collision
 }
 
+int TIntermediate::checkLocationRT(int set, int location) {
+    TRange range(location, location);
+    for (size_t r = 0; r < usedIoRT[set].size(); ++r) {
+        if (range.overlap(usedIoRT[set][r])) {
+            return range.start;
+        }
+    }
+    return -1; // no collision
+}
+
 // Accumulate bindings and offsets, and check for collisions
 // as the accumulation is done.
 //
@@ -1362,9 +1409,9 @@
     // that component's size.  Aggregate types are flattened down to the component
     // level to get this sequence of components."
 
-    if (type.isArray()) {
+    if (type.isSizedArray()) {
         // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
-        assert(type.isSizedArray());
+        // Unsized array use to xfb should be a compile error.
         TType elementType(type, 0);
         return type.getOuterArraySize() * computeTypeXfbSize(elementType, contains64BitType, contains16BitType, contains16BitType);
     }
@@ -1550,7 +1597,9 @@
         RoundToPow2(size, alignment);
         stride = size;  // uses full matrix size for stride of an array of matrices (not quite what rule 6/8, but what's expected)
                         // uses the assumption for rule 10 in the comment above
-        size = stride * type.getOuterArraySize();
+        // use one element to represent the last member of SSBO which is unsized array
+        int arraySize = (type.isUnsizedArray() && (type.getOuterArraySize() == 0)) ? 1 : type.getOuterArraySize();
+        size = stride * arraySize;
         return alignment;
     }
 
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 996e347..84d19d4 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -233,6 +233,48 @@
     TMap<TString, int> maps[EsiCount];
 };
 
+class TNumericFeatures {
+public:
+    TNumericFeatures() : features(0) { }
+    TNumericFeatures(const TNumericFeatures&) = delete;
+    TNumericFeatures& operator=(const TNumericFeatures&) = delete;
+    typedef enum : unsigned int {
+        shader_explicit_arithmetic_types          = 1 << 0,
+        shader_explicit_arithmetic_types_int8     = 1 << 1,
+        shader_explicit_arithmetic_types_int16    = 1 << 2,
+        shader_explicit_arithmetic_types_int32    = 1 << 3,
+        shader_explicit_arithmetic_types_int64    = 1 << 4,
+        shader_explicit_arithmetic_types_float16  = 1 << 5,
+        shader_explicit_arithmetic_types_float32  = 1 << 6,
+        shader_explicit_arithmetic_types_float64  = 1 << 7,
+        shader_implicit_conversions               = 1 << 8,
+        gpu_shader_fp64                           = 1 << 9,
+        gpu_shader_int16                          = 1 << 10,
+        gpu_shader_half_float                     = 1 << 11,
+    } feature;
+    void insert(feature f) { features |= f; }
+    void erase(feature f) { features &= ~f; }
+    bool contains(feature f) const { return (features & f) != 0; }
+private:
+    unsigned int features;
+};
+
+// MustBeAssigned wraps a T, asserting that it has been assigned with 
+// operator =() before attempting to read with operator T() or operator ->().
+// Used to catch cases where fields are read before they have been assigned.
+template<typename T>
+class MustBeAssigned
+{
+public:
+    MustBeAssigned() = default;
+    MustBeAssigned(const T& v) : value(v) {}
+    operator const T&() const { assert(isSet); return value; }
+    const T* operator ->() const { assert(isSet); return &value; }
+    MustBeAssigned& operator = (const T& v) { value = v; isSet = true; return *this; } 
+private:
+    T value;
+    bool isSet = false;
+};
 
 //
 // Set of helper functions to help parse and build the tree.
@@ -241,7 +283,11 @@
 public:
     explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :
         language(l),
-        profile(p), version(v), treeRoot(0),
+#ifndef GLSLANG_ANGLE
+        profile(p), version(v),
+#endif
+        treeRoot(0),
+        resources(TBuiltInResource{}),
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invertY(false),
         useStorageBuffer(false),
@@ -265,6 +311,7 @@
         computeDerivativeMode(LayoutDerivativeNone),
         primitives(TQualifier::layoutNotSet),
         numTaskNVBlocks(0),
+        layoutPrimitiveCulling(false),
         autoMapBindings(false),
         autoMapLocations(false),
         flattenUniformArrays(false),
@@ -294,9 +341,20 @@
 #endif
     }
 
-    void setVersion(int v) { version = v; }
+    void setVersion(int v)
+    {
+#ifndef GLSLANG_ANGLE
+        version = v;
+#endif
+    }
+    void setProfile(EProfile p)
+    {
+#ifndef GLSLANG_ANGLE
+        profile = p;
+#endif
+    }
+
     int getVersion() const { return version; }
-    void setProfile(EProfile p) { profile = p; }
     EProfile getProfile() const { return profile; }
     void setSpv(const SpvVersion& s)
     {
@@ -356,16 +414,12 @@
     }
     const SpvVersion& getSpv() const { return spvVersion; }
     EShLanguage getStage() const { return language; }
-    void updateRequestedExtension(const char* extension, TExtensionBehavior behavior) { 
-        if(requestedExtensions.find(extension) != requestedExtensions.end()) {
-            requestedExtensions[extension] = behavior; 
-        } else {
-            requestedExtensions.insert(std::make_pair(extension, behavior)); 
-        }
+    void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
+    const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
+    bool isRayTracingStage() const {
+        return language >= EShLangRayGen && language <= EShLangCallableNV;
     }
 
-    const std::map<std::string, TExtensionBehavior>& getRequestedExtensions() const { return requestedExtensions; }
-
     void setTreeRoot(TIntermNode* r) { treeRoot = r; }
     TIntermNode* getTreeRoot() const { return treeRoot; }
     void incrementEntryPointCount() { ++numEntryPoints; }
@@ -373,6 +427,7 @@
     int getNumErrors() const { return numErrors; }
     void addPushConstantCount() { ++numPushConstants; }
     void setLimits(const TBuiltInResource& r) { resources = r; }
+    const TBuiltInResource& getLimits() const { return resources; }
 
     bool postProcess(TIntermNode*, EShLanguage);
     void removeTree();
@@ -399,7 +454,7 @@
     void setSource(EShSource s) { source = s; }
     EShSource getSource() const { return source; }
 #else
-    void setSource(EShSource s) { assert(s == EShSourceGlsl); }
+    void setSource(EShSource s) { assert(s == EShSourceGlsl); (void)s; }
     EShSource getSource() const { return EShSourceGlsl; }
 #endif
 
@@ -410,15 +465,15 @@
     TIntermSymbol* addSymbol(const TType&, const TSourceLoc&);
     TIntermSymbol* addSymbol(const TIntermSymbol&);
     TIntermTyped* addConversion(TOperator, const TType&, TIntermTyped*);
-    std::tuple<TIntermTyped*, TIntermTyped*> addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1);
+    std::tuple<TIntermTyped*, TIntermTyped*> addPairConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1);
     TIntermTyped* addUniShapeConversion(TOperator, const TType&, TIntermTyped*);
     TIntermTyped* addConversion(TBasicType convertTo, TIntermTyped* node) const;
     void addBiShapeConversion(TOperator, TIntermTyped*& lhsNode, TIntermTyped*& rhsNode);
     TIntermTyped* addShapeConversion(const TType&, TIntermTyped*);
-    TIntermTyped* addBinaryMath(TOperator, TIntermTyped* left, TIntermTyped* right, TSourceLoc);
-    TIntermTyped* addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc);
-    TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, TSourceLoc);
-    TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, TSourceLoc);
+    TIntermTyped* addBinaryMath(TOperator, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
+    TIntermTyped* addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
+    TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, const TSourceLoc&);
+    TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, const TSourceLoc&);
     TIntermTyped* addBuiltInFunctionCall(const TSourceLoc& line, TOperator, bool unary, TIntermNode*, const TType& returnType);
     bool canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op = EOpNull) const;
     bool isIntegralPromotion(TBasicType from, TBasicType to) const;
@@ -432,7 +487,7 @@
     TIntermAggregate* makeAggregate(TIntermNode* node);
     TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&);
     TIntermAggregate* makeAggregate(const TSourceLoc&);
-    TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, TSourceLoc);
+    TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, const TSourceLoc&);
     bool areAllChildConst(TIntermAggregate* aggrNode);
     TIntermSelection* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
     TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc&);
@@ -461,10 +516,11 @@
 
     // Low level functions to add nodes (no conversions or other higher level transformations)
     // If a type is provided, the node's type will be set to it.
-    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc) const;
-    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc, const TType&) const;
-    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc) const;
-    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc, const TType&) const;
+    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&) const;
+    TIntermBinary* addBinaryNode(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&,
+        const TType&) const;
+    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc&) const;
+    TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, const TSourceLoc&, const TType&) const;
 
     // Constant folding (in Constant.cpp)
     TIntermTyped* fold(TIntermAggregate* aggrNode);
@@ -478,12 +534,9 @@
     // Linkage related
     void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
     void addSymbolLinkageNode(TIntermAggregate*& linkage, const TSymbol&);
+    TIntermAggregate* findLinkerObjects() const;
 
-    void setUseStorageBuffer()
-    {
-        useStorageBuffer = true;
-        processes.addProcess("use-storage-buffer");
-    }
+    void setUseStorageBuffer() { useStorageBuffer = true; }
     bool usingStorageBuffer() const { return useStorageBuffer; }
     void setDepthReplacing() { depthReplacing = true; }
     bool isDepthReplacing() const { return depthReplacing; }
@@ -742,6 +795,8 @@
     void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
     bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
     ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
+    void setLayoutPrimitiveCulling() { layoutPrimitiveCulling = true; }
+    bool getLayoutPrimitiveCulling() const { return layoutPrimitiveCulling; }
     bool setPrimitives(int m)
     {
         if (primitives != TQualifier::layoutNotSet)
@@ -803,6 +858,14 @@
     bool usingHlslIoMapping() { return false; }
 #endif
 
+    bool usingScalarBlockLayout() const {
+        for (auto extIt = requestedExtensions.begin(); extIt != requestedExtensions.end(); ++extIt) {
+            if (*extIt == E_GL_EXT_scalar_block_layout)
+                return true;
+        }
+        return false;
+    };
+
     void addToCallGraph(TInfoSink&, const TString& caller, const TString& callee);
     void merge(TInfoSink&, TIntermediate&);
     void finalCheck(TInfoSink&, bool keepUncalled);
@@ -815,6 +878,7 @@
 
     int addUsedLocation(const TQualifier&, const TType&, bool& typeCollision);
     int checkLocationRange(int set, const TIoRange& range, const TType&, bool& typeCollision);
+    int checkLocationRT(int set, int location);
     int addUsedOffsets(int binding, int offset, int numOffsets);
     bool addUsedConstantId(int id);
     static int computeTypeLocationSize(const TType&, EShLanguage);
@@ -853,22 +917,25 @@
     bool getArithemeticInt8Enabled() const { return false; }
     bool getArithemeticInt16Enabled() const { return false; }
     bool getArithemeticFloat16Enabled() const { return false; }
+    void updateNumericFeature(TNumericFeatures::feature f, bool on) { }
 #else
     bool getArithemeticInt8Enabled() const {
-        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
+        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8);
     }
     bool getArithemeticInt16Enabled() const {
-        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-               extensionRequested(E_GL_AMD_gpu_shader_int16) ||
-               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
+        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+               numericFeatures.contains(TNumericFeatures::gpu_shader_int16) ||
+               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int16);
     }
 
     bool getArithemeticFloat16Enabled() const {
-        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
-               extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
-               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16);
+        return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) ||
+               numericFeatures.contains(TNumericFeatures::gpu_shader_half_float) ||
+               numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_float16);
     }
+    void updateNumericFeature(TNumericFeatures::feature f, bool on)
+        { on ? numericFeatures.insert(f) : numericFeatures.erase(f); }
 #endif
 
 protected:
@@ -887,7 +954,7 @@
     void checkCallGraphCycles(TInfoSink&);
     void checkCallGraphBodies(TInfoSink&, bool keepUncalled);
     void inOutLocationCheck(TInfoSink&);
-    TIntermAggregate* findLinkerObjects() const;
+    void sharedBlockCheck(TInfoSink&);
     bool userOutputUsed() const;
     bool isSpecializationOperation(const TIntermOperator&) const;
     bool isNonuniformPropagating(TOperator) const;
@@ -900,23 +967,7 @@
     bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);
     void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);
     bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
-    std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
-
-    // JohnK: I think this function should go away.
-    // This data structure is just a log to pass on to back ends.
-    // Versioning and extensions are handled in Version.cpp, with a rich
-    // set of functions for querying stages, versions, extension enable/disabled, etc.
-#ifdef GLSLANG_WEB
-    bool extensionRequested(const char *extension) const { return false; }
-#else
-    bool extensionRequested(const char *extension) const {
-        auto it = requestedExtensions.find(extension);
-        if (it != requestedExtensions.end()) {
-            return (it->second == EBhDisable) ? false : true;
-        }
-        return false;
-    }
-#endif
+    std::tuple<TBasicType, TBasicType> getConversionDestinationType(TBasicType type0, TBasicType type1, TOperator op) const;
 
     static const char* getResourceName(TResourceType);
 
@@ -926,12 +977,17 @@
     typedef std::list<TCall> TGraph;
     TGraph callGraph;
 
+#ifdef GLSLANG_ANGLE
+    const EProfile profile = ECoreProfile;
+    const int version = 450;
+#else
     EProfile profile;                           // source profile
     int version;                                // source version
+#endif
     SpvVersion spvVersion;
     TIntermNode* treeRoot;
-    std::map<std::string, TExtensionBehavior> requestedExtensions;  // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
-    TBuiltInResource resources;
+    std::set<std::string> requestedExtensions;  // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
+    MustBeAssigned<TBuiltInResource> resources;
     int numEntryPoints;
     int numErrors;
     int numPushConstants;
@@ -974,6 +1030,7 @@
     ComputeDerivativeMode computeDerivativeMode;
     int primitives;
     int numTaskNVBlocks;
+    bool layoutPrimitiveCulling;
 
     // Base shift values
     std::array<unsigned int, EResCount> shiftBinding;
@@ -1000,11 +1057,14 @@
 
     std::unordered_map<std::string, int> uniformLocationOverrides;
     int uniformLocationBase;
+    TNumericFeatures numericFeatures;
 #endif
 
     std::unordered_set<int> usedConstantId; // specialization constant ids used
     std::vector<TOffsetRange> usedAtomics;  // sets of bindings used by atomic counters
     std::vector<TIoRange> usedIo[4];        // sets of used locations, one for each of in, out, uniform, and buffers
+    std::vector<TRange> usedIoRT[2];        // sets of used location, one for rayPayload/rayPayloadIN and other
+                                            // for callableData/callableDataIn
     // set of names of statically read/written I/O that might need extra checking
     std::set<TString> ioAccessed;
     // source code of shader, useful as part of debug information
diff --git a/glslang/MachineIndependent/parseVersions.h b/glslang/MachineIndependent/parseVersions.h
index aa1964f..7248354 100644
--- a/glslang/MachineIndependent/parseVersions.h
+++ b/glslang/MachineIndependent/parseVersions.h
@@ -58,7 +58,7 @@
                    const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink,
                    bool forwardCompatible, EShMessages messages)
         :
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         forwardCompatible(forwardCompatible),
         profile(profile),
 #endif
@@ -101,6 +101,7 @@
     void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
     void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
     void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
+    void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { }
     void fullIntegerCheck(const TSourceLoc&, const char* op) { }
     void doubleCheck(const TSourceLoc&, const char* op) { }
     bool float16Arithmetic() { return false; }
@@ -116,8 +117,13 @@
     bool suppressWarnings() const { return true; }
     bool isForwardCompatible() const { return false; }
 #else
+#ifdef GLSLANG_ANGLE
+    const bool forwardCompatible = true;
+    const EProfile profile = ECoreProfile;
+#else
     bool forwardCompatible;      // true if errors are to be given for use of deprecated features
     EProfile profile;            // the declared profile in the shader (core by default)
+#endif
     bool isEsProfile() const { return profile == EEsProfile; }
     void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc);
     void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions,
@@ -139,6 +145,7 @@
     virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
         const char* featureDesc);
     virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
+    virtual void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior);
     virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
 
     virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
@@ -170,6 +177,7 @@
     virtual void vulkanRemoved(const TSourceLoc&, const char* op);
     virtual void requireVulkan(const TSourceLoc&, const char* op);
     virtual void requireSpv(const TSourceLoc&, const char* op);
+    virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version);
 
 
 #if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
@@ -221,7 +229,8 @@
     TIntermediate& intermediate; // helper for making and hooking up pieces of the parse tree
 
 protected:
-    TMap<TString, TExtensionBehavior> extensionBehavior;    // for each extension string, what its current behavior is set to
+    TMap<TString, TExtensionBehavior> extensionBehavior;    // for each extension string, what its current behavior is
+    TMap<TString, unsigned int> extensionMinSpv;            // for each extension string, store minimum spirv required
     EShMessages messages;        // errors/warnings/rule-sets
     int numErrors;               // number of compile-time errors encountered
     TInputScanner* currentScanner;
diff --git a/glslang/MachineIndependent/pch.cpp b/glslang/MachineIndependent/pch.cpp
deleted file mode 100644
index b7a0865..0000000
--- a/glslang/MachineIndependent/pch.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (C) 2018 The Khronos Group Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//    Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//
-//    Redistributions in binary form must reproduce the above
-//    copyright notice, this list of conditions and the following
-//    disclaimer in the documentation and/or other materials provided
-//    with the distribution.
-//
-//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
-//    contributors may be used to endorse or promote products derived
-//    from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-
-#include "pch.h"
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
index ec39356..aa1e0d7 100644
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -422,10 +422,10 @@
             if (! parseContext.isReadingHLSL() && isMacroInput()) {
                 if (parseContext.relaxedErrors())
                     parseContext.ppWarn(ppToken->loc, "nonportable when expanded from macros for preprocessor expression",
-                                                      "defined", "");
+                        "defined", "");
                 else
                     parseContext.ppError(ppToken->loc, "cannot use in preprocessor expression when expanded from macros",
-                                                       "defined", "");
+                        "defined", "");
             }
             bool needclose = 0;
             token = scanToken(ppToken);
@@ -455,6 +455,7 @@
                 token = scanToken(ppToken);
             }
         } else {
+            token = tokenPaste(token, *ppToken);
             token = evalToToken(token, shortCircuit, res, err, ppToken);
             return eval(token, precedence, shortCircuit, res, err, ppToken);
         }
@@ -1184,7 +1185,9 @@
     int macroAtom = atomStrings.getAtom(ppToken->name);
     switch (macroAtom) {
     case PpAtomLineMacro:
-        ppToken->ival = parseContext.getCurrentLoc().line;
+        // Arguments which are macro have been replaced in the first stage.
+        if (ppToken->ival == 0)
+            ppToken->ival = parseContext.getCurrentLoc().line;
         snprintf(ppToken->name, sizeof(ppToken->name), "%d", ppToken->ival);
         UngetToken(PpAtomConstInt, ppToken);
         return MacroExpandStarted;
@@ -1285,6 +1288,11 @@
                     nestStack.push_back('}');
                 else if (nestStack.size() > 0 && token == nestStack.back())
                     nestStack.pop_back();
+
+                //Macro replacement list is expanded in the last stage.
+                if (atomStrings.getAtom(ppToken->name) == PpAtomLineMacro)
+                    ppToken->ival = parseContext.getCurrentLoc().line;
+
                 in->args[arg]->putToken(token, ppToken);
                 tokenRecorded = true;
             }
diff --git a/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
old mode 100755
new mode 100644
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index 2876933..9870a40 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -33,7 +33,7 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #include "../Include/Common.h"
 #include "reflection.h"
@@ -77,10 +77,10 @@
 // This is in the glslang namespace directly so it can be a friend of TReflection.
 //
 
-class TReflectionTraverser : public TLiveTraverser {
+class TReflectionTraverser : public TIntermTraverser {
 public:
     TReflectionTraverser(const TIntermediate& i, TReflection& r) :
-         TLiveTraverser(i), reflection(r) { }
+	                     TIntermTraverser(), intermediate(i), reflection(r), updateStageMasks(true) { }
 
     virtual bool visitBinary(TVisit, TIntermBinary* node);
     virtual void visitSymbol(TIntermSymbol* base);
@@ -92,11 +92,28 @@
         if (processedDerefs.find(&base) == processedDerefs.end()) {
             processedDerefs.insert(&base);
 
+            int blockIndex = -1;
+            int offset     = -1;
+            TList<TIntermBinary*> derefs;
+            TString baseName = base.getName();
+
+            if (base.getType().getBasicType() == EbtBlock) {
+                offset = 0;
+                bool anonymous = IsAnonymous(baseName);
+                const TString& blockName = base.getType().getTypeName();
+
+                if (!anonymous)
+                    baseName = blockName;
+                else
+                    baseName = "";
+
+                blockIndex = addBlockName(blockName, base.getType(), intermediate.getBlockSize(base.getType()));
+            }
+
             // Use a degenerate (empty) set of dereferences to immediately put as at the end of
             // the dereference change expected by blowUpActiveAggregate.
-            TList<TIntermBinary*> derefs;
-            blowUpActiveAggregate(base.getType(), base.getName(), derefs, derefs.end(), -1, -1, 0, 0,
-                                  base.getQualifier().storage, true);
+            blowUpActiveAggregate(base.getType(), baseName, derefs, derefs.end(), offset, blockIndex, 0, -1, 0,
+                                    base.getQualifier().storage, updateStageMasks);
         }
     }
 
@@ -155,9 +172,9 @@
     void getOffsets(const TType& type, TVector<int>& offsets)
     {
         const TTypeList& memberList = *type.getStruct();
-
         int memberSize = 0;
         int offset = 0;
+
         for (size_t m = 0; m < offsets.size(); ++m) {
             // if the user supplied an offset, snap to it now
             if (memberList[m].type->getQualifier().hasOffset())
@@ -233,7 +250,7 @@
     // A value of 0 for arraySize will mean to use the full array's size.
     void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,
                                TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize,
-                               int topLevelArrayStride, TStorageQualifier baseStorage, bool active)
+                               int topLevelArraySize, int topLevelArrayStride, TStorageQualifier baseStorage, bool active)
     {
         // when strictArraySuffix is enabled, we closely follow the rules from ARB_program_interface_query.
         // Broadly:
@@ -262,14 +279,15 @@
                 // Visit all the indices of this array, and for each one add on the remaining dereferencing
                 for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {
                     TString newBaseName = name;
-                    if (strictArraySuffix && blockParent)
+                    if (terminalType->getBasicType() == EbtBlock) {}
+                    else if (strictArraySuffix && blockParent)
                         newBaseName.append(TString("[0]"));
                     else if (strictArraySuffix || baseType.getBasicType() != EbtBlock)
                         newBaseName.append(TString("[") + String(i) + "]");
                     TList<TIntermBinary*>::const_iterator nextDeref = deref;
                     ++nextDeref;
                     blowUpActiveAggregate(*terminalType, newBaseName, derefs, nextDeref, offset, blockIndex, arraySize,
-                                          topLevelArrayStride, baseStorage, active);
+                                          topLevelArraySize, topLevelArrayStride, baseStorage, active);
 
                     if (offset >= 0)
                         offset += stride;
@@ -282,9 +300,10 @@
                 int stride = getArrayStride(baseType, visitNode->getLeft()->getType());
 
                 index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
-                if (strictArraySuffix && blockParent) {
+                if (terminalType->getBasicType() == EbtBlock) {}
+                else if (strictArraySuffix && blockParent)
                     name.append(TString("[0]"));
-                } else if (strictArraySuffix || baseType.getBasicType() != EbtBlock) {
+                else if (strictArraySuffix || baseType.getBasicType() != EbtBlock) {
                     name.append(TString("[") + String(index) + "]");
 
                     if (offset >= 0)
@@ -294,7 +313,10 @@
                 if (topLevelArrayStride == 0)
                     topLevelArrayStride = stride;
 
-                blockParent = false;
+                // expand top-level arrays in blocks with [0] suffix
+                if (topLevelArrayStride != 0 && visitNode->getLeft()->getType().isArray()) {
+                    blockParent = false;
+                }
                 break;
             }
             case EOpIndexDirectStruct:
@@ -304,6 +326,12 @@
                 if (name.size() > 0)
                     name.append(".");
                 name.append((*visitNode->getLeft()->getType().getStruct())[index].type->getFieldName());
+
+                // expand non top-level arrays with [x] suffix
+                if (visitNode->getLeft()->getType().getBasicType() != EbtBlock && terminalType->isArray())
+                {
+                    blockParent = false;
+                }
                 break;
             default:
                 break;
@@ -323,24 +351,27 @@
                 if (offset >= 0)
                     stride = getArrayStride(baseType, *terminalType);
 
-                if (topLevelArrayStride == 0)
-                    topLevelArrayStride = stride;
-
                 int arrayIterateSize = std::max(terminalType->getOuterArraySize(), 1);
 
                 // for top-level arrays in blocks, only expand [0] to avoid explosion of items
-                if (strictArraySuffix && blockParent)
+                if ((strictArraySuffix && blockParent) ||
+                    ((topLevelArraySize == arrayIterateSize) && (topLevelArrayStride == 0))) {
                     arrayIterateSize = 1;
+                }
+
+                if (topLevelArrayStride == 0)
+                    topLevelArrayStride = stride;
 
                 for (int i = 0; i < arrayIterateSize; ++i) {
                     TString newBaseName = name;
-                    newBaseName.append(TString("[") + String(i) + "]");
+                    if (terminalType->getBasicType() != EbtBlock)
+                        newBaseName.append(TString("[") + String(i) + "]");
                     TType derefType(*terminalType, 0);
                     if (offset >= 0)
                         offset = baseOffset + stride * i;
 
                     blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,
-                                          topLevelArrayStride, baseStorage, active);
+                                          topLevelArraySize, topLevelArrayStride, baseStorage, active);
                 }
             } else {
                 // Visit all members of this aggregate, and for each one,
@@ -369,8 +400,31 @@
                         arrayStride = getArrayStride(baseType, derefType);
                     }
 
-                    blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,
-                                          arrayStride, baseStorage, active);
+                    if (topLevelArraySize == -1 && arrayStride == 0 && blockParent)
+                        topLevelArraySize = 1;
+
+                    if (strictArraySuffix && blockParent) {
+                        // if this member is an array, store the top-level array stride but start the explosion from
+                        // the inner struct type.
+                        if (derefType.isArray() && derefType.isStruct()) {
+                            newBaseName.append("[0]");
+                            auto dimSize = derefType.isUnsizedArray() ? 0 : derefType.getArraySizes()->getDimSize(0);
+                            blowUpActiveAggregate(TType(derefType, 0), newBaseName, derefs, derefs.end(), memberOffsets[i],
+                                blockIndex, 0, dimSize, arrayStride, terminalType->getQualifier().storage, false);
+                        }
+                        else if (derefType.isArray()) {
+                            auto dimSize = derefType.isUnsizedArray() ? 0 : derefType.getArraySizes()->getDimSize(0);
+                            blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), memberOffsets[i], blockIndex,
+                                0, dimSize, 0, terminalType->getQualifier().storage, false);
+                        }
+                        else {
+                            blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), memberOffsets[i], blockIndex,
+                                0, 1, 0, terminalType->getQualifier().storage, false);
+                        }
+                    } else {
+                        blowUpActiveAggregate(derefType, newBaseName, derefs, derefs.end(), offset, blockIndex, 0,
+                                              topLevelArraySize, arrayStride, baseStorage, active);
+                    }
                 }
             }
 
@@ -406,6 +460,7 @@
             if ((reflection.options & EShReflectionSeparateBuffers) && terminalType->isAtomic())
                 reflection.atomicCounterUniformIndices.push_back(uniformIndex);
 
+            variables.back().topLevelArraySize = topLevelArraySize;
             variables.back().topLevelArrayStride = topLevelArrayStride;
             
             if ((reflection.options & EShReflectionAllBlockVariables) && active) {
@@ -537,65 +592,17 @@
             if (! anonymous)
                 baseName = blockName;
 
-            if (base->getType().isArray()) {
-                TType derefType(base->getType(), 0);
-
-                assert(! anonymous);
-                for (int e = 0; e < base->getType().getCumulativeArraySize(); ++e)
-                    blockIndex = addBlockName(blockName + "[" + String(e) + "]", derefType,
-                                              intermediate.getBlockSize(base->getType()));
-                baseName.append(TString("[0]"));
-            } else
-                blockIndex = addBlockName(blockName, base->getType(), intermediate.getBlockSize(base->getType()));
+            blockIndex = addBlockName(blockName, base->getType(), intermediate.getBlockSize(base->getType()));
 
             if (reflection.options & EShReflectionAllBlockVariables) {
                 // Use a degenerate (empty) set of dereferences to immediately put as at the end of
                 // the dereference change expected by blowUpActiveAggregate.
                 TList<TIntermBinary*> derefs;
 
-                // because we don't have any derefs, the first thing blowUpActiveAggregate will do is iterate over each
-                // member in the struct definition. This will lose any information about whether the parent was a buffer
-                // block. So if we're using strict array rules which don't expand the first child of a buffer block we
-                // instead iterate over the children here.
-                const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);
-                bool blockParent = (base->getType().getBasicType() == EbtBlock && base->getQualifier().storage == EvqBuffer);
-
-                if (strictArraySuffix && blockParent) {
-                    TType structDerefType(base->getType(), 0);
-
-                    const TType &structType = base->getType().isArray() ? structDerefType : base->getType();
-                    const TTypeList& typeList = *structType.getStruct();
-
-                    TVector<int> memberOffsets;
-
-                    memberOffsets.resize(typeList.size());
-                    getOffsets(structType, memberOffsets);
-
-                    for (int i = 0; i < (int)typeList.size(); ++i) {
-                        TType derefType(structType, i);
-                        TString name = baseName;
-                        if (name.size() > 0)
-                            name.append(".");
-                        name.append(typeList[i].type->getFieldName());
-
-                        // if this member is an array, store the top-level array stride but start the explosion from
-                        // the inner struct type.
-                        if (derefType.isArray() && derefType.isStruct()) {
-                            name.append("[0]");
-                            blowUpActiveAggregate(TType(derefType, 0), name, derefs, derefs.end(), memberOffsets[i],
-                                                  blockIndex, 0, getArrayStride(structType, derefType),
-                                                  base->getQualifier().storage, false);
-                        } else {
-                            blowUpActiveAggregate(derefType, name, derefs, derefs.end(), memberOffsets[i], blockIndex,
-                                                  0, 0, base->getQualifier().storage, false);
-                        }
-                    }
-                } else {
-                    // otherwise - if we're not using strict array suffix rules, or this isn't a block so we are
-                    // expanding root arrays anyway, just start the iteration from the base block type.
-                    blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.end(), 0, blockIndex, 0, 0,
+                // otherwise - if we're not using strict array suffix rules, or this isn't a block so we are
+                // expanding root arrays anyway, just start the iteration from the base block type.
+                blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.end(), 0, blockIndex, 0, -1, 0,
                                           base->getQualifier().storage, false);
-                }
             }
         }
 
@@ -626,30 +633,43 @@
             else
                 baseName = base->getName();
         }
-        blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.begin(), offset, blockIndex, arraySize, 0,
+        blowUpActiveAggregate(base->getType(), baseName, derefs, derefs.begin(), offset, blockIndex, arraySize, -1, 0,
                               base->getQualifier().storage, true);
     }
 
     int addBlockName(const TString& name, const TType& type, int size)
     {
-        TReflection::TMapIndexToReflection& blocks = reflection.GetBlockMapForStorage(type.getQualifier().storage);
-
-        int blockIndex;
-        TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
-        if (reflection.nameToIndex.find(name.c_str()) == reflection.nameToIndex.end()) {
-            blockIndex = (int)blocks.size();
-            reflection.nameToIndex[name.c_str()] = blockIndex;
-            blocks.push_back(TObjectReflection(name.c_str(), type, -1, -1, size, -1));
-
-            blocks.back().numMembers = countAggregateMembers(type);
-
-            EShLanguageMask& stages = blocks.back().stages;
-            stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+        int blockIndex = 0;
+        if (type.isArray()) {
+            TType derefType(type, 0);
+            for (int e = 0; e < type.getOuterArraySize(); ++e) {
+                int memberBlockIndex = addBlockName(name + "[" + String(e) + "]", derefType, size);
+                if (e == 0)
+                    blockIndex = memberBlockIndex;
+            }
         } else {
-            blockIndex = it->second;
+            TReflection::TMapIndexToReflection& blocks = reflection.GetBlockMapForStorage(type.getQualifier().storage);
 
-            EShLanguageMask& stages = blocks[blockIndex].stages;
-            stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+            TReflection::TNameToIndex::const_iterator it = reflection.nameToIndex.find(name.c_str());
+            if (reflection.nameToIndex.find(name.c_str()) == reflection.nameToIndex.end()) {
+                blockIndex = (int)blocks.size();
+                reflection.nameToIndex[name.c_str()] = blockIndex;
+                blocks.push_back(TObjectReflection(name.c_str(), type, -1, -1, size, blockIndex));
+
+                blocks.back().numMembers = countAggregateMembers(type);
+
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks.back().stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
+            }
+            else {
+                blockIndex = it->second;
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks[blockIndex].stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
+            }
         }
 
         return blockIndex;
@@ -995,8 +1015,10 @@
         return type.isArray() ? type.getOuterArraySize() : 1;
     }
 
+    const TIntermediate& intermediate;
     TReflection& reflection;
     std::set<const TIntermNode*> processedDerefs;
+    bool updateStageMasks;
 
 protected:
     TReflectionTraverser(TReflectionTraverser&);
@@ -1029,7 +1051,21 @@
 // To reflect non-dereferenced objects.
 void TReflectionTraverser::visitSymbol(TIntermSymbol* base)
 {
-    if (base->getQualifier().storage == EvqUniform)
+    if (base->getQualifier().storage == EvqUniform) {
+        if (base->getBasicType() == EbtBlock) {
+            if (reflection.options & EShReflectionSharedStd140UBO) {
+                addUniform(*base);
+            }
+        } else {
+            addUniform(*base);
+        }
+    }
+
+    // #TODO add std140/layout active rules for ssbo, same with ubo.
+    // Storage buffer blocks will be collected and expanding in this part.
+    if((reflection.options & EShReflectionSharedStd140SSBO) &&
+       (base->getQualifier().storage == EvqBuffer && base->getBasicType() == EbtBlock &&
+        (base->getQualifier().layoutPacking == ElpStd140 || base->getQualifier().layoutPacking == ElpShared)))
         addUniform(*base);
 
     if ((intermediate.getStage() == reflection.firstStage && base->getQualifier().isPipeInput()) ||
@@ -1102,6 +1138,8 @@
         if (index >= 0)
             indexToUniformBlock[i].counterIndex = index;
     }
+#else
+    (void)intermediate;
 #endif
 }
 
@@ -1135,15 +1173,47 @@
 
     TReflectionTraverser it(intermediate, *this);
 
-    // put the entry point on the list of functions to process
-    it.pushFunction(intermediate.getEntryPointMangledName().c_str());
-
-    // process all the functions
-    while (! it.functions.empty()) {
-        TIntermNode* function = it.functions.back();
-        it.functions.pop_back();
-        function->traverse(&it);
+    for (auto& sequnence : intermediate.getTreeRoot()->getAsAggregate()->getSequence()) {
+        if (sequnence->getAsAggregate() != nullptr) {
+            if (sequnence->getAsAggregate()->getOp() == glslang::EOpLinkerObjects) {
+                it.updateStageMasks = false;
+                TIntermAggregate* linkerObjects = sequnence->getAsAggregate();
+                for (auto& sequnence : linkerObjects->getSequence()) {
+                    auto pNode = sequnence->getAsSymbolNode();
+                    if (pNode != nullptr) {
+                        if ((pNode->getQualifier().storage == EvqUniform &&
+                            (options & EShReflectionSharedStd140UBO)) ||
+                           (pNode->getQualifier().storage == EvqBuffer &&
+                            (options & EShReflectionSharedStd140SSBO))) {
+                            // collect std140 and shared uniform block form AST
+                            if ((pNode->getBasicType() == EbtBlock) &&
+                                ((pNode->getQualifier().layoutPacking == ElpStd140) ||
+                                 (pNode->getQualifier().layoutPacking == ElpShared))) {
+                                   pNode->traverse(&it);
+                            }
+                        }
+                        else if ((options & EShReflectionAllIOVariables) &&
+                            (pNode->getQualifier().isPipeInput() || pNode->getQualifier().isPipeOutput()))
+                        {
+                            pNode->traverse(&it);
+                        }
+                    }
+                }
+            } else {
+                // This traverser will travers all function in AST.
+                // If we want reflect uncalled function, we need set linke message EShMsgKeepUncalled.
+                // When EShMsgKeepUncalled been set to true, all function will be keep in AST, even it is a uncalled function.
+                // This will keep some uniform variables in reflection, if those uniform variables is used in these uncalled function.
+                //
+                // If we just want reflect only live node, we can use a default link message or set EShMsgKeepUncalled false.
+                // When linke message not been set EShMsgKeepUncalled, linker won't keep uncalled function in AST.
+                // So, travers all function node can equivalent to travers live function.
+                it.updateStageMasks = true;
+                sequnence->getAsAggregate()->traverse(&it);
+            }
+        }
     }
+    it.updateStageMasks = true;
 
     buildCounterIndices(intermediate);
     buildUniformStageMask(intermediate);
@@ -1201,4 +1271,4 @@
 
 } // end namespace glslang
 
-#endif // GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
diff --git a/glslang/MachineIndependent/reflection.h b/glslang/MachineIndependent/reflection.h
index 0c33de4..5af4467 100644
--- a/glslang/MachineIndependent/reflection.h
+++ b/glslang/MachineIndependent/reflection.h
@@ -33,7 +33,7 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 #ifndef _REFLECTION_INCLUDED
 #define _REFLECTION_INCLUDED
@@ -220,4 +220,4 @@
 
 #endif // _REFLECTION_INCLUDED
 
-#endif // GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
diff --git a/glslang/OSDependent/Unix/CMakeLists.txt b/glslang/OSDependent/Unix/CMakeLists.txt
index 9994314..354a3e9 100644
--- a/glslang/OSDependent/Unix/CMakeLists.txt
+++ b/glslang/OSDependent/Unix/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 add_library(OSDependent STATIC ossource.cpp ../osinclude.h)
 set_property(TARGET OSDependent PROPERTY FOLDER glslang)
 set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON)
diff --git a/glslang/OSDependent/Web/CMakeLists.txt b/glslang/OSDependent/Web/CMakeLists.txt
index 697b0b7..0f60dbc 100644
--- a/glslang/OSDependent/Web/CMakeLists.txt
+++ b/glslang/OSDependent/Web/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 if(ENABLE_GLSLANG_JS)
     add_executable(glslang.js "glslang.js.cpp")
     glslang_set_link_args(glslang.js)
diff --git a/glslang/OSDependent/Windows/CMakeLists.txt b/glslang/OSDependent/Windows/CMakeLists.txt
index c050ef6..9cf1b7f 100644
--- a/glslang/OSDependent/Windows/CMakeLists.txt
+++ b/glslang/OSDependent/Windows/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 set(SOURCES ossource.cpp ../osinclude.h)
 
 add_library(OSDependent STATIC ${SOURCES})
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
old mode 100755
new mode 100644
index acb2a07..3b47403
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -44,16 +44,25 @@
 #include <vector>
 
 #ifdef _WIN32
-#define C_DECL __cdecl
-//#ifdef SH_EXPORTING
-//    #define SH_IMPORT_EXPORT __declspec(dllexport)
-//#else
-//    #define SH_IMPORT_EXPORT __declspec(dllimport)
-//#endif
-#define SH_IMPORT_EXPORT
+    #define C_DECL __cdecl
 #else
-#define SH_IMPORT_EXPORT
-#define C_DECL
+    #define C_DECL
+#endif
+
+#ifdef GLSLANG_IS_SHARED_LIBRARY
+    #ifdef _WIN32
+        #ifdef GLSLANG_EXPORTING
+            #define GLSLANG_EXPORT __declspec(dllexport)
+        #else
+            #define GLSLANG_EXPORT __declspec(dllimport)
+        #endif
+    #elif __GNUC__ >= 4
+        #define GLSLANG_EXPORT __attribute__((visibility("default")))
+    #endif
+#endif // GLSLANG_IS_SHARED_LIBRARY
+
+#ifndef GLSLANG_EXPORT
+#define GLSLANG_EXPORT
 #endif
 
 //
@@ -65,22 +74,17 @@
     extern "C" {
 #endif
 
-// This should always increase, as some paths to do not consume
-// a more major number.
-// It should increment by one when new functionality is added.
-#define GLSLANG_MINOR_VERSION 13
-
 //
 // Call before doing any other compiler/linker operations.
 //
 // (Call once per process, not once per thread.)
 //
-SH_IMPORT_EXPORT int ShInitialize();
+GLSLANG_EXPORT int ShInitialize();
 
 //
 // Call this at process shutdown to clean up memory.
 //
-SH_IMPORT_EXPORT int ShFinalize();
+GLSLANG_EXPORT int ShFinalize();
 
 //
 // Types of languages the compiler can consume.
@@ -109,7 +113,7 @@
     LAST_ELEMENT_MARKER(EShLangCount),
 } EShLanguage;         // would be better as stage, but this is ancient now
 
-typedef enum {
+typedef enum : unsigned {
     EShLangVertexMask         = (1 << EShLangVertex),
     EShLangTessControlMask    = (1 << EShLangTessControl),
     EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
@@ -163,7 +167,7 @@
     EShTargetVulkan_1_1 = (1 << 22) | (1 << 12),      // Vulkan 1.1
     EShTargetVulkan_1_2 = (1 << 22) | (2 << 12),      // Vulkan 1.2
     EShTargetOpenGL_450 = 450,                        // OpenGL
-    LAST_ELEMENT_MARKER(EShTargetClientVersionCount),
+    LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 4),
 } EShTargetClientVersion;
 
 typedef EShTargetClientVersion EshTargetClientVersion;
@@ -175,7 +179,7 @@
     EShTargetSpv_1_3 = (1 << 16) | (3 << 8),          // SPIR-V 1.3
     EShTargetSpv_1_4 = (1 << 16) | (4 << 8),          // SPIR-V 1.4
     EShTargetSpv_1_5 = (1 << 16) | (5 << 8),          // SPIR-V 1.5
-    LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount),
+    LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 6),
 } EShTargetLanguageVersion;
 
 struct TInputLanguage {
@@ -205,7 +209,7 @@
     TTarget target;           // what to generate
 };
 
-const char* StageName(EShLanguage);
+GLSLANG_EXPORT const char* StageName(EShLanguage);
 
 } // end namespace glslang
 
@@ -240,7 +244,7 @@
 //
 // Message choices for what errors and warnings are given.
 //
-enum EShMessages {
+enum EShMessages : unsigned {
     EShMsgDefault          = 0,         // default is to give all required errors and extra warnings
     EShMsgRelaxedErrors    = (1 << 0),  // be liberal in accepting input
     EShMsgSuppressWarnings = (1 << 1),  // suppress all warnings, except those required by the specification
@@ -255,7 +259,7 @@
     EShMsgDebugInfo        = (1 << 10), // save debug information
     EShMsgHlslEnable16BitTypes  = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
     EShMsgHlslLegalization  = (1 << 12), // enable HLSL Legalization messages
-    EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
+    EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
     EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
     LAST_ELEMENT_MARKER(EShMsgCount),
 };
@@ -264,13 +268,16 @@
 // Options for building reflection
 //
 typedef enum {
-    EShReflectionDefault           = 0,        // default is original behaviour before options were added
-    EShReflectionStrictArraySuffix = (1 << 0), // reflection will follow stricter rules for array-of-structs suffixes
-    EShReflectionBasicArraySuffix  = (1 << 1), // arrays of basic types will be appended with [0] as in GL reflection
-    EShReflectionIntermediateIO    = (1 << 2), // reflect inputs and outputs to program, even with no vertex shader
-    EShReflectionSeparateBuffers   = (1 << 3), // buffer variables and buffer blocks are reflected separately
-    EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
-    EShReflectionUnwrapIOBlocks    = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
+    EShReflectionDefault            = 0,        // default is original behaviour before options were added
+    EShReflectionStrictArraySuffix  = (1 << 0), // reflection will follow stricter rules for array-of-structs suffixes
+    EShReflectionBasicArraySuffix   = (1 << 1), // arrays of basic types will be appended with [0] as in GL reflection
+    EShReflectionIntermediateIO     = (1 << 2), // reflect inputs and outputs to program, even with no vertex shader
+    EShReflectionSeparateBuffers    = (1 << 3), // buffer variables and buffer blocks are reflected separately
+    EShReflectionAllBlockVariables  = (1 << 4), // reflect all variables in blocks, even if they are inactive
+    EShReflectionUnwrapIOBlocks     = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
+    EShReflectionAllIOVariables     = (1 << 6), // reflect all input/output variables, even if they are inactive
+    EShReflectionSharedStd140SSBO   = (1 << 7), // Apply std140/shared rules for ubo to ssbo
+    EShReflectionSharedStd140UBO    = (1 << 8), // Apply std140/shared rules for ubo to ssbo
     LAST_ELEMENT_MARKER(EShReflectionCount),
 } EShReflectionOptions;
 
@@ -303,10 +310,10 @@
 // Driver calls these to create and destroy compiler/linker
 // objects.
 //
-SH_IMPORT_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int debugOptions);  // one per shader
-SH_IMPORT_EXPORT ShHandle ShConstructLinker(const EShExecutable, int debugOptions);  // one per shader pair
-SH_IMPORT_EXPORT ShHandle ShConstructUniformMap();                 // one per uniform namespace (currently entire program object)
-SH_IMPORT_EXPORT void ShDestruct(ShHandle);
+GLSLANG_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int debugOptions);  // one per shader
+GLSLANG_EXPORT ShHandle ShConstructLinker(const EShExecutable, int debugOptions);  // one per shader pair
+GLSLANG_EXPORT ShHandle ShConstructUniformMap();                 // one per uniform namespace (currently entire program object)
+GLSLANG_EXPORT void ShDestruct(ShHandle);
 
 //
 // The return value of ShCompile is boolean, non-zero indicating
@@ -315,7 +322,7 @@
 // The info-log should be written by ShCompile into
 // ShHandle, so it can answer future queries.
 //
-SH_IMPORT_EXPORT int ShCompile(
+GLSLANG_EXPORT int ShCompile(
     const ShHandle,
     const char* const shaderStrings[],
     const int numStrings,
@@ -328,7 +335,7 @@
     EShMessages messages = EShMsgDefault // warnings and errors
     );
 
-SH_IMPORT_EXPORT int ShLinkExt(
+GLSLANG_EXPORT int ShLinkExt(
     const ShHandle,               // linker object
     const ShHandle h[],           // compiler objects to link together
     const int numHandles);
@@ -337,26 +344,26 @@
 // ShSetEncrpytionMethod is a place-holder for specifying
 // how source code is encrypted.
 //
-SH_IMPORT_EXPORT void ShSetEncryptionMethod(ShHandle);
+GLSLANG_EXPORT void ShSetEncryptionMethod(ShHandle);
 
 //
 // All the following return 0 if the information is not
 // available in the object passed down, or the object is bad.
 //
-SH_IMPORT_EXPORT const char* ShGetInfoLog(const ShHandle);
-SH_IMPORT_EXPORT const void* ShGetExecutable(const ShHandle);
-SH_IMPORT_EXPORT int ShSetVirtualAttributeBindings(const ShHandle, const ShBindingTable*);   // to detect user aliasing
-SH_IMPORT_EXPORT int ShSetFixedAttributeBindings(const ShHandle, const ShBindingTable*);     // to force any physical mappings
+GLSLANG_EXPORT const char* ShGetInfoLog(const ShHandle);
+GLSLANG_EXPORT const void* ShGetExecutable(const ShHandle);
+GLSLANG_EXPORT int ShSetVirtualAttributeBindings(const ShHandle, const ShBindingTable*);   // to detect user aliasing
+GLSLANG_EXPORT int ShSetFixedAttributeBindings(const ShHandle, const ShBindingTable*);     // to force any physical mappings
 //
 // Tell the linker to never assign a vertex attribute to this list of physical attributes
 //
-SH_IMPORT_EXPORT int ShExcludeAttributes(const ShHandle, int *attributes, int count);
+GLSLANG_EXPORT int ShExcludeAttributes(const ShHandle, int *attributes, int count);
 
 //
 // Returns the location ID of the named uniform.
 // Returns -1 if error.
 //
-SH_IMPORT_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name);
+GLSLANG_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name);
 
 #ifdef __cplusplus
     }  // end extern "C"
@@ -387,19 +394,27 @@
 
 namespace glslang {
 
-const char* GetEsslVersionString();
-const char* GetGlslVersionString();
-int GetKhronosToolId();
+struct Version {
+    int major;
+    int minor;
+    int patch;
+    const char* flavor;
+};
+
+GLSLANG_EXPORT Version GetVersion();
+GLSLANG_EXPORT const char* GetEsslVersionString();
+GLSLANG_EXPORT const char* GetGlslVersionString();
+GLSLANG_EXPORT int GetKhronosToolId();
 
 class TIntermediate;
 class TProgram;
 class TPoolAllocator;
 
 // Call this exactly once per process before using anything else
-bool InitializeProcess();
+GLSLANG_EXPORT bool InitializeProcess();
 
 // Call once per process to tear down everything
-void FinalizeProcess();
+GLSLANG_EXPORT void FinalizeProcess();
 
 // Resource type for IO resolver
 enum TResourceType {
@@ -412,6 +427,7 @@
     EResCount
 };
 
+
 // Make one TShader per shader that you will link into a program. Then
 //  - provide the shader through setStrings() or setStringsWithLengths()
 //  - optionally call setEnv*(), see below for more detail
@@ -431,40 +447,41 @@
 //
 class TShader {
 public:
-    explicit TShader(EShLanguage);
-    virtual ~TShader();
-    void setStrings(const char* const* s, int n);
-    void setStringsWithLengths(const char* const* s, const int* l, int n);
-    void setStringsWithLengthsAndNames(
+    GLSLANG_EXPORT explicit TShader(EShLanguage);
+    GLSLANG_EXPORT virtual ~TShader();
+    GLSLANG_EXPORT void setStrings(const char* const* s, int n);
+    GLSLANG_EXPORT void setStringsWithLengths(
+        const char* const* s, const int* l, int n);
+    GLSLANG_EXPORT void setStringsWithLengthsAndNames(
         const char* const* s, const int* l, const char* const* names, int n);
     void setPreamble(const char* s) { preamble = s; }
-    void setEntryPoint(const char* entryPoint);
-    void setSourceEntryPoint(const char* sourceEntryPointName);
-    void addProcesses(const std::vector<std::string>&);
+    GLSLANG_EXPORT void setEntryPoint(const char* entryPoint);
+    GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);
+    GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
 
     // IO resolver binding data: see comments in ShaderLang.cpp
-    void setShiftBinding(TResourceType res, unsigned int base);
-    void setShiftSamplerBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
-    void setShiftTextureBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
-    void setShiftImageBinding(unsigned int base);    // DEPRECATED: use setShiftBinding
-    void setShiftUboBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
-    void setShiftUavBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
-    void setShiftCbufferBinding(unsigned int base);  // synonym for setShiftUboBinding
-    void setShiftSsboBinding(unsigned int base);     // DEPRECATED: use setShiftBinding
-    void setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set);
-    void setResourceSetBinding(const std::vector<std::string>& base);
-    void setAutoMapBindings(bool map);
-    void setAutoMapLocations(bool map);
-    void addUniformLocationOverride(const char* name, int loc);
-    void setUniformLocationBase(int base);
-    void setInvertY(bool invert);
+    GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
+    GLSLANG_EXPORT void setShiftSamplerBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftTextureBinding(unsigned int base);  // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftImageBinding(unsigned int base);    // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftUboBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftUavBinding(unsigned int base);      // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftCbufferBinding(unsigned int base);  // synonym for setShiftUboBinding
+    GLSLANG_EXPORT void setShiftSsboBinding(unsigned int base);     // DEPRECATED: use setShiftBinding
+    GLSLANG_EXPORT void setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set);
+    GLSLANG_EXPORT void setResourceSetBinding(const std::vector<std::string>& base);
+    GLSLANG_EXPORT void setAutoMapBindings(bool map);
+    GLSLANG_EXPORT void setAutoMapLocations(bool map);
+    GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc);
+    GLSLANG_EXPORT void setUniformLocationBase(int base);
+    GLSLANG_EXPORT void setInvertY(bool invert);
 #ifdef ENABLE_HLSL
-    void setHlslIoMapping(bool hlslIoMap);
-    void setFlattenUniformArrays(bool flatten);
+    GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap);
+    GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten);
 #endif
-    void setNoStorageFormat(bool useUnknownFormat);
-    void setNanMinMaxClamp(bool nanMinMaxClamp);
-    void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);
+    GLSLANG_EXPORT void setNoStorageFormat(bool useUnknownFormat);
+    GLSLANG_EXPORT void setNanMinMaxClamp(bool nanMinMaxClamp);
+    GLSLANG_EXPORT void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);
 
     // For setting up the environment (cleared to nothingness in the constructor).
     // These must be called so that parsing is done for the right source language and
@@ -604,8 +621,10 @@
         virtual void releaseInclude(IncludeResult*) override { }
     };
 
-    bool parse(const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
-               bool forwardCompatible, EShMessages, Includer&);
+    GLSLANG_EXPORT bool parse(
+        const TBuiltInResource*, int defaultVersion, EProfile defaultProfile,
+        bool forceDefaultVersionAndProfile, bool forwardCompatible,
+        EShMessages, Includer&);
 
     bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
                bool forwardCompatible, EShMessages messages)
@@ -628,13 +647,14 @@
 
     // NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
     // is not an officially supported or fully working path.
-    bool preprocess(const TBuiltInResource* builtInResources,
-                    int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
-                    bool forwardCompatible, EShMessages message, std::string* outputString,
-                    Includer& includer);
+    GLSLANG_EXPORT bool preprocess(
+        const TBuiltInResource* builtInResources, int defaultVersion,
+        EProfile defaultProfile, bool forceDefaultVersionAndProfile,
+        bool forwardCompatible, EShMessages message, std::string* outputString,
+        Includer& includer);
 
-    const char* getInfoLog();
-    const char* getInfoDebugLog();
+    GLSLANG_EXPORT const char* getInfoLog();
+    GLSLANG_EXPORT const char* getInfoDebugLog();
     EShLanguage getStage() const { return stage; }
     TIntermediate* getIntermediate() const { return intermediate; }
 
@@ -670,7 +690,7 @@
     TShader& operator=(TShader&);
 };
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 //
 // A reflection database and its interface, consistent with the OpenGL API reflection queries.
@@ -679,11 +699,11 @@
 // Data needed for just a single object at the granularity exchanged by the reflection API
 class TObjectReflection {
 public:
-    TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex);
+    GLSLANG_EXPORT TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex);
 
-    const TType* getType() const { return type; }
-    int getBinding() const;
-    void dump() const;
+    GLSLANG_EXPORT const TType* getType() const { return type; }
+    GLSLANG_EXPORT int getBinding() const;
+    GLSLANG_EXPORT void dump() const;
     static TObjectReflection badReflection() { return TObjectReflection(); }
 
     std::string name;
@@ -694,6 +714,7 @@
     int counterIndex;
     int numMembers;
     int arrayStride;            // stride of an array variable
+    int topLevelArraySize;      // size of the top-level variable in a storage buffer member
     int topLevelArrayStride;    // stride of the top-level variable in a storage buffer member
     EShLanguageMask stages;
 
@@ -787,7 +808,7 @@
     virtual void addStage(EShLanguage stage) = 0;
 };
 
-#endif // GLSLANG_WEB
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
 // Make one TProgram per set of shaders that will get linked together.  Add all
 // the shaders that are to be linked together.  After calling shader.parse()
@@ -797,40 +818,40 @@
 //
 class TProgram {
 public:
-    TProgram();
-    virtual ~TProgram();
+    GLSLANG_EXPORT TProgram();
+    GLSLANG_EXPORT virtual ~TProgram();
     void addShader(TShader* shader) { stages[shader->stage].push_back(shader); }
     std::list<TShader*>& getShaders(EShLanguage stage) { return stages[stage]; }
     // Link Validation interface
-    bool link(EShMessages);
-    const char* getInfoLog();
-    const char* getInfoDebugLog();
+    GLSLANG_EXPORT bool link(EShMessages);
+    GLSLANG_EXPORT const char* getInfoLog();
+    GLSLANG_EXPORT const char* getInfoDebugLog();
 
     TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
     // Reflection Interface
 
     // call first, to do liveness analysis, index mapping, etc.; returns false on failure
-    bool buildReflection(int opts = EShReflectionDefault);
-    unsigned getLocalSize(int dim) const;                  // return dim'th local size
-    int getReflectionIndex(const char *name) const;
-    int getReflectionPipeIOIndex(const char* name, const bool inOrOut) const;
-    int getNumUniformVariables() const;
-    const TObjectReflection& getUniform(int index) const;
-    int getNumUniformBlocks() const;
-    const TObjectReflection& getUniformBlock(int index) const;
-    int getNumPipeInputs() const;
-    const TObjectReflection& getPipeInput(int index) const;
-    int getNumPipeOutputs() const;
-    const TObjectReflection& getPipeOutput(int index) const;
-    int getNumBufferVariables() const;
-    const TObjectReflection& getBufferVariable(int index) const;
-    int getNumBufferBlocks() const;
-    const TObjectReflection& getBufferBlock(int index) const;
-    int getNumAtomicCounters() const;
-    const TObjectReflection& getAtomicCounter(int index) const;
+    GLSLANG_EXPORT bool buildReflection(int opts = EShReflectionDefault);
+    GLSLANG_EXPORT unsigned getLocalSize(int dim) const;                  // return dim'th local size
+    GLSLANG_EXPORT int getReflectionIndex(const char *name) const;
+    GLSLANG_EXPORT int getReflectionPipeIOIndex(const char* name, const bool inOrOut) const;
+    GLSLANG_EXPORT int getNumUniformVariables() const;
+    GLSLANG_EXPORT const TObjectReflection& getUniform(int index) const;
+    GLSLANG_EXPORT int getNumUniformBlocks() const;
+    GLSLANG_EXPORT const TObjectReflection& getUniformBlock(int index) const;
+    GLSLANG_EXPORT int getNumPipeInputs() const;
+    GLSLANG_EXPORT const TObjectReflection& getPipeInput(int index) const;
+    GLSLANG_EXPORT int getNumPipeOutputs() const;
+    GLSLANG_EXPORT const TObjectReflection& getPipeOutput(int index) const;
+    GLSLANG_EXPORT int getNumBufferVariables() const;
+    GLSLANG_EXPORT const TObjectReflection& getBufferVariable(int index) const;
+    GLSLANG_EXPORT int getNumBufferBlocks() const;
+    GLSLANG_EXPORT const TObjectReflection& getBufferBlock(int index) const;
+    GLSLANG_EXPORT int getNumAtomicCounters() const;
+    GLSLANG_EXPORT const TObjectReflection& getAtomicCounter(int index) const;
 
     // Legacy Reflection Interface - expressed in terms of above interface
 
@@ -897,22 +918,22 @@
     // returns a TType*
     const TType *getAttributeTType(int index) const    { return getPipeInput(index).getType(); }
 
-    void dumpReflection();
+    GLSLANG_EXPORT void dumpReflection();
     // I/O mapping: apply base offsets and map live unbound variables
     // If resolver is not provided it uses the previous approach
     // and respects auto assignment and offsets.
-    bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr);
-#endif
+    GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr);
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
 protected:
-    bool linkStage(EShLanguage, EShMessages);
+    GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages);
 
     TPoolAllocator* pool;
     std::list<TShader*> stages[EShLangCount];
     TIntermediate* intermediate[EShLangCount];
     bool newedIntermediate[EShLangCount];      // track which intermediate were "new" versus reusing a singleton unit in a stage
     TInfoSink* infoSink;
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     TReflection* reflection;
 #endif
     bool linked;
diff --git a/glslang/updateGrammar b/glslang/updateGrammar
index 9384db9..9209493 100755
--- a/glslang/updateGrammar
+++ b/glslang/updateGrammar
@@ -1,5 +1,38 @@
 #!/bin/bash
 
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 if [ "$1" = 'web' ]
 then
     m4 -P -DGLSLANG_WEB MachineIndependent/glslang.m4 > MachineIndependent/glslang.y
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index 5004671..dc7fea3 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -59,7 +59,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileToAstTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "sample.frag",
@@ -234,6 +234,9 @@
         "maxClipDistances.vert",
         "findFunction.frag",
         "constantUnaryConversion.comp",
+        "xfbUnsizedArray.error.vert",
+        "glsl.140.layoutOffset.error.vert",
+        "glsl.430.layoutOffset.error.vert",
         "glsl.450.subgroup.frag",
         "glsl.450.subgroup.geom",
         "glsl.450.subgroup.tesc",
@@ -258,6 +261,7 @@
         "glsl.460.subgroup.rgen",
         "glsl.460.subgroup.rint",
         "glsl.460.subgroup.rmiss",
+        "glsl.es300.layoutOffset.error.vert",
         "glsl.es320.subgroup.frag",
         "glsl.es320.subgroup.geom",
         "glsl.es320.subgroup.tesc",
@@ -274,17 +278,20 @@
         "glsl.es320.subgroupShuffleRelative.comp",
         "glsl.es320.subgroupQuad.comp",
         "glsl.es320.subgroupVote.comp",
+        "terminate.frag",
+        "terminate.vert",
     })),
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileToAstTestNV,
     ::testing::ValuesIn(std::vector<std::string>({
         "nvShaderNoperspectiveInterpolation.frag",
     })),
     FileNameAsCustomTestSuffix
 );
+
 // clang-format on
 
 }  // anonymous namespace
diff --git a/gtests/CMakeLists.txt b/gtests/CMakeLists.txt
index dc53f5c..0617ff8 100644
--- a/gtests/CMakeLists.txt
+++ b/gtests/CMakeLists.txt
@@ -1,3 +1,36 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 if(BUILD_TESTING)
     if(TARGET gmock)
         message(STATUS "Google Mock found - building tests")
@@ -27,9 +60,9 @@
                 ${CMAKE_CURRENT_SOURCE_DIR}/Remap.FromFile.cpp)
         endif()
 
-        glslang_pch(TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/pch.cpp)
 
         add_executable(glslangtests ${TEST_SOURCES})
+        glslang_pch(glslangtests ${CMAKE_CURRENT_SOURCE_DIR}/pch.h)
         set_property(TARGET glslangtests PROPERTY FOLDER tests)
         glslang_set_link_args(glslangtests)
         if(ENABLE_GLSLANG_INSTALL)
@@ -50,6 +83,12 @@
                                    ${gmock_SOURCE_DIR}/include
                                    ${gtest_SOURCE_DIR}/include)
 
+        if(ENABLE_OPT)
+            target_include_directories(glslangtests
+                PRIVATE ${spirv-tools_SOURCE_DIR}/include
+            )
+        endif(ENABLE_OPT)
+
         set(LIBRARIES
             glslang OSDependent OGLCompiler glslang
             SPIRV glslang-default-resource-limits)
diff --git a/gtests/Config.FromFile.cpp b/gtests/Config.FromFile.cpp
index d6fbf20..dd18c13 100644
--- a/gtests/Config.FromFile.cpp
+++ b/gtests/Config.FromFile.cpp
@@ -95,7 +95,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, ConfigTest,
     ::testing::ValuesIn(std::vector<TestCaseSpec>({
         {"specExamples.vert", "baseResults/test.conf", "specExamplesConf.vert.out", (EShMessages)(EShMsgAST | EShMsgCascadingErrors)},
diff --git a/gtests/HexFloat.cpp b/gtests/HexFloat.cpp
index ead4fd3..0a11d96 100644
--- a/gtests/HexFloat.cpp
+++ b/gtests/HexFloat.cpp
@@ -77,7 +77,7 @@
   EXPECT_THAT(Decode<double>(GetParam().second), Eq(GetParam().first));
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float32Tests, HexFloatTest,
     ::testing::ValuesIn(std::vector<std::pair<FloatProxy<float>, std::string>>({
         {0.f, "0x0p+0"},
@@ -129,7 +129,7 @@
 
     })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float32NanTests, HexFloatTest,
     ::testing::ValuesIn(std::vector<std::pair<FloatProxy<float>, std::string>>({
         // Various NAN and INF cases
@@ -147,7 +147,7 @@
         {uint32_t(0x7FFFFFFF), "0x1.fffffep+128"},   // +nan
     })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float64Tests, HexDoubleTest,
     ::testing::ValuesIn(
         std::vector<std::pair<FloatProxy<double>, std::string>>({
@@ -220,7 +220,7 @@
 
         })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float64NanTests, HexDoubleTest,
     ::testing::ValuesIn(std::vector<
                         std::pair<FloatProxy<double>, std::string>>({
@@ -262,7 +262,7 @@
   EXPECT_THAT(Decode<double>(GetParam().first), Eq(GetParam().second));
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float32DecodeTests, DecodeHexFloatTest,
     ::testing::ValuesIn(std::vector<std::pair<std::string, FloatProxy<float>>>({
         {"0x0p+000", 0.f},
@@ -284,7 +284,7 @@
         {"0x0.4p+0", 0.25f},
     })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float32DecodeInfTests, DecodeHexFloatTest,
     ::testing::ValuesIn(std::vector<std::pair<std::string, FloatProxy<float>>>({
         // inf cases
@@ -294,7 +294,7 @@
         {"-0x32p+127", uint32_t(0xFF800000)},  // -inf
     })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float64DecodeTests, DecodeHexDoubleTest,
     ::testing::ValuesIn(
         std::vector<std::pair<std::string, FloatProxy<double>>>({
@@ -317,7 +317,7 @@
             {"0x0.4p+0", 0.25},
         })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float64DecodeInfTests, DecodeHexDoubleTest,
     ::testing::ValuesIn(
         std::vector<std::pair<std::string, FloatProxy<double>>>({
@@ -465,7 +465,7 @@
       Eq(GetParam().second));
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float32Tests, FloatProxyFloatTest,
     ::testing::ValuesIn(std::vector<std::pair<FloatProxy<float>, std::string>>({
         // Zero
@@ -497,7 +497,7 @@
         {-std::numeric_limits<float>::infinity(), "-0x1p+128"},
     })));
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float64Tests, FloatProxyDoubleTest,
     ::testing::ValuesIn(
         std::vector<std::pair<FloatProxy<double>, std::string>>({
@@ -747,7 +747,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(F32ToF16, HexFloatRoundTest,
+INSTANTIATE_TEST_SUITE_P(F32ToF16, HexFloatRoundTest,
   ::testing::ValuesIn(std::vector<RoundSignificandCase>(
   {
     {float_fractions({0}), std::make_pair(half_bits_set({}), false), spvutils::kRoundToZero},
@@ -828,7 +828,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(F16toF32, HexFloatRoundUpSignificandTest,
+INSTANTIATE_TEST_SUITE_P(F16toF32, HexFloatRoundUpSignificandTest,
   // 0xFC00 of the source 16-bit hex value cover the sign and the exponent.
   // They are ignored for this test.
   ::testing::ValuesIn(std::vector<UpCastSignificandCase>(
@@ -879,7 +879,7 @@
 const uint16_t positive_infinity = 0x7C00;
 const uint16_t negative_infinity = 0xFC00;
 
-INSTANTIATE_TEST_CASE_P(F32ToF16, HexFloatFP32To16Tests,
+INSTANTIATE_TEST_SUITE_P(F32ToF16, HexFloatFP32To16Tests,
   ::testing::ValuesIn(std::vector<DownCastTest>(
   {
     // Exactly representable as half.
@@ -944,7 +944,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(F16ToF32, HexFloatFP16To32Tests,
+INSTANTIATE_TEST_SUITE_P(F16ToF32, HexFloatFP16To32Tests,
   ::testing::ValuesIn(std::vector<UpCastCase>(
   {
     {0x0000, 0.f},
@@ -1039,7 +1039,7 @@
   return FloatParseCase<T>{literal, negate_value, true, proxy_expected_value};
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     FloatParse, ParseNormalFloatTest,
     ::testing::ValuesIn(std::vector<FloatParseCase<float>>{
         // Failing cases due to trivially incorrect syntax.
@@ -1090,7 +1090,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float16Parse, ParseNormalFloat16Test,
     ::testing::ValuesIn(std::vector<FloatParseCase<Float16>>{
         // Failing cases due to trivially incorrect syntax.
@@ -1137,7 +1137,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     FloatOverflow, FloatProxyParseOverflowFloatTest,
     ::testing::ValuesIn(std::vector<OverflowParseCase<float>>({
         {"0", true, 0.0f},
@@ -1164,7 +1164,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     DoubleOverflow, FloatProxyParseOverflowDoubleTest,
     ::testing::ValuesIn(std::vector<OverflowParseCase<double>>({
         {"0", true, 0.0},
@@ -1193,7 +1193,7 @@
   }
 }
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Float16Overflow, FloatProxyParseOverflowFloat16Test,
     ::testing::ValuesIn(std::vector<OverflowParseCase<uint16_t>>({
         {"0", true, uint16_t{0}},
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
old mode 100755
new mode 100644
index f483536..de071b9
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -129,7 +129,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslCompileTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.amend.frag", "f1"},
@@ -227,6 +227,7 @@
         {"hlsl.hull.3.tesc", "main"},
         {"hlsl.hull.4.tesc", "main"},
         {"hlsl.hull.5.tesc", "main"},
+        {"hlsl.hull.6.tesc", "main"},
         {"hlsl.hull.void.tesc", "main"},
         {"hlsl.hull.ctrlpt-1.tesc", "main"},
         {"hlsl.hull.ctrlpt-2.tesc", "main"},
@@ -238,6 +239,7 @@
         {"hlsl.implicitBool.frag", "main"},
         {"hlsl.inf.vert", "main"},
         {"hlsl.inoutquals.frag", "main"},
+        {"hlsl.inoutquals.negative.frag", "main"},
         {"hlsl.init.frag", "ShaderFunction"},
         {"hlsl.init2.frag", "main"},
         {"hlsl.isfinite.frag", "main"},
@@ -277,6 +279,7 @@
         {"hlsl.logical.unary.frag", "main"},
         {"hlsl.loopattr.frag", "main"},
         {"hlsl.matpack-pragma.frag", "main"},
+        {"hlsl.matpack-pragma-global.frag", "main"},
         {"hlsl.mip.operator.frag", "main"},
         {"hlsl.mip.negative.frag", "main"},
         {"hlsl.mip.negative2.frag", "main"},
@@ -305,10 +308,12 @@
         {"hlsl.pp.vert", "main"},
         {"hlsl.pp.line.frag", "main"},
         {"hlsl.precise.frag", "main"},
+        {"hlsl.printf.comp", "main"},
         {"hlsl.promote.atomic.frag", "main"},
         {"hlsl.promote.binary.frag", "main"},
         {"hlsl.promote.vec1.frag", "main"},
         {"hlsl.promotions.frag", "main"},
+        {"hlsl.round.dx10.frag", "main"},
         {"hlsl.rw.atomics.frag", "main"},
         {"hlsl.rw.bracket.frag", "main"},
         {"hlsl.rw.register.frag", "main"},
@@ -427,7 +432,7 @@
 // clang-format on
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslVulkan1_1CompileTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.wavebroadcast.comp", "CSMain"},
@@ -445,7 +450,7 @@
 // clang-format on
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslCompileAndFlattenTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.array.flatten.frag", "main"},
@@ -457,7 +462,7 @@
 
 #if ENABLE_OPT
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslLegalizeTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.aliasOpaque.frag", "main"},
@@ -475,7 +480,7 @@
 #endif
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslDebugTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.pp.line2.frag", "MainPs"}
@@ -483,9 +488,10 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslDX9CompatibleTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
+        {"hlsl.round.dx9.frag", "main"},
         {"hlsl.sample.dx9.frag", "main"},
         {"hlsl.sample.dx9.vert", "main"},
     }),
@@ -493,7 +499,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, HlslLegalDebugTest,
     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
         {"hlsl.pp.line4.frag", "MainPs"}
diff --git a/gtests/Link.FromFile.Vk.cpp b/gtests/Link.FromFile.Vk.cpp
old mode 100755
new mode 100644
index a43edcf..2909a9c
--- a/gtests/Link.FromFile.Vk.cpp
+++ b/gtests/Link.FromFile.Vk.cpp
@@ -75,6 +75,11 @@
     result.linkingOutput = program.getInfoLog();
     result.linkingError = program.getInfoDebugLog();
 
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+        if (success)
+            program.mapIO();
+#endif
+
     if (success && (controls & EShMsgSpvRules)) {
         spv::SpvBuildLogger logger;
         std::vector<uint32_t> spirv_binary;
@@ -104,7 +109,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, LinkTestVulkan,
     ::testing::ValuesIn(std::vector<std::vector<std::string>>({
         {"link1.vk.frag", "link2.vk.frag"},
diff --git a/gtests/Link.FromFile.cpp b/gtests/Link.FromFile.cpp
old mode 100755
new mode 100644
index dc9bb76..29590c0
--- a/gtests/Link.FromFile.cpp
+++ b/gtests/Link.FromFile.cpp
@@ -86,7 +86,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, LinkTest,
     ::testing::ValuesIn(std::vector<std::vector<std::string>>({
         {"mains1.frag", "mains2.frag", "noMain1.geom", "noMain2.geom"},
@@ -99,6 +99,7 @@
         {"empty.frag", "empty2.frag", "empty3.frag"},
         {"150.tesc", "150.tese", "400.tesc", "400.tese", "410.tesc", "420.tesc", "420.tese"},
         {"max_vertices_0.geom"},
+        {"contradict_0.geom", "contradict_1.geom"},
         {"es-link1.frag", "es-link2.frag"},
         {"missingBodies.vert"},
         {"link.multiAnonBlocksInvalid.0.0.vert", "link.multiAnonBlocksInvalid.0.1.vert"},
diff --git a/gtests/Pp.FromFile.cpp b/gtests/Pp.FromFile.cpp
index 1bea877..92b4d24 100644
--- a/gtests/Pp.FromFile.cpp
+++ b/gtests/Pp.FromFile.cpp
@@ -47,7 +47,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, PreprocessingTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "preprocessor.bad_arg.vert",
diff --git a/gtests/Remap.FromFile.cpp b/gtests/Remap.FromFile.cpp
index 50bce8e..f014253 100644
--- a/gtests/Remap.FromFile.cpp
+++ b/gtests/Remap.FromFile.cpp
@@ -80,7 +80,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     ToSpirv, RemapTest,
     ::testing::ValuesIn(std::vector<RemapTestArgs>{
             // GLSL remapper tests
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 1d061fb..2ee292e 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -1,6 +1,7 @@
  //
 // Copyright (C) 2016 Google, Inc.
 // Copyright (C) 2019 ARM Limited.
+// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
 //
 // All rights reserved.
 //
@@ -213,7 +214,7 @@
 }
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         // Test looping constructs.
@@ -238,6 +239,9 @@
         "rayQuery-committed.Error.rgen",
         "rayQuery-allOps.comp",
         "rayQuery-allOps.frag",
+        "rayQuery-initialization.Error.comp",
+        "rayQuery-global.rgen",
+        "rayQuery-types.comp",
         "spv.set.vert",
         "spv.double.comp",
         "spv.100ops.frag",
@@ -329,20 +333,6 @@
         "spv.earlyReturnDiscard.frag",
         "spv.extPostDepthCoverage.frag",
         "spv.extPostDepthCoverage_Error.frag",
-        "spv.ext.AnyHitShader.rahit",
-        "spv.ext.AnyHitShader_Errors.rahit",
-        "spv.ext.ClosestHitShader.rchit",
-        "spv.ext.ClosestHitShader_Errors.rchit",
-        "spv.ext.IntersectShader.rint",
-        "spv.ext.IntersectShader_Errors.rint",
-        "spv.ext.MissShader.rmiss",
-        "spv.ext.MissShader_Errors.rmiss",
-        "spv.ext.RayCallable.rcall",
-        "spv.ext.RayCallable_Errors.rcall",
-        "spv.ext.RayConstants.rgen",
-        "spv.ext.RayGenShader.rgen",
-        "spv.ext.RayGenShader11.rgen",
-        "spv.ext.RayGenShaderArray.rgen",
         "spv.float16convertonlyarith.comp",
         "spv.float16convertonlystorage.comp",
         "spv.flowControl.frag",
@@ -364,6 +354,7 @@
         "spv.int64.frag",
         "spv.intcoopmat.comp",
         "spv.intOps.vert",
+        "spv.layer.tese",
         "spv.layoutNested.vert",
         "spv.length.frag",
         "spv.localAggregates.frag",
@@ -385,11 +376,15 @@
         "spv.nonuniform4.frag",
         "spv.nonuniform5.frag",
         "spv.noWorkgroup.comp",
+        "spv.nullInit.comp",
         "spv.offsets.frag",
         "spv.Operations.frag",
         "spv.paramMemory.frag",
+        "spv.paramMemory.420.frag",
         "spv.precision.frag",
+        "spv.precisionArgs.frag",
         "spv.precisionNonESSamp.frag",
+        "spv.precisionTexture.frag",
         "spv.prepost.frag",
         "spv.privateVariableTypes.frag",
         "spv.qualifiers.vert",
@@ -420,6 +415,7 @@
         "spv.texture.vert",
         "spv.textureBuffer.vert",
         "spv.image.frag",
+        "spv.imageAtomic64.frag",
         "spv.types.frag",
         "spv.uint.frag",
         "spv.uniformArray.frag",
@@ -440,9 +436,14 @@
         "spv.specConstant.comp",
         "spv.specConstantComposite.vert",
         "spv.specConstantOperations.vert",
+        "spv.specConstant.float16.comp",
+        "spv.specConstant.int16.comp",
+        "spv.specConstant.int8.comp",
         "spv.storageBuffer.vert",
+        "spv.terminate.frag",
         "spv.precise.tese",
         "spv.precise.tesc",
+        "spv.viewportindex.tese",
         "spv.volatileAtomic.comp",
         "spv.vulkan100.subgroupArithmetic.comp",
         "spv.vulkan100.subgroupPartitioned.comp",
@@ -452,6 +453,8 @@
         "spv.samplerlessTextureFunctions.frag",
         "spv.smBuiltins.vert",
         "spv.smBuiltins.frag",
+        "spv.builtin.PrimitiveShadingRateEXT.vert",
+        "spv.builtin.ShadingRateEXT.frag",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -459,7 +462,7 @@
 // Cases with deliberately unreachable code.
 // By default the compiler will aggressively eliminate
 // unreachable merges and continues.
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     GlslWithDeadCode, CompileVulkanToSpirvDeadCodeElimTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.dead-after-continue.vert",
@@ -474,7 +477,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToDebugSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.pp.line.frag",
@@ -483,7 +486,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkan1_1ToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.1.3.8bitstorage-ubo.vert",
@@ -500,6 +503,7 @@
         "spv.memoryScopeSemantics.comp",
         "spv.memoryScopeSemantics_Error.comp",
         "spv.multiView.frag",
+        "spv.queueFamilyScope.comp",
         "spv.RayGenShader11.rgen",
         "spv.subgroup.frag",
         "spv.subgroup.geom",
@@ -539,12 +543,13 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileToSpirv14Test,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.1.4.LoopControl.frag",
         "spv.1.4.NonWritable.frag",
         "spv.1.4.OpEntryPoint.frag",
+        "spv.1.4.OpEntryPoint.opaqueParams.vert",
         "spv.1.4.OpSelect.frag",
         "spv.1.4.OpCopyLogical.comp",
         "spv.1.4.OpCopyLogicalBool.comp",
@@ -553,12 +558,47 @@
         "spv.1.4.sparseTexture.frag",
         "spv.1.4.texture.frag",
         "spv.1.4.constructComposite.comp",
+        "spv.ext.AnyHitShader.rahit",
+        "spv.ext.AnyHitShader_Errors.rahit",
+        "spv.ext.ClosestHitShader.rchit",
+        "spv.ext.ClosestHitShader_Subgroup.rchit",
+        "spv.ext.ClosestHitShader_Errors.rchit",
+        "spv.ext.IntersectShader.rint",
+        "spv.ext.IntersectShader_Errors.rint",
+        "spv.ext.MissShader.rmiss",
+        "spv.ext.MissShader_Errors.rmiss",
+        "spv.ext.RayPrimCull_Errors.rgen",
+        "spv.ext.RayCallable.rcall",
+        "spv.ext.RayCallable_Errors.rcall",
+        "spv.ext.RayConstants.rgen",
+        "spv.ext.RayGenShader.rgen",
+        "spv.ext.RayGenShader_Errors.rgen",
+        "spv.ext.RayGenShader11.rgen",
+        "spv.ext.RayGenShaderArray.rgen",
+        "spv.ext.RayGenSBTlayout.rgen",
+        "spv.ext.RayGenSBTlayout140.rgen",
+        "spv.ext.RayGenSBTlayout430.rgen",
+        "spv.ext.RayGenSBTlayoutscalar.rgen",
+        "spv.ext.World3x4.rahit",
+        "spv.ext.AccelDecl.frag",
+        "spv.ext.RayQueryDecl.frag",
+
+        // SPV_KHR_workgroup_memory_explicit_layout depends on SPIR-V 1.4.
+        "spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp",
+        "spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp",
+        "spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp",
+        "spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp",
+        "spv.WorkgroupMemoryExplicitLayout.NonBlock.comp",
+        "spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp",
+        "spv.WorkgroupMemoryExplicitLayout.std140.comp",
+        "spv.WorkgroupMemoryExplicitLayout.std430.comp",
+        "spv.WorkgroupMemoryExplicitLayout.scalar.comp",
     })),
     FileNameAsCustomTestSuffix
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Hlsl, HlslIoMap,
     ::testing::ValuesIn(std::vector<IoMapData>{
         { "spv.register.autoassign.frag", "main_ep", 5, 10, 0, 20, 30, true, false },
@@ -578,7 +618,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Hlsl, GlslIoMap,
     ::testing::ValuesIn(std::vector<IoMapData>{
         { "spv.glsl.register.autoassign.frag", "main", 5, 10, 0, 20, 30, true, false },
@@ -588,18 +628,23 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileOpenGLToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.460.frag",
         "spv.460.vert",
         "spv.460.comp",
         "spv.atomic.comp",
+        "spv.atomicFloat.comp",
+        "spv.atomicFloat_Error.comp",
         "spv.glFragColor.frag",
         "spv.rankShift.comp",
         "spv.specConst.vert",
         "spv.specTexture.frag",
         "spv.OVR_multiview.vert",
+        "spv.uniformInitializer.frag",
+        "spv.uniformInitializerSpecConstant.frag",
+        "spv.uniformInitializerStruct.frag",
         "spv.xfbOffsetOnBlockMembersAssignment.vert",
         "spv.xfbOffsetOnStructMembersAssignment.vert",
         "spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
@@ -608,7 +653,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, VulkanSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "vulkan.frag",
@@ -620,7 +665,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, OpenGLSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "glspv.esversion.vert",
@@ -632,7 +677,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, VulkanAstSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "vulkan.ast.vert",
@@ -640,7 +685,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToSpirvTestAMD,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.16bitxfb.vert",
@@ -656,7 +701,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToSpirvTestNV,
     ::testing::ValuesIn(std::vector<std::string>({
     "spv.sampleMaskOverrideCoverage.frag",
@@ -704,7 +749,7 @@
 FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
     ::testing::ValuesIn(std::vector<std::string>({
       "spv.texture.sampler.transform.frag",
diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h
old mode 100755
new mode 100644
index 8d2ebd9..2b057dc
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -253,10 +253,13 @@
         glslang::TProgram program;
         program.addShader(&shader);
         success &= program.link(controls);
-
-        spv::SpvBuildLogger logger;
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+        if (success)
+            program.mapIO();
+#endif
 
         if (success && (controls & EShMsgSpvRules)) {
+            spv::SpvBuildLogger logger;
             std::vector<uint32_t> spirv_binary;
             options().disableOptimizer = !enableOptimizer;
             options().generateDebugInfo = enableDebug;
@@ -312,8 +315,9 @@
         program.addShader(&shader);
         
         success &= program.link(controls);
-#ifndef GLSLANG_WEB
-        success &= program.mapIO();
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+        if (success)
+            program.mapIO();
 #endif
 
         spv::SpvBuildLogger logger;
@@ -356,10 +360,13 @@
         glslang::TProgram program;
         program.addShader(&shader);
         success &= program.link(controls);
-
-        spv::SpvBuildLogger logger;
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+        if (success)
+            program.mapIO();
+#endif
 
         if (success && (controls & EShMsgSpvRules)) {
+        spv::SpvBuildLogger logger;
             std::vector<uint32_t> spirv_binary;
             glslang::GlslangToSpv(*program.getIntermediate(stage),
                                   spirv_binary, &logger, &options());
diff --git a/gtests/pch.cpp b/gtests/pch.cpp
deleted file mode 100644
index b7a0865..0000000
--- a/gtests/pch.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (C) 2018 The Khronos Group Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//    Redistributions of source code must retain the above copyright
-//    notice, this list of conditions and the following disclaimer.
-//
-//    Redistributions in binary form must reproduce the above
-//    copyright notice, this list of conditions and the following
-//    disclaimer in the documentation and/or other materials provided
-//    with the distribution.
-//
-//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
-//    contributors may be used to endorse or promote products derived
-//    from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-
-#include "pch.h"
diff --git a/hlsl/CMakeLists.txt b/hlsl/CMakeLists.txt
index ae0d4d4..62faa19 100644
--- a/hlsl/CMakeLists.txt
+++ b/hlsl/CMakeLists.txt
@@ -1,25 +1,43 @@
-set(SOURCES
-    hlslAttributes.cpp
-    hlslParseHelper.cpp
-    hlslScanContext.cpp
-    hlslOpMap.cpp
-    hlslTokenStream.cpp
-    hlslGrammar.cpp
-    hlslParseables.cpp)
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
 
-set(HEADERS
-    hlslAttributes.h
-    hlslParseHelper.h
-    hlslTokens.h
-    hlslScanContext.h
-    hlslOpMap.h
-    hlslTokenStream.h
-    hlslGrammar.h
-    hlslParseables.h)
+# The HLSL source is directly embedded into the glslang target when ENABLE_HLSL
+# is set.
+# This source now lives at: glslang/HLSL/
+# The HLSL target is now just a stub that exists for backwards compatibility for
+# projects that referenced this target.
 
-glslang_pch(SOURCES pch.cpp)
-
-add_library(HLSL ${LIB_TYPE} ${SOURCES} ${HEADERS})
+add_library(HLSL ${LIB_TYPE} "stub.cpp")
 set_property(TARGET HLSL PROPERTY FOLDER hlsl)
 set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON)
 
@@ -27,10 +45,6 @@
     set_target_properties(HLSL PROPERTIES PREFIX "")
 endif()
 
-if(WIN32)
-    source_group("Source" FILES ${SOURCES} ${HEADERS})
-endif(WIN32)
-
 if(ENABLE_GLSLANG_INSTALL)
     if(BUILD_SHARED_LIBS)
         install(TARGETS HLSL EXPORT HLSLTargets
diff --git a/hlsl/pch.cpp b/hlsl/stub.cpp
similarity index 77%
rename from hlsl/pch.cpp
rename to hlsl/stub.cpp
index b7a0865..f1d39c1 100644
--- a/hlsl/pch.cpp
+++ b/hlsl/stub.cpp
@@ -1,5 +1,6 @@
 //
-// Copyright (C) 2018 The Khronos Group Inc.
+// Copyright (C) 2020 Google, Inc.
+//
 // All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
@@ -14,7 +15,7 @@
 //    disclaimer in the documentation and/or other materials provided
 //    with the distribution.
 //
-//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
+//    Neither the name of Google, Inc., nor the names of its
 //    contributors may be used to endorse or promote products derived
 //    from this software without specific prior written permission.
 //
@@ -32,4 +33,9 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
-#include "pch.h"
+// The HLSL source is directly embedded into the glslang target when ENABLE_HLSL
+// is set.
+// This source now lives at: glslang/HLSL/
+// The HLSL target is now just a stub that exists for backwards compatibility
+// for projects that referenced this target. As a target requires at least one
+// source file to build, this file acts as that stub.
diff --git a/known_good.json b/known_good.json
index 9cc8c44..9010538 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "fd8e130510a6b002b28eee5885a9505040a9bdc9"
+      "commit" : "b812fd634ea5ff307c374fb2b6340169f7db8b16"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "f8bf11a0253a32375c32cad92c841237b96696c0"
+      "commit" : "faa570afbc91ac73d594d787486bcf8f2df1ace0"
     }
   ]
 }
diff --git a/kokoro/android-ndk-build/build-docker.sh b/kokoro/android-ndk-build/build-docker.sh
new file mode 100755
index 0000000..2b23b27
--- /dev/null
+++ b/kokoro/android-ndk-build/build-docker.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+. /bin/using.sh # Declare the bash `using` function for configuring toolchains.
+
+set -x # Display commands being run.
+
+using ndk-r21d
+
+export NDK_PROJECT_PATH="${ROOT_DIR}/ndk_test"
+export APP_BUILD_SCRIPT="${ROOT_DIR}/ndk_test/Android.mk"
+
+echo "Building..."
+ndk-build -j
diff --git a/kokoro/android-ndk-build/build.sh b/kokoro/android-ndk-build/build.sh
new file mode 100755
index 0000000..5924f33
--- /dev/null
+++ b/kokoro/android-ndk-build/build.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )"
+
+docker run --rm -i \
+  --volume "${ROOT_DIR}:${ROOT_DIR}" \
+  --workdir "${ROOT_DIR}" \
+  --env ROOT_DIR="${ROOT_DIR}" \
+  --env SCRIPT_DIR="${SCRIPT_DIR}" \
+  --entrypoint "${SCRIPT_DIR}/build-docker.sh" \
+  "gcr.io/shaderc-build/radial-build:latest"
diff --git a/kokoro/android-ndk-build/continuous.cfg b/kokoro/android-ndk-build/continuous.cfg
new file mode 100644
index 0000000..ee0c4fb
--- /dev/null
+++ b/kokoro/android-ndk-build/continuous.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/android-ndk-build/build.sh"
diff --git a/kokoro/android-ndk-build/presubmit.cfg b/kokoro/android-ndk-build/presubmit.cfg
new file mode 100644
index 0000000..16f4fb7
--- /dev/null
+++ b/kokoro/android-ndk-build/presubmit.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/android-ndk-build/build.sh"
diff --git a/kokoro/license-check/build-docker.sh b/kokoro/license-check/build-docker.sh
new file mode 100755
index 0000000..41b0592
--- /dev/null
+++ b/kokoro/license-check/build-docker.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+set -x # Display commands being run.
+
+license-checker --dir="$ROOT_DIR"
diff --git a/kokoro/license-check/build.sh b/kokoro/license-check/build.sh
new file mode 100755
index 0000000..6e9d980
--- /dev/null
+++ b/kokoro/license-check/build.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )"
+
+docker run --rm -i \
+  --volume "${ROOT_DIR}:${ROOT_DIR}:ro" \
+  --workdir "${ROOT_DIR}" \
+  --env ROOT_DIR="${ROOT_DIR}" \
+  --env SCRIPT_DIR="${SCRIPT_DIR}" \
+  --entrypoint "${SCRIPT_DIR}/build-docker.sh" \
+  "gcr.io/shaderc-build/radial-build:latest"
diff --git a/kokoro/license-check/continuous.cfg b/kokoro/license-check/continuous.cfg
new file mode 100644
index 0000000..1f36031
--- /dev/null
+++ b/kokoro/license-check/continuous.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/license-check/build.sh"
diff --git a/kokoro/license-check/presubmit.cfg b/kokoro/license-check/presubmit.cfg
new file mode 100644
index 0000000..4cf9238
--- /dev/null
+++ b/kokoro/license-check/presubmit.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/license-check/build.sh"
diff --git a/kokoro/linux-clang-cmake/build-docker.sh b/kokoro/linux-clang-cmake/build-docker.sh
new file mode 100755
index 0000000..c5fdcd2
--- /dev/null
+++ b/kokoro/linux-clang-cmake/build-docker.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+. /bin/using.sh # Declare the bash `using` function for configuring toolchains.
+
+set -x # Display commands being run.
+
+using cmake-3.17.2
+using clang-10.0.0
+using ninja-1.10.0
+
+echo "Building..."
+mkdir /build && cd /build
+
+cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS
+ninja install
diff --git a/kokoro/linux-clang-cmake/build.sh b/kokoro/linux-clang-cmake/build.sh
new file mode 100755
index 0000000..53d8291
--- /dev/null
+++ b/kokoro/linux-clang-cmake/build.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )"
+
+docker run --rm -i \
+  --volume "${ROOT_DIR}:${ROOT_DIR}:ro" \
+  --workdir "${ROOT_DIR}" \
+  --env ROOT_DIR="${ROOT_DIR}" \
+  --env SCRIPT_DIR="${SCRIPT_DIR}" \
+  --env BUILD_SHARED_LIBS="${BUILD_SHARED_LIBS:-0}" \
+  --entrypoint "${SCRIPT_DIR}/build-docker.sh" \
+  "gcr.io/shaderc-build/radial-build:latest"
diff --git a/kokoro/linux-clang-cmake/shared/continuous.cfg b/kokoro/linux-clang-cmake/shared/continuous.cfg
new file mode 100644
index 0000000..e3de7ac
--- /dev/null
+++ b/kokoro/linux-clang-cmake/shared/continuous.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/linux-clang-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "1"
+}
diff --git a/kokoro/linux-clang-cmake/shared/presubmit.cfg b/kokoro/linux-clang-cmake/shared/presubmit.cfg
new file mode 100644
index 0000000..2d2e320
--- /dev/null
+++ b/kokoro/linux-clang-cmake/shared/presubmit.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/linux-clang-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "1"
+}
diff --git a/kokoro/linux-clang-cmake/static/continuous.cfg b/kokoro/linux-clang-cmake/static/continuous.cfg
new file mode 100644
index 0000000..f8f86c3
--- /dev/null
+++ b/kokoro/linux-clang-cmake/static/continuous.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/linux-clang-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "0"
+}
diff --git a/kokoro/linux-clang-cmake/static/presubmit.cfg b/kokoro/linux-clang-cmake/static/presubmit.cfg
new file mode 100644
index 0000000..9f30ddc
--- /dev/null
+++ b/kokoro/linux-clang-cmake/static/presubmit.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/linux-clang-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "0"
+}
diff --git a/kokoro/linux-clang-gn/build-docker.sh b/kokoro/linux-clang-gn/build-docker.sh
new file mode 100755
index 0000000..1035ab8
--- /dev/null
+++ b/kokoro/linux-clang-gn/build-docker.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+set -x # Display commands being run.
+
+echo "Fetching external projects..."
+./update_glslang_sources.py
+
+echo "Fetching depot_tools..."
+mkdir -p /tmp/depot_tools
+curl https://storage.googleapis.com/chrome-infra/depot_tools.zip -o /tmp/depot_tools.zip
+unzip /tmp/depot_tools.zip -d /tmp/depot_tools
+rm /tmp/depot_tools.zip
+export PATH="/tmp/depot_tools:$PATH"
+
+echo "Syncing client..."
+gclient sync --gclientfile=standalone.gclient
+gn gen out/Default
+
+echo "Building..."
+cd out/Default
+ninja
diff --git a/kokoro/linux-clang-gn/build.sh b/kokoro/linux-clang-gn/build.sh
new file mode 100755
index 0000000..563432a
--- /dev/null
+++ b/kokoro/linux-clang-gn/build.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )"
+
+docker run --rm -i \
+  --volume "${ROOT_DIR}:${ROOT_DIR}" \
+  --workdir "${ROOT_DIR}" \
+  --env ROOT_DIR="${ROOT_DIR}" \
+  --env SCRIPT_DIR="${SCRIPT_DIR}" \
+  --entrypoint "${SCRIPT_DIR}/build-docker.sh" \
+  "gcr.io/shaderc-build/radial-build:latest"
+
+sudo chown -R "$(id -u):$(id -g)" "${ROOT_DIR}"
diff --git a/kokoro/linux-clang-gn/continuous.cfg b/kokoro/linux-clang-gn/continuous.cfg
new file mode 100644
index 0000000..1b19146
--- /dev/null
+++ b/kokoro/linux-clang-gn/continuous.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/linux-clang-gn/build.sh"
diff --git a/kokoro/linux-clang-gn/presubmit.cfg b/kokoro/linux-clang-gn/presubmit.cfg
new file mode 100644
index 0000000..a72b9a8
--- /dev/null
+++ b/kokoro/linux-clang-gn/presubmit.cfg
@@ -0,0 +1,35 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/linux-clang-gn/build.sh"
diff --git a/kokoro/linux-clang-release-bazel/build.sh b/kokoro/linux-clang-release-bazel/build.sh
index f73162f..190e3d7 100644
--- a/kokoro/linux-clang-release-bazel/build.sh
+++ b/kokoro/linux-clang-release-bazel/build.sh
@@ -56,5 +56,5 @@
 echo $(date): Build completed.
 
 echo $(date): Starting bazel test...
-./bazel-0.29.1-linux-x86_64 test :all
+./bazel-0.29.1-linux-x86_64 test :all --test_output=all
 echo $(date): Bazel test completed.
diff --git a/kokoro/linux-gcc-cmake/build-docker.sh b/kokoro/linux-gcc-cmake/build-docker.sh
new file mode 100755
index 0000000..0edc05e
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/build-docker.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+. /bin/using.sh # Declare the bash `using` function for configuring toolchains.
+
+set -x # Display commands being run.
+
+using cmake-3.17.2
+using gcc-9
+using ninja-1.10.0
+
+echo "Building..."
+mkdir /build && cd /build
+
+cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS
+ninja install
diff --git a/kokoro/linux-gcc-cmake/build.sh b/kokoro/linux-gcc-cmake/build.sh
new file mode 100755
index 0000000..53d8291
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/build.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+set -e # Fail on any error.
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )"
+
+docker run --rm -i \
+  --volume "${ROOT_DIR}:${ROOT_DIR}:ro" \
+  --workdir "${ROOT_DIR}" \
+  --env ROOT_DIR="${ROOT_DIR}" \
+  --env SCRIPT_DIR="${SCRIPT_DIR}" \
+  --env BUILD_SHARED_LIBS="${BUILD_SHARED_LIBS:-0}" \
+  --entrypoint "${SCRIPT_DIR}/build-docker.sh" \
+  "gcr.io/shaderc-build/radial-build:latest"
diff --git a/kokoro/linux-gcc-cmake/shared/continuous.cfg b/kokoro/linux-gcc-cmake/shared/continuous.cfg
new file mode 100644
index 0000000..0bbc221
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/shared/continuous.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/linux-gcc-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "1"
+}
diff --git a/kokoro/linux-gcc-cmake/shared/presubmit.cfg b/kokoro/linux-gcc-cmake/shared/presubmit.cfg
new file mode 100644
index 0000000..9f5f03e
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/shared/presubmit.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/linux-gcc-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "1"
+}
diff --git a/kokoro/linux-gcc-cmake/static/continuous.cfg b/kokoro/linux-gcc-cmake/static/continuous.cfg
new file mode 100644
index 0000000..07a9e7e
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/static/continuous.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Continuous build configuration.
+build_file: "glslang/kokoro/linux-gcc-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "0"
+}
diff --git a/kokoro/linux-gcc-cmake/static/presubmit.cfg b/kokoro/linux-gcc-cmake/static/presubmit.cfg
new file mode 100644
index 0000000..cbdf061
--- /dev/null
+++ b/kokoro/linux-gcc-cmake/static/presubmit.cfg
@@ -0,0 +1,40 @@
+# Copyright (C) 2020 Google, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of Google Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Presubmit build configuration.
+build_file: "glslang/kokoro/linux-gcc-cmake/build.sh"
+
+env_vars {
+  key: "BUILD_SHARED_LIBS"
+  value: "0"
+}
diff --git a/kokoro/macos-clang-release-bazel/build.sh b/kokoro/macos-clang-release-bazel/build.sh
index cc51fad..8f1b251 100644
--- a/kokoro/macos-clang-release-bazel/build.sh
+++ b/kokoro/macos-clang-release-bazel/build.sh
@@ -56,5 +56,5 @@
 echo $(date): Build completed.
 
 echo $(date): Starting bazel test...
-./bazel-0.29.1-darwin-x86_64 test :all
+./bazel-0.29.1-darwin-x86_64 test :all --test_output=all
 echo $(date): Bazel test completed.
diff --git a/kokoro/windows-msvc-2015-release-bazel/build.bat b/kokoro/windows-msvc-2015-release-bazel/build.bat
index 1a1557c..fb2009b 100644
--- a/kokoro/windows-msvc-2015-release-bazel/build.bat
+++ b/kokoro/windows-msvc-2015-release-bazel/build.bat
@@ -67,7 +67,7 @@
 :: Run the tests
 :: ##############
 echo "Running Tests... %DATE% %TIME%"
-bazel.exe test :all
+bazel.exe test :all --test_output=all
 if %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL%
 echo "Tests Completed %DATE% %TIME%"
 
diff --git a/license-checker.cfg b/license-checker.cfg
new file mode 100644
index 0000000..409f18e
--- /dev/null
+++ b/license-checker.cfg
@@ -0,0 +1,57 @@
+[

+    {

+        "licenses": [

+            "Apache-2.0",

+            "Apache-2.0-Header",

+            "BSD-2-Clause",

+            "BSD-3-Clause",

+            "MIT-0",

+            "MIT"

+        ],

+        "paths": [

+            {

+                "exclude": [

+                    "**.md",

+

+                    "_config.yml",

+                    ".*",

+                    "CMakeSettings.json",

+                    "known_good_khr.json",

+                    "known_good.json",

+                    "LICENSE.txt",

+                    "make-revision",

+                    "README-spirv-remap.txt",

+                    "WORKSPACE",

+

+                    "glslang/OSDependent/Web/glslang.*.js",

+                    "glslang/MachineIndependent/glslang_tab.cpp",

+                    "glslang/MachineIndependent/glslang_tab.cpp.h",

+

+                    "build/**",

+                    "out/**",

+                    "Test/**",

+                    "External/spirv-tools/**",

+

+                    "SPIRV/GLSL.*.h",

+                    "SPIRV/NonSemanticDebugPrintf.h",

+                    "SPIRV/spirv.hpp"

+                ]

+            }

+        ]

+    },

+    {

+        "licenses": [

+            "GPL-Header",

+            "GPL-3.0-or-later"

+        ],

+        "paths": [

+            { "exclude": [ "**" ] },

+            {

+                "include": [

+                    "glslang/MachineIndependent/glslang_tab.cpp",

+                    "glslang/MachineIndependent/glslang_tab.cpp.h"

+                ]

+            }

+        ]

+    }

+]

diff --git a/make-revision b/make-revision
deleted file mode 100755
index a89ff08..0000000
--- a/make-revision
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-(
-echo "// This header is generated by the make-revision script."
-echo
-echo \#define GLSLANG_PATCH_LEVEL `git log --oneline | wc -l`
-) > glslang/Include/revision.h
diff --git a/ndk_test/jni/Application.mk b/ndk_test/jni/Application.mk
index d7ccd34..07b7615 100644
--- a/ndk_test/jni/Application.mk
+++ b/ndk_test/jni/Application.mk
@@ -1,5 +1,38 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
 APP_ABI := all
 APP_BUILD_SCRIPT := Android.mk
-APP_STL := gnustl_static
+APP_STL := c++_static
 APP_PLATFORM := android-9
 NDK_TOOLCHAIN_VERSION := 4.9
diff --git a/standalone.gclient b/standalone.gclient
new file mode 100644
index 0000000..de067db
--- /dev/null
+++ b/standalone.gclient
@@ -0,0 +1,42 @@
+# Copyright (C) 2020 The Khronos Group Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#    Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#    Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials provided
+#    with the distribution.
+#
+#    Neither the name of The Khronos Group Inc. nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+solutions = [
+  { "name"        : ".",
+    "url"         : "https://github.com/KhronosGroup/glslang",
+    "deps_file"   : "DEPS",
+    "managed"     : False,
+    "custom_deps" : {
+    },
+  },
+]