Merge "[vulkan] glslang - Update Vulkan ecosystem to v1.2.174."
diff --git a/.appveyor.yml b/.appveyor.yml
index 4c5b0da..500d4bd 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -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
diff --git a/.gitattributes b/.gitattributes
old mode 100755
new mode 100644
diff --git a/.gitignore b/.gitignore
index 790b880..ab25cec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,10 @@
 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/BUILD.bazel b/BUILD.bazel
index bfb7797..e8cf6a8 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -53,7 +53,8 @@
     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)",
+    cmd_bash = "$(location build_info) $$(dirname $(location CHANGES.md)) -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)",
+    cmd_bat = "for %F in ($(location CHANGES.md)) do $(location build_info) %~dpF -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)",
     tools = [":build_info"],
 )
 
@@ -143,7 +144,8 @@
         "include/SPIRV/NonSemanticDebugPrintf.h",
         "include/SPIRV/spirv.hpp",
     ],
-    cmd = "mkdir -p $(@D)/include/SPIRV && cp $(SRCS) $(@D)/include/SPIRV/",
+    cmd_bash = "mkdir -p $(@D)/include/SPIRV && cp $(SRCS) $(@D)/include/SPIRV/",
+    cmd_bat = "(if not exist $(@D)\\include\\SPIRV mkdir $(@D)\\include\\SPIRV) && (for %S in ($(SRCS)) do @xcopy /q %S $(@D)\\include\\SPIRV\\ >NUL)",
 )
 
 cc_library(
diff --git a/BUILD.gn b/BUILD.gn
index 4c4b370..dd31806 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -76,6 +76,9 @@
 
 config("glslang_public") {
   include_dirs = [ "." ]
+  if (!is_win || is_clang) {
+    cflags = [ "-Wno-conversion" ]
+  }
 }
 
 config("glslang_hlsl") {
@@ -111,7 +114,6 @@
       "SPIRV/SpvBuilder.cpp",
       "SPIRV/SpvBuilder.h",
       "SPIRV/SpvPostProcess.cpp",
-      "SPIRV/SpvTools.cpp",
       "SPIRV/SpvTools.h",
       "SPIRV/bitutils.h",
       "SPIRV/disassemble.cpp",
@@ -210,8 +212,12 @@
 
     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" ]
@@ -227,11 +233,17 @@
         "-Wno-ignored-qualifiers",
         "-Wno-implicit-fallthrough",
         "-Wno-inconsistent-missing-override",
-        "-Wno-sign-compare",
+
+        # TODO(rosasco): Fuchsia-only flags
         "-Wno-unused-variable",
         "-Wno-unknown-warning-option",
+
         "-Wno-missing-field-initializers",
         "-Wno-newline-eof",
+        "-Wno-sign-compare",
+        "-Wno-suggest-destructor-override",
+        "-Wno-suggest-override",
+        "-Wno-unused-variable",
       ]
     }
 
@@ -242,6 +254,8 @@
       ]
     }
 
+    include_dirs = [ "${target_gen_dir}/include" ]
+
     deps = [ ":glslang_build_info" ]
 
     if (invoker.enable_opt) {
@@ -249,10 +263,9 @@
         "${spirv_tools_dir}:spvtools_opt",
         "${spirv_tools_dir}:spvtools_val",
       ]
+      include_dirs += [ "${spirv_tools_dir}/include" ]
     }
 
-    include_dirs = [ "${target_gen_dir}/include" ]
-
     configs -= _configs_to_remove
     configs += _configs_to_add
   }
@@ -261,11 +274,13 @@
 glslang_sources_common("glslang_lib_sources") {
   enable_opt = !glslang_angle
   enable_hlsl = !glslang_angle
+  is_angle = glslang_angle
 }
 
 glslang_sources_common("glslang_sources") {
   enable_opt = true
   enable_hlsl = true
+  is_angle = false
 }
 
 source_set("glslang_default_resource_limits_sources") {
@@ -296,7 +311,10 @@
   ]
   public_configs = [ ":glslang_hlsl" ]
 
-  include_dirs = [ "${target_gen_dir}/include" ]
+  include_dirs = [
+    "${target_gen_dir}/include",
+    "${spirv_tools_dir}/include",
+  ]
 
   configs -= _configs_to_remove
   configs += _configs_to_add
@@ -307,6 +325,8 @@
   defines = [ "ENABLE_OPT=1" ]
   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
index 6328041..3fd3636 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,6 +3,19 @@
 All notable changes to this project will be documented in this file.
 This project adheres to [Semantic Versioning](https://semver.org/).
 
+## 11.2.0 2021-02-18
+
+### Other changes
+* Removed Python requirement when not building with spirv-tools
+* Add support for GL_EXT_shared_memory_block
+* Implement GL_EXT_null_initializer
+* Add CMake support for Fuschia
+
+## 11.1.0 2020-12-07
+
+### Other changes
+* Added ray-tracing extension support
+
 ## 11.0.0 2020-07-20
 
 ### Breaking changes
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f4a6fb1..9ed5265 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,15 +31,15 @@
 # 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)
 if (POLICY CMP0048)
   cmake_policy(SET CMP0048 NEW)
 endif()
+
+project(glslang LANGUAGES CXX)
+
 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 
 # Enable compile commands database
@@ -186,13 +186,16 @@
     if(NOT ENABLE_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})
+            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
+	else()
+        string(REGEX REPLACE /EHsc "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # Try to remove default /EHsc cxx_flag
+        add_compile_definitions(_HAS_EXCEPTIONS=0)
     endif()
 endif()
 
@@ -228,9 +231,11 @@
     endif()
 endfunction(glslang_set_link_args)
 
-# CMake needs to find the right version of python, right from the beginning,
-# otherwise, it will find the wrong version and fail later
-find_package(PythonInterp 3 REQUIRED)
+if(NOT COMMAND find_host_package)
+    macro(find_host_package)
+        find_package(${ARGN})
+    endmacro()
+endif()
 
 # Root directory for build-time generated include files
 set(GLSLANG_GENERATED_INCLUDEDIR "${CMAKE_BINARY_DIR}/include")
@@ -238,64 +243,40 @@
 ################################################################################
 # Build version information generation
 ################################################################################
+include(parse_version.cmake)
 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}")
+parse_version(${GLSLANG_CHANGES_FILE} GLSLANG)
 
-# Target to build the build_info.h file
-add_custom_target(glslang-build-info DEPENDS ${GLSLANG_BUILD_INFO_H})
+function(configurate_version)
+    set(major ${GLSLANG_VERSION_MAJOR})
+    set(minor ${GLSLANG_VERSION_MINOR})
+    set(patch ${GLSLANG_VERSION_PATCH})
+    set(flavor ${GLSLANG_VERSION_FLAVOR})
+    configure_file(${GLSLANG_BUILD_INFO_H_TMPL} ${GLSLANG_BUILD_INFO_H} @ONLY)
+endfunction()
 
-# 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
+configurate_version()
 
 # 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_default_to_hidden_visibility() makes the symbol visibility hidden by
-# default for <target>.
-function(glslang_default_to_hidden_visibility target)
-    if(NOT WIN32)
-        target_compile_options(${target} PRIVATE "-fvisibility=hidden")
-    endif()
 endfunction()
 
 # glslang_only_export_explicit_symbols() makes the symbol visibility hidden by
-# default for <target>, and sets the GLSLANG_IS_SHARED_LIBRARY define, and 
-# GLSLANG_EXPORTING to 1 when specifically building <target>.
+# 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)
-    glslang_default_to_hidden_visibility(${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()
@@ -303,17 +284,21 @@
 # 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")
+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()
-    message("Your CMake version is ${CMAKE_VERSION}. Update to at least 3.16 to enable precompiled headers to speed up incremental builds")
+    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)
+    find_host_package(PythonInterp 3 REQUIRED)
+
     # We depend on these for later projects, so they should come first.
     add_subdirectory(External)
 endif()
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/OGLCompilersDLL/CMakeLists.txt b/OGLCompilersDLL/CMakeLists.txt
index 246b4e7..0b007d4 100644
--- a/OGLCompilersDLL/CMakeLists.txt
+++ b/OGLCompilersDLL/CMakeLists.txt
@@ -36,7 +36,6 @@
 add_library(OGLCompiler STATIC ${SOURCES})
 set_property(TARGET OGLCompiler PROPERTY FOLDER glslang)
 set_property(TARGET OGLCompiler PROPERTY POSITION_INDEPENDENT_CODE ON)
-glslang_default_to_hidden_visibility(OGLCompiler)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES})
diff --git a/OGLCompilersDLL/InitializeDll.cpp b/OGLCompilersDLL/InitializeDll.cpp
index ab3762e..abea910 100644
--- a/OGLCompilersDLL/InitializeDll.cpp
+++ b/OGLCompilersDLL/InitializeDll.cpp
@@ -32,6 +32,134 @@
 // POSSIBILITY OF SUCH DAMAGE.
 //
 
+#define SH_EXPORTING
+
+#include <cassert>
+
+#include "InitializeDll.h"
+#include "../glslang/Include/InitializeGlobals.h"
+#include "../glslang/Public/ShaderLang.h"
+#include "../glslang/Include/PoolAlloc.h"
+
 namespace glslang {
 
+OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
+
+// Per-process initialization.
+// Needs to be called at least once before parsing, etc. is done.
+// Will also do thread initialization for the calling thread; other
+// threads will need to do that explicitly.
+bool InitProcess()
+{
+    glslang::GetGlobalLock();
+
+    if (ThreadInitializeIndex != OS_INVALID_TLS_INDEX) {
+        //
+        // Function is re-entrant.
+        //
+
+        glslang::ReleaseGlobalLock();
+        return true;
+    }
+
+    ThreadInitializeIndex = OS_AllocTLSIndex();
+
+    if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
+        assert(0 && "InitProcess(): Failed to allocate TLS area for init flag");
+
+        glslang::ReleaseGlobalLock();
+        return false;
+    }
+
+    if (! InitializePoolIndex()) {
+        assert(0 && "InitProcess(): Failed to initialize global pool");
+
+        glslang::ReleaseGlobalLock();
+        return false;
+    }
+
+    if (! InitThread()) {
+        assert(0 && "InitProcess(): Failed to initialize thread");
+
+        glslang::ReleaseGlobalLock();
+        return false;
+    }
+
+    glslang::ReleaseGlobalLock();
+    return true;
+}
+
+// Per-thread scoped initialization.
+// Must be called at least once by each new thread sharing the
+// symbol tables, etc., needed to parse.
+bool InitThread()
+{
+    //
+    // This function is re-entrant
+    //
+    if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
+        assert(0 && "InitThread(): Process hasn't been initalised.");
+        return false;
+    }
+
+    if (OS_GetTLSValue(ThreadInitializeIndex) != 0)
+        return true;
+
+    if (! OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) {
+        assert(0 && "InitThread(): Unable to set init flag.");
+        return false;
+    }
+
+    glslang::SetThreadPoolAllocator(nullptr);
+
+    return true;
+}
+
+// Not necessary to call this: InitThread() is reentrant, and the need
+// to do per thread tear down has been removed.
+//
+// This is kept, with memory management removed, to satisfy any exiting
+// calls to it that rely on it.
+bool DetachThread()
+{
+    bool success = true;
+
+    if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
+        return true;
+
+    //
+    // Function is re-entrant and this thread may not have been initialized.
+    //
+    if (OS_GetTLSValue(ThreadInitializeIndex) != 0) {
+        if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)0)) {
+            assert(0 && "DetachThread(): Unable to clear init flag.");
+            success = false;
+        }
+    }
+
+    return success;
+}
+
+// Not necessary to call this: InitProcess() is reentrant.
+//
+// This is kept, with memory management removed, to satisfy any exiting
+// calls to it that rely on it.
+//
+// Users of glslang should call shFinalize() or glslang::FinalizeProcess() for
+// process-scoped memory tear down.
+bool DetachProcess()
+{
+    bool success = true;
+
+    if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
+        return true;
+
+    success = DetachThread();
+
+    OS_FreeTLSIndex(ThreadInitializeIndex);
+    ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
+
+    return success;
+}
+
 } // end namespace glslang
diff --git a/OGLCompilersDLL/InitializeDll.h b/OGLCompilersDLL/InitializeDll.h
index b18e2ab..661cee4 100644
--- a/OGLCompilersDLL/InitializeDll.h
+++ b/OGLCompilersDLL/InitializeDll.h
@@ -38,10 +38,10 @@
 
 namespace glslang {
 
-inline bool InitProcess()   { return true; } // DEPRECATED
-inline bool InitThread()    { return true; } // DEPRECATED
-inline bool DetachThread()  { return true; } // DEPRECATED
-inline bool DetachProcess() { return true; } // DEPRECATED
+bool InitProcess();
+bool InitThread();
+bool DetachThread();  // not called from standalone, perhaps other tools rely on parts of it
+bool DetachProcess(); // not called from standalone, perhaps other tools rely on parts of it
 
 } // end namespace glslang
 
diff --git a/README.md b/README.md
old mode 100755
new mode 100644
index 330ec82..9b8cfb3
--- a/README.md
+++ b/README.md
@@ -88,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.
@@ -99,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.)
@@ -125,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 ../..
 ```
 
@@ -193,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
index c88b808..a0790f4 100644
--- a/SPIRV/CInterface/spirv_c_interface.cpp
+++ b/SPIRV/CInterface/spirv_c_interface.cpp
@@ -79,7 +79,7 @@
     return EShLangCount;
 }
 
-void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage)
+GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage)
 {
     spv::SpvBuildLogger logger;
     glslang::SpvOptions spvOptions;
@@ -92,19 +92,19 @@
     program->loggerMessages = logger.getAllMessages();
 }
 
-size_t glslang_program_SPIRV_get_size(glslang_program_t* program) { return program->spirv.size(); }
+GLSLANG_EXPORT 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)
+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));
 }
 
-unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program)
+GLSLANG_EXPORT 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)
+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 53ada4f..d699dad 100644
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -43,7 +43,8 @@
     CInterface/spirv_c_interface.cpp)
 
 set(SPVREMAP_SOURCES
-    SPVRemapper.cpp)
+    SPVRemapper.cpp
+    doc.cpp)
 
 set(HEADERS
     bitutils.h
@@ -68,7 +69,6 @@
     doc.h)
 
 add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS})
-target_link_libraries(SPIRV PRIVATE MachineIndependent)
 set_property(TARGET SPIRV PROPERTY FOLDER glslang)
 set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_include_directories(SPIRV PUBLIC
@@ -79,7 +79,6 @@
 
 if (ENABLE_SPVREMAPPER)
     add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
-    target_link_libraries(SPVRemapper PRIVATE SPIRV)
     set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
     set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
 endif()
@@ -96,10 +95,12 @@
         PRIVATE ${spirv-tools_SOURCE_DIR}/include
         PRIVATE ${spirv-tools_SOURCE_DIR}/source
     )
-    target_link_libraries(SPIRV PRIVATE 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>)
+else()
+    target_link_libraries(SPIRV PRIVATE MachineIndependent)
 endif(ENABLE_OPT)
 
 if(WIN32)
diff --git a/SPIRV/GLSL.ext.EXT.h b/SPIRV/GLSL.ext.EXT.h
index 6eb0eee..20b9e54 100644
--- a/SPIRV/GLSL.ext.EXT.h
+++ b/SPIRV/GLSL.ext.EXT.h
@@ -36,5 +36,6 @@
 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 b14a3b2..81aacd1 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -149,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);
@@ -189,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,
@@ -253,17 +255,17 @@
     bool nanMinMaxClamp;               // true if use NMin/NMax/NClamp instead of FMin/FMax/FClamp
     spv::Id stdBuiltins;
     spv::Id nonSemanticDebugPrintf;
-    std::unordered_map<const char*, spv::Id> extBuiltinMap;
+    std::unordered_map<std::string, spv::Id> extBuiltinMap;
 
-    std::unordered_map<int, spv::Id> symbolValues;
-    std::unordered_set<int> rValueParameters;  // set of formal function parameters passed as rValues,
+    std::unordered_map<long long, spv::Id> symbolValues;
+    std::unordered_set<long long> rValueParameters;  // set of formal function parameters passed as rValues,
                                                // rather than a pointer
     std::unordered_map<std::string, spv::Function*> functionMap;
     std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];
     // for mapping glslang block indices to spv indices (e.g., due to hidden members):
-    std::unordered_map<int, std::vector<int>> memberRemapper;
+    std::unordered_map<long long, std::vector<int>> memberRemapper;
     // for mapping glslang symbol struct to symbol Id
-    std::unordered_map<const glslang::TTypeList*, int> glslangTypeToIdMap;
+    std::unordered_map<const glslang::TTypeList*, long long> glslangTypeToIdMap;
     std::stack<bool> breakForLoop;  // false means break for switch
     std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;
     // Map pointee types for EbtReference to their forward pointers
@@ -272,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];
 };
 
 //
@@ -283,6 +288,8 @@
 {
 #ifdef GLSLANG_WEB
     return spv::SourceLanguageESSL;
+#elif defined(GLSLANG_ANGLE)
+    return spv::SourceLanguageGLSL;
 #endif
 
     switch (source) {
@@ -373,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;
@@ -429,6 +437,7 @@
             break;
         case glslang::EbtBlock:
             switch (type.getQualifier().storage) {
+            case glslang::EvqShared:
             case glslang::EvqUniform:
             case glslang::EvqBuffer:
                 switch (type.getQualifier().layoutPacking) {
@@ -537,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)
 {
@@ -612,6 +635,7 @@
                        flags.volatil;
     flags.isImage = type.getBasicType() == glslang::EbtSampler;
 #endif
+    flags.nonUniform = type.getQualifier().nonUniform;
     return flags;
 }
 
@@ -707,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;
 
@@ -732,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;
 
@@ -767,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;
@@ -961,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:
@@ -1069,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;
     }
@@ -1115,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;
     }
 }
@@ -1185,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())
@@ -1217,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;
@@ -1351,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)
@@ -1422,7 +1493,7 @@
 
     if (glslangIntermediate->usingPhysicalStorageBuffer()) {
         addressingModel = spv::AddressingModelPhysicalStorageBuffer64EXT;
-        builder.addIncorporatedExtension(spv::E_SPV_EXT_physical_storage_buffer, spv::Spv_1_5);
+        builder.addIncorporatedExtension(spv::E_SPV_KHR_physical_storage_buffer, spv::Spv_1_5);
         builder.addCapability(spv::CapabilityPhysicalStorageBufferAddressesEXT);
     }
     if (glslangIntermediate->usingVulkanMemoryModel()) {
@@ -1442,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.
 
@@ -1452,7 +1523,7 @@
     }
 
     if (glslangIntermediate->getLayoutPrimitiveCulling()) {
-        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingProvisionalKHR);
+        builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingKHR);
     }
 
     unsigned int mode;
@@ -1480,15 +1551,16 @@
             builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);
         }
 
-        if (glslangIntermediate->getDepth() != glslang::EldUnchanged && glslangIntermediate->isDepthReplacing())
+        if (glslangIntermediate->isDepthReplacing())
             builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing);
 
 #ifndef GLSLANG_WEB
 
         switch(glslangIntermediate->getDepth()) {
-        case glslang::EldGreater:  mode = spv::ExecutionModeDepthGreater; break;
-        case glslang::EldLess:     mode = spv::ExecutionModeDepthLess;    break;
-        default:                   mode = spv::ExecutionModeMax;          break;
+        case glslang::EldGreater:   mode = spv::ExecutionModeDepthGreater;   break;
+        case glslang::EldLess:      mode = spv::ExecutionModeDepthLess;      break;
+        case glslang::EldUnchanged: mode = spv::ExecutionModeDepthUnchanged; break;
+        default:                    mode = spv::ExecutionModeMax;            break;
         }
         if (mode != spv::ExecutionModeMax)
             builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode);
@@ -1619,7 +1691,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 {
@@ -1708,6 +1780,12 @@
     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);
@@ -1850,9 +1928,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());
@@ -1883,13 +1963,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 {
@@ -1912,7 +1995,7 @@
                 {
                     // This may be, e.g., an anonymous block-member selection, which generally need
                     // index remapping due to hidden members in anonymous blocks.
-                    int glslangId = glslangTypeToIdMap[node->getLeft()->getType().getStruct()];
+                    long long glslangId = glslangTypeToIdMap[node->getLeft()->getType().getStruct()];
                     if (memberRemapper.find(glslangId) != memberRemapper.end()) {
                         std::vector<int>& remapper = memberRemapper[glslangId];
                         assert(remapper.size() > 0);
@@ -1920,9 +2003,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.
@@ -1956,15 +2044,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:
@@ -2048,8 +2141,9 @@
             // 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
@@ -2088,7 +2182,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));
@@ -2104,7 +2198,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  {
@@ -2207,7 +2301,8 @@
     if (node->getOp() == glslang::EOpAtomicCounterIncrement ||
         node->getOp() == glslang::EOpAtomicCounterDecrement ||
         node->getOp() == glslang::EOpAtomicCounter          ||
-        node->getOp() == glslang::EOpInterpolateAtCentroid  ||
+        (node->getOp() == glslang::EOpInterpolateAtCentroid &&
+          glslangIntermediate->getSource() != glslang::EShSourceHlsl)  ||
         node->getOp() == glslang::EOpRayQueryProceed        ||
         node->getOp() == glslang::EOpRayQueryGetRayTMin     ||
         node->getOp() == glslang::EOpRayQueryGetRayFlags    ||
@@ -2290,7 +2385,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)
@@ -2419,6 +2515,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());
@@ -2609,6 +2709,10 @@
         else
             constructed = builder.createConstructor(precision, arguments, resultType());
 
+        if (node->getType().getQualifier().isNonUniform()) {
+            builder.addDecoration(constructed, spv::DecorationNonUniformEXT);
+        }
+
         builder.clearAccessChain();
         builder.setAccessChainRValue(constructed);
 
@@ -2681,6 +2785,7 @@
         break;
 
     case glslang::EOpAtomicAdd:
+    case glslang::EOpAtomicSubtract:
     case glslang::EOpAtomicMin:
     case glslang::EOpAtomicMax:
     case glslang::EOpAtomicAnd:
@@ -2724,10 +2829,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;
@@ -2736,7 +2843,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:
@@ -2759,7 +2866,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:
@@ -2850,6 +2957,7 @@
             break;
 
         case glslang::EOpAtomicAdd:
+        case glslang::EOpAtomicSubtract:
         case glslang::EOpAtomicMin:
         case glslang::EOpAtomicMax:
         case glslang::EOpAtomicAnd:
@@ -2870,7 +2978,13 @@
         case glslang::EOpInterpolateAtOffset:
         case glslang::EOpInterpolateAtVertex:
             if (arg == 0) {
-                lvalue = true;
+                // If GLSL, use the address of the interpolant argument.
+                // If HLSL, use an internal version of OpInterolates that takes
+                // the rvalue of the interpolant. A fixup pass in spirv-opt
+                // legalization will remove the OpLoad and convert to an lvalue.
+                // Had to do this because legalization will only propagate a
+                // builtin into an rvalue.
+                lvalue = glslangIntermediate->getSource() != glslang::EShSourceHlsl;
 
                 // Does it need a swizzle inversion?  If so, evaluation is inverted;
                 // operate first on the swizzle base, then apply the swizzle.
@@ -3012,11 +3126,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()));
-            }
-
+             }
         }
     }
 
@@ -3052,7 +3173,9 @@
 #endif
     if (atomic) {
         // Handle all atomics
-        result = createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType(),
+        glslang::TBasicType typeProxy = (node->getOp() == glslang::EOpAtomicStore)
+            ? node->getSequence()[0]->getAsTyped()->getBasicType() : node->getBasicType();
+        result = createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy,
             lvalueCoherentFlags);
     } else if (node->getOp() == glslang::EOpDebugPrintf) {
         if (!nonSemanticDebugPrintf) {
@@ -3087,7 +3210,8 @@
 
         for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {
             builder.setAccessChain(complexLvalues[i]);
-            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision));
+            builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision),
+                TranslateNonUniformDecoration(complexLvalues[i].coherentFlags));
         }
     }
 
@@ -3418,7 +3542,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())
@@ -3455,6 +3583,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:
@@ -3509,6 +3643,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())
@@ -3527,6 +3666,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);
         }
@@ -3538,13 +3680,14 @@
 
     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 */);
+    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);
@@ -3562,6 +3705,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);
@@ -3668,10 +3817,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:
         {
@@ -3927,6 +4102,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;
@@ -3979,7 +4156,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
@@ -4085,6 +4262,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),
@@ -4152,7 +4330,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);
@@ -4257,6 +4435,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;
 
@@ -4540,7 +4719,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)
 {
@@ -4684,8 +4895,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
@@ -4748,12 +4961,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:
@@ -5007,10 +5223,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;
 
@@ -5071,13 +5283,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();
@@ -5237,7 +5442,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);
     }
@@ -5373,6 +5578,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;
@@ -5382,6 +5588,7 @@
         else if (writableParam(qualifiers[a])) {
             if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
                 spv::Id copy = builder.createLoad(spvArgs[a], spv::NoPrecision);
+                builder.addDecoration(copy, TranslateNonUniformDecoration(argTypes[a]->getQualifier()));
                 builder.setAccessChain(lValues[lValueCount]);
                 multiTypeStore(*argTypes[a], copy);
             }
@@ -6169,6 +6376,11 @@
     case glslang::EOpConstructReference:
         unaryOp = spv::OpBitcast;
         break;
+
+    case glslang::EOpConvUint64ToAccStruct:
+    case glslang::EOpConvUvec2ToAccStruct:
+        unaryOp = spv::OpConvertUToAccelerationStructureKHR;
+        break;
 #endif
 
     case glslang::EOpCopyObject:
@@ -6631,9 +6843,6 @@
         break;
     case glslang::EOpConvPtrToUvec2:
     case glslang::EOpConvUvec2ToPtr:
-        if (builder.isVector(operand))
-            builder.promoteIncorporatedExtension(spv::E_SPV_EXT_physical_storage_buffer,
-                                                 spv::E_SPV_KHR_physical_storage_buffer, spv::Spv_1_5);
         convOp = spv::OpBitcast;
         break;
 #endif
@@ -6691,6 +6900,7 @@
                 builder.addCapability(spv::CapabilityAtomicFloat64AddEXT);
         }
         break;
+    case glslang::EOpAtomicSubtract:
     case glslang::EOpAtomicCounterSubtract:
         opCode = spv::OpAtomicISub;
         break;
@@ -6813,6 +7023,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);
     }
@@ -7755,10 +7969,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;
 
@@ -7803,7 +8023,7 @@
         opCode = spv::OpRayQueryGetIntersectionInstanceIdKHR;
         break;
     case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:
-        typeId = builder.makeIntType(32);
+        typeId = builder.makeUintType(32);
         opCode = spv::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR;
         break;
     case glslang::EOpRayQueryGetIntersectionGeometryIndex:
@@ -8046,11 +8266,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);
@@ -8178,7 +8398,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());
@@ -8186,9 +8407,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
@@ -8694,7 +8912,7 @@
 // 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())
@@ -8721,6 +8939,7 @@
     }
     if (varName != nullptr) {
         out << "};";
+        out << std::endl;
     }
     out.close();
 #endif
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 943b9b6..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;
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 582b6cb..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)
 {
@@ -1352,10 +1471,10 @@
 }
 
 // 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
@@ -2666,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
@@ -2694,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;
 
@@ -2759,9 +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);
+        addDecoration(id, l_nonUniform);
         id = createLoad(id, precision, memoryAccess, scope, alignment);
-        addDecoration(id, nonUniform);
+        addDecoration(id, r_nonUniform);
     }
 
     // Done, unless there are swizzles to do
@@ -2782,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 83a7116..73847e1 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -293,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); }
@@ -321,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; }
@@ -350,8 +358,9 @@
     // 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(Decoration precision, StorageClass, Id type, const char* name = nullptr,
@@ -617,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;
@@ -631,6 +641,7 @@
             unsigned nonprivate : 1;
             unsigned volatil : 1;
             unsigned isImage : 1;
+            unsigned nonUniform : 1;
 
             void clear() {
                 coherent = 0;
@@ -642,6 +653,7 @@
                 nonprivate = 0;
                 volatil = 0;
                 isImage = 0;
+                nonUniform = 0;
             }
 
             CoherentFlags operator |=(const CoherentFlags &other) {
@@ -654,6 +666,7 @@
                 nonprivate |= other.nonprivate;
                 volatil |= other.volatil;
                 isImage |= other.isImage;
+                nonUniform |= other.nonUniform;
                 return *this;
             }
 #endif
@@ -714,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);
 
@@ -825,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 6d4d9ef..8acf9b1 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 {
 
@@ -114,11 +113,18 @@
     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(),
@@ -147,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
@@ -165,7 +173,7 @@
 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(OptimizerMesssageConsumer);
@@ -174,10 +182,7 @@
     // 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());
-    }
-    else if (options->stripDebugInfo) {
+    if (options->stripDebugInfo) {
         optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());
     }
     optimizer.RegisterPass(spvtools::CreateWrapOpKillPass());
@@ -202,14 +207,12 @@
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
     optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
+    optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
     if (options->optimizeSize) {
         optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
     }
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
-    if (options->generateDebugInfo) {
-        optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass());
-    }
 
     spvtools::OptimizerOptions spvOptOptions;
     optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
@@ -223,7 +226,7 @@
 void SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate,
         std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger)
 {
-    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(OptimizerMesssageConsumer);
diff --git a/SPIRV/SpvTools.h b/SPIRV/SpvTools.h
index 7779dfa..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"
@@ -62,11 +63,15 @@
     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);
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 4829bb4..3da77bf 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,10 @@
     case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
     case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
     case CapabilityRayTracingNV:                    return "RayTracingNV";
+    case CapabilityRayTracingKHR:                   return "RayTracingKHR";
+    case CapabilityRayQueryKHR:                     return "RayQueryKHR";
     case CapabilityRayTracingProvisionalKHR:        return "RayTracingProvisionalKHR";
-    case CapabilityRayQueryProvisionalKHR:          return "RayQueryProvisionalKHR";
-    case CapabilityRayTraversalPrimitiveCullingProvisionalKHR: return "RayTraversalPrimitiveCullingProvisionalKHR";
+    case CapabilityRayTraversalPrimitiveCullingKHR: return "RayTraversalPrimitiveCullingKHR";
     case CapabilityComputeDerivativeGroupQuadsNV:   return "ComputeDerivativeGroupQuadsNV";
     case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
     case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
@@ -933,14 +957,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";
     }
 }
@@ -1272,6 +1303,7 @@
     case 320: return "OpImageSparseRead";
 
     case OpModuleProcessed: return "OpModuleProcessed";
+    case OpExecutionModeId: return "OpExecutionModeId";
     case OpDecorateId:      return "OpDecorateId";
 
     case 333: return "OpGroupNonUniformElect";
@@ -1309,6 +1341,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";
@@ -1335,17 +1369,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";
@@ -1423,6 +1463,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);
@@ -1476,6 +1517,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);
@@ -1609,6 +1651,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'");
 
@@ -1702,7 +1748,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'");
@@ -1712,7 +1758,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'");
@@ -2673,7 +2719,7 @@
 
     InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'");
     InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X");
-    InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandLiteralNumber, "'Direction'");
+    InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "'Direction'");
 
     InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'");
 
@@ -2736,7 +2782,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'");
@@ -2752,17 +2811,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 35482ea..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,10 +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,
 };
 
@@ -204,6 +210,8 @@
     StorageClassPhysicalStorageBuffer = 5349,
     StorageClassPhysicalStorageBufferEXT = 5349,
     StorageClassCodeSectionINTEL = 5605,
+    StorageClassDeviceOnlyINTEL = 5936,
+    StorageClassHostOnlyINTEL = 5937,
     StorageClassMax = 0x7fffffff,
 };
 
@@ -274,6 +282,8 @@
     ImageFormatRg8ui = 37,
     ImageFormatR16ui = 38,
     ImageFormatR8ui = 39,
+    ImageFormatR64ui = 40,
+    ImageFormatR64i = 41,
     ImageFormatMax = 0x7fffffff,
 };
 
@@ -372,6 +382,8 @@
     FPFastMathModeNSZShift = 2,
     FPFastMathModeAllowRecipShift = 3,
     FPFastMathModeFastShift = 4,
+    FPFastMathModeAllowContractFastINTELShift = 16,
+    FPFastMathModeAllowReassocINTELShift = 17,
     FPFastMathModeMax = 0x7fffffff,
 };
 
@@ -382,6 +394,8 @@
     FPFastMathModeNSZMask = 0x00000004,
     FPFastMathModeAllowRecipMask = 0x00000008,
     FPFastMathModeFastMask = 0x00000010,
+    FPFastMathModeAllowContractFastINTELMask = 0x00010000,
+    FPFastMathModeAllowReassocINTELMask = 0x00020000,
 };
 
 enum FPRoundingMode {
@@ -482,12 +496,22 @@
     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,
@@ -500,6 +524,17 @@
     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,
 };
 
@@ -558,8 +593,10 @@
     BuiltInBaseVertex = 4424,
     BuiltInBaseInstance = 4425,
     BuiltInDrawIndex = 4426,
+    BuiltInPrimitiveShadingRateKHR = 4432,
     BuiltInDeviceIndex = 4438,
     BuiltInViewIndex = 4440,
+    BuiltInShadingRateKHR = 4444,
     BuiltInBaryCoordNoPerspAMD = 4992,
     BuiltInBaryCoordNoPerspCentroidAMD = 4993,
     BuiltInBaryCoordNoPerspSampleAMD = 4994,
@@ -610,7 +647,6 @@
     BuiltInObjectToWorldNV = 5330,
     BuiltInWorldToObjectKHR = 5331,
     BuiltInWorldToObjectNV = 5331,
-    BuiltInHitTKHR = 5332,
     BuiltInHitTNV = 5332,
     BuiltInHitKindKHR = 5333,
     BuiltInHitKindNV = 5333,
@@ -653,6 +689,7 @@
     LoopControlLoopCoalesceINTELShift = 20,
     LoopControlMaxInterleavingINTELShift = 21,
     LoopControlSpeculatedIterationsINTELShift = 22,
+    LoopControlNoFusionINTELShift = 23,
     LoopControlMax = 0x7fffffff,
 };
 
@@ -674,6 +711,7 @@
     LoopControlLoopCoalesceINTELMask = 0x00100000,
     LoopControlMaxInterleavingINTELMask = 0x00200000,
     LoopControlSpeculatedIterationsINTELMask = 0x00400000,
+    LoopControlNoFusionINTELMask = 0x00800000,
 };
 
 enum FunctionControlShift {
@@ -870,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,
@@ -894,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,
@@ -959,21 +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,
 };
 
@@ -1024,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,
@@ -1369,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,
@@ -1398,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,
@@ -1441,8 +1532,11 @@
     OpUSubSatINTEL = 5596,
     OpIMul32x16INTEL = 5597,
     OpUMul32x16INTEL = 5598,
-    OpFunctionPointerINTEL = 5600,
+    OpConstFunctionPointerINTEL = 5600,
     OpFunctionPointerCallINTEL = 5601,
+    OpAsmTargetINTEL = 5609,
+    OpAsmINTEL = 5610,
+    OpAsmCallINTEL = 5611,
     OpDecorateString = 5632,
     OpDecorateStringGOOGLE = 5632,
     OpMemberDecorateString = 5633,
@@ -1565,7 +1659,12 @@
     OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,
     OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,
     OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,
+    OpVariableLengthArrayINTEL = 5818,
+    OpSaveMemoryINTEL = 5819,
+    OpRestoreMemoryINTEL = 5820,
     OpLoopControlINTEL = 5887,
+    OpPtrCastToCrossWorkgroupINTEL = 5934,
+    OpCrossWorkgroupCastToPtrINTEL = 5938,
     OpReadPipeBlockingINTEL = 5946,
     OpWritePipeBlockingINTEL = 5947,
     OpFPGARegINTEL = 5949,
@@ -1587,6 +1686,10 @@
     OpRayQueryGetIntersectionObjectToWorldKHR = 6031,
     OpRayQueryGetIntersectionWorldToObjectKHR = 6032,
     OpAtomicFAddEXT = 6035,
+    OpTypeBufferSurfaceINTEL = 6086,
+    OpTypeStructContinuedINTEL = 6090,
+    OpConstantCompositeContinuedINTEL = 6091,
+    OpSpecConstantCompositeContinuedINTEL = 6092,
     OpMax = 0x7fffffff,
 };
 
@@ -1939,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;
@@ -2005,8 +2114,11 @@
     case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
     case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
     case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
-    case OpFunctionPointerINTEL: *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;
@@ -2127,7 +2239,12 @@
     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;
@@ -2149,6 +2266,10 @@
     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 */
@@ -2164,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 868b9bf..486e80d
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -263,6 +263,7 @@
         case OpBranchConditional:
         case OpSwitch:
         case OpKill:
+        case OpTerminateInvocation:
         case OpReturn:
         case OpReturnValue:
         case OpUnreachable:
diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
index 8038c04..751d1cd 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -41,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})
@@ -70,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})
@@ -95,7 +100,12 @@
 
     if(BUILD_SHARED_LIBS)
         install(TARGETS glslang-default-resource-limits EXPORT glslang-default-resource-limitsTargets
-                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
-        install(EXPORT glslang-default-resource-limitsTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+                RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    else()
+        install(TARGETS glslang-default-resource-limits EXPORT glslang-default-resource-limitsTargets
+                ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
     endif()
+    install(EXPORT glslang-default-resource-limitsTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake)
 endif(ENABLE_GLSLANG_INSTALL)
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 8836812..923ded3 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -110,6 +110,7 @@
 bool NaNClamp = false;
 bool stripDebugInfo = false;
 bool beQuiet = false;
+bool VulkanRulesRelaxed = false;
 
 //
 // Return codes from main/exit().
@@ -195,6 +196,17 @@
 std::array<std::array<TPerSetBaseBinding, EShLangCount>, glslang::EResCount> baseBindingForSet;
 std::array<std::vector<std::string>, EShLangCount> baseResourceSetBinding;
 
+std::vector<std::pair<std::string, glslang::TBlockStorageClass>> blockStorageOverrides;
+
+bool setGlobalUniformBlock = false;
+std::string globalUniformName;
+unsigned int globalUniformBinding;
+unsigned int globalUniformSet;
+
+bool setGlobalBufferBlock = false;
+std::string atomicCounterBlockName;
+unsigned int atomicCounterBlockSet;
+
 // Add things like "#define ..." to a preamble to use in the beginning of the shader.
 class TPreamble {
 public:
@@ -397,6 +409,115 @@
 }
 
 //
+// Process an optional binding base of one the forms:
+//   --argname name {uniform|buffer|push_constant}
+void ProcessBlockStorage(int& argc, char**& argv, std::vector<std::pair<std::string, glslang::TBlockStorageClass>>& storage)
+{
+    if (argc < 3)
+        usage();
+
+    glslang::TBlockStorageClass blockStorage = glslang::EbsNone;
+
+    std::string strBacking(argv[2]);
+    if (strBacking == "uniform")
+        blockStorage = glslang::EbsUniform;
+    else if (strBacking == "buffer")
+        blockStorage = glslang::EbsStorageBuffer;
+    else if (strBacking == "push_constant")
+        blockStorage = glslang::EbsPushConstant;
+    else {
+        printf("%s: invalid block storage\n", strBacking.c_str());
+        usage();
+    }
+
+    storage.push_back(std::make_pair(std::string(argv[1]), blockStorage));
+
+    argc -= 2;
+    argv += 2;
+}
+
+inline bool isNonDigit(char c) {
+    // a non-digit character valid in a glsl identifier
+    return (c == '_') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+}
+
+// whether string isa  valid identifier to be used in glsl
+bool isValidIdentifier(const char* str) {
+    std::string idn(str);
+
+    if (idn.length() == 0) {
+        return false;
+    }
+
+    if (idn.length() >= 3 && idn.substr(0, 3) == "gl_") {
+        // identifiers startin with "gl_" are reserved
+        return false;
+    }
+
+    if (!isNonDigit(idn[0])) {
+        return false;
+    }
+
+    for (unsigned int i = 1; i < idn.length(); ++i) {
+        if (!(isdigit(idn[i]) || isNonDigit(idn[i]))) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+// Process settings for either the global buffer block or global unfirom block
+// of the form:
+//      --argname name set binding
+void ProcessGlobalBlockSettings(int& argc, char**& argv, std::string* name, unsigned int* set, unsigned int* binding)
+{
+    if (argc < 4)
+        usage();
+
+    unsigned int curArg = 1;
+
+    assert(name || set || binding);
+
+    if (name) {
+        if (!isValidIdentifier(argv[curArg])) {
+            printf("%s: invalid identifier\n", argv[curArg]);
+            usage();
+        }
+        *name = argv[curArg];
+
+        curArg++;
+    }
+
+    if (set) {
+        errno = 0;
+        int setVal = ::strtol(argv[curArg], NULL, 10);
+        if (errno || setVal < 0) {
+            printf("%s: invalid set\n", argv[curArg]);
+            usage();
+        }
+        *set = setVal;
+
+        curArg++;
+    }
+
+    if (binding) {
+        errno = 0;
+        int bindingVal = ::strtol(argv[curArg], NULL, 10);
+        if (errno || bindingVal < 0) {
+            printf("%s: invalid binding\n", argv[curArg]);
+            usage();
+        }
+        *binding = bindingVal;
+
+        curArg++;
+    }
+
+    argc -= (curArg - 1);
+    argv += (curArg - 1);
+}
+
+//
 // Do all command-line argument parsing.  This includes building up the work-items
 // to be processed later, and saving all the command-line options.
 //
@@ -569,6 +690,17 @@
                                lowerword == "resource-set-binding"  ||
                                lowerword == "rsb") {
                         ProcessResourceSetBindingBase(argc, argv, baseResourceSetBinding);
+                    } else if (lowerword == "set-block-storage" ||
+                               lowerword == "sbs") {
+                        ProcessBlockStorage(argc, argv, blockStorageOverrides);
+                    } else if (lowerword == "set-atomic-counter-block" ||
+                               lowerword == "sacb") {
+                        ProcessGlobalBlockSettings(argc, argv, &atomicCounterBlockName, &atomicCounterBlockSet, nullptr);
+                        setGlobalBufferBlock = true;
+                    } else if (lowerword == "set-default-uniform-block" ||
+                               lowerword == "sdub") {
+                        ProcessGlobalBlockSettings(argc, argv, &globalUniformName, &globalUniformSet, &globalUniformBinding);
+                        setGlobalUniformBlock = true;
                     } else if (lowerword == "shift-image-bindings" ||  // synonyms
                                lowerword == "shift-image-binding"  ||
                                lowerword == "sib") {
@@ -696,6 +828,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;
@@ -719,6 +853,9 @@
                 else
                     Error("unknown -O option");
                 break;
+            case 'R':
+                VulkanRulesRelaxed = true;
+                break;
             case 'S':
                 if (argc <= 1)
                     Error("no <stage> specified for -S");
@@ -732,6 +869,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;
@@ -840,6 +979,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) {
@@ -1060,6 +1203,24 @@
         shader->setUniformLocationBase(uniformBase);
 #endif
 
+        if (VulkanRulesRelaxed) {
+            for (auto& storageOverride : blockStorageOverrides) {
+                shader->addBlockStorageOverride(storageOverride.first.c_str(),
+                    storageOverride.second);
+            }
+
+            if (setGlobalBufferBlock) {
+                shader->setAtomicCounterBlockName(atomicCounterBlockName.c_str());
+                shader->setAtomicCounterBlockSet(atomicCounterBlockSet);
+            }
+
+            if (setGlobalUniformBlock) {
+                shader->setGlobalUniformBlockName(globalUniformName.c_str());
+                shader->setGlobalUniformSet(globalUniformSet);
+                shader->setGlobalUniformBinding(globalUniformBinding);
+            }
+        }
+
         shader->setNanMinMaxClamp(NaNClamp);
 
 #ifdef ENABLE_HLSL
@@ -1083,6 +1244,8 @@
             if (targetHlslFunctionality1)
                 shader->setEnvTargetHlslFunctionality1();
 #endif
+            if (VulkanRulesRelaxed)
+                shader->setEnvInputVulkanRulesRelaxed();
         }
 
         shaders.push_back(shader);
@@ -1557,12 +1720,16 @@
            "              '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"
            "  -Od         disables optimization; may cause illegal SPIR-V for HLSL\n"
            "  -Os         optimizes SPIR-V to minimize size\n"
+           "  -R          use relaxed verification rules for generating Vulkan SPIR-V,\n"
+           "              allowing the use of default uniforms, atomic_uints, and\n"
+           "              gl_VertexID and gl_InstanceID keywords.\n"
            "  -S <stage>  uses specified stage rather than parsing the file extension\n"
            "              choices for <stage> are vert, tesc, tese, geom, frag, or comp\n"
            "  -U<name> | --undef-macro <name> | --U <name>\n"
@@ -1640,6 +1807,22 @@
            "  --resource-set-binding [stage] set\n"
            "                                    set descriptor set for all resources\n"
            "  --rsb                             synonym for --resource-set-binding\n"
+           "  --set-block-backing name {uniform|buffer|push_constant}\n"
+           "                                    changes the backing type of a uniform, buffer,\n"
+           "                                    or push_constant block declared in\n"
+           "                                    in the program, when using -R option.\n"
+           "                                    This can be used to change the backing\n"
+           "                                    for existing blocks as well as implicit ones\n"
+           "                                    such as 'gl_DefaultUniformBlock'.\n"
+           "  --sbs                             synonym for set-block-storage\n"
+           "  --set-atomic-counter-block name set\n"
+           "                                    set name, and descriptor set for\n"
+           "                                    atomic counter blocks, with -R opt\n"
+           "  --sacb                            synonym for set-atomic-counter-block\n"
+           "  --set-default-uniform-block name set binding\n"
+           "                                    set name, descriptor set, and binding for\n"
+           "                                    global default-uniform-block, with -R opt\n"
+           "  --sdub                            synonym for set-default-uniform-block\n"
            "  --shift-image-binding [stage] num\n"
            "                                    base binding number for images (uav)\n"
            "  --shift-image-binding [stage] [num set]...\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/420.vert b/Test/420.vert
index c7ffa90..cfae71f 100644
--- a/Test/420.vert
+++ b/Test/420.vert
@@ -159,3 +159,4 @@
 }

 

 layout(binding=0) writeonly uniform image1D badArray[];

+layout(binding = 74) uniform sampler2D u_sampler0[6];
diff --git a/Test/440.frag b/Test/440.frag
index 4eb1a3f..a3ec89d 100644
--- a/Test/440.frag
+++ b/Test/440.frag
@@ -151,3 +151,18 @@
 {

     return gl_Layer;

 }

+

+// The std140 layout qualifier should NOT propagate all the way down to

+// the vec3. It is unnecessary and it breaks downstream AST consumers,

+// notably LunarGlass.

+

+struct PointLight_t

+{

+    vec3 vPositionWs ;

+} ;

+

+layout( std140, row_major ) uniform PerViewLightData_t

+{

+

+    PointLight_t g_pointLightData [ 128 ] ;

+} ;

diff --git a/Test/450.frag b/Test/450.frag
index 076d0b3..abab34d 100644
--- a/Test/450.frag
+++ b/Test/450.frag
@@ -48,6 +48,31 @@
     float f = imageAtomicExchange(i2dmsa, ivec3(in3), 2, 4.5);

 }

 

+#extension GL_ARB_sparse_texture2: enable

+

+uniform sampler2D               s2D;

+uniform isampler2DArray         is2DArray;

+uniform sampler2DRectShadow     s2DRectShadow;

+

+in flat ivec2 offsets[4];

+in vec2 c2;

+in vec3 c3;

+

+void testOffsets()

+{

+    vec4  texel  = vec4(0.0);

+    ivec4 itexel = ivec4(0);

+    const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));

+    sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(is2DArray, c3, constOffsets, itexel, 2);

+    sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, constOffsets, texel);

+

+    sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel); // Error : Non constant offsets

+    sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2); // Error : Non constant offsets

+    sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel); // Error : Non constant offsets

+

+}

+

 in float gl_CullDistance[6];

 

 float cull(int i)

diff --git a/Test/baseLegalResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseLegalResults/hlsl.intrinsics.evalfns.frag.out
new file mode 100644
index 0000000..564f0f4
--- /dev/null
+++ b/Test/baseLegalResults/hlsl.intrinsics.evalfns.frag.out
@@ -0,0 +1,110 @@
+hlsl.intrinsics.evalfns.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 274
+
+                              Capability Shader
+                              Capability InterpolationFunction
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 138 142 146 150 154 157 161
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 138  "inF1"
+                              Name 142  "inF2"
+                              Name 146  "inF3"
+                              Name 150  "inF4"
+                              Name 154  "inI2"
+                              Name 157  "i.vPos"
+                              Name 161  "@entryPointOutput"
+                              Decorate 138(inF1) Location 0
+                              Decorate 142(inF2) Location 1
+                              Decorate 146(inF3) Location 2
+                              Decorate 150(inF4) Location 3
+                              Decorate 154(inI2) Flat
+                              Decorate 154(inI2) Location 4
+                              Decorate 157(i.vPos) Location 5
+                              Decorate 161(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               8:             TypeVector 6(float) 2
+              10:             TypeVector 6(float) 3
+              12:             TypeVector 6(float) 4
+              14:             TypeInt 32 1
+              15:             TypeVector 14(int) 2
+              30:    6(float) Constant 3204448256
+              31:    6(float) Constant 3179282432
+              32:    8(fvec2) ConstantComposite 30 31
+              36:    6(float) Constant 0
+              37:    6(float) Constant 1031798784
+              38:    8(fvec2) ConstantComposite 36 37
+              42:    6(float) Constant 1044381696
+              43:    6(float) Constant 3200253952
+              44:    8(fvec2) ConstantComposite 42 43
+              48:    6(float) Constant 1054867456
+              49:    8(fvec2) ConstantComposite 48 30
+              53:     14(int) Constant 28
+              64:             TypeInt 32 0
+              65:     64(int) Constant 3
+             137:             TypePointer Input 6(float)
+       138(inF1):    137(ptr) Variable Input
+             141:             TypePointer Input 8(fvec2)
+       142(inF2):    141(ptr) Variable Input
+             145:             TypePointer Input 10(fvec3)
+       146(inF3):    145(ptr) Variable Input
+             149:             TypePointer Input 12(fvec4)
+       150(inF4):    149(ptr) Variable Input
+             153:             TypePointer Input 15(ivec2)
+       154(inI2):    153(ptr) Variable Input
+     157(i.vPos):    141(ptr) Variable Input
+             160:             TypePointer Output 12(fvec4)
+161(@entryPointOutput):    160(ptr) Variable Output
+             273:   15(ivec2) ConstantComposite 53 53
+         4(main):           2 Function None 3
+               5:             Label
+             155:   15(ivec2) Load 154(inI2)
+             183:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 138(inF1) 32
+             185:    8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 142(inF2) 38
+             187:   10(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 146(inF3) 44
+             189:   12(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 150(inF4) 49
+             193:   15(ivec2) ShiftLeftLogical 155 273
+             195:   15(ivec2) ShiftRightArithmetic 193 273
+             196:    8(fvec2) ConvertSToF 195
+             197:    8(fvec2) VectorTimesScalar 196 37
+             198:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 138(inF1) 197
+             200:    6(float) FAdd 183 198
+             202:    6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 138(inF1) 65
+             204:    6(float) FAdd 200 202
+             206:    8(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 142(inF2) 65
+             208:    8(fvec2) FAdd 185 206
+             210:   10(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 146(inF3) 65
+             212:   10(fvec3) FAdd 187 210
+             214:   12(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 150(inF4) 65
+             216:   12(fvec4) FAdd 189 214
+             219:     14(int) CompositeExtract 155 0
+             220:     64(int) Bitcast 219
+             221:    6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 138(inF1) 220
+             223:    6(float) FAdd 204 221
+             225:    6(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 138(inF1)
+             227:    6(float) FAdd 223 225
+             229:    8(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 142(inF2)
+             231:    8(fvec2) FAdd 208 229
+             233:   10(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 146(inF3)
+             235:   10(fvec3) FAdd 212 233
+             237:   12(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 150(inF4)
+             239:   12(fvec4) FAdd 216 237
+             242:    8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 157(i.vPos) 38
+             244:    8(fvec2) FAdd 231 242
+             247:    8(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 157(i.vPos) 65
+             249:    8(fvec2) FAdd 244 247
+             252:    8(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 157(i.vPos)
+             254:    8(fvec2) FAdd 249 252
+             257:    6(float) CompositeExtract 254 1
+             259:    6(float) CompositeExtract 235 2
+             261:    6(float) CompositeExtract 239 3
+             262:   12(fvec4) CompositeConstruct 227 257 259 261
+                              Store 161(@entryPointOutput) 262
+                              Return
+                              FunctionEnd
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/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.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/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/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.vert.out b/Test/baseResults/420.vert.out
index 1a57b34..b3d9e70 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -306,6 +306,7 @@
 0:?     'samp1D' ( uniform sampler1D)
 0:?     'samp1Ds' ( uniform sampler1DShadow)
 0:?     'badArray' (layout( binding=0) writeonly uniform unsized 1-element array of image1D)
+0:?     'u_sampler0' (layout( binding=74) uniform 6-element array of sampler2D)
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
@@ -388,6 +389,7 @@
 0:?     'samp1D' ( uniform sampler1D)
 0:?     'samp1Ds' ( uniform sampler1DShadow)
 0:?     'badArray' (layout( binding=0) writeonly uniform 1-element array of image1D)
+0:?     'u_sampler0' (layout( binding=74) uniform 6-element array of sampler2D)
 0:?     'gl_VertexID' ( gl_VertexId int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
 
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/440.frag.out b/Test/baseResults/440.frag.out
index 1ac6e7c..c7ff728 100644
--- a/Test/baseResults/440.frag.out
+++ b/Test/baseResults/440.frag.out
@@ -118,6 +118,7 @@
 0:?     'aconst' ( global 4-element array of int)
 0:?     'bconst' ( global 64-element array of int)
 0:?     'sampInArray' ( smooth sample in 4-element array of 3-component vector of float)
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 128-element array of structure{ global 3-component vector of float vPositionWs} g_pointLightData})
 
 
 Linked fragment stage:
@@ -162,4 +163,5 @@
 0:?     'aconst' ( global 4-element array of int)
 0:?     'bconst' ( global 64-element array of int)
 0:?     'sampInArray' ( smooth sample in 4-element array of 3-component vector of float)
+0:?     'anon@0' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 128-element array of structure{ global 3-component vector of float vPositionWs} g_pointLightData})
 
diff --git a/Test/baseResults/450.frag.out b/Test/baseResults/450.frag.out
index 9cbb4cb..ec184ac 100644
--- a/Test/baseResults/450.frag.out
+++ b/Test/baseResults/450.frag.out
@@ -1,10 +1,14 @@
 450.frag
-ERROR: 0:63: 'location' : cannot use in a block array where new locations are needed for each block element 
-ERROR: 0:68: 'early_fragment_tests' : can only apply to a standalone qualifier 
-ERROR: 2 compilation errors.  No code generated.
+ERROR: 0:70: 'offsets' : argument must be compile-time constant 
+ERROR: 0:71: 'offsets' : argument must be compile-time constant 
+ERROR: 0:72: 'offsets' : argument must be compile-time constant 
+ERROR: 0:88: 'location' : cannot use in a block array where new locations are needed for each block element 
+ERROR: 0:93: 'early_fragment_tests' : can only apply to a standalone qualifier 
+ERROR: 5 compilation errors.  No code generated.
 
 
 Shader version: 450
+Requested GL_ARB_sparse_texture2
 ERROR: node is still EOpNull!
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
@@ -133,26 +137,107 @@
 0:48              2 (const int)
 0:48            Constant:
 0:48              4.500000
-0:53  Function Definition: cull(i1; ( global float)
-0:53    Function Parameters: 
-0:53      'i' ( in int)
-0:55    Sequence
-0:55      Branch: Return with expression
-0:55        Test condition and select ( temp float)
-0:55          Condition
-0:55          Compare Greater Than or Equal ( temp bool)
-0:55            'i' ( in int)
-0:55            Constant:
-0:55              6 (const int)
-0:55          true case
-0:55          direct index ( smooth temp float CullDistance)
-0:55            'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
-0:55            Constant:
-0:55              5 (const int)
-0:55          false case
-0:55          indirect index ( smooth temp float CullDistance)
-0:55            'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
-0:55            'i' ( in int)
+0:61  Function Definition: testOffsets( ( global void)
+0:61    Function Parameters: 
+0:63    Sequence
+0:63      Sequence
+0:63        move second child to first child ( temp 4-component vector of float)
+0:63          'texel' ( temp 4-component vector of float)
+0:63          Constant:
+0:63            0.000000
+0:63            0.000000
+0:63            0.000000
+0:63            0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 4-component vector of int)
+0:64          'itexel' ( temp 4-component vector of int)
+0:64          Constant:
+0:64            0 (const int)
+0:64            0 (const int)
+0:64            0 (const int)
+0:64            0 (const int)
+0:66      sparseTextureGatherOffsets ( global int)
+0:66        's2D' ( uniform sampler2D)
+0:66        'c2' ( smooth in 2-component vector of float)
+0:66        Constant:
+0:66          1 (const int)
+0:66          2 (const int)
+0:66          3 (const int)
+0:66          4 (const int)
+0:66          15 (const int)
+0:66          16 (const int)
+0:66          -2 (const int)
+0:66          0 (const int)
+0:66        'texel' ( temp 4-component vector of float)
+0:67      sparseTextureGatherOffsets ( global int)
+0:67        'is2DArray' ( uniform isampler2DArray)
+0:67        'c3' ( smooth in 3-component vector of float)
+0:67        Constant:
+0:67          1 (const int)
+0:67          2 (const int)
+0:67          3 (const int)
+0:67          4 (const int)
+0:67          15 (const int)
+0:67          16 (const int)
+0:67          -2 (const int)
+0:67          0 (const int)
+0:67        'itexel' ( temp 4-component vector of int)
+0:67        Constant:
+0:67          2 (const int)
+0:68      sparseTextureGatherOffsets ( global int)
+0:68        's2DRectShadow' ( uniform sampler2DRectShadow)
+0:68        'c2' ( smooth in 2-component vector of float)
+0:68        Constant:
+0:68          2.000000
+0:68        Constant:
+0:68          1 (const int)
+0:68          2 (const int)
+0:68          3 (const int)
+0:68          4 (const int)
+0:68          15 (const int)
+0:68          16 (const int)
+0:68          -2 (const int)
+0:68          0 (const int)
+0:68        'texel' ( temp 4-component vector of float)
+0:70      sparseTextureGatherOffsets ( global int)
+0:70        's2D' ( uniform sampler2D)
+0:70        'c2' ( smooth in 2-component vector of float)
+0:70        'offsets' ( flat in 4-element array of 2-component vector of int)
+0:70        'texel' ( temp 4-component vector of float)
+0:71      sparseTextureGatherOffsets ( global int)
+0:71        'is2DArray' ( uniform isampler2DArray)
+0:71        'c3' ( smooth in 3-component vector of float)
+0:71        'offsets' ( flat in 4-element array of 2-component vector of int)
+0:71        'itexel' ( temp 4-component vector of int)
+0:71        Constant:
+0:71          2 (const int)
+0:72      sparseTextureGatherOffsets ( global int)
+0:72        's2DRectShadow' ( uniform sampler2DRectShadow)
+0:72        'c2' ( smooth in 2-component vector of float)
+0:72        Constant:
+0:72          2.000000
+0:72        'offsets' ( flat in 4-element array of 2-component vector of int)
+0:72        'texel' ( temp 4-component vector of float)
+0:78  Function Definition: cull(i1; ( global float)
+0:78    Function Parameters: 
+0:78      'i' ( in int)
+0:80    Sequence
+0:80      Branch: Return with expression
+0:80        Test condition and select ( temp float)
+0:80          Condition
+0:80          Compare Greater Than or Equal ( temp bool)
+0:80            'i' ( in int)
+0:80            Constant:
+0:80              6 (const int)
+0:80          true case
+0:80          direct index ( smooth temp float CullDistance)
+0:80            'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
+0:80            Constant:
+0:80              5 (const int)
+0:80          false case
+0:80          indirect index ( smooth temp float CullDistance)
+0:80            'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
+0:80            'i' ( in int)
 0:?   Linker Objects
 0:?     'in1' ( smooth in float)
 0:?     'in2' ( smooth in 2-component vector of float)
@@ -163,6 +248,12 @@
 0:?     'us2dmsa' ( uniform usampler2DMSArray)
 0:?     'ii2dms' (layout( rgba32i) uniform iimage2DMS)
 0:?     'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
+0:?     's2D' ( uniform sampler2D)
+0:?     'is2DArray' ( uniform isampler2DArray)
+0:?     's2DRectShadow' ( uniform sampler2DRectShadow)
+0:?     'offsets' ( flat in 4-element array of 2-component vector of int)
+0:?     'c2' ( smooth in 2-component vector of float)
+0:?     'c3' ( smooth in 3-component vector of float)
 0:?     'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
 0:?     'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
 0:?     'f' ( smooth in float)
@@ -172,6 +263,7 @@
 
 
 Shader version: 450
+Requested GL_ARB_sparse_texture2
 ERROR: node is still EOpNull!
 0:8  Function Definition: main( ( global void)
 0:8    Function Parameters: 
@@ -279,6 +371,12 @@
 0:?     'us2dmsa' ( uniform usampler2DMSArray)
 0:?     'ii2dms' (layout( rgba32i) uniform iimage2DMS)
 0:?     'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
+0:?     's2D' ( uniform sampler2D)
+0:?     'is2DArray' ( uniform isampler2DArray)
+0:?     's2DRectShadow' ( uniform sampler2DRectShadow)
+0:?     'offsets' ( flat in 4-element array of 2-component vector of int)
+0:?     'c2' ( smooth in 2-component vector of float)
+0:?     'c3' ( smooth in 3-component vector of float)
 0:?     'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
 0:?     'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
 0:?     'f' ( smooth in float)
diff --git a/Test/baseResults/contradict_0.geom.out b/Test/baseResults/contradict_0.geom.out
old mode 100755
new mode 100644
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.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/hlsl.earlydepthstencil.frag.out b/Test/baseResults/hlsl.earlydepthstencil.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out b/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
deleted file mode 100644
index 502ad0f..0000000
--- a/Test/baseResults/hlsl.intrinsics.evalfns.frag.out
+++ /dev/null
@@ -1,287 +0,0 @@
-hlsl.intrinsics.evalfns.frag
-Shader version: 500
-gl_FragCoord origin is upper left
-0:? Sequence
-0:3  Function Definition: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
-0:3    Function Parameters: 
-0:3      'inF1' ( in float)
-0:3      'inF2' ( in 2-component vector of float)
-0:3      'inF3' ( in 3-component vector of float)
-0:3      'inF4' ( in 4-component vector of float)
-0:3      'inI2' ( in 2-component vector of int)
-0:?     Sequence
-0:4      interpolateAtOffset ( temp float)
-0:4        'inF1' ( in float)
-0:?         Constant:
-0:?           -0.500000
-0:?           -0.062500
-0:5      interpolateAtOffset ( temp 2-component vector of float)
-0:5        'inF2' ( in 2-component vector of float)
-0:?         Constant:
-0:?           0.000000
-0:?           0.062500
-0:6      interpolateAtOffset ( temp 3-component vector of float)
-0:6        'inF3' ( in 3-component vector of float)
-0:?         Constant:
-0:?           0.187500
-0:?           -0.375000
-0:7      interpolateAtOffset ( temp 4-component vector of float)
-0:7        'inF4' ( in 4-component vector of float)
-0:?         Constant:
-0:?           0.437500
-0:?           -0.500000
-0:9      interpolateAtOffset ( temp float)
-0:9        'inF1' ( in float)
-0:9        vector-scale ( temp 2-component vector of float)
-0:9          Convert int to float ( temp 2-component vector of float)
-0:9            right-shift ( temp 2-component vector of int)
-0:9              left-shift ( temp 2-component vector of int)
-0:9                'inI2' ( in 2-component vector of int)
-0:9                Constant:
-0:9                  28 (const int)
-0:9              Constant:
-0:9                28 (const int)
-0:9          Constant:
-0:9            0.062500
-0:3  Function Definition: main( ( temp void)
-0:3    Function Parameters: 
-0:?     Sequence
-0:3      move second child to first child ( temp float)
-0:?         'inF1' ( temp float)
-0:?         'inF1' (layout( location=0) in float)
-0:3      move second child to first child ( temp 2-component vector of float)
-0:?         'inF2' ( temp 2-component vector of float)
-0:?         'inF2' (layout( location=1) in 2-component vector of float)
-0:3      move second child to first child ( temp 3-component vector of float)
-0:?         'inF3' ( temp 3-component vector of float)
-0:?         'inF3' (layout( location=2) in 3-component vector of float)
-0:3      move second child to first child ( temp 4-component vector of float)
-0:?         'inF4' ( temp 4-component vector of float)
-0:?         'inF4' (layout( location=3) in 4-component vector of float)
-0:3      move second child to first child ( temp 2-component vector of int)
-0:?         'inI2' ( temp 2-component vector of int)
-0:?         'inI2' (layout( location=4) flat in 2-component vector of int)
-0:3      Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
-0:?         'inF1' ( temp float)
-0:?         'inF2' ( temp 2-component vector of float)
-0:?         'inF3' ( temp 3-component vector of float)
-0:?         'inF4' ( temp 4-component vector of float)
-0:?         'inI2' ( temp 2-component vector of int)
-0:?   Linker Objects
-0:?     'inF1' (layout( location=0) in float)
-0:?     'inF2' (layout( location=1) in 2-component vector of float)
-0:?     'inF3' (layout( location=2) in 3-component vector of float)
-0:?     'inF4' (layout( location=3) in 4-component vector of float)
-0:?     'inI2' (layout( location=4) flat in 2-component vector of int)
-
-
-Linked fragment stage:
-
-
-Shader version: 500
-gl_FragCoord origin is upper left
-0:? Sequence
-0:3  Function Definition: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
-0:3    Function Parameters: 
-0:3      'inF1' ( in float)
-0:3      'inF2' ( in 2-component vector of float)
-0:3      'inF3' ( in 3-component vector of float)
-0:3      'inF4' ( in 4-component vector of float)
-0:3      'inI2' ( in 2-component vector of int)
-0:?     Sequence
-0:4      interpolateAtOffset ( temp float)
-0:4        'inF1' ( in float)
-0:?         Constant:
-0:?           -0.500000
-0:?           -0.062500
-0:5      interpolateAtOffset ( temp 2-component vector of float)
-0:5        'inF2' ( in 2-component vector of float)
-0:?         Constant:
-0:?           0.000000
-0:?           0.062500
-0:6      interpolateAtOffset ( temp 3-component vector of float)
-0:6        'inF3' ( in 3-component vector of float)
-0:?         Constant:
-0:?           0.187500
-0:?           -0.375000
-0:7      interpolateAtOffset ( temp 4-component vector of float)
-0:7        'inF4' ( in 4-component vector of float)
-0:?         Constant:
-0:?           0.437500
-0:?           -0.500000
-0:9      interpolateAtOffset ( temp float)
-0:9        'inF1' ( in float)
-0:9        vector-scale ( temp 2-component vector of float)
-0:9          Convert int to float ( temp 2-component vector of float)
-0:9            right-shift ( temp 2-component vector of int)
-0:9              left-shift ( temp 2-component vector of int)
-0:9                'inI2' ( in 2-component vector of int)
-0:9                Constant:
-0:9                  28 (const int)
-0:9              Constant:
-0:9                28 (const int)
-0:9          Constant:
-0:9            0.062500
-0:3  Function Definition: main( ( temp void)
-0:3    Function Parameters: 
-0:?     Sequence
-0:3      move second child to first child ( temp float)
-0:?         'inF1' ( temp float)
-0:?         'inF1' (layout( location=0) in float)
-0:3      move second child to first child ( temp 2-component vector of float)
-0:?         'inF2' ( temp 2-component vector of float)
-0:?         'inF2' (layout( location=1) in 2-component vector of float)
-0:3      move second child to first child ( temp 3-component vector of float)
-0:?         'inF3' ( temp 3-component vector of float)
-0:?         'inF3' (layout( location=2) in 3-component vector of float)
-0:3      move second child to first child ( temp 4-component vector of float)
-0:?         'inF4' ( temp 4-component vector of float)
-0:?         'inF4' (layout( location=3) in 4-component vector of float)
-0:3      move second child to first child ( temp 2-component vector of int)
-0:?         'inI2' ( temp 2-component vector of int)
-0:?         'inI2' (layout( location=4) flat in 2-component vector of int)
-0:3      Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
-0:?         'inF1' ( temp float)
-0:?         'inF2' ( temp 2-component vector of float)
-0:?         'inF3' ( temp 3-component vector of float)
-0:?         'inF4' ( temp 4-component vector of float)
-0:?         'inI2' ( temp 2-component vector of int)
-0:?   Linker Objects
-0:?     'inF1' (layout( location=0) in float)
-0:?     'inF2' (layout( location=1) in 2-component vector of float)
-0:?     'inF3' (layout( location=2) in 3-component vector of float)
-0:?     'inF4' (layout( location=3) in 4-component vector of float)
-0:?     'inI2' (layout( location=4) flat in 2-component vector of int)
-
-Validation failed
-// Module Version 10000
-// Generated by (magic number): 8000a
-// Id's are bound by 80
-
-                              Capability Shader
-                              Capability InterpolationFunction
-               1:             ExtInstImport  "GLSL.std.450"
-                              MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 51 55 59 63 67
-                              ExecutionMode 4 OriginUpperLeft
-                              Source HLSL 500
-                              Name 4  "main"
-                              Name 23  "@main(f1;vf2;vf3;vf4;vi2;"
-                              Name 18  "inF1"
-                              Name 19  "inF2"
-                              Name 20  "inF3"
-                              Name 21  "inF4"
-                              Name 22  "inI2"
-                              Name 49  "inF1"
-                              Name 51  "inF1"
-                              Name 53  "inF2"
-                              Name 55  "inF2"
-                              Name 57  "inF3"
-                              Name 59  "inF3"
-                              Name 61  "inF4"
-                              Name 63  "inF4"
-                              Name 65  "inI2"
-                              Name 67  "inI2"
-                              Name 69  "param"
-                              Name 71  "param"
-                              Name 73  "param"
-                              Name 75  "param"
-                              Name 77  "param"
-                              Decorate 51(inF1) Location 0
-                              Decorate 55(inF2) Location 1
-                              Decorate 59(inF3) Location 2
-                              Decorate 63(inF4) Location 3
-                              Decorate 67(inI2) Flat
-                              Decorate 67(inI2) Location 4
-               2:             TypeVoid
-               3:             TypeFunction 2
-               6:             TypeFloat 32
-               7:             TypePointer Function 6(float)
-               8:             TypeVector 6(float) 2
-               9:             TypePointer Function 8(fvec2)
-              10:             TypeVector 6(float) 3
-              11:             TypePointer Function 10(fvec3)
-              12:             TypeVector 6(float) 4
-              13:             TypePointer Function 12(fvec4)
-              14:             TypeInt 32 1
-              15:             TypeVector 14(int) 2
-              16:             TypePointer Function 15(ivec2)
-              17:             TypeFunction 2 7(ptr) 9(ptr) 11(ptr) 13(ptr) 16(ptr)
-              25:    6(float) Constant 3204448256
-              26:    6(float) Constant 3179282432
-              27:    8(fvec2) ConstantComposite 25 26
-              29:    6(float) Constant 0
-              30:    6(float) Constant 1031798784
-              31:    8(fvec2) ConstantComposite 29 30
-              33:    6(float) Constant 1044381696
-              34:    6(float) Constant 3200253952
-              35:    8(fvec2) ConstantComposite 33 34
-              37:    6(float) Constant 1054867456
-              38:    8(fvec2) ConstantComposite 37 25
-              41:     14(int) Constant 28
-              50:             TypePointer Input 6(float)
-        51(inF1):     50(ptr) Variable Input
-              54:             TypePointer Input 8(fvec2)
-        55(inF2):     54(ptr) Variable Input
-              58:             TypePointer Input 10(fvec3)
-        59(inF3):     58(ptr) Variable Input
-              62:             TypePointer Input 12(fvec4)
-        63(inF4):     62(ptr) Variable Input
-              66:             TypePointer Input 15(ivec2)
-        67(inI2):     66(ptr) Variable Input
-         4(main):           2 Function None 3
-               5:             Label
-        49(inF1):      7(ptr) Variable Function
-        53(inF2):      9(ptr) Variable Function
-        57(inF3):     11(ptr) Variable Function
-        61(inF4):     13(ptr) Variable Function
-        65(inI2):     16(ptr) Variable Function
-       69(param):      7(ptr) Variable Function
-       71(param):      9(ptr) Variable Function
-       73(param):     11(ptr) Variable Function
-       75(param):     13(ptr) Variable Function
-       77(param):     16(ptr) Variable Function
-              52:    6(float) Load 51(inF1)
-                              Store 49(inF1) 52
-              56:    8(fvec2) Load 55(inF2)
-                              Store 53(inF2) 56
-              60:   10(fvec3) Load 59(inF3)
-                              Store 57(inF3) 60
-              64:   12(fvec4) Load 63(inF4)
-                              Store 61(inF4) 64
-              68:   15(ivec2) Load 67(inI2)
-                              Store 65(inI2) 68
-              70:    6(float) Load 49(inF1)
-                              Store 69(param) 70
-              72:    8(fvec2) Load 53(inF2)
-                              Store 71(param) 72
-              74:   10(fvec3) Load 57(inF3)
-                              Store 73(param) 74
-              76:   12(fvec4) Load 61(inF4)
-                              Store 75(param) 76
-              78:   15(ivec2) Load 65(inI2)
-                              Store 77(param) 78
-              79:           2 FunctionCall 23(@main(f1;vf2;vf3;vf4;vi2;) 69(param) 71(param) 73(param) 75(param) 77(param)
-                              Return
-                              FunctionEnd
-23(@main(f1;vf2;vf3;vf4;vi2;):           2 Function None 17
-        18(inF1):      7(ptr) FunctionParameter
-        19(inF2):      9(ptr) FunctionParameter
-        20(inF3):     11(ptr) FunctionParameter
-        21(inF4):     13(ptr) FunctionParameter
-        22(inI2):     16(ptr) FunctionParameter
-              24:             Label
-              28:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 18(inF1) 27
-              32:    8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 19(inF2) 31
-              36:   10(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 20(inF3) 35
-              39:   12(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 21(inF4) 38
-              40:   15(ivec2) Load 22(inI2)
-              42:   15(ivec2) CompositeConstruct 41 41
-              43:   15(ivec2) ShiftLeftLogical 40 42
-              44:   15(ivec2) CompositeConstruct 41 41
-              45:   15(ivec2) ShiftRightArithmetic 43 44
-              46:    8(fvec2) ConvertSToF 45
-              47:    8(fvec2) VectorTimesScalar 46 30
-              48:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 18(inF1) 47
-                              Return
-                              FunctionEnd
diff --git a/Test/baseResults/hlsl.load.2dms.dx10.frag.out b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
index 9986074..02365b8 100644
--- a/Test/baseResults/hlsl.load.2dms.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.2dms.dx10.frag.out
@@ -357,6 +357,7 @@
 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): 8000a
 // Id's are bound by 130
diff --git a/Test/baseResults/hlsl.load.offset.dx10.frag.out b/Test/baseResults/hlsl.load.offset.dx10.frag.out
index d0fa5fd..135b4af 100644
--- a/Test/baseResults/hlsl.load.offset.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offset.dx10.frag.out
@@ -561,6 +561,7 @@
 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): 8000a
 // Id's are bound by 201
diff --git a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
index a379068..24aa368 100644
--- a/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
+++ b/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out
@@ -435,6 +435,7 @@
 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): 8000a
 // Id's are bound by 174
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.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.register.frag.out b/Test/baseResults/hlsl.rw.register.frag.out
index 35b4758..7bcecc9 100644
--- a/Test/baseResults/hlsl.rw.register.frag.out
+++ b/Test/baseResults/hlsl.rw.register.frag.out
@@ -97,6 +97,7 @@
 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): 8000a
 // Id's are bound by 42
diff --git a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
index 2c67075..0614677 100644
--- a/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
@@ -1689,6 +1689,7 @@
 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): 8000a
 // Id's are bound by 571
diff --git a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
index 093665c..68e40de 100644
--- a/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
+++ b/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
@@ -1707,6 +1707,7 @@
 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): 8000a
 // Id's are bound by 605
diff --git a/Test/baseResults/hlsl.singleArgIntPromo.vert.out b/Test/baseResults/hlsl.singleArgIntPromo.vert.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.specConstant.frag.out b/Test/baseResults/hlsl.specConstant.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/hlsl.structbuffer.append.fn.frag.out b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
index 6a239da..2ac904e 100644
--- a/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.append.fn.frag.out
@@ -190,13 +190,13 @@
                               Decorate 9 BufferBlock
                               Decorate 12 BufferBlock
                               Decorate 49(sbuf_a) DescriptorSet 0
-                              Decorate 49(sbuf_a) Binding 4
+                              Decorate 49(sbuf_a) Binding 0
                               Decorate 50(sbuf_a@count) DescriptorSet 0
-                              Decorate 50(sbuf_a@count) Binding 6
+                              Decorate 50(sbuf_a@count) Binding 0
                               Decorate 51(sbuf_c) DescriptorSet 0
-                              Decorate 51(sbuf_c) Binding 5
+                              Decorate 51(sbuf_c) Binding 1
                               Decorate 52(sbuf_c@count) DescriptorSet 0
-                              Decorate 52(sbuf_c@count) Binding 7
+                              Decorate 52(sbuf_c@count) Binding 0
                               Decorate 58(pos) Flat
                               Decorate 58(pos) Location 0
                               Decorate 61(@entryPointOutput) Location 0
diff --git a/Test/baseResults/hlsl.structbuffer.fn.frag.out b/Test/baseResults/hlsl.structbuffer.fn.frag.out
index c5afd35..bd2a4e6 100644
--- a/Test/baseResults/hlsl.structbuffer.fn.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.fn.frag.out
@@ -191,9 +191,9 @@
                               Decorate 18 BufferBlock
                               Decorate 20 BufferBlock
                               Decorate 47(sbuf2) DescriptorSet 0
-                              Decorate 47(sbuf2) Binding 2
+                              Decorate 47(sbuf2) Binding 0
                               Decorate 48(sbuf2@count) DescriptorSet 0
-                              Decorate 48(sbuf2@count) Binding 3
+                              Decorate 48(sbuf2@count) Binding 0
                               Decorate 50(sbuf) DescriptorSet 0
                               Decorate 50(sbuf) Binding 10
                               Decorate 63(pos) Flat
diff --git a/Test/baseResults/iomap.crossStage.2.vert.out b/Test/baseResults/iomap.crossStage.2.vert.out
new file mode 100644
index 0000000..325c1b4
--- /dev/null
+++ b/Test/baseResults/iomap.crossStage.2.vert.out
@@ -0,0 +1,787 @@
+iomap.crossStage.2.vert
+Shader version: 460
+0:? Sequence
+0:32  Function Definition: main( ( global void)
+0:32    Function Parameters: 
+0:34    Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:34        'vgo1' ( smooth out 4-component vector of float)
+0:34        Constant:
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:35      move second child to first child ( temp 2-component vector of float)
+0:35        'vgo2' ( smooth out 2-component vector of float)
+0:35        Constant:
+0:35          0.000000
+0:35          0.000000
+0:36      move second child to first child ( temp 4-component vector of float)
+0:36        o3: direct index for structure ( out 4-component vector of float)
+0:36          'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        Constant:
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:?   Linker Objects
+0:?     'vgo1' ( smooth out 4-component vector of float)
+0:?     'vgo2' ( smooth out 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.crossStage.2.geom
+Shader version: 460
+invocations = -1
+max_vertices = 3
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:29  Function Definition: main( ( global void)
+0:29    Function Parameters: 
+0:31    Sequence
+0:31      Sequence
+0:31        Sequence
+0:31          move second child to first child ( temp int)
+0:31            'i' ( temp int)
+0:31            Constant:
+0:31              0 (const int)
+0:31        Loop with condition tested first
+0:31          Loop Condition
+0:31          Compare Less Than ( temp bool)
+0:31            'i' ( temp int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Loop Body
+0:32          Sequence
+0:32            move second child to first child ( temp 4-component vector of float)
+0:32              'gfo1' (layout( stream=0) out 4-component vector of float)
+0:32              Constant:
+0:32                0.000000
+0:32                0.000000
+0:32                0.000000
+0:32                0.000000
+0:33            move second child to first child ( temp 2-component vector of float)
+0:33              'gfo2' (layout( stream=0) out 2-component vector of float)
+0:33              Constant:
+0:33                0.000000
+0:33                0.000000
+0:34            move second child to first child ( temp 4-component vector of float)
+0:34              o3: direct index for structure (layout( stream=0) out 4-component vector of float)
+0:34                'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out 4-component vector of float o3})
+0:34                Constant:
+0:34                  0 (const int)
+0:34              o3: direct index for structure ( in 4-component vector of float)
+0:34                indirect index (layout( location=5) temp block{ in 4-component vector of float o3})
+0:34                  'inBlock' (layout( location=5) in 1-element array of block{ in 4-component vector of float o3})
+0:34                  'i' ( temp int)
+0:34                Constant:
+0:34                  0 (const int)
+0:35            EmitVertex ( global void)
+0:31          Loop Terminal Expression
+0:31          Post-Increment ( temp int)
+0:31            'i' ( temp int)
+0:37      EndPrimitive ( global void)
+0:?   Linker Objects
+0:?     'vgo1' ( in 1-element array of 4-component vector of float)
+0:?     'vgo2' ( in 1-element array of 2-component vector of float)
+0:?     'inBlock' (layout( location=5) in 1-element array of block{ in 4-component vector of float o3})
+0:?     'gfo1' (layout( stream=0) out 4-component vector of float)
+0:?     'gfo2' (layout( stream=0) out 2-component vector of float)
+0:?     'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+
+iomap.crossStage.2.frag
+Shader version: 460
+0:? Sequence
+0:37  Function Definition: main( ( global void)
+0:37    Function Parameters: 
+0:39    Sequence
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          'color' ( temp 4-component vector of float)
+0:39          component-wise multiply ( temp 4-component vector of float)
+0:39            component-wise multiply ( temp 4-component vector of float)
+0:39              component-wise multiply ( temp 4-component vector of float)
+0:39                'gfo1' ( smooth in 4-component vector of float)
+0:39                vector swizzle ( temp 4-component vector of float)
+0:39                  'u1' ( uniform 2-component vector of float)
+0:39                  Sequence
+0:39                    Constant:
+0:39                      0 (const int)
+0:39                    Constant:
+0:39                      1 (const int)
+0:39                    Constant:
+0:39                      0 (const int)
+0:39                    Constant:
+0:39                      1 (const int)
+0:39              vector swizzle ( temp 4-component vector of float)
+0:39                'u2' ( uniform 3-component vector of float)
+0:39                Sequence
+0:39                  Constant:
+0:39                    0 (const int)
+0:39                  Constant:
+0:39                    1 (const int)
+0:39                  Constant:
+0:39                    2 (const int)
+0:39                  Constant:
+0:39                    0 (const int)
+0:39            vector swizzle ( temp 4-component vector of float)
+0:39              'u3' ( uniform 4-component vector of float)
+0:39                0.000000
+0:39                0.000000
+0:39                0.000000
+0:39                0.000000
+0:39              Sequence
+0:39                Constant:
+0:39                  0 (const int)
+0:39                Constant:
+0:39                  1 (const int)
+0:39                Constant:
+0:39                  2 (const int)
+0:39                Constant:
+0:39                  3 (const int)
+0:40      move second child to first child ( temp 4-component vector of float)
+0:40        'outColor' ( out 4-component vector of float)
+0:40        'color' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in 4-component vector of float o3})
+0:?     'gfo1' ( smooth in 4-component vector of float)
+0:?     'gfo2' ( smooth in 2-component vector of float)
+0:?     'outColor' ( out 4-component vector of float)
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+
+
+Linked vertex stage:
+
+
+Linked geometry stage:
+
+
+Linked fragment stage:
+
+WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
+    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}"
+
+Shader version: 460
+0:? Sequence
+0:32  Function Definition: main( ( global void)
+0:32    Function Parameters: 
+0:34    Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:34        'vgo1' ( smooth out 4-component vector of float)
+0:34        Constant:
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:35      move second child to first child ( temp 2-component vector of float)
+0:35        'vgo2' ( smooth out 2-component vector of float)
+0:35        Constant:
+0:35          0.000000
+0:35          0.000000
+0:36      move second child to first child ( temp 4-component vector of float)
+0:36        o3: direct index for structure ( out 4-component vector of float)
+0:36          'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        Constant:
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:?   Linker Objects
+0:?     'vgo1' ( smooth out 4-component vector of float)
+0:?     'vgo2' ( smooth out 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 460
+invocations = 1
+max_vertices = 3
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:29  Function Definition: main( ( global void)
+0:29    Function Parameters: 
+0:31    Sequence
+0:31      Sequence
+0:31        Sequence
+0:31          move second child to first child ( temp int)
+0:31            'i' ( temp int)
+0:31            Constant:
+0:31              0 (const int)
+0:31        Loop with condition tested first
+0:31          Loop Condition
+0:31          Compare Less Than ( temp bool)
+0:31            'i' ( temp int)
+0:31            Constant:
+0:31              3 (const int)
+0:31          Loop Body
+0:32          Sequence
+0:32            move second child to first child ( temp 4-component vector of float)
+0:32              'gfo1' (layout( stream=0) out 4-component vector of float)
+0:32              Constant:
+0:32                0.000000
+0:32                0.000000
+0:32                0.000000
+0:32                0.000000
+0:33            move second child to first child ( temp 2-component vector of float)
+0:33              'gfo2' (layout( stream=0) out 2-component vector of float)
+0:33              Constant:
+0:33                0.000000
+0:33                0.000000
+0:34            move second child to first child ( temp 4-component vector of float)
+0:34              o3: direct index for structure (layout( stream=0) out 4-component vector of float)
+0:34                'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out 4-component vector of float o3})
+0:34                Constant:
+0:34                  0 (const int)
+0:34              o3: direct index for structure ( in 4-component vector of float)
+0:34                indirect index (layout( location=5) temp block{ in 4-component vector of float o3})
+0:34                  'inBlock' (layout( location=5) in 1-element array of block{ in 4-component vector of float o3})
+0:34                  'i' ( temp int)
+0:34                Constant:
+0:34                  0 (const int)
+0:35            EmitVertex ( global void)
+0:31          Loop Terminal Expression
+0:31          Post-Increment ( temp int)
+0:31            'i' ( temp int)
+0:37      EndPrimitive ( global void)
+0:?   Linker Objects
+0:?     'vgo1' ( in 1-element array of 4-component vector of float)
+0:?     'vgo2' ( in 1-element array of 2-component vector of float)
+0:?     'inBlock' (layout( location=5) in 1-element array of block{ in 4-component vector of float o3})
+0:?     'gfo1' (layout( stream=0) out 4-component vector of float)
+0:?     'gfo2' (layout( stream=0) out 2-component vector of float)
+0:?     'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+Shader version: 460
+0:? Sequence
+0:37  Function Definition: main( ( global void)
+0:37    Function Parameters: 
+0:39    Sequence
+0:39      Sequence
+0:39        move second child to first child ( temp 4-component vector of float)
+0:39          'color' ( temp 4-component vector of float)
+0:39          component-wise multiply ( temp 4-component vector of float)
+0:39            component-wise multiply ( temp 4-component vector of float)
+0:39              component-wise multiply ( temp 4-component vector of float)
+0:39                'gfo1' ( smooth in 4-component vector of float)
+0:39                vector swizzle ( temp 4-component vector of float)
+0:39                  'u1' ( uniform 2-component vector of float)
+0:39                  Sequence
+0:39                    Constant:
+0:39                      0 (const int)
+0:39                    Constant:
+0:39                      1 (const int)
+0:39                    Constant:
+0:39                      0 (const int)
+0:39                    Constant:
+0:39                      1 (const int)
+0:39              vector swizzle ( temp 4-component vector of float)
+0:39                'u2' ( uniform 3-component vector of float)
+0:39                Sequence
+0:39                  Constant:
+0:39                    0 (const int)
+0:39                  Constant:
+0:39                    1 (const int)
+0:39                  Constant:
+0:39                    2 (const int)
+0:39                  Constant:
+0:39                    0 (const int)
+0:39            vector swizzle ( temp 4-component vector of float)
+0:39              'u3' ( uniform 4-component vector of float)
+0:39                0.000000
+0:39                0.000000
+0:39                0.000000
+0:39                0.000000
+0:39              Sequence
+0:39                Constant:
+0:39                  0 (const int)
+0:39                Constant:
+0:39                  1 (const int)
+0:39                Constant:
+0:39                  2 (const int)
+0:39                Constant:
+0:39                  3 (const int)
+0:40      move second child to first child ( temp 4-component vector of float)
+0:40        'outColor' ( out 4-component vector of float)
+0:40        'color' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in 4-component vector of float o3})
+0:?     'gfo1' ( smooth in 4-component vector of float)
+0:?     'gfo2' ( smooth in 2-component vector of float)
+0:?     'outColor' ( out 4-component vector of float)
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 56
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 14 18 54 55
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "vgo1"
+                              Name 14  "vgo2"
+                              Name 16  "outBlock"
+                              MemberName 16(outBlock) 0  "o3"
+                              Name 18  ""
+                              Name 23  "u1"
+                              Name 27  "u2"
+                              Name 29  "u3"
+                              Name 36  "um2"
+                              Name 40  "glass"
+                              Name 41  "crossStageBlock1"
+                              MemberName 41(crossStageBlock1) 0  "a"
+                              MemberName 41(crossStageBlock1) 1  "b"
+                              Name 43  ""
+                              Name 44  "vertOnlyBlock"
+                              MemberName 44(vertOnlyBlock) 0  "vb1"
+                              Name 46  ""
+                              Name 47  "crossStageBlock2"
+                              MemberName 47(crossStageBlock2) 0  "a"
+                              MemberName 47(crossStageBlock2) 1  "b"
+                              Name 52  "blockName1"
+                              Name 54  "gl_VertexID"
+                              Name 55  "gl_InstanceID"
+                              Decorate 9(vgo1) Location 0
+                              Decorate 14(vgo2) Location 1
+                              Decorate 16(outBlock) Block
+                              Decorate 18 Location 5
+                              Decorate 23(u1) Location 1
+                              Decorate 23(u1) DescriptorSet 0
+                              Decorate 27(u2) Location 2
+                              Decorate 27(u2) DescriptorSet 0
+                              Decorate 29(u3) Location 3
+                              Decorate 29(u3) DescriptorSet 0
+                              Decorate 36(um2) Location 4
+                              Decorate 36(um2) DescriptorSet 0
+                              Decorate 40(glass) Location 0
+                              Decorate 40(glass) DescriptorSet 0
+                              Decorate 40(glass) Binding 0
+                              MemberDecorate 41(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 41(crossStageBlock1) 1 Offset 16
+                              Decorate 41(crossStageBlock1) Block
+                              Decorate 43 DescriptorSet 0
+                              Decorate 43 Binding 0
+                              MemberDecorate 44(vertOnlyBlock) 0 Offset 0
+                              Decorate 44(vertOnlyBlock) BufferBlock
+                              Decorate 46 DescriptorSet 0
+                              Decorate 46 Binding 0
+                              MemberDecorate 47(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 47(crossStageBlock2) 1 Offset 16
+                              Decorate 47(crossStageBlock2) Block
+                              Decorate 52(blockName1) DescriptorSet 0
+                              Decorate 52(blockName1) Binding 0
+                              Decorate 54(gl_VertexID) BuiltIn VertexId
+                              Decorate 55(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+         9(vgo1):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+        14(vgo2):     13(ptr) Variable Output
+              15:   12(fvec2) ConstantComposite 10 10
+    16(outBlock):             TypeStruct 7(fvec4)
+              17:             TypePointer Output 16(outBlock)
+              18:     17(ptr) Variable Output
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              22:             TypePointer UniformConstant 12(fvec2)
+          23(u1):     22(ptr) Variable UniformConstant
+              24:             TypeVector 6(float) 3
+              25:   24(fvec3) ConstantComposite 10 10 10
+              26:             TypePointer UniformConstant 24(fvec3)
+          27(u2):     26(ptr) Variable UniformConstant 25
+              28:             TypePointer UniformConstant 7(fvec4)
+          29(u3):     28(ptr) Variable UniformConstant 11
+              30:             TypeMatrix 12(fvec2) 2
+              31:    6(float) Constant 1082130432
+              32:   12(fvec2) ConstantComposite 31 10
+              33:   12(fvec2) ConstantComposite 10 31
+              34:          30 ConstantComposite 32 33
+              35:             TypePointer UniformConstant 30
+         36(um2):     35(ptr) Variable UniformConstant 34
+              37:             TypeImage 6(float) 2D sampled format:Unknown
+              38:             TypeSampledImage 37
+              39:             TypePointer UniformConstant 38
+       40(glass):     39(ptr) Variable UniformConstant
+41(crossStageBlock1):             TypeStruct 7(fvec4) 7(fvec4)
+              42:             TypePointer Uniform 41(crossStageBlock1)
+              43:     42(ptr) Variable Uniform
+44(vertOnlyBlock):             TypeStruct 12(fvec2)
+              45:             TypePointer Uniform 44(vertOnlyBlock)
+              46:     45(ptr) Variable Uniform
+47(crossStageBlock2):             TypeStruct 7(fvec4) 12(fvec2)
+              48:             TypeInt 32 0
+              49:     48(int) Constant 2
+              50:             TypeArray 47(crossStageBlock2) 49
+              51:             TypePointer Uniform 50
+  52(blockName1):     51(ptr) Variable Uniform
+              53:             TypePointer Input 19(int)
+ 54(gl_VertexID):     53(ptr) Variable Input
+55(gl_InstanceID):     53(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(vgo1) 11
+                              Store 14(vgo2) 15
+              21:      8(ptr) AccessChain 18 20
+                              Store 21 11
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 65
+
+                              Capability Geometry
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 22 27 31 37 48 51
+                              ExecutionMode 4 InputPoints
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "i"
+                              Name 22  "gfo1"
+                              Name 27  "gfo2"
+                              Name 29  "outBlock"
+                              MemberName 29(outBlock) 0  "o3"
+                              Name 31  "gf_out"
+                              Name 32  "outBlock"
+                              MemberName 32(outBlock) 0  "o3"
+                              Name 37  "inBlock"
+                              Name 48  "vgo1"
+                              Name 51  "vgo2"
+                              Name 53  "u1"
+                              Name 57  "u2"
+                              Name 59  "u3"
+                              Name 60  "crossStageBlock2"
+                              MemberName 60(crossStageBlock2) 0  "a"
+                              MemberName 60(crossStageBlock2) 1  "b"
+                              Name 64  "blockName1"
+                              Decorate 22(gfo1) Location 0
+                              Decorate 27(gfo2) Location 1
+                              Decorate 29(outBlock) Block
+                              Decorate 31(gf_out) Location 5
+                              Decorate 32(outBlock) Block
+                              Decorate 37(inBlock) Location 5
+                              Decorate 48(vgo1) Location 0
+                              Decorate 51(vgo2) Location 1
+                              Decorate 53(u1) Location 1
+                              Decorate 53(u1) DescriptorSet 0
+                              Decorate 57(u2) Location 2
+                              Decorate 57(u2) DescriptorSet 0
+                              Decorate 59(u3) Location 3
+                              Decorate 59(u3) DescriptorSet 0
+                              MemberDecorate 60(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 60(crossStageBlock2) 1 Offset 16
+                              Decorate 60(crossStageBlock2) Block
+                              Decorate 64(blockName1) DescriptorSet 0
+                              Decorate 64(blockName1) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:      6(int) Constant 0
+              16:      6(int) Constant 3
+              17:             TypeBool
+              19:             TypeFloat 32
+              20:             TypeVector 19(float) 4
+              21:             TypePointer Output 20(fvec4)
+        22(gfo1):     21(ptr) Variable Output
+              23:   19(float) Constant 0
+              24:   20(fvec4) ConstantComposite 23 23 23 23
+              25:             TypeVector 19(float) 2
+              26:             TypePointer Output 25(fvec2)
+        27(gfo2):     26(ptr) Variable Output
+              28:   25(fvec2) ConstantComposite 23 23
+    29(outBlock):             TypeStruct 20(fvec4)
+              30:             TypePointer Output 29(outBlock)
+      31(gf_out):     30(ptr) Variable Output
+    32(outBlock):             TypeStruct 20(fvec4)
+              33:             TypeInt 32 0
+              34:     33(int) Constant 1
+              35:             TypeArray 32(outBlock) 34
+              36:             TypePointer Input 35
+     37(inBlock):     36(ptr) Variable Input
+              39:             TypePointer Input 20(fvec4)
+              44:      6(int) Constant 1
+              46:             TypeArray 20(fvec4) 34
+              47:             TypePointer Input 46
+        48(vgo1):     47(ptr) Variable Input
+              49:             TypeArray 25(fvec2) 34
+              50:             TypePointer Input 49
+        51(vgo2):     50(ptr) Variable Input
+              52:             TypePointer UniformConstant 25(fvec2)
+          53(u1):     52(ptr) Variable UniformConstant
+              54:             TypeVector 19(float) 3
+              55:   54(fvec3) ConstantComposite 23 23 23
+              56:             TypePointer UniformConstant 54(fvec3)
+          57(u2):     56(ptr) Variable UniformConstant 55
+              58:             TypePointer UniformConstant 20(fvec4)
+          59(u3):     58(ptr) Variable UniformConstant 24
+60(crossStageBlock2):             TypeStruct 20(fvec4) 25(fvec2)
+              61:     33(int) Constant 2
+              62:             TypeArray 60(crossStageBlock2) 61
+              63:             TypePointer Uniform 62
+  64(blockName1):     63(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+            8(i):      7(ptr) Variable Function
+                              Store 8(i) 9
+                              Branch 10
+              10:             Label
+                              LoopMerge 12 13 None
+                              Branch 14
+              14:             Label
+              15:      6(int) Load 8(i)
+              18:    17(bool) SLessThan 15 16
+                              BranchConditional 18 11 12
+              11:               Label
+                                Store 22(gfo1) 24
+                                Store 27(gfo2) 28
+              38:      6(int)   Load 8(i)
+              40:     39(ptr)   AccessChain 37(inBlock) 38 9
+              41:   20(fvec4)   Load 40
+              42:     21(ptr)   AccessChain 31(gf_out) 9
+                                Store 42 41
+                                EmitVertex
+                                Branch 13
+              13:               Label
+              43:      6(int)   Load 8(i)
+              45:      6(int)   IAdd 43 44
+                                Store 8(i) 45
+                                Branch 10
+              12:             Label
+                              EndPrimitive
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 62
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 11 32 36 38
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 11  "gfo1"
+                              Name 15  "u1"
+                              Name 21  "u2"
+                              Name 28  "u3"
+                              Name 32  "outColor"
+                              Name 34  "outBlock"
+                              MemberName 34(outBlock) 0  "o3"
+                              Name 36  ""
+                              Name 38  "gfo2"
+                              Name 45  "um2"
+                              Name 49  "glass"
+                              Name 50  "crossStageBlock1"
+                              MemberName 50(crossStageBlock1) 0  "a"
+                              MemberName 50(crossStageBlock1) 1  "b"
+                              Name 52  ""
+                              Name 53  "fragOnlyBlock"
+                              MemberName 53(fragOnlyBlock) 0  "fb1"
+                              Name 55  ""
+                              Name 56  "crossStageBlock2"
+                              MemberName 56(crossStageBlock2) 0  "a"
+                              MemberName 56(crossStageBlock2) 1  "b"
+                              Name 61  "blockName2"
+                              Decorate 11(gfo1) Location 0
+                              Decorate 15(u1) Location 1
+                              Decorate 15(u1) DescriptorSet 0
+                              Decorate 21(u2) Location 2
+                              Decorate 21(u2) DescriptorSet 0
+                              Decorate 28(u3) Location 3
+                              Decorate 28(u3) DescriptorSet 0
+                              Decorate 32(outColor) Location 0
+                              Decorate 34(outBlock) Block
+                              Decorate 36 Location 5
+                              Decorate 38(gfo2) Location 1
+                              Decorate 45(um2) Location 4
+                              Decorate 45(um2) DescriptorSet 0
+                              Decorate 49(glass) Location 0
+                              Decorate 49(glass) DescriptorSet 0
+                              Decorate 49(glass) Binding 0
+                              MemberDecorate 50(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 50(crossStageBlock1) 1 Offset 16
+                              Decorate 50(crossStageBlock1) Block
+                              Decorate 52 DescriptorSet 0
+                              Decorate 52 Binding 0
+                              MemberDecorate 53(fragOnlyBlock) 0 Offset 0
+                              Decorate 53(fragOnlyBlock) BufferBlock
+                              Decorate 55 DescriptorSet 0
+                              Decorate 55 Binding 0
+                              MemberDecorate 56(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 56(crossStageBlock2) 1 Offset 16
+                              Decorate 56(crossStageBlock2) Block
+                              Decorate 61(blockName2) DescriptorSet 0
+                              Decorate 61(blockName2) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypePointer Input 7(fvec4)
+        11(gfo1):     10(ptr) Variable Input
+              13:             TypeVector 6(float) 2
+              14:             TypePointer UniformConstant 13(fvec2)
+          15(u1):     14(ptr) Variable UniformConstant
+              19:             TypeVector 6(float) 3
+              20:             TypePointer UniformConstant 19(fvec3)
+          21(u2):     20(ptr) Variable UniformConstant
+              25:    6(float) Constant 0
+              26:    7(fvec4) ConstantComposite 25 25 25 25
+              27:             TypePointer UniformConstant 7(fvec4)
+          28(u3):     27(ptr) Variable UniformConstant 26
+              31:             TypePointer Output 7(fvec4)
+    32(outColor):     31(ptr) Variable Output
+    34(outBlock):             TypeStruct 7(fvec4)
+              35:             TypePointer Input 34(outBlock)
+              36:     35(ptr) Variable Input
+              37:             TypePointer Input 13(fvec2)
+        38(gfo2):     37(ptr) Variable Input
+              39:             TypeMatrix 13(fvec2) 2
+              40:    6(float) Constant 1082130432
+              41:   13(fvec2) ConstantComposite 40 25
+              42:   13(fvec2) ConstantComposite 25 40
+              43:          39 ConstantComposite 41 42
+              44:             TypePointer UniformConstant 39
+         45(um2):     44(ptr) Variable UniformConstant 43
+              46:             TypeImage 6(float) 2D sampled format:Unknown
+              47:             TypeSampledImage 46
+              48:             TypePointer UniformConstant 47
+       49(glass):     48(ptr) Variable UniformConstant
+50(crossStageBlock1):             TypeStruct 7(fvec4) 7(fvec4)
+              51:             TypePointer Uniform 50(crossStageBlock1)
+              52:     51(ptr) Variable Uniform
+53(fragOnlyBlock):             TypeStruct 13(fvec2)
+              54:             TypePointer Uniform 53(fragOnlyBlock)
+              55:     54(ptr) Variable Uniform
+56(crossStageBlock2):             TypeStruct 7(fvec4) 13(fvec2)
+              57:             TypeInt 32 0
+              58:     57(int) Constant 2
+              59:             TypeArray 56(crossStageBlock2) 58
+              60:             TypePointer Uniform 59
+  61(blockName2):     60(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+        9(color):      8(ptr) Variable Function
+              12:    7(fvec4) Load 11(gfo1)
+              16:   13(fvec2) Load 15(u1)
+              17:    7(fvec4) VectorShuffle 16 16 0 1 0 1
+              18:    7(fvec4) FMul 12 17
+              22:   19(fvec3) Load 21(u2)
+              23:    7(fvec4) VectorShuffle 22 22 0 1 2 0
+              24:    7(fvec4) FMul 18 23
+              29:    7(fvec4) Load 28(u3)
+              30:    7(fvec4) FMul 24 29
+                              Store 9(color) 30
+              33:    7(fvec4) Load 9(color)
+                              Store 32(outColor) 33
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.crossStage.vert.out b/Test/baseResults/iomap.crossStage.vert.out
new file mode 100644
index 0000000..5338b80
--- /dev/null
+++ b/Test/baseResults/iomap.crossStage.vert.out
@@ -0,0 +1,515 @@
+iomap.crossStage.vert
+Shader version: 460
+0:? Sequence
+0:32  Function Definition: main( ( global void)
+0:32    Function Parameters: 
+0:34    Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:34        'o1' ( smooth out 4-component vector of float)
+0:34        Constant:
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:35      move second child to first child ( temp 2-component vector of float)
+0:35        'o2' ( smooth out 2-component vector of float)
+0:35        Constant:
+0:35          0.000000
+0:35          0.000000
+0:36      move second child to first child ( temp 4-component vector of float)
+0:36        o3: direct index for structure ( out 4-component vector of float)
+0:36          'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        Constant:
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:?   Linker Objects
+0:?     'o1' ( smooth out 4-component vector of float)
+0:?     'o2' ( smooth out 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+iomap.crossStage.frag
+Shader version: 460
+0:? Sequence
+0:36  Function Definition: main( ( global void)
+0:36    Function Parameters: 
+0:38    Sequence
+0:38      Sequence
+0:38        move second child to first child ( temp 4-component vector of float)
+0:38          'color' ( temp 4-component vector of float)
+0:38          component-wise multiply ( temp 4-component vector of float)
+0:38            component-wise multiply ( temp 4-component vector of float)
+0:38              component-wise multiply ( temp 4-component vector of float)
+0:38                'o1' ( smooth in 4-component vector of float)
+0:38                vector swizzle ( temp 4-component vector of float)
+0:38                  'u1' ( uniform 2-component vector of float)
+0:38                  Sequence
+0:38                    Constant:
+0:38                      0 (const int)
+0:38                    Constant:
+0:38                      1 (const int)
+0:38                    Constant:
+0:38                      0 (const int)
+0:38                    Constant:
+0:38                      1 (const int)
+0:38              vector swizzle ( temp 4-component vector of float)
+0:38                'u2' ( uniform 3-component vector of float)
+0:38                Sequence
+0:38                  Constant:
+0:38                    0 (const int)
+0:38                  Constant:
+0:38                    1 (const int)
+0:38                  Constant:
+0:38                    2 (const int)
+0:38                  Constant:
+0:38                    0 (const int)
+0:38            vector swizzle ( temp 4-component vector of float)
+0:38              'u3' ( uniform 4-component vector of float)
+0:38                0.000000
+0:38                0.000000
+0:38                0.000000
+0:38                0.000000
+0:38              Sequence
+0:38                Constant:
+0:38                  0 (const int)
+0:38                Constant:
+0:38                  1 (const int)
+0:38                Constant:
+0:38                  2 (const int)
+0:38                Constant:
+0:38                  3 (const int)
+0:39      move second child to first child ( temp 4-component vector of float)
+0:39        'outColor' ( out 4-component vector of float)
+0:39        'color' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in 4-component vector of float o3})
+0:?     'o2' ( smooth in 2-component vector of float)
+0:?     'o1' ( smooth in 4-component vector of float)
+0:?     'outColor' ( out 4-component vector of float)
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
+    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b}"
+
+Shader version: 460
+0:? Sequence
+0:32  Function Definition: main( ( global void)
+0:32    Function Parameters: 
+0:34    Sequence
+0:34      move second child to first child ( temp 4-component vector of float)
+0:34        'o1' ( smooth out 4-component vector of float)
+0:34        Constant:
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:34          0.000000
+0:35      move second child to first child ( temp 2-component vector of float)
+0:35        'o2' ( smooth out 2-component vector of float)
+0:35        Constant:
+0:35          0.000000
+0:35          0.000000
+0:36      move second child to first child ( temp 4-component vector of float)
+0:36        o3: direct index for structure ( out 4-component vector of float)
+0:36          'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:36          Constant:
+0:36            0 (const uint)
+0:36        Constant:
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:36          0.000000
+0:?   Linker Objects
+0:?     'o1' ( smooth out 4-component vector of float)
+0:?     'o2' ( smooth out 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out 4-component vector of float o3})
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+Shader version: 460
+0:? Sequence
+0:36  Function Definition: main( ( global void)
+0:36    Function Parameters: 
+0:38    Sequence
+0:38      Sequence
+0:38        move second child to first child ( temp 4-component vector of float)
+0:38          'color' ( temp 4-component vector of float)
+0:38          component-wise multiply ( temp 4-component vector of float)
+0:38            component-wise multiply ( temp 4-component vector of float)
+0:38              component-wise multiply ( temp 4-component vector of float)
+0:38                'o1' ( smooth in 4-component vector of float)
+0:38                vector swizzle ( temp 4-component vector of float)
+0:38                  'u1' ( uniform 2-component vector of float)
+0:38                  Sequence
+0:38                    Constant:
+0:38                      0 (const int)
+0:38                    Constant:
+0:38                      1 (const int)
+0:38                    Constant:
+0:38                      0 (const int)
+0:38                    Constant:
+0:38                      1 (const int)
+0:38              vector swizzle ( temp 4-component vector of float)
+0:38                'u2' ( uniform 3-component vector of float)
+0:38                Sequence
+0:38                  Constant:
+0:38                    0 (const int)
+0:38                  Constant:
+0:38                    1 (const int)
+0:38                  Constant:
+0:38                    2 (const int)
+0:38                  Constant:
+0:38                    0 (const int)
+0:38            vector swizzle ( temp 4-component vector of float)
+0:38              'u3' ( uniform 4-component vector of float)
+0:38                0.000000
+0:38                0.000000
+0:38                0.000000
+0:38                0.000000
+0:38              Sequence
+0:38                Constant:
+0:38                  0 (const int)
+0:38                Constant:
+0:38                  1 (const int)
+0:38                Constant:
+0:38                  2 (const int)
+0:38                Constant:
+0:38                  3 (const int)
+0:39      move second child to first child ( temp 4-component vector of float)
+0:39        'outColor' ( out 4-component vector of float)
+0:39        'color' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in 4-component vector of float o3})
+0:?     'o2' ( smooth in 2-component vector of float)
+0:?     'o1' ( smooth in 4-component vector of float)
+0:?     'outColor' ( out 4-component vector of float)
+0:?     'u1' ( uniform 2-component vector of float)
+0:?     'u2' ( uniform 3-component vector of float)
+0:?     'u3' ( uniform 4-component vector of float)
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?       0.000000
+0:?     'um2' ( uniform 2X2 matrix of float)
+0:?       4.000000
+0:?       0.000000
+0:?       0.000000
+0:?       4.000000
+0:?     'glass' (layout( location=0 binding=0) uniform sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) buffer block{layout( column_major std430) buffer 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform 4-component vector of float a, layout( column_major std140) uniform 2-component vector of float b})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 56
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 14 18 54 55
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "o1"
+                              Name 14  "o2"
+                              Name 16  "outBlock"
+                              MemberName 16(outBlock) 0  "o3"
+                              Name 18  ""
+                              Name 23  "u1"
+                              Name 27  "u2"
+                              Name 29  "u3"
+                              Name 36  "um2"
+                              Name 40  "glass"
+                              Name 41  "crossStageBlock1"
+                              MemberName 41(crossStageBlock1) 0  "a"
+                              MemberName 41(crossStageBlock1) 1  "b"
+                              Name 43  ""
+                              Name 44  "vertOnlyBlock"
+                              MemberName 44(vertOnlyBlock) 0  "vb1"
+                              Name 46  ""
+                              Name 47  "crossStageBlock2"
+                              MemberName 47(crossStageBlock2) 0  "a"
+                              MemberName 47(crossStageBlock2) 1  "b"
+                              Name 52  "blockName1"
+                              Name 54  "gl_VertexID"
+                              Name 55  "gl_InstanceID"
+                              Decorate 9(o1) Location 0
+                              Decorate 14(o2) Location 1
+                              Decorate 16(outBlock) Block
+                              Decorate 18 Location 5
+                              Decorate 23(u1) Location 1
+                              Decorate 23(u1) DescriptorSet 0
+                              Decorate 27(u2) Location 2
+                              Decorate 27(u2) DescriptorSet 0
+                              Decorate 29(u3) Location 3
+                              Decorate 29(u3) DescriptorSet 0
+                              Decorate 36(um2) Location 4
+                              Decorate 36(um2) DescriptorSet 0
+                              Decorate 40(glass) Location 0
+                              Decorate 40(glass) DescriptorSet 0
+                              Decorate 40(glass) Binding 0
+                              MemberDecorate 41(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 41(crossStageBlock1) 1 Offset 16
+                              Decorate 41(crossStageBlock1) Block
+                              Decorate 43 DescriptorSet 0
+                              Decorate 43 Binding 0
+                              MemberDecorate 44(vertOnlyBlock) 0 Offset 0
+                              Decorate 44(vertOnlyBlock) BufferBlock
+                              Decorate 46 DescriptorSet 0
+                              Decorate 46 Binding 0
+                              MemberDecorate 47(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 47(crossStageBlock2) 1 Offset 16
+                              Decorate 47(crossStageBlock2) Block
+                              Decorate 52(blockName1) DescriptorSet 0
+                              Decorate 52(blockName1) Binding 0
+                              Decorate 54(gl_VertexID) BuiltIn VertexId
+                              Decorate 55(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+           9(o1):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+          14(o2):     13(ptr) Variable Output
+              15:   12(fvec2) ConstantComposite 10 10
+    16(outBlock):             TypeStruct 7(fvec4)
+              17:             TypePointer Output 16(outBlock)
+              18:     17(ptr) Variable Output
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              22:             TypePointer UniformConstant 12(fvec2)
+          23(u1):     22(ptr) Variable UniformConstant
+              24:             TypeVector 6(float) 3
+              25:   24(fvec3) ConstantComposite 10 10 10
+              26:             TypePointer UniformConstant 24(fvec3)
+          27(u2):     26(ptr) Variable UniformConstant 25
+              28:             TypePointer UniformConstant 7(fvec4)
+          29(u3):     28(ptr) Variable UniformConstant 11
+              30:             TypeMatrix 12(fvec2) 2
+              31:    6(float) Constant 1082130432
+              32:   12(fvec2) ConstantComposite 31 10
+              33:   12(fvec2) ConstantComposite 10 31
+              34:          30 ConstantComposite 32 33
+              35:             TypePointer UniformConstant 30
+         36(um2):     35(ptr) Variable UniformConstant 34
+              37:             TypeImage 6(float) 2D sampled format:Unknown
+              38:             TypeSampledImage 37
+              39:             TypePointer UniformConstant 38
+       40(glass):     39(ptr) Variable UniformConstant
+41(crossStageBlock1):             TypeStruct 7(fvec4) 7(fvec4)
+              42:             TypePointer Uniform 41(crossStageBlock1)
+              43:     42(ptr) Variable Uniform
+44(vertOnlyBlock):             TypeStruct 12(fvec2)
+              45:             TypePointer Uniform 44(vertOnlyBlock)
+              46:     45(ptr) Variable Uniform
+47(crossStageBlock2):             TypeStruct 7(fvec4) 12(fvec2)
+              48:             TypeInt 32 0
+              49:     48(int) Constant 2
+              50:             TypeArray 47(crossStageBlock2) 49
+              51:             TypePointer Uniform 50
+  52(blockName1):     51(ptr) Variable Uniform
+              53:             TypePointer Input 19(int)
+ 54(gl_VertexID):     53(ptr) Variable Input
+55(gl_InstanceID):     53(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(o1) 11
+                              Store 14(o2) 15
+              21:      8(ptr) AccessChain 18 20
+                              Store 21 11
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 62
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 11 32 36 38
+                              ExecutionMode 4 OriginLowerLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 11  "o1"
+                              Name 15  "u1"
+                              Name 21  "u2"
+                              Name 28  "u3"
+                              Name 32  "outColor"
+                              Name 34  "outBlock"
+                              MemberName 34(outBlock) 0  "o3"
+                              Name 36  ""
+                              Name 38  "o2"
+                              Name 45  "um2"
+                              Name 49  "glass"
+                              Name 50  "crossStageBlock1"
+                              MemberName 50(crossStageBlock1) 0  "a"
+                              MemberName 50(crossStageBlock1) 1  "b"
+                              Name 52  ""
+                              Name 53  "fragOnlyBlock"
+                              MemberName 53(fragOnlyBlock) 0  "fb1"
+                              Name 55  ""
+                              Name 56  "crossStageBlock2"
+                              MemberName 56(crossStageBlock2) 0  "a"
+                              MemberName 56(crossStageBlock2) 1  "b"
+                              Name 61  "blockName2"
+                              Decorate 11(o1) Location 0
+                              Decorate 15(u1) Location 1
+                              Decorate 15(u1) DescriptorSet 0
+                              Decorate 21(u2) Location 2
+                              Decorate 21(u2) DescriptorSet 0
+                              Decorate 28(u3) Location 3
+                              Decorate 28(u3) DescriptorSet 0
+                              Decorate 32(outColor) Location 0
+                              Decorate 34(outBlock) Block
+                              Decorate 36 Location 5
+                              Decorate 38(o2) Location 1
+                              Decorate 45(um2) Location 4
+                              Decorate 45(um2) DescriptorSet 0
+                              Decorate 49(glass) Location 0
+                              Decorate 49(glass) DescriptorSet 0
+                              Decorate 49(glass) Binding 0
+                              MemberDecorate 50(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 50(crossStageBlock1) 1 Offset 16
+                              Decorate 50(crossStageBlock1) Block
+                              Decorate 52 DescriptorSet 0
+                              Decorate 52 Binding 0
+                              MemberDecorate 53(fragOnlyBlock) 0 Offset 0
+                              Decorate 53(fragOnlyBlock) BufferBlock
+                              Decorate 55 DescriptorSet 0
+                              Decorate 55 Binding 0
+                              MemberDecorate 56(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 56(crossStageBlock2) 1 Offset 16
+                              Decorate 56(crossStageBlock2) Block
+                              Decorate 61(blockName2) DescriptorSet 0
+                              Decorate 61(blockName2) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:             TypePointer Input 7(fvec4)
+          11(o1):     10(ptr) Variable Input
+              13:             TypeVector 6(float) 2
+              14:             TypePointer UniformConstant 13(fvec2)
+          15(u1):     14(ptr) Variable UniformConstant
+              19:             TypeVector 6(float) 3
+              20:             TypePointer UniformConstant 19(fvec3)
+          21(u2):     20(ptr) Variable UniformConstant
+              25:    6(float) Constant 0
+              26:    7(fvec4) ConstantComposite 25 25 25 25
+              27:             TypePointer UniformConstant 7(fvec4)
+          28(u3):     27(ptr) Variable UniformConstant 26
+              31:             TypePointer Output 7(fvec4)
+    32(outColor):     31(ptr) Variable Output
+    34(outBlock):             TypeStruct 7(fvec4)
+              35:             TypePointer Input 34(outBlock)
+              36:     35(ptr) Variable Input
+              37:             TypePointer Input 13(fvec2)
+          38(o2):     37(ptr) Variable Input
+              39:             TypeMatrix 13(fvec2) 2
+              40:    6(float) Constant 1082130432
+              41:   13(fvec2) ConstantComposite 40 25
+              42:   13(fvec2) ConstantComposite 25 40
+              43:          39 ConstantComposite 41 42
+              44:             TypePointer UniformConstant 39
+         45(um2):     44(ptr) Variable UniformConstant 43
+              46:             TypeImage 6(float) 2D sampled format:Unknown
+              47:             TypeSampledImage 46
+              48:             TypePointer UniformConstant 47
+       49(glass):     48(ptr) Variable UniformConstant
+50(crossStageBlock1):             TypeStruct 7(fvec4) 7(fvec4)
+              51:             TypePointer Uniform 50(crossStageBlock1)
+              52:     51(ptr) Variable Uniform
+53(fragOnlyBlock):             TypeStruct 13(fvec2)
+              54:             TypePointer Uniform 53(fragOnlyBlock)
+              55:     54(ptr) Variable Uniform
+56(crossStageBlock2):             TypeStruct 7(fvec4) 13(fvec2)
+              57:             TypeInt 32 0
+              58:     57(int) Constant 2
+              59:             TypeArray 56(crossStageBlock2) 58
+              60:             TypePointer Uniform 59
+  61(blockName2):     60(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+        9(color):      8(ptr) Variable Function
+              12:    7(fvec4) Load 11(o1)
+              16:   13(fvec2) Load 15(u1)
+              17:    7(fvec4) VectorShuffle 16 16 0 1 0 1
+              18:    7(fvec4) FMul 12 17
+              22:   19(fvec3) Load 21(u2)
+              23:    7(fvec4) VectorShuffle 22 22 0 1 2 0
+              24:    7(fvec4) FMul 18 23
+              29:    7(fvec4) Load 28(u3)
+              30:    7(fvec4) FMul 24 29
+                              Store 9(color) 30
+              33:    7(fvec4) Load 9(color)
+                              Store 32(outColor) 33
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/iomap.crossStage.vk.vert.out b/Test/baseResults/iomap.crossStage.vk.vert.out
new file mode 100644
index 0000000..e137bdf
--- /dev/null
+++ b/Test/baseResults/iomap.crossStage.vk.vert.out
@@ -0,0 +1,720 @@
+iomap.crossStage.vk.vert
+Shader version: 460
+0:? Sequence
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:28    Sequence
+0:28      move second child to first child ( temp highp 4-component vector of float)
+0:28        'vgo1' ( smooth out highp 4-component vector of float)
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:29      move second child to first child ( temp highp 2-component vector of float)
+0:29        'vgo2' ( smooth out highp 2-component vector of float)
+0:29        Constant:
+0:29          0.000000
+0:29          0.000000
+0:30      move second child to first child ( temp highp 4-component vector of float)
+0:30        o3: direct index for structure ( out highp 4-component vector of float)
+0:30          'anon@0' (layout( location=5) out block{ out highp 4-component vector of float o3})
+0:30          Constant:
+0:30            0 (const uint)
+0:30        Constant:
+0:30          0.000000
+0:30          0.000000
+0:30          0.000000
+0:30          0.000000
+0:?   Linker Objects
+0:?     'vgo1' ( smooth out highp 4-component vector of float)
+0:?     'vgo2' ( smooth out highp 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out highp 4-component vector of float o3})
+0:?     'glass' (layout( binding=0) uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+
+iomap.crossStage.vk.geom
+Shader version: 460
+invocations = -1
+max_vertices = 3
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:25  Function Definition: main( ( global void)
+0:25    Function Parameters: 
+0:27    Sequence
+0:27      Sequence
+0:27        Sequence
+0:27          move second child to first child ( temp highp int)
+0:27            'i' ( temp highp int)
+0:27            Constant:
+0:27              0 (const int)
+0:27        Loop with condition tested first
+0:27          Loop Condition
+0:27          Compare Less Than ( temp bool)
+0:27            'i' ( temp highp int)
+0:27            Constant:
+0:27              3 (const int)
+0:27          Loop Body
+0:28          Sequence
+0:28            move second child to first child ( temp highp 4-component vector of float)
+0:28              'gfo1' (layout( stream=0) out highp 4-component vector of float)
+0:28              Constant:
+0:28                0.000000
+0:28                0.000000
+0:28                0.000000
+0:28                0.000000
+0:29            move second child to first child ( temp highp 2-component vector of float)
+0:29              'gfo2' (layout( stream=0) out highp 2-component vector of float)
+0:29              Constant:
+0:29                0.000000
+0:29                0.000000
+0:30            move second child to first child ( temp highp 4-component vector of float)
+0:30              o3: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:30                'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out highp 4-component vector of float o3})
+0:30                Constant:
+0:30                  0 (const int)
+0:30              o3: direct index for structure ( in highp 4-component vector of float)
+0:30                indirect index (layout( location=5) temp block{ in highp 4-component vector of float o3})
+0:30                  'inBlock' (layout( location=5) in 1-element array of block{ in highp 4-component vector of float o3})
+0:30                  'i' ( temp highp int)
+0:30                Constant:
+0:30                  0 (const int)
+0:31            EmitVertex ( global void)
+0:27          Loop Terminal Expression
+0:27          Post-Increment ( temp highp int)
+0:27            'i' ( temp highp int)
+0:33      EndPrimitive ( global void)
+0:?   Linker Objects
+0:?     'vgo1' ( in 1-element array of highp 4-component vector of float)
+0:?     'vgo2' ( in 1-element array of highp 2-component vector of float)
+0:?     'inBlock' (layout( location=5) in 1-element array of block{ in highp 4-component vector of float o3})
+0:?     'gfo1' (layout( stream=0) out highp 4-component vector of float)
+0:?     'gfo2' (layout( stream=0) out highp 2-component vector of float)
+0:?     'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out highp 4-component vector of float o3})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+
+iomap.crossStage.vk.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:30  Function Definition: Bar( ( global highp 2-component vector of float)
+0:30    Function Parameters: 
+0:31    Sequence
+0:31      Branch: Return with expression
+0:32        add ( temp highp 2-component vector of float)
+0:31          add ( temp highp 2-component vector of float)
+0:31            fb1: direct index for structure (layout( column_major std430) readonly buffer highp 2-component vector of float)
+0:31              'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float fb1})
+0:31              Constant:
+0:31                0 (const uint)
+0:32            b: direct index for structure (layout( column_major std140) uniform highp 2-component vector of float)
+0:32              direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:32                'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:32                Constant:
+0:32                  0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:33          b: direct index for structure (layout( column_major std140) uniform highp 2-component vector of float)
+0:33            direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:33              'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:33              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:36  Function Definition: Foo( ( global highp 4-component vector of float)
+0:36    Function Parameters: 
+0:37    Sequence
+0:37      Branch: Return with expression
+0:40        add ( temp highp 4-component vector of float)
+0:39          add ( temp highp 4-component vector of float)
+0:38            add ( temp highp 4-component vector of float)
+0:37              add ( temp highp 4-component vector of float)
+0:37                a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:37                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:38                b: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:38                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:38                  Constant:
+0:38                    1 (const uint)
+0:39              a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:39                direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:39                  'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:39                  Constant:
+0:39                    0 (const int)
+0:39                Constant:
+0:39                  0 (const int)
+0:40            a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:40              direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:40                'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:40                Constant:
+0:40                  1 (const int)
+0:40              Constant:
+0:40                0 (const int)
+0:41          Construct vec4 ( temp highp 4-component vector of float)
+0:41            Function Call: Bar( ( global highp 2-component vector of float)
+0:41            Constant:
+0:41              0.000000
+0:41            Constant:
+0:41              0.000000
+0:44  Function Definition: main( ( global void)
+0:44    Function Parameters: 
+0:46    Sequence
+0:46      Sequence
+0:46        move second child to first child ( temp highp 4-component vector of float)
+0:46          'color' ( temp highp 4-component vector of float)
+0:46          'gfo1' ( smooth in highp 4-component vector of float)
+0:47      move second child to first child ( temp highp 4-component vector of float)
+0:47        'color' ( temp highp 4-component vector of float)
+0:47        add ( temp highp 4-component vector of float)
+0:47          'color' ( temp highp 4-component vector of float)
+0:47          Function Call: Foo( ( global highp 4-component vector of float)
+0:48      move second child to first child ( temp highp 4-component vector of float)
+0:48        'outColor' ( out highp 4-component vector of float)
+0:48        'color' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in highp 4-component vector of float o3})
+0:?     'gfo1' ( smooth in highp 4-component vector of float)
+0:?     'gfo2' ( smooth in highp 2-component vector of float)
+0:?     'outColor' ( out highp 4-component vector of float)
+0:?     'glass' (layout( binding=0) uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+
+
+Linked vertex stage:
+
+
+Linked geometry stage:
+
+
+Linked fragment stage:
+
+WARNING: Linking unknown stage stage: Matched shader interfaces are using different instance names.
+    blockName1: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b}" versus blockName2: "layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b}"
+
+Shader version: 460
+0:? Sequence
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:28    Sequence
+0:28      move second child to first child ( temp highp 4-component vector of float)
+0:28        'vgo1' ( smooth out highp 4-component vector of float)
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:29      move second child to first child ( temp highp 2-component vector of float)
+0:29        'vgo2' ( smooth out highp 2-component vector of float)
+0:29        Constant:
+0:29          0.000000
+0:29          0.000000
+0:30      move second child to first child ( temp highp 4-component vector of float)
+0:30        o3: direct index for structure ( out highp 4-component vector of float)
+0:30          'anon@0' (layout( location=5) out block{ out highp 4-component vector of float o3})
+0:30          Constant:
+0:30            0 (const uint)
+0:30        Constant:
+0:30          0.000000
+0:30          0.000000
+0:30          0.000000
+0:30          0.000000
+0:?   Linker Objects
+0:?     'vgo1' ( smooth out highp 4-component vector of float)
+0:?     'vgo2' ( smooth out highp 2-component vector of float)
+0:?     'anon@0' (layout( location=5) out block{ out highp 4-component vector of float o3})
+0:?     'glass' (layout( binding=0) uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float vb1})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+Shader version: 460
+invocations = 1
+max_vertices = 3
+input primitive = points
+output primitive = triangle_strip
+0:? Sequence
+0:25  Function Definition: main( ( global void)
+0:25    Function Parameters: 
+0:27    Sequence
+0:27      Sequence
+0:27        Sequence
+0:27          move second child to first child ( temp highp int)
+0:27            'i' ( temp highp int)
+0:27            Constant:
+0:27              0 (const int)
+0:27        Loop with condition tested first
+0:27          Loop Condition
+0:27          Compare Less Than ( temp bool)
+0:27            'i' ( temp highp int)
+0:27            Constant:
+0:27              3 (const int)
+0:27          Loop Body
+0:28          Sequence
+0:28            move second child to first child ( temp highp 4-component vector of float)
+0:28              'gfo1' (layout( stream=0) out highp 4-component vector of float)
+0:28              Constant:
+0:28                0.000000
+0:28                0.000000
+0:28                0.000000
+0:28                0.000000
+0:29            move second child to first child ( temp highp 2-component vector of float)
+0:29              'gfo2' (layout( stream=0) out highp 2-component vector of float)
+0:29              Constant:
+0:29                0.000000
+0:29                0.000000
+0:30            move second child to first child ( temp highp 4-component vector of float)
+0:30              o3: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:30                'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out highp 4-component vector of float o3})
+0:30                Constant:
+0:30                  0 (const int)
+0:30              o3: direct index for structure ( in highp 4-component vector of float)
+0:30                indirect index (layout( location=5) temp block{ in highp 4-component vector of float o3})
+0:30                  'inBlock' (layout( location=5) in 1-element array of block{ in highp 4-component vector of float o3})
+0:30                  'i' ( temp highp int)
+0:30                Constant:
+0:30                  0 (const int)
+0:31            EmitVertex ( global void)
+0:27          Loop Terminal Expression
+0:27          Post-Increment ( temp highp int)
+0:27            'i' ( temp highp int)
+0:33      EndPrimitive ( global void)
+0:?   Linker Objects
+0:?     'vgo1' ( in 1-element array of highp 4-component vector of float)
+0:?     'vgo2' ( in 1-element array of highp 2-component vector of float)
+0:?     'inBlock' (layout( location=5) in 1-element array of block{ in highp 4-component vector of float o3})
+0:?     'gfo1' (layout( stream=0) out highp 4-component vector of float)
+0:?     'gfo2' (layout( stream=0) out highp 2-component vector of float)
+0:?     'gf_out' (layout( location=5 stream=0) out block{layout( stream=0) out highp 4-component vector of float o3})
+0:?     'blockName1' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:30  Function Definition: Bar( ( global highp 2-component vector of float)
+0:30    Function Parameters: 
+0:31    Sequence
+0:31      Branch: Return with expression
+0:32        add ( temp highp 2-component vector of float)
+0:31          add ( temp highp 2-component vector of float)
+0:31            fb1: direct index for structure (layout( column_major std430) readonly buffer highp 2-component vector of float)
+0:31              'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float fb1})
+0:31              Constant:
+0:31                0 (const uint)
+0:32            b: direct index for structure (layout( column_major std140) uniform highp 2-component vector of float)
+0:32              direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:32                'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:32                Constant:
+0:32                  0 (const int)
+0:32              Constant:
+0:32                1 (const int)
+0:33          b: direct index for structure (layout( column_major std140) uniform highp 2-component vector of float)
+0:33            direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:33              'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:33              Constant:
+0:33                1 (const int)
+0:33            Constant:
+0:33              1 (const int)
+0:36  Function Definition: Foo( ( global highp 4-component vector of float)
+0:36    Function Parameters: 
+0:37    Sequence
+0:37      Branch: Return with expression
+0:40        add ( temp highp 4-component vector of float)
+0:39          add ( temp highp 4-component vector of float)
+0:38            add ( temp highp 4-component vector of float)
+0:37              add ( temp highp 4-component vector of float)
+0:37                a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:37                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:37                  Constant:
+0:37                    0 (const uint)
+0:38                b: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:38                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:38                  Constant:
+0:38                    1 (const uint)
+0:39              a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:39                direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:39                  'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:39                  Constant:
+0:39                    0 (const int)
+0:39                Constant:
+0:39                  0 (const int)
+0:40            a: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:40              direct index (layout( column_major std140) temp block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:40                'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+0:40                Constant:
+0:40                  1 (const int)
+0:40              Constant:
+0:40                0 (const int)
+0:41          Construct vec4 ( temp highp 4-component vector of float)
+0:41            Function Call: Bar( ( global highp 2-component vector of float)
+0:41            Constant:
+0:41              0.000000
+0:41            Constant:
+0:41              0.000000
+0:44  Function Definition: main( ( global void)
+0:44    Function Parameters: 
+0:46    Sequence
+0:46      Sequence
+0:46        move second child to first child ( temp highp 4-component vector of float)
+0:46          'color' ( temp highp 4-component vector of float)
+0:46          'gfo1' ( smooth in highp 4-component vector of float)
+0:47      move second child to first child ( temp highp 4-component vector of float)
+0:47        'color' ( temp highp 4-component vector of float)
+0:47        add ( temp highp 4-component vector of float)
+0:47          'color' ( temp highp 4-component vector of float)
+0:47          Function Call: Foo( ( global highp 4-component vector of float)
+0:48      move second child to first child ( temp highp 4-component vector of float)
+0:48        'outColor' ( out highp 4-component vector of float)
+0:48        'color' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( location=5) in block{ in highp 4-component vector of float o3})
+0:?     'gfo1' ( smooth in highp 4-component vector of float)
+0:?     'gfo2' ( smooth in highp 2-component vector of float)
+0:?     'outColor' ( out highp 4-component vector of float)
+0:?     'glass' (layout( binding=0) uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 4-component vector of float b})
+0:?     'anon@2' (layout( column_major std430) readonly buffer block{layout( column_major std430) readonly buffer highp 2-component vector of float fb1})
+0:?     'blockName2' (layout( column_major std140) uniform 2-element array of block{layout( column_major std140) uniform highp 4-component vector of float a, layout( column_major std140) uniform highp 2-component vector of float b})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 38
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 14 18
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "vgo1"
+                              Name 14  "vgo2"
+                              Name 16  "outBlock"
+                              MemberName 16(outBlock) 0  "o3"
+                              Name 18  ""
+                              Name 25  "glass"
+                              Name 26  "crossStageBlock1"
+                              MemberName 26(crossStageBlock1) 0  "a"
+                              MemberName 26(crossStageBlock1) 1  "b"
+                              Name 28  ""
+                              Name 29  "vertOnlyBlock"
+                              MemberName 29(vertOnlyBlock) 0  "vb1"
+                              Name 31  ""
+                              Name 32  "crossStageBlock2"
+                              MemberName 32(crossStageBlock2) 0  "a"
+                              MemberName 32(crossStageBlock2) 1  "b"
+                              Name 37  "blockName1"
+                              Decorate 9(vgo1) Location 0
+                              Decorate 14(vgo2) Location 1
+                              Decorate 16(outBlock) Block
+                              Decorate 18 Location 5
+                              Decorate 25(glass) DescriptorSet 0
+                              Decorate 25(glass) Binding 0
+                              MemberDecorate 26(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 26(crossStageBlock1) 1 Offset 16
+                              Decorate 26(crossStageBlock1) Block
+                              Decorate 28 DescriptorSet 0
+                              Decorate 28 Binding 1
+                              MemberDecorate 29(vertOnlyBlock) 0 NonWritable
+                              MemberDecorate 29(vertOnlyBlock) 0 Offset 0
+                              Decorate 29(vertOnlyBlock) BufferBlock
+                              Decorate 31 DescriptorSet 0
+                              Decorate 31 Binding 0
+                              MemberDecorate 32(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 32(crossStageBlock2) 1 Offset 16
+                              Decorate 32(crossStageBlock2) Block
+                              Decorate 37(blockName1) DescriptorSet 0
+                              Decorate 37(blockName1) Binding 3
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+         9(vgo1):      8(ptr) Variable Output
+              10:    6(float) Constant 0
+              11:    7(fvec4) ConstantComposite 10 10 10 10
+              12:             TypeVector 6(float) 2
+              13:             TypePointer Output 12(fvec2)
+        14(vgo2):     13(ptr) Variable Output
+              15:   12(fvec2) ConstantComposite 10 10
+    16(outBlock):             TypeStruct 7(fvec4)
+              17:             TypePointer Output 16(outBlock)
+              18:     17(ptr) Variable Output
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              22:             TypeImage 6(float) 2D sampled format:Unknown
+              23:             TypeSampledImage 22
+              24:             TypePointer UniformConstant 23
+       25(glass):     24(ptr) Variable UniformConstant
+26(crossStageBlock1):             TypeStruct 7(fvec4) 7(fvec4)
+              27:             TypePointer Uniform 26(crossStageBlock1)
+              28:     27(ptr) Variable Uniform
+29(vertOnlyBlock):             TypeStruct 12(fvec2)
+              30:             TypePointer Uniform 29(vertOnlyBlock)
+              31:     30(ptr) Variable Uniform
+32(crossStageBlock2):             TypeStruct 7(fvec4) 12(fvec2)
+              33:             TypeInt 32 0
+              34:     33(int) Constant 2
+              35:             TypeArray 32(crossStageBlock2) 34
+              36:             TypePointer Uniform 35
+  37(blockName1):     36(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(vgo1) 11
+                              Store 14(vgo2) 15
+              21:      8(ptr) AccessChain 18 20
+                              Store 21 11
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 57
+
+                              Capability Geometry
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Geometry 4  "main" 22 27 31 37 48 51
+                              ExecutionMode 4 InputPoints
+                              ExecutionMode 4 Invocations 1
+                              ExecutionMode 4 OutputTriangleStrip
+                              ExecutionMode 4 OutputVertices 3
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "i"
+                              Name 22  "gfo1"
+                              Name 27  "gfo2"
+                              Name 29  "outBlock"
+                              MemberName 29(outBlock) 0  "o3"
+                              Name 31  "gf_out"
+                              Name 32  "outBlock"
+                              MemberName 32(outBlock) 0  "o3"
+                              Name 37  "inBlock"
+                              Name 48  "vgo1"
+                              Name 51  "vgo2"
+                              Name 52  "crossStageBlock2"
+                              MemberName 52(crossStageBlock2) 0  "a"
+                              MemberName 52(crossStageBlock2) 1  "b"
+                              Name 56  "blockName1"
+                              Decorate 22(gfo1) Location 0
+                              Decorate 27(gfo2) Location 1
+                              Decorate 29(outBlock) Block
+                              Decorate 31(gf_out) Location 5
+                              Decorate 32(outBlock) Block
+                              Decorate 37(inBlock) Location 5
+                              Decorate 48(vgo1) Location 0
+                              Decorate 51(vgo2) Location 1
+                              MemberDecorate 52(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 52(crossStageBlock2) 1 Offset 16
+                              Decorate 52(crossStageBlock2) Block
+                              Decorate 56(blockName1) DescriptorSet 0
+                              Decorate 56(blockName1) Binding 3
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:      6(int) Constant 0
+              16:      6(int) Constant 3
+              17:             TypeBool
+              19:             TypeFloat 32
+              20:             TypeVector 19(float) 4
+              21:             TypePointer Output 20(fvec4)
+        22(gfo1):     21(ptr) Variable Output
+              23:   19(float) Constant 0
+              24:   20(fvec4) ConstantComposite 23 23 23 23
+              25:             TypeVector 19(float) 2
+              26:             TypePointer Output 25(fvec2)
+        27(gfo2):     26(ptr) Variable Output
+              28:   25(fvec2) ConstantComposite 23 23
+    29(outBlock):             TypeStruct 20(fvec4)
+              30:             TypePointer Output 29(outBlock)
+      31(gf_out):     30(ptr) Variable Output
+    32(outBlock):             TypeStruct 20(fvec4)
+              33:             TypeInt 32 0
+              34:     33(int) Constant 1
+              35:             TypeArray 32(outBlock) 34
+              36:             TypePointer Input 35
+     37(inBlock):     36(ptr) Variable Input
+              39:             TypePointer Input 20(fvec4)
+              44:      6(int) Constant 1
+              46:             TypeArray 20(fvec4) 34
+              47:             TypePointer Input 46
+        48(vgo1):     47(ptr) Variable Input
+              49:             TypeArray 25(fvec2) 34
+              50:             TypePointer Input 49
+        51(vgo2):     50(ptr) Variable Input
+52(crossStageBlock2):             TypeStruct 20(fvec4) 25(fvec2)
+              53:     33(int) Constant 2
+              54:             TypeArray 52(crossStageBlock2) 53
+              55:             TypePointer Uniform 54
+  56(blockName1):     55(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+            8(i):      7(ptr) Variable Function
+                              Store 8(i) 9
+                              Branch 10
+              10:             Label
+                              LoopMerge 12 13 None
+                              Branch 14
+              14:             Label
+              15:      6(int) Load 8(i)
+              18:    17(bool) SLessThan 15 16
+                              BranchConditional 18 11 12
+              11:               Label
+                                Store 22(gfo1) 24
+                                Store 27(gfo2) 28
+              38:      6(int)   Load 8(i)
+              40:     39(ptr)   AccessChain 37(inBlock) 38 9
+              41:   20(fvec4)   Load 40
+              42:     21(ptr)   AccessChain 31(gf_out) 9
+                                Store 42 41
+                                EmitVertex
+                                Branch 13
+              13:               Label
+              43:      6(int)   Load 8(i)
+              45:      6(int)   IAdd 43 44
+                                Store 8(i) 45
+                                Branch 10
+              12:             Label
+                              EndPrimitive
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 81
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 64 70 74 76
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "Bar("
+                              Name 13  "Foo("
+                              Name 15  "fragOnlyBlock"
+                              MemberName 15(fragOnlyBlock) 0  "fb1"
+                              Name 17  ""
+                              Name 23  "crossStageBlock2"
+                              MemberName 23(crossStageBlock2) 0  "a"
+                              MemberName 23(crossStageBlock2) 1  "b"
+                              Name 28  "blockName2"
+                              Name 38  "crossStageBlock1"
+                              MemberName 38(crossStageBlock1) 0  "a"
+                              MemberName 38(crossStageBlock1) 1  "b"
+                              Name 40  ""
+                              Name 62  "color"
+                              Name 64  "gfo1"
+                              Name 70  "outColor"
+                              Name 72  "outBlock"
+                              MemberName 72(outBlock) 0  "o3"
+                              Name 74  ""
+                              Name 76  "gfo2"
+                              Name 80  "glass"
+                              MemberDecorate 15(fragOnlyBlock) 0 NonWritable
+                              MemberDecorate 15(fragOnlyBlock) 0 Offset 0
+                              Decorate 15(fragOnlyBlock) BufferBlock
+                              Decorate 17 DescriptorSet 0
+                              Decorate 17 Binding 2
+                              MemberDecorate 23(crossStageBlock2) 0 Offset 0
+                              MemberDecorate 23(crossStageBlock2) 1 Offset 16
+                              Decorate 23(crossStageBlock2) Block
+                              Decorate 28(blockName2) DescriptorSet 0
+                              Decorate 28(blockName2) Binding 3
+                              MemberDecorate 38(crossStageBlock1) 0 Offset 0
+                              MemberDecorate 38(crossStageBlock1) 1 Offset 16
+                              Decorate 38(crossStageBlock1) Block
+                              Decorate 40 DescriptorSet 0
+                              Decorate 40 Binding 1
+                              Decorate 64(gfo1) Location 0
+                              Decorate 70(outColor) Location 0
+                              Decorate 72(outBlock) Block
+                              Decorate 74 Location 5
+                              Decorate 76(gfo2) Location 1
+                              Decorate 80(glass) DescriptorSet 0
+                              Decorate 80(glass) Binding 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeFunction 7(fvec2)
+              11:             TypeVector 6(float) 4
+              12:             TypeFunction 11(fvec4)
+15(fragOnlyBlock):             TypeStruct 7(fvec2)
+              16:             TypePointer Uniform 15(fragOnlyBlock)
+              17:     16(ptr) Variable Uniform
+              18:             TypeInt 32 1
+              19:     18(int) Constant 0
+              20:             TypePointer Uniform 7(fvec2)
+23(crossStageBlock2):             TypeStruct 11(fvec4) 7(fvec2)
+              24:             TypeInt 32 0
+              25:     24(int) Constant 2
+              26:             TypeArray 23(crossStageBlock2) 25
+              27:             TypePointer Uniform 26
+  28(blockName2):     27(ptr) Variable Uniform
+              29:     18(int) Constant 1
+38(crossStageBlock1):             TypeStruct 11(fvec4) 11(fvec4)
+              39:             TypePointer Uniform 38(crossStageBlock1)
+              40:     39(ptr) Variable Uniform
+              41:             TypePointer Uniform 11(fvec4)
+              54:    6(float) Constant 0
+              61:             TypePointer Function 11(fvec4)
+              63:             TypePointer Input 11(fvec4)
+        64(gfo1):     63(ptr) Variable Input
+              69:             TypePointer Output 11(fvec4)
+    70(outColor):     69(ptr) Variable Output
+    72(outBlock):             TypeStruct 11(fvec4)
+              73:             TypePointer Input 72(outBlock)
+              74:     73(ptr) Variable Input
+              75:             TypePointer Input 7(fvec2)
+        76(gfo2):     75(ptr) Variable Input
+              77:             TypeImage 6(float) 2D sampled format:Unknown
+              78:             TypeSampledImage 77
+              79:             TypePointer UniformConstant 78
+       80(glass):     79(ptr) Variable UniformConstant
+         4(main):           2 Function None 3
+               5:             Label
+       62(color):     61(ptr) Variable Function
+              65:   11(fvec4) Load 64(gfo1)
+                              Store 62(color) 65
+              66:   11(fvec4) Load 62(color)
+              67:   11(fvec4) FunctionCall 13(Foo()
+              68:   11(fvec4) FAdd 66 67
+                              Store 62(color) 68
+              71:   11(fvec4) Load 62(color)
+                              Store 70(outColor) 71
+                              Return
+                              FunctionEnd
+         9(Bar():    7(fvec2) Function None 8
+              10:             Label
+              21:     20(ptr) AccessChain 17 19
+              22:    7(fvec2) Load 21
+              30:     20(ptr) AccessChain 28(blockName2) 19 29
+              31:    7(fvec2) Load 30
+              32:    7(fvec2) FAdd 22 31
+              33:     20(ptr) AccessChain 28(blockName2) 29 29
+              34:    7(fvec2) Load 33
+              35:    7(fvec2) FAdd 32 34
+                              ReturnValue 35
+                              FunctionEnd
+        13(Foo():   11(fvec4) Function None 12
+              14:             Label
+              42:     41(ptr) AccessChain 40 19
+              43:   11(fvec4) Load 42
+              44:     41(ptr) AccessChain 40 29
+              45:   11(fvec4) Load 44
+              46:   11(fvec4) FAdd 43 45
+              47:     41(ptr) AccessChain 28(blockName2) 19 19
+              48:   11(fvec4) Load 47
+              49:   11(fvec4) FAdd 46 48
+              50:     41(ptr) AccessChain 28(blockName2) 29 19
+              51:   11(fvec4) Load 50
+              52:   11(fvec4) FAdd 49 51
+              53:    7(fvec2) FunctionCall 9(Bar()
+              55:    6(float) CompositeExtract 53 0
+              56:    6(float) CompositeExtract 53 1
+              57:   11(fvec4) CompositeConstruct 55 56 54 54
+              58:   11(fvec4) FAdd 52 57
+                              ReturnValue 58
+                              FunctionEnd
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.inconsistentGLPerVertex.0.vert.out b/Test/baseResults/link.vk.inconsistentGLPerVertex.0.vert.out
new file mode 100755
index 0000000..3d76b2f
--- /dev/null
+++ b/Test/baseResults/link.vk.inconsistentGLPerVertex.0.vert.out
@@ -0,0 +1,315 @@
+link.vk.inconsistentGLPerVertex.0.vert
+Shader version: 460
+0:? Sequence
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      move second child to first child ( temp highp 4-component vector of float)
+0:17        color: direct index for structure ( out highp 4-component vector of float)
+0:17          'vs_out' ( out block{ out highp 4-component vector of float color})
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          1.000000
+0:17          1.000000
+0:17          1.000000
+0:17          1.000000
+0:18      move second child to first child ( temp float)
+0:18        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
+0:18          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:18          Constant:
+0:18            1 (const uint)
+0:18        Constant:
+0:18          1.000000
+0:19      move second child to first child ( temp highp 4-component vector of float)
+0:19        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:19          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:19          Constant:
+0:19            0 (const uint)
+0:19        'P' ( in highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'vs_out' ( out block{ out highp 4-component vector of float color})
+0:?     'P' ( in highp 4-component vector of float)
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  out unsized 1-element array of float CullDistance gl_CullDistance})
+
+link.vk.inconsistentGLPerVertex.0.geom
+Shader version: 460
+invocations = -1
+max_vertices = 50
+input primitive = lines_adjacency
+output primitive = triangle_strip
+0:? Sequence
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:18    Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:18          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out unsized 1-element array of float CullDistance gl_CullDistance})
+0:18          Constant:
+0:18            0 (const uint)
+0:18        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:18          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:18            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:18            Constant:
+0:18              0 (const int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      move second child to first child ( temp highp 4-component vector of float)
+0:19        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:19          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:19          Constant:
+0:19            0 (const int)
+0:19        color: direct index for structure ( in highp 4-component vector of float)
+0:19          direct index ( temp block{ in highp 4-component vector of float color})
+0:19            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:19            Constant:
+0:19              0 (const int)
+0:19          Constant:
+0:19            0 (const int)
+0:20      EmitVertex ( global void)
+0:21      move second child to first child ( temp highp 4-component vector of float)
+0:21        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:21          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:21          Constant:
+0:21            0 (const int)
+0:21        color: direct index for structure ( in highp 4-component vector of float)
+0:21          direct index ( temp block{ in highp 4-component vector of float color})
+0:21            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:21            Constant:
+0:21              1 (const int)
+0:21          Constant:
+0:21            0 (const int)
+0:22      move second child to first child ( temp 4-component vector of float)
+0:22        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:22          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out unsized 1-element array of float CullDistance gl_CullDistance})
+0:22          Constant:
+0:22            0 (const uint)
+0:22        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:22          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:22            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:22            Constant:
+0:22              1 (const int)
+0:22          Constant:
+0:22            0 (const int)
+0:23      EmitVertex ( global void)
+0:24      move second child to first child ( temp highp 4-component vector of float)
+0:24        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:24          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:24          Constant:
+0:24            0 (const int)
+0:24        color: direct index for structure ( in highp 4-component vector of float)
+0:24          direct index ( temp block{ in highp 4-component vector of float color})
+0:24            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:24            Constant:
+0:24              0 (const int)
+0:24          Constant:
+0:24            0 (const int)
+0:25      move second child to first child ( temp 4-component vector of float)
+0:25        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:25          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out unsized 1-element array of float CullDistance gl_CullDistance})
+0:25          Constant:
+0:25            0 (const uint)
+0:25        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:25          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:25            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:26      EmitVertex ( global void)
+0:?   Linker Objects
+0:?     'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:?     'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out unsized 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in unsized 1-element array of float ClipDistance gl_ClipDistance,  in unsized 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in unsized 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+
+
+Linked vertex stage:
+
+
+Linked geometry stage:
+
+
+Shader version: 460
+0:? Sequence
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:17    Sequence
+0:17      move second child to first child ( temp highp 4-component vector of float)
+0:17        color: direct index for structure ( out highp 4-component vector of float)
+0:17          'vs_out' ( out block{ out highp 4-component vector of float color})
+0:17          Constant:
+0:17            0 (const int)
+0:17        Constant:
+0:17          1.000000
+0:17          1.000000
+0:17          1.000000
+0:17          1.000000
+0:18      move second child to first child ( temp float)
+0:18        gl_PointSize: direct index for structure ( gl_PointSize float PointSize)
+0:18          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  out 1-element array of float CullDistance gl_CullDistance})
+0:18          Constant:
+0:18            1 (const uint)
+0:18        Constant:
+0:18          1.000000
+0:19      move second child to first child ( temp highp 4-component vector of float)
+0:19        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:19          'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  out 1-element array of float CullDistance gl_CullDistance})
+0:19          Constant:
+0:19            0 (const uint)
+0:19        'P' ( in highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'vs_out' ( out block{ out highp 4-component vector of float color})
+0:?     'P' ( in highp 4-component vector of float)
+0:?     'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  out 1-element array of float CullDistance gl_CullDistance})
+Shader version: 460
+invocations = 1
+max_vertices = 50
+input primitive = lines_adjacency
+output primitive = triangle_strip
+0:? Sequence
+0:16  Function Definition: main( ( global void)
+0:16    Function Parameters: 
+0:18    Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:18        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:18          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out 1-element array of float CullDistance gl_CullDistance})
+0:18          Constant:
+0:18            0 (const uint)
+0:18        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:18          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:18            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:18            Constant:
+0:18              0 (const int)
+0:18          Constant:
+0:18            0 (const int)
+0:19      move second child to first child ( temp highp 4-component vector of float)
+0:19        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:19          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:19          Constant:
+0:19            0 (const int)
+0:19        color: direct index for structure ( in highp 4-component vector of float)
+0:19          direct index ( temp block{ in highp 4-component vector of float color})
+0:19            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:19            Constant:
+0:19              0 (const int)
+0:19          Constant:
+0:19            0 (const int)
+0:20      EmitVertex ( global void)
+0:21      move second child to first child ( temp highp 4-component vector of float)
+0:21        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:21          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:21          Constant:
+0:21            0 (const int)
+0:21        color: direct index for structure ( in highp 4-component vector of float)
+0:21          direct index ( temp block{ in highp 4-component vector of float color})
+0:21            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:21            Constant:
+0:21              1 (const int)
+0:21          Constant:
+0:21            0 (const int)
+0:22      move second child to first child ( temp 4-component vector of float)
+0:22        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:22          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out 1-element array of float CullDistance gl_CullDistance})
+0:22          Constant:
+0:22            0 (const uint)
+0:22        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:22          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:22            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:22            Constant:
+0:22              1 (const int)
+0:22          Constant:
+0:22            0 (const int)
+0:23      EmitVertex ( global void)
+0:24      move second child to first child ( temp highp 4-component vector of float)
+0:24        color: direct index for structure (layout( stream=0) out highp 4-component vector of float)
+0:24          'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:24          Constant:
+0:24            0 (const int)
+0:24        color: direct index for structure ( in highp 4-component vector of float)
+0:24          direct index ( temp block{ in highp 4-component vector of float color})
+0:24            'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:24            Constant:
+0:24              0 (const int)
+0:24          Constant:
+0:24            0 (const int)
+0:25      move second child to first child ( temp 4-component vector of float)
+0:25        gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position)
+0:25          'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out 1-element array of float CullDistance gl_CullDistance})
+0:25          Constant:
+0:25            0 (const uint)
+0:25        gl_Position: direct index for structure ( in 4-component vector of float Position)
+0:25          direct index ( temp block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:25            'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+0:25            Constant:
+0:25              0 (const int)
+0:25          Constant:
+0:25            0 (const int)
+0:26      EmitVertex ( global void)
+0:?   Linker Objects
+0:?     'gs_in' ( in 4-element array of block{ in highp 4-component vector of float color})
+0:?     'gs_out' (layout( stream=0) out block{layout( stream=0) out highp 4-component vector of float color})
+0:?     'anon@0' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out 1-element array of float ClipDistance gl_ClipDistance, layout( stream=0) out 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position,  in float PointSize gl_PointSize,  in 1-element array of float ClipDistance gl_ClipDistance,  in 1-element array of float CullDistance gl_CullDistance,  in 4-component vector of float SecondaryPositionNV gl_SecondaryPositionNV,  in 1-element array of 4-component vector of float PositionPerViewNV gl_PositionPerViewNV})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 30
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 22 27
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "vs_output"
+                              MemberName 8(vs_output) 0  "color"
+                              Name 10  "vs_out"
+                              Name 20  "gl_PerVertex"
+                              MemberName 20(gl_PerVertex) 0  "gl_Position"
+                              MemberName 20(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 20(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 20(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 22  ""
+                              Name 27  "P"
+                              Decorate 8(vs_output) Block
+                              Decorate 10(vs_out) Location 0
+                              MemberDecorate 20(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 20(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 20(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 20(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 20(gl_PerVertex) Block
+                              Decorate 27(P) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+    8(vs_output):             TypeStruct 7(fvec4)
+               9:             TypePointer Output 8(vs_output)
+      10(vs_out):      9(ptr) Variable Output
+              11:             TypeInt 32 1
+              12:     11(int) Constant 0
+              13:    6(float) Constant 1065353216
+              14:    7(fvec4) ConstantComposite 13 13 13 13
+              15:             TypePointer Output 7(fvec4)
+              17:             TypeInt 32 0
+              18:     17(int) Constant 1
+              19:             TypeArray 6(float) 18
+20(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 19 19
+              21:             TypePointer Output 20(gl_PerVertex)
+              22:     21(ptr) Variable Output
+              23:     11(int) Constant 1
+              24:             TypePointer Output 6(float)
+              26:             TypePointer Input 7(fvec4)
+           27(P):     26(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              16:     15(ptr) AccessChain 10(vs_out) 12
+                              Store 16 14
+              25:     24(ptr) AccessChain 22 23
+                              Store 25 13
+              28:    7(fvec4) Load 27(P)
+              29:     15(ptr) AccessChain 22 12
+                              Store 29 28
+                              Return
+                              FunctionEnd
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
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 ddb856d..bdabab1
--- a/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.0.0.vert.out
@@ -211,7 +211,7 @@
                               Name 70  "BufferBlock"
                               MemberName 70(BufferBlock) 0  "p"
                               Name 72  "uBuf"
-                              Decorate 14(oColor) Location 4
+                              Decorate 14(oColor) Location 2
                               MemberDecorate 16(ColorBlock) 0 Offset 0
                               MemberDecorate 16(ColorBlock) 1 Offset 16
                               MemberDecorate 16(ColorBlock) 2 Offset 32
@@ -224,7 +224,7 @@
                               Decorate 28(uColorBuf) DescriptorSet 0
                               Decorate 28(uColorBuf) Binding 0
                               Decorate 32(Vertex) Block
-                              Decorate 34(oV) Location 2
+                              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
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 63be728..b0456a0
--- a/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
+++ b/Test/baseResults/link.vk.multiBlocksValid.1.0.geom.out
@@ -304,7 +304,7 @@
                               MemberName 95(BufferBlock) 0  "p"
                               Name 97  "uBuf"
                               Name 100  "P"
-                              Decorate 18(oColor) Location 2
+                              Decorate 18(oColor) Location 1
                               MemberDecorate 20(ColorBlock) 0 Offset 0
                               MemberDecorate 20(ColorBlock) 1 Offset 16
                               MemberDecorate 20(ColorBlock) 2 Offset 32
@@ -326,7 +326,7 @@
                               Decorate 50(uM) DescriptorSet 0
                               Decorate 50(uM) Binding 0
                               Decorate 59(Vertex) Block
-                              Decorate 61(oV) Location 1
+                              Decorate 61(oV) Location 0
                               Decorate 64(Vertex) Block
                               Decorate 68(iV) Location 0
                               MemberDecorate 95(BufferBlock) 0 ColMajor
@@ -335,7 +335,7 @@
                               Decorate 95(BufferBlock) BufferBlock
                               Decorate 97(uBuf) DescriptorSet 0
                               Decorate 97(uBuf) Binding 1
-                              Decorate 100(P) Location 4
+                              Decorate 100(P) Location 2
                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
diff --git a/Test/baseResults/negativeWorkGroupSize.comp.out b/Test/baseResults/negativeWorkGroupSize.comp.out
new file mode 100644
index 0000000..7ae3798
--- /dev/null
+++ b/Test/baseResults/negativeWorkGroupSize.comp.out
@@ -0,0 +1,69 @@
+negativeWorkGroupSize.comp
+ERROR: 0:4: 'initializer' : can't read from gl_WorkGroupSize before a fixed workgroup size has been declared 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 460
+local_size = (64, 1, 1)
+ERROR: node is still EOpNull!
+0:3  Function Definition: fn( ( global void)
+0:3    Function Parameters: 
+0:4    Sequence
+0:4      Sequence
+0:4        move second child to first child ( temp 3-component vector of uint)
+0:4          'wgs' ( temp 3-component vector of uint)
+0:4          Constant:
+0:4            1 (const uint)
+0:4            1 (const uint)
+0:4            1 (const uint)
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Function Call: fn( ( global void)
+0:11      Sequence
+0:11        move second child to first child ( temp 3-component vector of uint)
+0:11          'wgs' ( temp 3-component vector of uint)
+0:11          Constant:
+0:11            64 (const uint)
+0:11            1 (const uint)
+0:11            1 (const uint)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const 3-component vector of uint WorkGroupSize)
+0:?       64 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+
+
+Linked compute stage:
+
+
+Shader version: 460
+local_size = (64, 1, 1)
+ERROR: node is still EOpNull!
+0:3  Function Definition: fn( ( global void)
+0:3    Function Parameters: 
+0:4    Sequence
+0:4      Sequence
+0:4        move second child to first child ( temp 3-component vector of uint)
+0:4          'wgs' ( temp 3-component vector of uint)
+0:4          Constant:
+0:4            1 (const uint)
+0:4            1 (const uint)
+0:4            1 (const uint)
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Function Call: fn( ( global void)
+0:11      Sequence
+0:11        move second child to first child ( temp 3-component vector of uint)
+0:11          'wgs' ( temp 3-component vector of uint)
+0:11          Constant:
+0:11            64 (const uint)
+0:11            1 (const uint)
+0:11            1 (const uint)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const 3-component vector of uint WorkGroupSize)
+0:?       64 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+
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 c0cc8aa..bf654f7 100644
--- a/Test/baseResults/rayQuery-allOps.comp.out
+++ b/Test/baseResults/rayQuery-allOps.comp.out
@@ -4,8 +4,8 @@
 // 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 8182da3..90ebc4a 100644
--- a/Test/baseResults/rayQuery-allOps.frag.out
+++ b/Test/baseResults/rayQuery-allOps.frag.out
@@ -4,7 +4,7 @@
 // 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 01b8f1d..b3a93b0 100644
--- a/Test/baseResults/rayQuery-allOps.rgen.out
+++ b/Test/baseResults/rayQuery-allOps.rgen.out
@@ -3,7 +3,7 @@
 // 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 f97287f..f16facd 100644
--- a/Test/baseResults/rayQuery-initialize.rgen.out
+++ b/Test/baseResults/rayQuery-initialize.rgen.out
@@ -3,7 +3,7 @@
 // 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 23c8b51..a44c41f 100644
--- a/Test/baseResults/rayQuery-no-cse.rgen.out
+++ b/Test/baseResults/rayQuery-no-cse.rgen.out
@@ -3,7 +3,7 @@
 // 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 bf142a3..80e9916 100644
--- a/Test/baseResults/rayQuery.rgen.out
+++ b/Test/baseResults/rayQuery.rgen.out
@@ -3,7 +3,7 @@
 // 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"
@@ -39,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
@@ -59,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/spv.1.4.NonWritable.frag.out b/Test/baseResults/spv.1.4.NonWritable.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out b/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out
old mode 100755
new mode 100644
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
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
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
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
diff --git a/Test/baseResults/spv.AnyHitShader.rahit.out b/Test/baseResults/spv.AnyHitShader.rahit.out
index 755d60e..c893f88 100644
--- a/Test/baseResults/spv.AnyHitShader.rahit.out
+++ b/Test/baseResults/spv.AnyHitShader.rahit.out
@@ -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.ClosestHitShader.rchit.out b/Test/baseResults/spv.ClosestHitShader.rchit.out
index 63039dd..b76629c 100644
--- a/Test/baseResults/spv.ClosestHitShader.rchit.out
+++ b/Test/baseResults/spv.ClosestHitShader.rchit.out
@@ -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.MissShader.rmiss.out b/Test/baseResults/spv.MissShader.rmiss.out
index d0eeb01..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): 8000a
-// Id's are bound by 60
+// 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.RayCallable.rcall.out b/Test/baseResults/spv.RayCallable.rcall.out
index f59d36f..75698fc 100644
--- a/Test/baseResults/spv.RayCallable.rcall.out
+++ b/Test/baseResults/spv.RayCallable.rcall.out
@@ -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 c4085fe..962aeb7 100644
--- a/Test/baseResults/spv.RayConstants.rgen.out
+++ b/Test/baseResults/spv.RayConstants.rgen.out
@@ -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 363b3dd..f8f3fd6 100644
--- a/Test/baseResults/spv.RayGenShader.rgen.out
+++ b/Test/baseResults/spv.RayGenShader.rgen.out
@@ -92,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 195071f..f6b79c5
--- a/Test/baseResults/spv.RayGenShader11.rgen.out
+++ b/Test/baseResults/spv.RayGenShader11.rgen.out
@@ -88,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 fef54aa..63a04b3 100644
--- a/Test/baseResults/spv.RayGenShaderArray.rgen.out
+++ b/Test/baseResults/spv.RayGenShaderArray.rgen.out
@@ -111,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
@@ -124,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
@@ -138,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.atomicFloat.comp.out b/Test/baseResults/spv.atomicFloat.comp.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.atomicFloat_Error.comp.out b/Test/baseResults/spv.atomicFloat_Error.comp.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.atomicStoreInt64.comp.out b/Test/baseResults/spv.atomicStoreInt64.comp.out
new file mode 100644
index 0000000..3adadcb
--- /dev/null
+++ b/Test/baseResults/spv.atomicStoreInt64.comp.out
@@ -0,0 +1,57 @@
+spv.atomicStoreInt64.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+                              Capability Shader
+                              Capability Int64
+                              Capability Int64Atomics
+               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_atomic_int64"
+                              SourceExtension  "GL_EXT_shader_explicit_arithmetic_types_int64"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              Name 4  "main"
+                              Name 7  "ssbo"
+                              MemberName 7(ssbo) 0  "y"
+                              Name 9  ""
+                              Name 14  "ubo"
+                              MemberName 14(ubo) 0  "z"
+                              Name 16  ""
+                              MemberDecorate 7(ssbo) 0 Offset 0
+                              Decorate 7(ssbo) BufferBlock
+                              Decorate 9 DescriptorSet 0
+                              Decorate 9 Binding 0
+                              MemberDecorate 14(ubo) 0 Offset 0
+                              Decorate 14(ubo) Block
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 0
+         7(ssbo):             TypeStruct 6(int64_t)
+               8:             TypePointer Uniform 7(ssbo)
+               9:      8(ptr) Variable Uniform
+              10:             TypeInt 32 1
+              11:     10(int) Constant 0
+              12:             TypePointer Uniform 6(int64_t)
+         14(ubo):             TypeStruct 6(int64_t)
+              15:             TypePointer Uniform 14(ubo)
+              16:     15(ptr) Variable Uniform
+              19:     10(int) Constant 1
+              20:     10(int) Constant 64
+              21:             TypeInt 32 0
+              22:     21(int) Constant 1
+              23:     21(int) Constant 0
+              24:     21(int) Constant 64
+         4(main):           2 Function None 3
+               5:             Label
+              13:     12(ptr) AccessChain 9 11
+              17:     12(ptr) AccessChain 16 11
+              18:  6(int64_t) Load 17
+                              AtomicStore 13 19 24 18
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.bufferhandle1.frag.out b/Test/baseResults/spv.bufferhandle1.frag.out
index 59bcc78..b49c129 100644
--- a/Test/baseResults/spv.bufferhandle1.frag.out
+++ b/Test/baseResults/spv.bufferhandle1.frag.out
@@ -6,7 +6,7 @@
                               Capability Shader
                               Capability VulkanMemoryModelKHR
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                               Extension  "SPV_KHR_vulkan_memory_model"
                1:             ExtInstImport  "GLSL.std.450"
diff --git a/Test/baseResults/spv.bufferhandle10.frag.out b/Test/baseResults/spv.bufferhandle10.frag.out
index 3a33c42..f9ab60d 100644
--- a/Test/baseResults/spv.bufferhandle10.frag.out
+++ b/Test/baseResults/spv.bufferhandle10.frag.out
@@ -6,7 +6,7 @@
                               Capability Shader
                               Capability VulkanMemoryModelKHR
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                               Extension  "SPV_KHR_vulkan_memory_model"
                1:             ExtInstImport  "GLSL.std.450"
diff --git a/Test/baseResults/spv.bufferhandle11.frag.out b/Test/baseResults/spv.bufferhandle11.frag.out
index bd034aa..9dd1c7b 100644
--- a/Test/baseResults/spv.bufferhandle11.frag.out
+++ b/Test/baseResults/spv.bufferhandle11.frag.out
@@ -9,8 +9,8 @@
                               Capability Shader
                               Capability StorageBuffer8BitAccess
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
                               Extension  "SPV_KHR_8bit_storage"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle12.frag.out b/Test/baseResults/spv.bufferhandle12.frag.out
index c47c718..7cd5cb5 100644
--- a/Test/baseResults/spv.bufferhandle12.frag.out
+++ b/Test/baseResults/spv.bufferhandle12.frag.out
@@ -9,8 +9,8 @@
                               Capability Shader
                               Capability StorageUniformBufferBlock16
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
                               Extension  "SPV_KHR_16bit_storage"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle13.frag.out b/Test/baseResults/spv.bufferhandle13.frag.out
index bfc1524..5ce24ac 100644
--- a/Test/baseResults/spv.bufferhandle13.frag.out
+++ b/Test/baseResults/spv.bufferhandle13.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle14.frag.out b/Test/baseResults/spv.bufferhandle14.frag.out
index 514a798..34df753 100644
--- a/Test/baseResults/spv.bufferhandle14.frag.out
+++ b/Test/baseResults/spv.bufferhandle14.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
                               EntryPoint Fragment 4  "main"
diff --git a/Test/baseResults/spv.bufferhandle15.frag.out b/Test/baseResults/spv.bufferhandle15.frag.out
index bfa5d94..ab1b4db 100644
--- a/Test/baseResults/spv.bufferhandle15.frag.out
+++ b/Test/baseResults/spv.bufferhandle15.frag.out
@@ -8,7 +8,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle16.frag.out b/Test/baseResults/spv.bufferhandle16.frag.out
index 284bcb0..a9d9dcf 100644
--- a/Test/baseResults/spv.bufferhandle16.frag.out
+++ b/Test/baseResults/spv.bufferhandle16.frag.out
@@ -6,7 +6,7 @@
                               Capability Shader
                               Capability Int64
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
                               EntryPoint Fragment 4  "main"
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 21dddc5..59ad6d0 100644
--- a/Test/baseResults/spv.bufferhandle18.frag.out
+++ b/Test/baseResults/spv.bufferhandle18.frag.out
@@ -6,7 +6,7 @@
                               Capability Shader
                               Capability Int64
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
                               EntryPoint Fragment 4  "main"
diff --git a/Test/baseResults/spv.bufferhandle2.frag.out b/Test/baseResults/spv.bufferhandle2.frag.out
index f66c92a..e20f3b7 100644
--- a/Test/baseResults/spv.bufferhandle2.frag.out
+++ b/Test/baseResults/spv.bufferhandle2.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle3.frag.out b/Test/baseResults/spv.bufferhandle3.frag.out
index 95d4dcf..65ad1ca 100644
--- a/Test/baseResults/spv.bufferhandle3.frag.out
+++ b/Test/baseResults/spv.bufferhandle3.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle4.frag.out b/Test/baseResults/spv.bufferhandle4.frag.out
index 6751d6f..e06bca4 100644
--- a/Test/baseResults/spv.bufferhandle4.frag.out
+++ b/Test/baseResults/spv.bufferhandle4.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle5.frag.out b/Test/baseResults/spv.bufferhandle5.frag.out
index 9f78166..bf4d3a2 100644
--- a/Test/baseResults/spv.bufferhandle5.frag.out
+++ b/Test/baseResults/spv.bufferhandle5.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
                               EntryPoint Fragment 4  "main"
diff --git a/Test/baseResults/spv.bufferhandle6.frag.out b/Test/baseResults/spv.bufferhandle6.frag.out
index 441c762..abc9187 100644
--- a/Test/baseResults/spv.bufferhandle6.frag.out
+++ b/Test/baseResults/spv.bufferhandle6.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle7.frag.out b/Test/baseResults/spv.bufferhandle7.frag.out
index 3c8e86c..4282a36 100644
--- a/Test/baseResults/spv.bufferhandle7.frag.out
+++ b/Test/baseResults/spv.bufferhandle7.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle8.frag.out b/Test/baseResults/spv.bufferhandle8.frag.out
index b9f23c5..65d4665 100644
--- a/Test/baseResults/spv.bufferhandle8.frag.out
+++ b/Test/baseResults/spv.bufferhandle8.frag.out
@@ -5,7 +5,7 @@
 
                               Capability Shader
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandle9.frag.out b/Test/baseResults/spv.bufferhandle9.frag.out
index 7e534df..1e5091c 100644
--- a/Test/baseResults/spv.bufferhandle9.frag.out
+++ b/Test/baseResults/spv.bufferhandle9.frag.out
@@ -6,7 +6,7 @@
                               Capability Shader
                               Capability Int64
                               Capability PhysicalStorageBufferAddressesEXT
-                              Extension  "SPV_EXT_physical_storage_buffer"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel PhysicalStorageBuffer64EXT GLSL450
diff --git a/Test/baseResults/spv.bufferhandleUvec2.frag.out b/Test/baseResults/spv.bufferhandleUvec2.frag.out
old mode 100755
new mode 100644
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.coopmat.comp.out b/Test/baseResults/spv.coopmat.comp.out
index 6838bfc..0a609df 100644
--- a/Test/baseResults/spv.coopmat.comp.out
+++ b/Test/baseResults/spv.coopmat.comp.out
@@ -9,8 +9,8 @@
                               Capability VulkanMemoryModelKHR
                               Capability PhysicalStorageBufferAddressesEXT
                               Capability CooperativeMatrixNV
-                              Extension  "SPV_EXT_physical_storage_buffer"
                               Extension  "SPV_KHR_16bit_storage"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                               Extension  "SPV_KHR_vulkan_memory_model"
                               Extension  "SPV_NV_cooperative_matrix"
diff --git a/Test/baseResults/spv.debugInfo.1.1.frag.out b/Test/baseResults/spv.debugInfo.1.1.frag.out
index eec50a3..78044ff 100644
--- a/Test/baseResults/spv.debugInfo.1.1.frag.out
+++ b/Test/baseResults/spv.debugInfo.1.1.frag.out
@@ -1,6 +1,4 @@
 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): 8000a
 // Id's are bound by 124
@@ -9,7 +7,7 @@
                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.depthUnchanged.frag.out b/Test/baseResults/spv.depthUnchanged.frag.out
new file mode 100644
index 0000000..0074007
--- /dev/null
+++ b/Test/baseResults/spv.depthUnchanged.frag.out
@@ -0,0 +1,44 @@
+spv.depthUnchanged.frag
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 22
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 14 16
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 DepthReplacing
+                              ExecutionMode 4 DepthUnchanged
+                              Source GLSL 430
+                              Name 4  "main"
+                              Name 9  "outColor"
+                              Name 14  "gl_FragDepth"
+                              Name 16  "gl_FragCoord"
+                              Decorate 9(outColor) Location 0
+                              Decorate 14(gl_FragDepth) BuiltIn FragDepth
+                              Decorate 16(gl_FragCoord) BuiltIn FragCoord
+               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 1065353216
+              11:    6(float) Constant 0
+              12:    7(fvec4) ConstantComposite 10 11 11 10
+              13:             TypePointer Output 6(float)
+14(gl_FragDepth):     13(ptr) Variable Output
+              15:             TypePointer Input 7(fvec4)
+16(gl_FragCoord):     15(ptr) Variable Input
+              17:             TypeInt 32 0
+              18:     17(int) Constant 1
+              19:             TypePointer Input 6(float)
+         4(main):           2 Function None 3
+               5:             Label
+                              Store 9(outColor) 12
+              20:     19(ptr) AccessChain 16(gl_FragCoord) 18
+              21:    6(float) Load 20
+                              Store 14(gl_FragDepth) 21
+                              Return
+                              FunctionEnd
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 39e43a7..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 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 94
+// 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 84
+                              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 7077ea4..40903e6 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader.rchit.out
@@ -3,7 +3,7 @@
 // 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
@@ -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 4a4a34a..2d389a0 100644
--- a/Test/baseResults/spv.ext.IntersectShader.rint.out
+++ b/Test/baseResults/spv.ext.IntersectShader.rint.out
@@ -3,7 +3,7 @@
 // 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
@@ -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 544901b..d2dfc17 100644
--- a/Test/baseResults/spv.ext.MissShader.rmiss.out
+++ b/Test/baseResults/spv.ext.MissShader.rmiss.out
@@ -1,15 +1,27 @@
 spv.ext.MissShader.rmiss
 // Module Version 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 54
+// Id's are bound by 90
 
-                              Capability RayTracingProvisionalKHR
+                              Capability MinLod
+                              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 36 51 53
+                              EntryPoint MissKHR 4  "main" 11 14 21 24 29 32 36 51 53 58 63 74 78 85 89
                               Source GLSL 460
+                              SourceExtension  "GL_ARB_shader_ballot"
+                              SourceExtension  "GL_ARB_sparse_texture_clamp"
                               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 +36,15 @@
                               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  "texel"
+                              Name 74  "s2D"
+                              Name 78  "c2"
+                              Name 85  "lodClamp"
+                              Name 89  "localPayload"
                               Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
                               Decorate 14(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
                               Decorate 21(gl_WorldRayOriginEXT) BuiltIn WorldRayOriginKHR
@@ -34,8 +53,21 @@
                               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 74(s2D) DescriptorSet 0
+                              Decorate 74(s2D) Binding 1
+                              Decorate 78(c2) Location 2
+                              Decorate 85(lodClamp) Location 3
+                              Decorate 89(localPayload) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -69,10 +101,29 @@
               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 Function 49(fvec4)
+              71:             TypeImage 16(float) 2D sampled format:Unknown
+              72:             TypeSampledImage 71
+              73:             TypePointer UniformConstant 72
+         74(s2D):     73(ptr) Variable UniformConstant
+              76:             TypeVector 16(float) 2
+              77:             TypePointer Input 76(fvec2)
+          78(c2):     77(ptr) Variable Input
+              82:             TypeVector 47(int) 2
+              83:     47(int) Constant 5
+              84:   82(ivec2) ConstantComposite 83 83
+    85(lodClamp):     28(ptr) Variable Input
+              88:             TypePointer RayPayloadKHR 49(fvec4)
+89(localPayload):     88(ptr) Variable RayPayloadKHR
          4(main):           2 Function None 3
                5:             Label
            9(v0):      8(ptr) Variable Function
@@ -81,6 +132,7 @@
           23(v3):     18(ptr) Variable Function
           27(v4):     26(ptr) Variable Function
           31(v5):     26(ptr) Variable Function
+       70(texel):     69(ptr) Variable Function
               12:    7(ivec3) Load 11(gl_LaunchIDEXT)
                               Store 9(v0) 12
               15:    7(ivec3) Load 14(gl_LaunchSizeEXT)
@@ -94,6 +146,24 @@
               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
+              75:          72 Load 74(s2D)
+              79:   76(fvec2) Load 78(c2)
+              80:   76(fvec2) Load 78(c2)
+              81:   76(fvec2) Load 78(c2)
+              86:   16(float) Load 85(lodClamp)
+              87:   49(fvec4) ImageSampleExplicitLod 75 79 Grad ConstOffset MinLod 80 81 84 86
+                              Store 70(texel) 87
                               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 e87b5fa..d429116 100644
--- a/Test/baseResults/spv.ext.RayCallable.rcall.out
+++ b/Test/baseResults/spv.ext.RayCallable.rcall.out
@@ -3,7 +3,7 @@
 // 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
@@ -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 5d7079a..afd5083 100644
--- a/Test/baseResults/spv.ext.RayConstants.rgen.out
+++ b/Test/baseResults/spv.ext.RayConstants.rgen.out
@@ -3,7 +3,7 @@
 // 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
@@ -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 b1904ac..da516f3 100644
--- a/Test/baseResults/spv.ext.RayGenShader.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader.rgen.out
@@ -3,12 +3,12 @@
 // 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 29 40 51 54 57
+                              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,9 +24,9 @@
                               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
@@ -36,11 +36,11 @@
                               Decorate 38(block) Block
                               Decorate 40 DescriptorSet 0
                               Decorate 40 Binding 3
-                              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 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
@@ -67,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
@@ -101,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 cfaf529..00262ac 100644
--- a/Test/baseResults/spv.ext.RayGenShader11.rgen.out
+++ b/Test/baseResults/spv.ext.RayGenShader11.rgen.out
@@ -3,7 +3,7 @@
 // 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
@@ -32,7 +32,7 @@
                               Decorate 37(block) Block
                               Decorate 39 DescriptorSet 0
                               Decorate 39 Binding 1
-                              Decorate 52(payload) Location 0
+                              Decorate 52(payload) Location 1
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -88,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 25d46a6..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 10400
 // Generated by (magic number): 8000a
-// Id's are bound by 89
+// 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 30 36 60 88
+                              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,29 +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) Block
-                              Decorate 36 DescriptorSet 0
-                              Decorate 36 Binding 2
-                              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
@@ -63,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
@@ -99,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.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
old mode 100755
new mode 100644
index ad877bd..40d73d1
--- a/Test/baseResults/spv.ext.World3x4.rahit.out
+++ b/Test/baseResults/spv.ext.World3x4.rahit.out
@@ -3,7 +3,7 @@
 // Generated by (magic number): 8000a
 // Id's are bound by 90
 
-                              Capability RayTracingProvisionalKHR
+                              Capability RayTracingKHR
                               Extension  "SPV_KHR_ray_tracing"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
diff --git a/Test/baseResults/spv.float16Fetch.frag.out b/Test/baseResults/spv.float16Fetch.frag.out
index 38c5478..3b2c36f 100644
--- a/Test/baseResults/spv.float16Fetch.frag.out
+++ b/Test/baseResults/spv.float16Fetch.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 5923
+// Id's are bound by 5933
 
                               Capability Shader
                               Capability Float16
@@ -29,7 +29,7 @@
                               Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4257 4264 5913 5922
+                              EntryPoint Fragment 4  "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4267 4274 5923 5932
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_AMD_gpu_shader_half_float"
@@ -173,40 +173,40 @@
                               Name 3832  "texel"
                               Name 3950  "texel"
                               Name 4022  "texel"
-                              Name 4094  "texel"
-                              Name 4146  "texel"
-                              Name 4174  "texel"
-                              Name 4202  "texel"
-                              Name 4254  "texel"
-                              Name 4257  "lodClamp"
-                              Name 4264  "f16lodClamp"
-                              Name 4391  "texel"
-                              Name 4598  "texel"
-                              Name 4674  "texel"
-                              Name 4818  "texel"
-                              Name 4962  "texel"
-                              Name 5188  "texel"
-                              Name 5280  "texel"
-                              Name 5452  "texel"
-                              Name 5454  "t1D"
-                              Name 5458  "s"
-                              Name 5474  "t2D"
-                              Name 5491  "t3D"
-                              Name 5508  "tCube"
-                              Name 5525  "sShadow"
-                              Name 5589  "t1DArray"
-                              Name 5606  "t2DArray"
-                              Name 5623  "tCubeArray"
-                              Name 5681  "t2DRect"
-                              Name 5741  "subpass"
-                              Name 5747  "subpassMS"
-                              Name 5753  "result"
-                              Name 5834  "param"
-                              Name 5913  "fragColor"
-                              Name 5917  "tBuffer"
-                              Name 5919  "t2DMS"
-                              Name 5921  "t2DMSArray"
-                              Name 5922  "bias"
+                              Name 4104  "texel"
+                              Name 4156  "texel"
+                              Name 4184  "texel"
+                              Name 4212  "texel"
+                              Name 4264  "texel"
+                              Name 4267  "lodClamp"
+                              Name 4274  "f16lodClamp"
+                              Name 4401  "texel"
+                              Name 4608  "texel"
+                              Name 4684  "texel"
+                              Name 4828  "texel"
+                              Name 4972  "texel"
+                              Name 5198  "texel"
+                              Name 5290  "texel"
+                              Name 5462  "texel"
+                              Name 5464  "t1D"
+                              Name 5468  "s"
+                              Name 5484  "t2D"
+                              Name 5501  "t3D"
+                              Name 5518  "tCube"
+                              Name 5535  "sShadow"
+                              Name 5599  "t1DArray"
+                              Name 5616  "t2DArray"
+                              Name 5633  "tCubeArray"
+                              Name 5691  "t2DRect"
+                              Name 5751  "subpass"
+                              Name 5757  "subpassMS"
+                              Name 5763  "result"
+                              Name 5844  "param"
+                              Name 5923  "fragColor"
+                              Name 5927  "tBuffer"
+                              Name 5929  "t2DMS"
+                              Name 5931  "t2DMSArray"
+                              Name 5932  "bias"
                               Decorate 125(s1D) DescriptorSet 0
                               Decorate 125(s1D) Binding 0
                               Decorate 128(c1) Location 0
@@ -283,42 +283,42 @@
                               Decorate 3036(i2DMS) Binding 9
                               Decorate 3045(i2DMSArray) DescriptorSet 1
                               Decorate 3045(i2DMSArray) Binding 10
-                              Decorate 4257(lodClamp) Location 7
-                              Decorate 4264(f16lodClamp) Location 17
-                              Decorate 5454(t1D) DescriptorSet 2
-                              Decorate 5454(t1D) Binding 0
-                              Decorate 5458(s) DescriptorSet 2
-                              Decorate 5458(s) Binding 11
-                              Decorate 5474(t2D) DescriptorSet 2
-                              Decorate 5474(t2D) Binding 1
-                              Decorate 5491(t3D) DescriptorSet 2
-                              Decorate 5491(t3D) Binding 2
-                              Decorate 5508(tCube) DescriptorSet 2
-                              Decorate 5508(tCube) Binding 4
-                              Decorate 5525(sShadow) DescriptorSet 2
-                              Decorate 5525(sShadow) Binding 12
-                              Decorate 5589(t1DArray) DescriptorSet 2
-                              Decorate 5589(t1DArray) Binding 5
-                              Decorate 5606(t2DArray) DescriptorSet 2
-                              Decorate 5606(t2DArray) Binding 6
-                              Decorate 5623(tCubeArray) DescriptorSet 2
-                              Decorate 5623(tCubeArray) Binding 7
-                              Decorate 5681(t2DRect) DescriptorSet 2
-                              Decorate 5681(t2DRect) Binding 3
-                              Decorate 5741(subpass) DescriptorSet 3
-                              Decorate 5741(subpass) Binding 0
-                              Decorate 5741(subpass) InputAttachmentIndex 0
-                              Decorate 5747(subpassMS) DescriptorSet 3
-                              Decorate 5747(subpassMS) Binding 1
-                              Decorate 5747(subpassMS) InputAttachmentIndex 0
-                              Decorate 5913(fragColor) Location 0
-                              Decorate 5917(tBuffer) DescriptorSet 2
-                              Decorate 5917(tBuffer) Binding 8
-                              Decorate 5919(t2DMS) DescriptorSet 2
-                              Decorate 5919(t2DMS) Binding 9
-                              Decorate 5921(t2DMSArray) DescriptorSet 2
-                              Decorate 5921(t2DMSArray) Binding 10
-                              Decorate 5922(bias) Location 6
+                              Decorate 4267(lodClamp) Location 7
+                              Decorate 4274(f16lodClamp) Location 17
+                              Decorate 5464(t1D) DescriptorSet 2
+                              Decorate 5464(t1D) Binding 0
+                              Decorate 5468(s) DescriptorSet 2
+                              Decorate 5468(s) Binding 11
+                              Decorate 5484(t2D) DescriptorSet 2
+                              Decorate 5484(t2D) Binding 1
+                              Decorate 5501(t3D) DescriptorSet 2
+                              Decorate 5501(t3D) Binding 2
+                              Decorate 5518(tCube) DescriptorSet 2
+                              Decorate 5518(tCube) Binding 4
+                              Decorate 5535(sShadow) DescriptorSet 2
+                              Decorate 5535(sShadow) Binding 12
+                              Decorate 5599(t1DArray) DescriptorSet 2
+                              Decorate 5599(t1DArray) Binding 5
+                              Decorate 5616(t2DArray) DescriptorSet 2
+                              Decorate 5616(t2DArray) Binding 6
+                              Decorate 5633(tCubeArray) DescriptorSet 2
+                              Decorate 5633(tCubeArray) Binding 7
+                              Decorate 5691(t2DRect) DescriptorSet 2
+                              Decorate 5691(t2DRect) Binding 3
+                              Decorate 5751(subpass) DescriptorSet 3
+                              Decorate 5751(subpass) Binding 0
+                              Decorate 5751(subpass) InputAttachmentIndex 0
+                              Decorate 5757(subpassMS) DescriptorSet 3
+                              Decorate 5757(subpassMS) Binding 1
+                              Decorate 5757(subpassMS) InputAttachmentIndex 0
+                              Decorate 5923(fragColor) Location 0
+                              Decorate 5927(tBuffer) DescriptorSet 2
+                              Decorate 5927(tBuffer) Binding 8
+                              Decorate 5929(t2DMS) DescriptorSet 2
+                              Decorate 5929(t2DMS) Binding 9
+                              Decorate 5931(t2DMSArray) DescriptorSet 2
+                              Decorate 5931(t2DMSArray) Binding 10
+                              Decorate 5932(bias) Location 6
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 16
@@ -491,258 +491,268 @@
 3045(i2DMSArray):   3044(ptr) Variable UniformConstant
    3102(ResType):             TypeStruct 47(int) 7(f16vec4)
    3138(ResType):             TypeStruct 47(int) 6(float16_t)
-  4257(lodClamp):    127(ptr) Variable Input
-4264(f16lodClamp):    134(ptr) Variable Input
-            5453:             TypePointer UniformConstant 122
-       5454(t1D):   5453(ptr) Variable UniformConstant
-            5456:             TypeSampler
-            5457:             TypePointer UniformConstant 5456
-         5458(s):   5457(ptr) Variable UniformConstant
-            5473:             TypePointer UniformConstant 142
-       5474(t2D):   5473(ptr) Variable UniformConstant
-            5490:             TypePointer UniformConstant 162
-       5491(t3D):   5490(ptr) Variable UniformConstant
-            5507:             TypePointer UniformConstant 183
-     5508(tCube):   5507(ptr) Variable UniformConstant
-   5525(sShadow):   5457(ptr) Variable UniformConstant
-            5588:             TypePointer UniformConstant 268
-  5589(t1DArray):   5588(ptr) Variable UniformConstant
-            5605:             TypePointer UniformConstant 283
-  5606(t2DArray):   5605(ptr) Variable UniformConstant
-            5622:             TypePointer UniformConstant 298
-5623(tCubeArray):   5622(ptr) Variable UniformConstant
-            5680:             TypePointer UniformConstant 356
-   5681(t2DRect):   5680(ptr) Variable UniformConstant
-            5739:             TypeImage 6(float16_t) SubpassData nonsampled format:Unknown
-            5740:             TypePointer UniformConstant 5739
-   5741(subpass):   5740(ptr) Variable UniformConstant
-            5743:  721(ivec2) ConstantComposite 2187 2187
-            5745:             TypeImage 6(float16_t) SubpassData multi-sampled nonsampled format:Unknown
-            5746:             TypePointer UniformConstant 5745
- 5747(subpassMS):   5746(ptr) Variable UniformConstant
-            5912:             TypePointer Output 249(fvec4)
- 5913(fragColor):   5912(ptr) Variable Output
-            5916:             TypePointer UniformConstant 1297
-   5917(tBuffer):   5916(ptr) Variable UniformConstant
-            5918:             TypePointer UniformConstant 1308
-     5919(t2DMS):   5918(ptr) Variable UniformConstant
-            5920:             TypePointer UniformConstant 1319
-5921(t2DMSArray):   5920(ptr) Variable UniformConstant
-      5922(bias):    127(ptr) Variable Input
+            4025:  721(ivec2) ConstantComposite 709 1326
+            4026:     47(int) Constant 3
+            4027:     47(int) Constant 4
+            4028:  721(ivec2) ConstantComposite 4026 4027
+            4029:     47(int) Constant 15
+            4030:     47(int) Constant 16
+            4031:  721(ivec2) ConstantComposite 4029 4030
+            4032:     47(int) Constant 4294967294
+            4033:  721(ivec2) ConstantComposite 4032 2187
+            4034:        2379 ConstantComposite 4025 4028 4031 4033
+  4267(lodClamp):    127(ptr) Variable Input
+4274(f16lodClamp):    134(ptr) Variable Input
+            5463:             TypePointer UniformConstant 122
+       5464(t1D):   5463(ptr) Variable UniformConstant
+            5466:             TypeSampler
+            5467:             TypePointer UniformConstant 5466
+         5468(s):   5467(ptr) Variable UniformConstant
+            5483:             TypePointer UniformConstant 142
+       5484(t2D):   5483(ptr) Variable UniformConstant
+            5500:             TypePointer UniformConstant 162
+       5501(t3D):   5500(ptr) Variable UniformConstant
+            5517:             TypePointer UniformConstant 183
+     5518(tCube):   5517(ptr) Variable UniformConstant
+   5535(sShadow):   5467(ptr) Variable UniformConstant
+            5598:             TypePointer UniformConstant 268
+  5599(t1DArray):   5598(ptr) Variable UniformConstant
+            5615:             TypePointer UniformConstant 283
+  5616(t2DArray):   5615(ptr) Variable UniformConstant
+            5632:             TypePointer UniformConstant 298
+5633(tCubeArray):   5632(ptr) Variable UniformConstant
+            5690:             TypePointer UniformConstant 356
+   5691(t2DRect):   5690(ptr) Variable UniformConstant
+            5749:             TypeImage 6(float16_t) SubpassData nonsampled format:Unknown
+            5750:             TypePointer UniformConstant 5749
+   5751(subpass):   5750(ptr) Variable UniformConstant
+            5753:  721(ivec2) ConstantComposite 2187 2187
+            5755:             TypeImage 6(float16_t) SubpassData multi-sampled nonsampled format:Unknown
+            5756:             TypePointer UniformConstant 5755
+ 5757(subpassMS):   5756(ptr) Variable UniformConstant
+            5922:             TypePointer Output 249(fvec4)
+ 5923(fragColor):   5922(ptr) Variable Output
+            5926:             TypePointer UniformConstant 1297
+   5927(tBuffer):   5926(ptr) Variable UniformConstant
+            5928:             TypePointer UniformConstant 1308
+     5929(t2DMS):   5928(ptr) Variable UniformConstant
+            5930:             TypePointer UniformConstant 1319
+5931(t2DMSArray):   5930(ptr) Variable UniformConstant
+      5932(bias):    127(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-    5753(result):     64(ptr) Variable Function
-     5834(param):     64(ptr) Variable Function
-                              Store 5753(result) 121
-            5754:  7(f16vec4) FunctionCall 9(testTexture()
-            5755:  7(f16vec4) Load 5753(result)
-            5756:  7(f16vec4) FAdd 5755 5754
-                              Store 5753(result) 5756
-            5757:  7(f16vec4) FunctionCall 11(testTextureProj()
-            5758:  7(f16vec4) Load 5753(result)
-            5759:  7(f16vec4) FAdd 5758 5757
-                              Store 5753(result) 5759
-            5760:  7(f16vec4) FunctionCall 13(testTextureLod()
-            5761:  7(f16vec4) Load 5753(result)
-            5762:  7(f16vec4) FAdd 5761 5760
-                              Store 5753(result) 5762
-            5763:  7(f16vec4) FunctionCall 15(testTextureOffset()
-            5764:  7(f16vec4) Load 5753(result)
-            5765:  7(f16vec4) FAdd 5764 5763
-                              Store 5753(result) 5765
-            5766:  7(f16vec4) FunctionCall 19(testTextureLodOffset()
-            5767:  7(f16vec4) Load 5753(result)
-            5768:  7(f16vec4) FAdd 5767 5766
-                              Store 5753(result) 5768
-            5769:  7(f16vec4) FunctionCall 21(testTextureProjLodOffset()
-            5770:  7(f16vec4) Load 5753(result)
-            5771:  7(f16vec4) FAdd 5770 5769
-                              Store 5753(result) 5771
-            5772:  7(f16vec4) FunctionCall 23(testTexelFetch()
-            5773:  7(f16vec4) Load 5753(result)
-            5774:  7(f16vec4) FAdd 5773 5772
-                              Store 5753(result) 5774
-            5775:  7(f16vec4) FunctionCall 25(testTexelFetchOffset()
-            5776:  7(f16vec4) Load 5753(result)
-            5777:  7(f16vec4) FAdd 5776 5775
-                              Store 5753(result) 5777
-            5778:  7(f16vec4) FunctionCall 27(testTextureGrad()
-            5779:  7(f16vec4) Load 5753(result)
-            5780:  7(f16vec4) FAdd 5779 5778
-                              Store 5753(result) 5780
-            5781:  7(f16vec4) FunctionCall 29(testTextureGradOffset()
-            5782:  7(f16vec4) Load 5753(result)
-            5783:  7(f16vec4) FAdd 5782 5781
-                              Store 5753(result) 5783
-            5784:  7(f16vec4) FunctionCall 31(testTextureProjGrad()
-            5785:  7(f16vec4) Load 5753(result)
-            5786:  7(f16vec4) FAdd 5785 5784
-                              Store 5753(result) 5786
-            5787:  7(f16vec4) FunctionCall 33(testTextureProjGradoffset()
-            5788:  7(f16vec4) Load 5753(result)
-            5789:  7(f16vec4) FAdd 5788 5787
-                              Store 5753(result) 5789
-            5790:  7(f16vec4) FunctionCall 35(testTextureGather()
-            5791:  7(f16vec4) Load 5753(result)
-            5792:  7(f16vec4) FAdd 5791 5790
-                              Store 5753(result) 5792
-            5793:  7(f16vec4) FunctionCall 37(testTextureGatherOffset()
-            5794:  7(f16vec4) Load 5753(result)
-            5795:  7(f16vec4) FAdd 5794 5793
-                              Store 5753(result) 5795
-            5796:  7(f16vec4) FunctionCall 39(testTextureGatherOffsets()
-            5797:  7(f16vec4) Load 5753(result)
-            5798:  7(f16vec4) FAdd 5797 5796
-                              Store 5753(result) 5798
-            5799:  7(f16vec4) FunctionCall 41(testTextureGatherLod()
-            5800:  7(f16vec4) Load 5753(result)
-            5801:  7(f16vec4) FAdd 5800 5799
-                              Store 5753(result) 5801
-            5802:  7(f16vec4) FunctionCall 43(testTextureGatherLodOffset()
-            5803:  7(f16vec4) Load 5753(result)
-            5804:  7(f16vec4) FAdd 5803 5802
-                              Store 5753(result) 5804
-            5805:  7(f16vec4) FunctionCall 45(testTextureGatherLodOffsets()
-            5806:  7(f16vec4) Load 5753(result)
-            5807:  7(f16vec4) FAdd 5806 5805
-                              Store 5753(result) 5807
-            5808:   48(ivec4) FunctionCall 50(testTextureSize()
-            5809:  7(f16vec4) ConvertSToF 5808
-            5810:  7(f16vec4) Load 5753(result)
+    5763(result):     64(ptr) Variable Function
+     5844(param):     64(ptr) Variable Function
+                              Store 5763(result) 121
+            5764:  7(f16vec4) FunctionCall 9(testTexture()
+            5765:  7(f16vec4) Load 5763(result)
+            5766:  7(f16vec4) FAdd 5765 5764
+                              Store 5763(result) 5766
+            5767:  7(f16vec4) FunctionCall 11(testTextureProj()
+            5768:  7(f16vec4) Load 5763(result)
+            5769:  7(f16vec4) FAdd 5768 5767
+                              Store 5763(result) 5769
+            5770:  7(f16vec4) FunctionCall 13(testTextureLod()
+            5771:  7(f16vec4) Load 5763(result)
+            5772:  7(f16vec4) FAdd 5771 5770
+                              Store 5763(result) 5772
+            5773:  7(f16vec4) FunctionCall 15(testTextureOffset()
+            5774:  7(f16vec4) Load 5763(result)
+            5775:  7(f16vec4) FAdd 5774 5773
+                              Store 5763(result) 5775
+            5776:  7(f16vec4) FunctionCall 19(testTextureLodOffset()
+            5777:  7(f16vec4) Load 5763(result)
+            5778:  7(f16vec4) FAdd 5777 5776
+                              Store 5763(result) 5778
+            5779:  7(f16vec4) FunctionCall 21(testTextureProjLodOffset()
+            5780:  7(f16vec4) Load 5763(result)
+            5781:  7(f16vec4) FAdd 5780 5779
+                              Store 5763(result) 5781
+            5782:  7(f16vec4) FunctionCall 23(testTexelFetch()
+            5783:  7(f16vec4) Load 5763(result)
+            5784:  7(f16vec4) FAdd 5783 5782
+                              Store 5763(result) 5784
+            5785:  7(f16vec4) FunctionCall 25(testTexelFetchOffset()
+            5786:  7(f16vec4) Load 5763(result)
+            5787:  7(f16vec4) FAdd 5786 5785
+                              Store 5763(result) 5787
+            5788:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5789:  7(f16vec4) Load 5763(result)
+            5790:  7(f16vec4) FAdd 5789 5788
+                              Store 5763(result) 5790
+            5791:  7(f16vec4) FunctionCall 29(testTextureGradOffset()
+            5792:  7(f16vec4) Load 5763(result)
+            5793:  7(f16vec4) FAdd 5792 5791
+                              Store 5763(result) 5793
+            5794:  7(f16vec4) FunctionCall 31(testTextureProjGrad()
+            5795:  7(f16vec4) Load 5763(result)
+            5796:  7(f16vec4) FAdd 5795 5794
+                              Store 5763(result) 5796
+            5797:  7(f16vec4) FunctionCall 33(testTextureProjGradoffset()
+            5798:  7(f16vec4) Load 5763(result)
+            5799:  7(f16vec4) FAdd 5798 5797
+                              Store 5763(result) 5799
+            5800:  7(f16vec4) FunctionCall 35(testTextureGather()
+            5801:  7(f16vec4) Load 5763(result)
+            5802:  7(f16vec4) FAdd 5801 5800
+                              Store 5763(result) 5802
+            5803:  7(f16vec4) FunctionCall 37(testTextureGatherOffset()
+            5804:  7(f16vec4) Load 5763(result)
+            5805:  7(f16vec4) FAdd 5804 5803
+                              Store 5763(result) 5805
+            5806:  7(f16vec4) FunctionCall 39(testTextureGatherOffsets()
+            5807:  7(f16vec4) Load 5763(result)
+            5808:  7(f16vec4) FAdd 5807 5806
+                              Store 5763(result) 5808
+            5809:  7(f16vec4) FunctionCall 41(testTextureGatherLod()
+            5810:  7(f16vec4) Load 5763(result)
             5811:  7(f16vec4) FAdd 5810 5809
-                              Store 5753(result) 5811
-            5812:   53(fvec2) FunctionCall 55(testTextureQueryLod()
-            5813:154(f16vec2) FConvert 5812
-            5814:  7(f16vec4) Load 5753(result)
-            5815:154(f16vec2) VectorShuffle 5814 5814 0 1
-            5816:154(f16vec2) FAdd 5815 5813
-            5817:  7(f16vec4) Load 5753(result)
-            5818:  7(f16vec4) VectorShuffle 5817 5816 4 5 2 3
-                              Store 5753(result) 5818
-            5819:     47(int) FunctionCall 58(testTextureQueryLevels()
-            5820:6(float16_t) ConvertSToF 5819
-            5821:    208(ptr) AccessChain 5753(result) 207
-            5822:6(float16_t) Load 5821
-            5823:6(float16_t) FAdd 5822 5820
-            5824:    208(ptr) AccessChain 5753(result) 207
-                              Store 5824 5823
-            5825:     47(int) FunctionCall 60(testTextureSamples()
-            5826:6(float16_t) ConvertSToF 5825
-            5827:    208(ptr) AccessChain 5753(result) 207
-            5828:6(float16_t) Load 5827
-            5829:6(float16_t) FAdd 5828 5826
-            5830:    208(ptr) AccessChain 5753(result) 207
-                              Store 5830 5829
-            5831:  7(f16vec4) FunctionCall 62(testImageLoad()
-            5832:  7(f16vec4) Load 5753(result)
-            5833:  7(f16vec4) FAdd 5832 5831
-                              Store 5753(result) 5833
-            5835:  7(f16vec4) Load 5753(result)
-                              Store 5834(param) 5835
-            5836:           2 FunctionCall 67(testImageStore(vf164;) 5834(param)
-            5837:  7(f16vec4) FunctionCall 69(testSparseTexture()
-            5838:  7(f16vec4) Load 5753(result)
-            5839:  7(f16vec4) FAdd 5838 5837
-                              Store 5753(result) 5839
-            5840:  7(f16vec4) FunctionCall 71(testSparseTextureLod()
-            5841:  7(f16vec4) Load 5753(result)
-            5842:  7(f16vec4) FAdd 5841 5840
-                              Store 5753(result) 5842
-            5843:  7(f16vec4) FunctionCall 73(testSparseTextureOffset()
-            5844:  7(f16vec4) Load 5753(result)
-            5845:  7(f16vec4) FAdd 5844 5843
-                              Store 5753(result) 5845
-            5846:  7(f16vec4) FunctionCall 75(testSparseTextureLodOffset()
-            5847:  7(f16vec4) Load 5753(result)
-            5848:  7(f16vec4) FAdd 5847 5846
-                              Store 5753(result) 5848
-            5849:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
-            5850:  7(f16vec4) Load 5753(result)
-            5851:  7(f16vec4) FAdd 5850 5849
-                              Store 5753(result) 5851
-            5852:  7(f16vec4) FunctionCall 79(testSparseTextureGradOffset()
-            5853:  7(f16vec4) Load 5753(result)
-            5854:  7(f16vec4) FAdd 5853 5852
-                              Store 5753(result) 5854
-            5855:  7(f16vec4) FunctionCall 81(testSparseTexelFetch()
-            5856:  7(f16vec4) Load 5753(result)
-            5857:  7(f16vec4) FAdd 5856 5855
-                              Store 5753(result) 5857
-            5858:  7(f16vec4) FunctionCall 83(testSparseTexelFetchOffset()
-            5859:  7(f16vec4) Load 5753(result)
-            5860:  7(f16vec4) FAdd 5859 5858
-                              Store 5753(result) 5860
-            5861:  7(f16vec4) FunctionCall 85(testSparseTextureGather()
-            5862:  7(f16vec4) Load 5753(result)
-            5863:  7(f16vec4) FAdd 5862 5861
-                              Store 5753(result) 5863
-            5864:  7(f16vec4) FunctionCall 87(testSparseTextureGatherOffset()
-            5865:  7(f16vec4) Load 5753(result)
-            5866:  7(f16vec4) FAdd 5865 5864
-                              Store 5753(result) 5866
-            5867:  7(f16vec4) FunctionCall 89(testSparseTextureGatherOffsets()
-            5868:  7(f16vec4) Load 5753(result)
-            5869:  7(f16vec4) FAdd 5868 5867
-                              Store 5753(result) 5869
-            5870:  7(f16vec4) FunctionCall 91(testSparseTextureGatherLod()
-            5871:  7(f16vec4) Load 5753(result)
-            5872:  7(f16vec4) FAdd 5871 5870
-                              Store 5753(result) 5872
-            5873:  7(f16vec4) FunctionCall 93(testSparseTextureGatherLodOffset()
-            5874:  7(f16vec4) Load 5753(result)
-            5875:  7(f16vec4) FAdd 5874 5873
-                              Store 5753(result) 5875
-            5876:  7(f16vec4) FunctionCall 95(testSparseTextureGatherLodOffsets()
-            5877:  7(f16vec4) Load 5753(result)
-            5878:  7(f16vec4) FAdd 5877 5876
-                              Store 5753(result) 5878
-            5879:  7(f16vec4) FunctionCall 97(testSparseImageLoad()
-            5880:  7(f16vec4) Load 5753(result)
-            5881:  7(f16vec4) FAdd 5880 5879
-                              Store 5753(result) 5881
-            5882:  7(f16vec4) FunctionCall 99(testSparseTextureClamp()
-            5883:  7(f16vec4) Load 5753(result)
-            5884:  7(f16vec4) FAdd 5883 5882
-                              Store 5753(result) 5884
-            5885:  7(f16vec4) FunctionCall 101(testTextureClamp()
-            5886:  7(f16vec4) Load 5753(result)
-            5887:  7(f16vec4) FAdd 5886 5885
-                              Store 5753(result) 5887
-            5888:  7(f16vec4) FunctionCall 103(testSparseTextureOffsetClamp()
-            5889:  7(f16vec4) Load 5753(result)
-            5890:  7(f16vec4) FAdd 5889 5888
-                              Store 5753(result) 5890
-            5891:  7(f16vec4) FunctionCall 105(testTextureOffsetClamp()
-            5892:  7(f16vec4) Load 5753(result)
-            5893:  7(f16vec4) FAdd 5892 5891
-                              Store 5753(result) 5893
-            5894:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
-            5895:  7(f16vec4) Load 5753(result)
-            5896:  7(f16vec4) FAdd 5895 5894
-                              Store 5753(result) 5896
-            5897:  7(f16vec4) FunctionCall 27(testTextureGrad()
-            5898:  7(f16vec4) Load 5753(result)
-            5899:  7(f16vec4) FAdd 5898 5897
-                              Store 5753(result) 5899
-            5900:  7(f16vec4) FunctionCall 111(testSparseTextureGradOffsetClamp()
-            5901:  7(f16vec4) Load 5753(result)
-            5902:  7(f16vec4) FAdd 5901 5900
-                              Store 5753(result) 5902
-            5903:  7(f16vec4) FunctionCall 113(testTextureGradOffsetClamp()
-            5904:  7(f16vec4) Load 5753(result)
-            5905:  7(f16vec4) FAdd 5904 5903
-                              Store 5753(result) 5905
-            5906:  7(f16vec4) FunctionCall 115(testCombinedTextureSampler()
-            5907:  7(f16vec4) Load 5753(result)
-            5908:  7(f16vec4) FAdd 5907 5906
-                              Store 5753(result) 5908
-            5909:  7(f16vec4) FunctionCall 117(testSubpassLoad()
-            5910:  7(f16vec4) Load 5753(result)
-            5911:  7(f16vec4) FAdd 5910 5909
-                              Store 5753(result) 5911
-            5914:  7(f16vec4) Load 5753(result)
-            5915:  249(fvec4) FConvert 5914
-                              Store 5913(fragColor) 5915
+                              Store 5763(result) 5811
+            5812:  7(f16vec4) FunctionCall 43(testTextureGatherLodOffset()
+            5813:  7(f16vec4) Load 5763(result)
+            5814:  7(f16vec4) FAdd 5813 5812
+                              Store 5763(result) 5814
+            5815:  7(f16vec4) FunctionCall 45(testTextureGatherLodOffsets()
+            5816:  7(f16vec4) Load 5763(result)
+            5817:  7(f16vec4) FAdd 5816 5815
+                              Store 5763(result) 5817
+            5818:   48(ivec4) FunctionCall 50(testTextureSize()
+            5819:  7(f16vec4) ConvertSToF 5818
+            5820:  7(f16vec4) Load 5763(result)
+            5821:  7(f16vec4) FAdd 5820 5819
+                              Store 5763(result) 5821
+            5822:   53(fvec2) FunctionCall 55(testTextureQueryLod()
+            5823:154(f16vec2) FConvert 5822
+            5824:  7(f16vec4) Load 5763(result)
+            5825:154(f16vec2) VectorShuffle 5824 5824 0 1
+            5826:154(f16vec2) FAdd 5825 5823
+            5827:  7(f16vec4) Load 5763(result)
+            5828:  7(f16vec4) VectorShuffle 5827 5826 4 5 2 3
+                              Store 5763(result) 5828
+            5829:     47(int) FunctionCall 58(testTextureQueryLevels()
+            5830:6(float16_t) ConvertSToF 5829
+            5831:    208(ptr) AccessChain 5763(result) 207
+            5832:6(float16_t) Load 5831
+            5833:6(float16_t) FAdd 5832 5830
+            5834:    208(ptr) AccessChain 5763(result) 207
+                              Store 5834 5833
+            5835:     47(int) FunctionCall 60(testTextureSamples()
+            5836:6(float16_t) ConvertSToF 5835
+            5837:    208(ptr) AccessChain 5763(result) 207
+            5838:6(float16_t) Load 5837
+            5839:6(float16_t) FAdd 5838 5836
+            5840:    208(ptr) AccessChain 5763(result) 207
+                              Store 5840 5839
+            5841:  7(f16vec4) FunctionCall 62(testImageLoad()
+            5842:  7(f16vec4) Load 5763(result)
+            5843:  7(f16vec4) FAdd 5842 5841
+                              Store 5763(result) 5843
+            5845:  7(f16vec4) Load 5763(result)
+                              Store 5844(param) 5845
+            5846:           2 FunctionCall 67(testImageStore(vf164;) 5844(param)
+            5847:  7(f16vec4) FunctionCall 69(testSparseTexture()
+            5848:  7(f16vec4) Load 5763(result)
+            5849:  7(f16vec4) FAdd 5848 5847
+                              Store 5763(result) 5849
+            5850:  7(f16vec4) FunctionCall 71(testSparseTextureLod()
+            5851:  7(f16vec4) Load 5763(result)
+            5852:  7(f16vec4) FAdd 5851 5850
+                              Store 5763(result) 5852
+            5853:  7(f16vec4) FunctionCall 73(testSparseTextureOffset()
+            5854:  7(f16vec4) Load 5763(result)
+            5855:  7(f16vec4) FAdd 5854 5853
+                              Store 5763(result) 5855
+            5856:  7(f16vec4) FunctionCall 75(testSparseTextureLodOffset()
+            5857:  7(f16vec4) Load 5763(result)
+            5858:  7(f16vec4) FAdd 5857 5856
+                              Store 5763(result) 5858
+            5859:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5860:  7(f16vec4) Load 5763(result)
+            5861:  7(f16vec4) FAdd 5860 5859
+                              Store 5763(result) 5861
+            5862:  7(f16vec4) FunctionCall 79(testSparseTextureGradOffset()
+            5863:  7(f16vec4) Load 5763(result)
+            5864:  7(f16vec4) FAdd 5863 5862
+                              Store 5763(result) 5864
+            5865:  7(f16vec4) FunctionCall 81(testSparseTexelFetch()
+            5866:  7(f16vec4) Load 5763(result)
+            5867:  7(f16vec4) FAdd 5866 5865
+                              Store 5763(result) 5867
+            5868:  7(f16vec4) FunctionCall 83(testSparseTexelFetchOffset()
+            5869:  7(f16vec4) Load 5763(result)
+            5870:  7(f16vec4) FAdd 5869 5868
+                              Store 5763(result) 5870
+            5871:  7(f16vec4) FunctionCall 85(testSparseTextureGather()
+            5872:  7(f16vec4) Load 5763(result)
+            5873:  7(f16vec4) FAdd 5872 5871
+                              Store 5763(result) 5873
+            5874:  7(f16vec4) FunctionCall 87(testSparseTextureGatherOffset()
+            5875:  7(f16vec4) Load 5763(result)
+            5876:  7(f16vec4) FAdd 5875 5874
+                              Store 5763(result) 5876
+            5877:  7(f16vec4) FunctionCall 89(testSparseTextureGatherOffsets()
+            5878:  7(f16vec4) Load 5763(result)
+            5879:  7(f16vec4) FAdd 5878 5877
+                              Store 5763(result) 5879
+            5880:  7(f16vec4) FunctionCall 91(testSparseTextureGatherLod()
+            5881:  7(f16vec4) Load 5763(result)
+            5882:  7(f16vec4) FAdd 5881 5880
+                              Store 5763(result) 5882
+            5883:  7(f16vec4) FunctionCall 93(testSparseTextureGatherLodOffset()
+            5884:  7(f16vec4) Load 5763(result)
+            5885:  7(f16vec4) FAdd 5884 5883
+                              Store 5763(result) 5885
+            5886:  7(f16vec4) FunctionCall 95(testSparseTextureGatherLodOffsets()
+            5887:  7(f16vec4) Load 5763(result)
+            5888:  7(f16vec4) FAdd 5887 5886
+                              Store 5763(result) 5888
+            5889:  7(f16vec4) FunctionCall 97(testSparseImageLoad()
+            5890:  7(f16vec4) Load 5763(result)
+            5891:  7(f16vec4) FAdd 5890 5889
+                              Store 5763(result) 5891
+            5892:  7(f16vec4) FunctionCall 99(testSparseTextureClamp()
+            5893:  7(f16vec4) Load 5763(result)
+            5894:  7(f16vec4) FAdd 5893 5892
+                              Store 5763(result) 5894
+            5895:  7(f16vec4) FunctionCall 101(testTextureClamp()
+            5896:  7(f16vec4) Load 5763(result)
+            5897:  7(f16vec4) FAdd 5896 5895
+                              Store 5763(result) 5897
+            5898:  7(f16vec4) FunctionCall 103(testSparseTextureOffsetClamp()
+            5899:  7(f16vec4) Load 5763(result)
+            5900:  7(f16vec4) FAdd 5899 5898
+                              Store 5763(result) 5900
+            5901:  7(f16vec4) FunctionCall 105(testTextureOffsetClamp()
+            5902:  7(f16vec4) Load 5763(result)
+            5903:  7(f16vec4) FAdd 5902 5901
+                              Store 5763(result) 5903
+            5904:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5905:  7(f16vec4) Load 5763(result)
+            5906:  7(f16vec4) FAdd 5905 5904
+                              Store 5763(result) 5906
+            5907:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5908:  7(f16vec4) Load 5763(result)
+            5909:  7(f16vec4) FAdd 5908 5907
+                              Store 5763(result) 5909
+            5910:  7(f16vec4) FunctionCall 111(testSparseTextureGradOffsetClamp()
+            5911:  7(f16vec4) Load 5763(result)
+            5912:  7(f16vec4) FAdd 5911 5910
+                              Store 5763(result) 5912
+            5913:  7(f16vec4) FunctionCall 113(testTextureGradOffsetClamp()
+            5914:  7(f16vec4) Load 5763(result)
+            5915:  7(f16vec4) FAdd 5914 5913
+                              Store 5763(result) 5915
+            5916:  7(f16vec4) FunctionCall 115(testCombinedTextureSampler()
+            5917:  7(f16vec4) Load 5763(result)
+            5918:  7(f16vec4) FAdd 5917 5916
+                              Store 5763(result) 5918
+            5919:  7(f16vec4) FunctionCall 117(testSubpassLoad()
+            5920:  7(f16vec4) Load 5763(result)
+            5921:  7(f16vec4) FAdd 5920 5919
+                              Store 5763(result) 5921
+            5924:  7(f16vec4) Load 5763(result)
+            5925:  249(fvec4) FConvert 5924
+                              Store 5923(fragColor) 5925
                               Return
                               FunctionEnd
  9(testTexture():  7(f16vec4) Function None 8
@@ -5123,1949 +5133,1949 @@
                               Store 4022(texel) 121
             4023:         143 Load 145(s2D)
             4024:   53(fvec2) Load 148(c2)
-            4025:3102(ResType) ImageSparseGather 4023 4024 2187 ConstOffsets 2380
-            4026:  7(f16vec4) CompositeExtract 4025 1
-                              Store 4022(texel) 4026
-            4027:     47(int) CompositeExtract 4025 0
-            4028:         143 Load 145(s2D)
-            4029:154(f16vec2) Load 156(f16c2)
-            4030:6(float16_t) Load 137(f16bias)
-            4031:3102(ResType) ImageSparseGather 4028 4029 2187 Bias ConstOffsets 4030 2380
-            4032:  7(f16vec4) CompositeExtract 4031 1
-                              Store 4022(texel) 4032
-            4033:     47(int) CompositeExtract 4031 0
-            4034:         284 Load 286(s2DArray)
-            4035:  167(fvec3) Load 169(c3)
-            4036:3102(ResType) ImageSparseGather 4034 4035 2187 ConstOffsets 2380
-            4037:  7(f16vec4) CompositeExtract 4036 1
-                              Store 4022(texel) 4037
-            4038:     47(int) CompositeExtract 4036 0
-            4039:         284 Load 286(s2DArray)
-            4040:175(f16vec3) Load 177(f16c3)
-            4041:6(float16_t) Load 137(f16bias)
-            4042:3102(ResType) ImageSparseGather 4039 4040 2187 Bias ConstOffsets 4041 2380
-            4043:  7(f16vec4) CompositeExtract 4042 1
-                              Store 4022(texel) 4043
-            4044:     47(int) CompositeExtract 4042 0
-            4045:         357 Load 359(s2DRect)
-            4046:   53(fvec2) Load 148(c2)
-            4047:3102(ResType) ImageSparseGather 4045 4046 2187 ConstOffsets 2380
-            4048:  7(f16vec4) CompositeExtract 4047 1
-                              Store 4022(texel) 4048
-            4049:     47(int) CompositeExtract 4047 0
-            4050:         357 Load 359(s2DRect)
-            4051:154(f16vec2) Load 156(f16c2)
-            4052:3102(ResType) ImageSparseGather 4050 4051 2187 ConstOffsets 2380
+            4035:3102(ResType) ImageSparseGather 4023 4024 2187 ConstOffsets 4034
+            4036:  7(f16vec4) CompositeExtract 4035 1
+                              Store 4022(texel) 4036
+            4037:     47(int) CompositeExtract 4035 0
+            4038:         143 Load 145(s2D)
+            4039:154(f16vec2) Load 156(f16c2)
+            4040:6(float16_t) Load 137(f16bias)
+            4041:3102(ResType) ImageSparseGather 4038 4039 2187 Bias ConstOffsets 4040 4034
+            4042:  7(f16vec4) CompositeExtract 4041 1
+                              Store 4022(texel) 4042
+            4043:     47(int) CompositeExtract 4041 0
+            4044:         284 Load 286(s2DArray)
+            4045:  167(fvec3) Load 169(c3)
+            4046:3102(ResType) ImageSparseGather 4044 4045 2187 ConstOffsets 4034
+            4047:  7(f16vec4) CompositeExtract 4046 1
+                              Store 4022(texel) 4047
+            4048:     47(int) CompositeExtract 4046 0
+            4049:         284 Load 286(s2DArray)
+            4050:175(f16vec3) Load 177(f16c3)
+            4051:6(float16_t) Load 137(f16bias)
+            4052:3102(ResType) ImageSparseGather 4049 4050 2187 Bias ConstOffsets 4051 4034
             4053:  7(f16vec4) CompositeExtract 4052 1
                               Store 4022(texel) 4053
             4054:     47(int) CompositeExtract 4052 0
-            4055:         224 Load 226(s2DShadow)
+            4055:         357 Load 359(s2DRect)
             4056:   53(fvec2) Load 148(c2)
-            4057:   52(float) Load 215(compare)
-            4058:3102(ResType) ImageSparseDrefGather 4055 4056 4057 ConstOffsets 2380
-            4059:  7(f16vec4) CompositeExtract 4058 1
-                              Store 4022(texel) 4059
-            4060:     47(int) CompositeExtract 4058 0
-            4061:         224 Load 226(s2DShadow)
-            4062:154(f16vec2) Load 156(f16c2)
-            4063:   52(float) Load 215(compare)
-            4064:3102(ResType) ImageSparseDrefGather 4061 4062 4063 ConstOffsets 2380
-            4065:  7(f16vec4) CompositeExtract 4064 1
-                              Store 4022(texel) 4065
-            4066:     47(int) CompositeExtract 4064 0
-            4067:         337 Load 339(s2DArrayShadow)
-            4068:  167(fvec3) Load 169(c3)
-            4069:   52(float) Load 215(compare)
-            4070:3102(ResType) ImageSparseDrefGather 4067 4068 4069 ConstOffsets 2380
-            4071:  7(f16vec4) CompositeExtract 4070 1
-                              Store 4022(texel) 4071
-            4072:     47(int) CompositeExtract 4070 0
-            4073:         337 Load 339(s2DArrayShadow)
-            4074:175(f16vec3) Load 177(f16c3)
-            4075:   52(float) Load 215(compare)
-            4076:3102(ResType) ImageSparseDrefGather 4073 4074 4075 ConstOffsets 2380
-            4077:  7(f16vec4) CompositeExtract 4076 1
-                              Store 4022(texel) 4077
-            4078:     47(int) CompositeExtract 4076 0
-            4079:         371 Load 373(s2DRectShadow)
-            4080:   53(fvec2) Load 148(c2)
-            4081:   52(float) Load 215(compare)
-            4082:3102(ResType) ImageSparseDrefGather 4079 4080 4081 ConstOffsets 2380
-            4083:  7(f16vec4) CompositeExtract 4082 1
-                              Store 4022(texel) 4083
-            4084:     47(int) CompositeExtract 4082 0
-            4085:         371 Load 373(s2DRectShadow)
-            4086:154(f16vec2) Load 156(f16c2)
-            4087:   52(float) Load 215(compare)
-            4088:3102(ResType) ImageSparseDrefGather 4085 4086 4087 ConstOffsets 2380
-            4089:  7(f16vec4) CompositeExtract 4088 1
-                              Store 4022(texel) 4089
-            4090:     47(int) CompositeExtract 4088 0
-            4091:  7(f16vec4) Load 4022(texel)
-                              ReturnValue 4091
+            4057:3102(ResType) ImageSparseGather 4055 4056 2187 ConstOffsets 4034
+            4058:  7(f16vec4) CompositeExtract 4057 1
+                              Store 4022(texel) 4058
+            4059:     47(int) CompositeExtract 4057 0
+            4060:         357 Load 359(s2DRect)
+            4061:154(f16vec2) Load 156(f16c2)
+            4062:3102(ResType) ImageSparseGather 4060 4061 2187 ConstOffsets 4034
+            4063:  7(f16vec4) CompositeExtract 4062 1
+                              Store 4022(texel) 4063
+            4064:     47(int) CompositeExtract 4062 0
+            4065:         224 Load 226(s2DShadow)
+            4066:   53(fvec2) Load 148(c2)
+            4067:   52(float) Load 215(compare)
+            4068:3102(ResType) ImageSparseDrefGather 4065 4066 4067 ConstOffsets 4034
+            4069:  7(f16vec4) CompositeExtract 4068 1
+                              Store 4022(texel) 4069
+            4070:     47(int) CompositeExtract 4068 0
+            4071:         224 Load 226(s2DShadow)
+            4072:154(f16vec2) Load 156(f16c2)
+            4073:   52(float) Load 215(compare)
+            4074:3102(ResType) ImageSparseDrefGather 4071 4072 4073 ConstOffsets 4034
+            4075:  7(f16vec4) CompositeExtract 4074 1
+                              Store 4022(texel) 4075
+            4076:     47(int) CompositeExtract 4074 0
+            4077:         337 Load 339(s2DArrayShadow)
+            4078:  167(fvec3) Load 169(c3)
+            4079:   52(float) Load 215(compare)
+            4080:3102(ResType) ImageSparseDrefGather 4077 4078 4079 ConstOffsets 4034
+            4081:  7(f16vec4) CompositeExtract 4080 1
+                              Store 4022(texel) 4081
+            4082:     47(int) CompositeExtract 4080 0
+            4083:         337 Load 339(s2DArrayShadow)
+            4084:175(f16vec3) Load 177(f16c3)
+            4085:   52(float) Load 215(compare)
+            4086:3102(ResType) ImageSparseDrefGather 4083 4084 4085 ConstOffsets 4034
+            4087:  7(f16vec4) CompositeExtract 4086 1
+                              Store 4022(texel) 4087
+            4088:     47(int) CompositeExtract 4086 0
+            4089:         371 Load 373(s2DRectShadow)
+            4090:   53(fvec2) Load 148(c2)
+            4091:   52(float) Load 215(compare)
+            4092:3102(ResType) ImageSparseDrefGather 4089 4090 4091 ConstOffsets 4034
+            4093:  7(f16vec4) CompositeExtract 4092 1
+                              Store 4022(texel) 4093
+            4094:     47(int) CompositeExtract 4092 0
+            4095:         371 Load 373(s2DRectShadow)
+            4096:154(f16vec2) Load 156(f16c2)
+            4097:   52(float) Load 215(compare)
+            4098:3102(ResType) ImageSparseDrefGather 4095 4096 4097 ConstOffsets 4034
+            4099:  7(f16vec4) CompositeExtract 4098 1
+                              Store 4022(texel) 4099
+            4100:     47(int) CompositeExtract 4098 0
+            4101:  7(f16vec4) Load 4022(texel)
+                              ReturnValue 4101
                               FunctionEnd
 91(testSparseTextureGatherLod():  7(f16vec4) Function None 8
               92:             Label
-     4094(texel):     64(ptr) Variable Function
-                              Store 4094(texel) 121
-            4095:         143 Load 145(s2D)
-            4096:   53(fvec2) Load 148(c2)
-            4097:   52(float) Load 565(lod)
-            4098:3102(ResType) ImageSparseGather 4095 4096 2187 Lod 4097
-            4099:  7(f16vec4) CompositeExtract 4098 1
-                              Store 4094(texel) 4099
-            4100:     47(int) CompositeExtract 4098 0
-            4101:         143 Load 145(s2D)
-            4102:154(f16vec2) Load 156(f16c2)
-            4103:6(float16_t) Load 572(f16lod)
-            4104:3102(ResType) ImageSparseGather 4101 4102 2187 Lod 4103
-            4105:  7(f16vec4) CompositeExtract 4104 1
-                              Store 4094(texel) 4105
-            4106:     47(int) CompositeExtract 4104 0
-            4107:         284 Load 286(s2DArray)
-            4108:  167(fvec3) Load 169(c3)
-            4109:   52(float) Load 565(lod)
-            4110:3102(ResType) ImageSparseGather 4107 4108 2187 Lod 4109
-            4111:  7(f16vec4) CompositeExtract 4110 1
-                              Store 4094(texel) 4111
-            4112:     47(int) CompositeExtract 4110 0
-            4113:         284 Load 286(s2DArray)
-            4114:175(f16vec3) Load 177(f16c3)
-            4115:6(float16_t) Load 572(f16lod)
-            4116:3102(ResType) ImageSparseGather 4113 4114 2187 Lod 4115
-            4117:  7(f16vec4) CompositeExtract 4116 1
-                              Store 4094(texel) 4117
-            4118:     47(int) CompositeExtract 4116 0
-            4119:         184 Load 186(sCube)
-            4120:  167(fvec3) Load 169(c3)
-            4121:   52(float) Load 565(lod)
-            4122:3102(ResType) ImageSparseGather 4119 4120 2187 Lod 4121
-            4123:  7(f16vec4) CompositeExtract 4122 1
-                              Store 4094(texel) 4123
-            4124:     47(int) CompositeExtract 4122 0
-            4125:         184 Load 186(sCube)
-            4126:175(f16vec3) Load 177(f16c3)
-            4127:6(float16_t) Load 572(f16lod)
-            4128:3102(ResType) ImageSparseGather 4125 4126 2187 Lod 4127
-            4129:  7(f16vec4) CompositeExtract 4128 1
-                              Store 4094(texel) 4129
-            4130:     47(int) CompositeExtract 4128 0
-            4131:         299 Load 301(sCubeArray)
-            4132:  249(fvec4) Load 251(c4)
-            4133:   52(float) Load 565(lod)
-            4134:3102(ResType) ImageSparseGather 4131 4132 2187 Lod 4133
-            4135:  7(f16vec4) CompositeExtract 4134 1
-                              Store 4094(texel) 4135
-            4136:     47(int) CompositeExtract 4134 0
-            4137:         299 Load 301(sCubeArray)
-            4138:  7(f16vec4) Load 309(f16c4)
-            4139:6(float16_t) Load 572(f16lod)
-            4140:3102(ResType) ImageSparseGather 4137 4138 2187 Lod 4139
-            4141:  7(f16vec4) CompositeExtract 4140 1
-                              Store 4094(texel) 4141
-            4142:     47(int) CompositeExtract 4140 0
-            4143:  7(f16vec4) Load 4094(texel)
-                              ReturnValue 4143
+     4104(texel):     64(ptr) Variable Function
+                              Store 4104(texel) 121
+            4105:         143 Load 145(s2D)
+            4106:   53(fvec2) Load 148(c2)
+            4107:   52(float) Load 565(lod)
+            4108:3102(ResType) ImageSparseGather 4105 4106 2187 Lod 4107
+            4109:  7(f16vec4) CompositeExtract 4108 1
+                              Store 4104(texel) 4109
+            4110:     47(int) CompositeExtract 4108 0
+            4111:         143 Load 145(s2D)
+            4112:154(f16vec2) Load 156(f16c2)
+            4113:6(float16_t) Load 572(f16lod)
+            4114:3102(ResType) ImageSparseGather 4111 4112 2187 Lod 4113
+            4115:  7(f16vec4) CompositeExtract 4114 1
+                              Store 4104(texel) 4115
+            4116:     47(int) CompositeExtract 4114 0
+            4117:         284 Load 286(s2DArray)
+            4118:  167(fvec3) Load 169(c3)
+            4119:   52(float) Load 565(lod)
+            4120:3102(ResType) ImageSparseGather 4117 4118 2187 Lod 4119
+            4121:  7(f16vec4) CompositeExtract 4120 1
+                              Store 4104(texel) 4121
+            4122:     47(int) CompositeExtract 4120 0
+            4123:         284 Load 286(s2DArray)
+            4124:175(f16vec3) Load 177(f16c3)
+            4125:6(float16_t) Load 572(f16lod)
+            4126:3102(ResType) ImageSparseGather 4123 4124 2187 Lod 4125
+            4127:  7(f16vec4) CompositeExtract 4126 1
+                              Store 4104(texel) 4127
+            4128:     47(int) CompositeExtract 4126 0
+            4129:         184 Load 186(sCube)
+            4130:  167(fvec3) Load 169(c3)
+            4131:   52(float) Load 565(lod)
+            4132:3102(ResType) ImageSparseGather 4129 4130 2187 Lod 4131
+            4133:  7(f16vec4) CompositeExtract 4132 1
+                              Store 4104(texel) 4133
+            4134:     47(int) CompositeExtract 4132 0
+            4135:         184 Load 186(sCube)
+            4136:175(f16vec3) Load 177(f16c3)
+            4137:6(float16_t) Load 572(f16lod)
+            4138:3102(ResType) ImageSparseGather 4135 4136 2187 Lod 4137
+            4139:  7(f16vec4) CompositeExtract 4138 1
+                              Store 4104(texel) 4139
+            4140:     47(int) CompositeExtract 4138 0
+            4141:         299 Load 301(sCubeArray)
+            4142:  249(fvec4) Load 251(c4)
+            4143:   52(float) Load 565(lod)
+            4144:3102(ResType) ImageSparseGather 4141 4142 2187 Lod 4143
+            4145:  7(f16vec4) CompositeExtract 4144 1
+                              Store 4104(texel) 4145
+            4146:     47(int) CompositeExtract 4144 0
+            4147:         299 Load 301(sCubeArray)
+            4148:  7(f16vec4) Load 309(f16c4)
+            4149:6(float16_t) Load 572(f16lod)
+            4150:3102(ResType) ImageSparseGather 4147 4148 2187 Lod 4149
+            4151:  7(f16vec4) CompositeExtract 4150 1
+                              Store 4104(texel) 4151
+            4152:     47(int) CompositeExtract 4150 0
+            4153:  7(f16vec4) Load 4104(texel)
+                              ReturnValue 4153
                               FunctionEnd
 93(testSparseTextureGatherLodOffset():  7(f16vec4) Function None 8
               94:             Label
-     4146(texel):     64(ptr) Variable Function
-                              Store 4146(texel) 121
-            4147:         143 Load 145(s2D)
-            4148:   53(fvec2) Load 148(c2)
-            4149:   52(float) Load 565(lod)
-            4150:3102(ResType) ImageSparseGather 4147 4148 2187 Lod ConstOffset 4149 722
-            4151:  7(f16vec4) CompositeExtract 4150 1
-                              Store 4146(texel) 4151
-            4152:     47(int) CompositeExtract 4150 0
-            4153:         143 Load 145(s2D)
-            4154:154(f16vec2) Load 156(f16c2)
-            4155:6(float16_t) Load 572(f16lod)
-            4156:3102(ResType) ImageSparseGather 4153 4154 2187 Lod ConstOffset 4155 722
-            4157:  7(f16vec4) CompositeExtract 4156 1
-                              Store 4146(texel) 4157
-            4158:     47(int) CompositeExtract 4156 0
-            4159:         284 Load 286(s2DArray)
-            4160:  167(fvec3) Load 169(c3)
-            4161:   52(float) Load 565(lod)
-            4162:3102(ResType) ImageSparseGather 4159 4160 2187 Lod ConstOffset 4161 722
-            4163:  7(f16vec4) CompositeExtract 4162 1
-                              Store 4146(texel) 4163
-            4164:     47(int) CompositeExtract 4162 0
-            4165:         284 Load 286(s2DArray)
-            4166:175(f16vec3) Load 177(f16c3)
-            4167:6(float16_t) Load 572(f16lod)
-            4168:3102(ResType) ImageSparseGather 4165 4166 2187 Lod ConstOffset 4167 722
-            4169:  7(f16vec4) CompositeExtract 4168 1
-                              Store 4146(texel) 4169
-            4170:     47(int) CompositeExtract 4168 0
-            4171:  7(f16vec4) Load 4146(texel)
-                              ReturnValue 4171
+     4156(texel):     64(ptr) Variable Function
+                              Store 4156(texel) 121
+            4157:         143 Load 145(s2D)
+            4158:   53(fvec2) Load 148(c2)
+            4159:   52(float) Load 565(lod)
+            4160:3102(ResType) ImageSparseGather 4157 4158 2187 Lod ConstOffset 4159 722
+            4161:  7(f16vec4) CompositeExtract 4160 1
+                              Store 4156(texel) 4161
+            4162:     47(int) CompositeExtract 4160 0
+            4163:         143 Load 145(s2D)
+            4164:154(f16vec2) Load 156(f16c2)
+            4165:6(float16_t) Load 572(f16lod)
+            4166:3102(ResType) ImageSparseGather 4163 4164 2187 Lod ConstOffset 4165 722
+            4167:  7(f16vec4) CompositeExtract 4166 1
+                              Store 4156(texel) 4167
+            4168:     47(int) CompositeExtract 4166 0
+            4169:         284 Load 286(s2DArray)
+            4170:  167(fvec3) Load 169(c3)
+            4171:   52(float) Load 565(lod)
+            4172:3102(ResType) ImageSparseGather 4169 4170 2187 Lod ConstOffset 4171 722
+            4173:  7(f16vec4) CompositeExtract 4172 1
+                              Store 4156(texel) 4173
+            4174:     47(int) CompositeExtract 4172 0
+            4175:         284 Load 286(s2DArray)
+            4176:175(f16vec3) Load 177(f16c3)
+            4177:6(float16_t) Load 572(f16lod)
+            4178:3102(ResType) ImageSparseGather 4175 4176 2187 Lod ConstOffset 4177 722
+            4179:  7(f16vec4) CompositeExtract 4178 1
+                              Store 4156(texel) 4179
+            4180:     47(int) CompositeExtract 4178 0
+            4181:  7(f16vec4) Load 4156(texel)
+                              ReturnValue 4181
                               FunctionEnd
 95(testSparseTextureGatherLodOffsets():  7(f16vec4) Function None 8
               96:             Label
-     4174(texel):     64(ptr) Variable Function
-                              Store 4174(texel) 121
-            4175:         143 Load 145(s2D)
-            4176:   53(fvec2) Load 148(c2)
-            4177:   52(float) Load 565(lod)
-            4178:3102(ResType) ImageSparseGather 4175 4176 2187 Lod ConstOffsets 4177 2380
-            4179:  7(f16vec4) CompositeExtract 4178 1
-                              Store 4174(texel) 4179
-            4180:     47(int) CompositeExtract 4178 0
-            4181:         143 Load 145(s2D)
-            4182:154(f16vec2) Load 156(f16c2)
-            4183:6(float16_t) Load 572(f16lod)
-            4184:3102(ResType) ImageSparseGather 4181 4182 2187 Lod ConstOffsets 4183 2380
-            4185:  7(f16vec4) CompositeExtract 4184 1
-                              Store 4174(texel) 4185
-            4186:     47(int) CompositeExtract 4184 0
-            4187:         284 Load 286(s2DArray)
-            4188:  167(fvec3) Load 169(c3)
-            4189:   52(float) Load 565(lod)
-            4190:3102(ResType) ImageSparseGather 4187 4188 2187 Lod ConstOffsets 4189 2380
-            4191:  7(f16vec4) CompositeExtract 4190 1
-                              Store 4174(texel) 4191
-            4192:     47(int) CompositeExtract 4190 0
-            4193:         284 Load 286(s2DArray)
-            4194:175(f16vec3) Load 177(f16c3)
-            4195:6(float16_t) Load 572(f16lod)
-            4196:3102(ResType) ImageSparseGather 4193 4194 2187 Lod ConstOffsets 4195 2380
-            4197:  7(f16vec4) CompositeExtract 4196 1
-                              Store 4174(texel) 4197
-            4198:     47(int) CompositeExtract 4196 0
-            4199:  7(f16vec4) Load 4174(texel)
-                              ReturnValue 4199
+     4184(texel):     64(ptr) Variable Function
+                              Store 4184(texel) 121
+            4185:         143 Load 145(s2D)
+            4186:   53(fvec2) Load 148(c2)
+            4187:   52(float) Load 565(lod)
+            4188:3102(ResType) ImageSparseGather 4185 4186 2187 Lod ConstOffsets 4187 2380
+            4189:  7(f16vec4) CompositeExtract 4188 1
+                              Store 4184(texel) 4189
+            4190:     47(int) CompositeExtract 4188 0
+            4191:         143 Load 145(s2D)
+            4192:154(f16vec2) Load 156(f16c2)
+            4193:6(float16_t) Load 572(f16lod)
+            4194:3102(ResType) ImageSparseGather 4191 4192 2187 Lod ConstOffsets 4193 2380
+            4195:  7(f16vec4) CompositeExtract 4194 1
+                              Store 4184(texel) 4195
+            4196:     47(int) CompositeExtract 4194 0
+            4197:         284 Load 286(s2DArray)
+            4198:  167(fvec3) Load 169(c3)
+            4199:   52(float) Load 565(lod)
+            4200:3102(ResType) ImageSparseGather 4197 4198 2187 Lod ConstOffsets 4199 2380
+            4201:  7(f16vec4) CompositeExtract 4200 1
+                              Store 4184(texel) 4201
+            4202:     47(int) CompositeExtract 4200 0
+            4203:         284 Load 286(s2DArray)
+            4204:175(f16vec3) Load 177(f16c3)
+            4205:6(float16_t) Load 572(f16lod)
+            4206:3102(ResType) ImageSparseGather 4203 4204 2187 Lod ConstOffsets 4205 2380
+            4207:  7(f16vec4) CompositeExtract 4206 1
+                              Store 4184(texel) 4207
+            4208:     47(int) CompositeExtract 4206 0
+            4209:  7(f16vec4) Load 4184(texel)
+                              ReturnValue 4209
                               FunctionEnd
 97(testSparseImageLoad():  7(f16vec4) Function None 8
               98:             Label
-     4202(texel):     64(ptr) Variable Function
-                              Store 4202(texel) 121
-            4203:        2962 Load 2964(i2D)
-            4204:   53(fvec2) Load 148(c2)
-            4205:  721(ivec2) ConvertFToS 4204
-            4206:3102(ResType) ImageSparseRead 4203 4205
-            4207:  7(f16vec4) CompositeExtract 4206 1
-                              Store 4202(texel) 4207
-            4208:     47(int) CompositeExtract 4206 0
-            4209:        2971 Load 2973(i3D)
-            4210:  167(fvec3) Load 169(c3)
-            4211:  734(ivec3) ConvertFToS 4210
-            4212:3102(ResType) ImageSparseRead 4209 4211
-            4213:  7(f16vec4) CompositeExtract 4212 1
-                              Store 4202(texel) 4213
-            4214:     47(int) CompositeExtract 4212 0
-            4215:        2980 Load 2982(i2DRect)
-            4216:   53(fvec2) Load 148(c2)
-            4217:  721(ivec2) ConvertFToS 4216
-            4218:3102(ResType) ImageSparseRead 4215 4217
-            4219:  7(f16vec4) CompositeExtract 4218 1
-                              Store 4202(texel) 4219
-            4220:     47(int) CompositeExtract 4218 0
-            4221:        2989 Load 2991(iCube)
-            4222:  167(fvec3) Load 169(c3)
-            4223:  734(ivec3) ConvertFToS 4222
-            4224:3102(ResType) ImageSparseRead 4221 4223
-            4225:  7(f16vec4) CompositeExtract 4224 1
-                              Store 4202(texel) 4225
-            4226:     47(int) CompositeExtract 4224 0
-            4227:        3016 Load 3018(i2DArray)
-            4228:  167(fvec3) Load 169(c3)
-            4229:  734(ivec3) ConvertFToS 4228
-            4230:3102(ResType) ImageSparseRead 4227 4229
-            4231:  7(f16vec4) CompositeExtract 4230 1
-                              Store 4202(texel) 4231
-            4232:     47(int) CompositeExtract 4230 0
-            4233:        3025 Load 3027(iCubeArray)
-            4234:  167(fvec3) Load 169(c3)
-            4235:  734(ivec3) ConvertFToS 4234
-            4236:3102(ResType) ImageSparseRead 4233 4235
-            4237:  7(f16vec4) CompositeExtract 4236 1
-                              Store 4202(texel) 4237
-            4238:     47(int) CompositeExtract 4236 0
-            4239:        3034 Load 3036(i2DMS)
-            4240:   53(fvec2) Load 148(c2)
-            4241:  721(ivec2) ConvertFToS 4240
-            4242:3102(ResType) ImageSparseRead 4239 4241 Sample 709
-            4243:  7(f16vec4) CompositeExtract 4242 1
-                              Store 4202(texel) 4243
-            4244:     47(int) CompositeExtract 4242 0
-            4245:        3043 Load 3045(i2DMSArray)
-            4246:  167(fvec3) Load 169(c3)
-            4247:  734(ivec3) ConvertFToS 4246
-            4248:3102(ResType) ImageSparseRead 4245 4247 Sample 1326
-            4249:  7(f16vec4) CompositeExtract 4248 1
-                              Store 4202(texel) 4249
-            4250:     47(int) CompositeExtract 4248 0
-            4251:  7(f16vec4) Load 4202(texel)
-                              ReturnValue 4251
+     4212(texel):     64(ptr) Variable Function
+                              Store 4212(texel) 121
+            4213:        2962 Load 2964(i2D)
+            4214:   53(fvec2) Load 148(c2)
+            4215:  721(ivec2) ConvertFToS 4214
+            4216:3102(ResType) ImageSparseRead 4213 4215
+            4217:  7(f16vec4) CompositeExtract 4216 1
+                              Store 4212(texel) 4217
+            4218:     47(int) CompositeExtract 4216 0
+            4219:        2971 Load 2973(i3D)
+            4220:  167(fvec3) Load 169(c3)
+            4221:  734(ivec3) ConvertFToS 4220
+            4222:3102(ResType) ImageSparseRead 4219 4221
+            4223:  7(f16vec4) CompositeExtract 4222 1
+                              Store 4212(texel) 4223
+            4224:     47(int) CompositeExtract 4222 0
+            4225:        2980 Load 2982(i2DRect)
+            4226:   53(fvec2) Load 148(c2)
+            4227:  721(ivec2) ConvertFToS 4226
+            4228:3102(ResType) ImageSparseRead 4225 4227
+            4229:  7(f16vec4) CompositeExtract 4228 1
+                              Store 4212(texel) 4229
+            4230:     47(int) CompositeExtract 4228 0
+            4231:        2989 Load 2991(iCube)
+            4232:  167(fvec3) Load 169(c3)
+            4233:  734(ivec3) ConvertFToS 4232
+            4234:3102(ResType) ImageSparseRead 4231 4233
+            4235:  7(f16vec4) CompositeExtract 4234 1
+                              Store 4212(texel) 4235
+            4236:     47(int) CompositeExtract 4234 0
+            4237:        3016 Load 3018(i2DArray)
+            4238:  167(fvec3) Load 169(c3)
+            4239:  734(ivec3) ConvertFToS 4238
+            4240:3102(ResType) ImageSparseRead 4237 4239
+            4241:  7(f16vec4) CompositeExtract 4240 1
+                              Store 4212(texel) 4241
+            4242:     47(int) CompositeExtract 4240 0
+            4243:        3025 Load 3027(iCubeArray)
+            4244:  167(fvec3) Load 169(c3)
+            4245:  734(ivec3) ConvertFToS 4244
+            4246:3102(ResType) ImageSparseRead 4243 4245
+            4247:  7(f16vec4) CompositeExtract 4246 1
+                              Store 4212(texel) 4247
+            4248:     47(int) CompositeExtract 4246 0
+            4249:        3034 Load 3036(i2DMS)
+            4250:   53(fvec2) Load 148(c2)
+            4251:  721(ivec2) ConvertFToS 4250
+            4252:3102(ResType) ImageSparseRead 4249 4251 Sample 709
+            4253:  7(f16vec4) CompositeExtract 4252 1
+                              Store 4212(texel) 4253
+            4254:     47(int) CompositeExtract 4252 0
+            4255:        3043 Load 3045(i2DMSArray)
+            4256:  167(fvec3) Load 169(c3)
+            4257:  734(ivec3) ConvertFToS 4256
+            4258:3102(ResType) ImageSparseRead 4255 4257 Sample 1326
+            4259:  7(f16vec4) CompositeExtract 4258 1
+                              Store 4212(texel) 4259
+            4260:     47(int) CompositeExtract 4258 0
+            4261:  7(f16vec4) Load 4212(texel)
+                              ReturnValue 4261
                               FunctionEnd
 99(testSparseTextureClamp():  7(f16vec4) Function None 8
              100:             Label
-     4254(texel):     64(ptr) Variable Function
-                              Store 4254(texel) 121
-            4255:         143 Load 145(s2D)
-            4256:   53(fvec2) Load 148(c2)
-            4258:   52(float) Load 4257(lodClamp)
-            4259:3102(ResType) ImageSparseSampleImplicitLod 4255 4256 MinLod 4258
-            4260:  7(f16vec4) CompositeExtract 4259 1
-                              Store 4254(texel) 4260
-            4261:     47(int) CompositeExtract 4259 0
-            4262:         143 Load 145(s2D)
-            4263:154(f16vec2) Load 156(f16c2)
-            4265:6(float16_t) Load 4264(f16lodClamp)
-            4266:6(float16_t) Load 137(f16bias)
-            4267:3102(ResType) ImageSparseSampleImplicitLod 4262 4263 Bias MinLod 4266 4265
-            4268:  7(f16vec4) CompositeExtract 4267 1
-                              Store 4254(texel) 4268
-            4269:     47(int) CompositeExtract 4267 0
-            4270:         163 Load 165(s3D)
-            4271:  167(fvec3) Load 169(c3)
-            4272:   52(float) Load 4257(lodClamp)
-            4273:3102(ResType) ImageSparseSampleImplicitLod 4270 4271 MinLod 4272
-            4274:  7(f16vec4) CompositeExtract 4273 1
-                              Store 4254(texel) 4274
-            4275:     47(int) CompositeExtract 4273 0
-            4276:         163 Load 165(s3D)
-            4277:175(f16vec3) Load 177(f16c3)
-            4278:6(float16_t) Load 4264(f16lodClamp)
-            4279:6(float16_t) Load 137(f16bias)
-            4280:3102(ResType) ImageSparseSampleImplicitLod 4276 4277 Bias MinLod 4279 4278
-            4281:  7(f16vec4) CompositeExtract 4280 1
-                              Store 4254(texel) 4281
-            4282:     47(int) CompositeExtract 4280 0
-            4283:         184 Load 186(sCube)
-            4284:  167(fvec3) Load 169(c3)
-            4285:   52(float) Load 4257(lodClamp)
-            4286:3102(ResType) ImageSparseSampleImplicitLod 4283 4284 MinLod 4285
-            4287:  7(f16vec4) CompositeExtract 4286 1
-                              Store 4254(texel) 4287
-            4288:     47(int) CompositeExtract 4286 0
-            4289:         184 Load 186(sCube)
-            4290:175(f16vec3) Load 177(f16c3)
-            4291:6(float16_t) Load 4264(f16lodClamp)
-            4292:6(float16_t) Load 137(f16bias)
-            4293:3102(ResType) ImageSparseSampleImplicitLod 4289 4290 Bias MinLod 4292 4291
-            4294:  7(f16vec4) CompositeExtract 4293 1
-                              Store 4254(texel) 4294
-            4295:     47(int) CompositeExtract 4293 0
-            4296:         224 Load 226(s2DShadow)
-            4297:  167(fvec3) Load 169(c3)
-            4298:   52(float) Load 4257(lodClamp)
-            4299:    208(ptr) AccessChain 4254(texel) 207
-            4300:   52(float) CompositeExtract 4297 2
-            4301:3138(ResType) ImageSparseSampleDrefImplicitLod 4296 4297 4300 MinLod 4298
-            4302:6(float16_t) CompositeExtract 4301 1
-                              Store 4299 4302
-            4303:     47(int) CompositeExtract 4301 0
-            4304:         224 Load 226(s2DShadow)
-            4305:154(f16vec2) Load 156(f16c2)
-            4306:   52(float) Load 215(compare)
-            4307:6(float16_t) Load 4264(f16lodClamp)
-            4308:    208(ptr) AccessChain 4254(texel) 207
-            4309:6(float16_t) Load 137(f16bias)
-            4310:3138(ResType) ImageSparseSampleDrefImplicitLod 4304 4305 4306 Bias MinLod 4309 4307
-            4311:6(float16_t) CompositeExtract 4310 1
-                              Store 4308 4311
-            4312:     47(int) CompositeExtract 4310 0
-            4313:         245 Load 247(sCubeShadow)
-            4314:  249(fvec4) Load 251(c4)
-            4315:   52(float) Load 4257(lodClamp)
-            4316:    208(ptr) AccessChain 4254(texel) 207
-            4317:   52(float) CompositeExtract 4314 3
-            4318:3138(ResType) ImageSparseSampleDrefImplicitLod 4313 4314 4317 MinLod 4315
-            4319:6(float16_t) CompositeExtract 4318 1
-                              Store 4316 4319
-            4320:     47(int) CompositeExtract 4318 0
-            4321:         245 Load 247(sCubeShadow)
-            4322:175(f16vec3) Load 177(f16c3)
-            4323:   52(float) Load 215(compare)
-            4324:6(float16_t) Load 4264(f16lodClamp)
-            4325:    208(ptr) AccessChain 4254(texel) 207
-            4326:6(float16_t) Load 137(f16bias)
-            4327:3138(ResType) ImageSparseSampleDrefImplicitLod 4321 4322 4323 Bias MinLod 4326 4324
-            4328:6(float16_t) CompositeExtract 4327 1
-                              Store 4325 4328
-            4329:     47(int) CompositeExtract 4327 0
-            4330:         284 Load 286(s2DArray)
-            4331:  167(fvec3) Load 169(c3)
-            4332:   52(float) Load 4257(lodClamp)
-            4333:3102(ResType) ImageSparseSampleImplicitLod 4330 4331 MinLod 4332
-            4334:  7(f16vec4) CompositeExtract 4333 1
-                              Store 4254(texel) 4334
-            4335:     47(int) CompositeExtract 4333 0
-            4336:         284 Load 286(s2DArray)
-            4337:175(f16vec3) Load 177(f16c3)
-            4338:6(float16_t) Load 4264(f16lodClamp)
-            4339:6(float16_t) Load 137(f16bias)
-            4340:3102(ResType) ImageSparseSampleImplicitLod 4336 4337 Bias MinLod 4339 4338
-            4341:  7(f16vec4) CompositeExtract 4340 1
-                              Store 4254(texel) 4341
-            4342:     47(int) CompositeExtract 4340 0
-            4343:         299 Load 301(sCubeArray)
-            4344:  249(fvec4) Load 251(c4)
-            4345:   52(float) Load 4257(lodClamp)
-            4346:3102(ResType) ImageSparseSampleImplicitLod 4343 4344 MinLod 4345
-            4347:  7(f16vec4) CompositeExtract 4346 1
-                              Store 4254(texel) 4347
-            4348:     47(int) CompositeExtract 4346 0
-            4349:         299 Load 301(sCubeArray)
-            4350:  7(f16vec4) Load 309(f16c4)
-            4351:6(float16_t) Load 4264(f16lodClamp)
-            4352:6(float16_t) Load 137(f16bias)
-            4353:3102(ResType) ImageSparseSampleImplicitLod 4349 4350 Bias MinLod 4352 4351
-            4354:  7(f16vec4) CompositeExtract 4353 1
-                              Store 4254(texel) 4354
-            4355:     47(int) CompositeExtract 4353 0
-            4356:         337 Load 339(s2DArrayShadow)
-            4357:  249(fvec4) Load 251(c4)
-            4358:   52(float) Load 4257(lodClamp)
-            4359:    208(ptr) AccessChain 4254(texel) 207
-            4360:   52(float) CompositeExtract 4357 3
-            4361:3138(ResType) ImageSparseSampleDrefImplicitLod 4356 4357 4360 MinLod 4358
-            4362:6(float16_t) CompositeExtract 4361 1
-                              Store 4359 4362
-            4363:     47(int) CompositeExtract 4361 0
-            4364:         337 Load 339(s2DArrayShadow)
-            4365:175(f16vec3) Load 177(f16c3)
-            4366:   52(float) Load 215(compare)
-            4367:6(float16_t) Load 4264(f16lodClamp)
-            4368:    208(ptr) AccessChain 4254(texel) 207
-            4369:3138(ResType) ImageSparseSampleDrefImplicitLod 4364 4365 4366 MinLod 4367
-            4370:6(float16_t) CompositeExtract 4369 1
-                              Store 4368 4370
-            4371:     47(int) CompositeExtract 4369 0
-            4372:         391 Load 393(sCubeArrayShadow)
-            4373:  249(fvec4) Load 251(c4)
-            4374:   52(float) Load 215(compare)
-            4375:   52(float) Load 4257(lodClamp)
-            4376:    208(ptr) AccessChain 4254(texel) 207
-            4377:3138(ResType) ImageSparseSampleDrefImplicitLod 4372 4373 4374 MinLod 4375
-            4378:6(float16_t) CompositeExtract 4377 1
-                              Store 4376 4378
-            4379:     47(int) CompositeExtract 4377 0
-            4380:         391 Load 393(sCubeArrayShadow)
-            4381:  7(f16vec4) Load 309(f16c4)
-            4382:   52(float) Load 215(compare)
-            4383:6(float16_t) Load 4264(f16lodClamp)
-            4384:    208(ptr) AccessChain 4254(texel) 207
-            4385:3138(ResType) ImageSparseSampleDrefImplicitLod 4380 4381 4382 MinLod 4383
-            4386:6(float16_t) CompositeExtract 4385 1
-                              Store 4384 4386
-            4387:     47(int) CompositeExtract 4385 0
-            4388:  7(f16vec4) Load 4254(texel)
-                              ReturnValue 4388
+     4264(texel):     64(ptr) Variable Function
+                              Store 4264(texel) 121
+            4265:         143 Load 145(s2D)
+            4266:   53(fvec2) Load 148(c2)
+            4268:   52(float) Load 4267(lodClamp)
+            4269:3102(ResType) ImageSparseSampleImplicitLod 4265 4266 MinLod 4268
+            4270:  7(f16vec4) CompositeExtract 4269 1
+                              Store 4264(texel) 4270
+            4271:     47(int) CompositeExtract 4269 0
+            4272:         143 Load 145(s2D)
+            4273:154(f16vec2) Load 156(f16c2)
+            4275:6(float16_t) Load 4274(f16lodClamp)
+            4276:6(float16_t) Load 137(f16bias)
+            4277:3102(ResType) ImageSparseSampleImplicitLod 4272 4273 Bias MinLod 4276 4275
+            4278:  7(f16vec4) CompositeExtract 4277 1
+                              Store 4264(texel) 4278
+            4279:     47(int) CompositeExtract 4277 0
+            4280:         163 Load 165(s3D)
+            4281:  167(fvec3) Load 169(c3)
+            4282:   52(float) Load 4267(lodClamp)
+            4283:3102(ResType) ImageSparseSampleImplicitLod 4280 4281 MinLod 4282
+            4284:  7(f16vec4) CompositeExtract 4283 1
+                              Store 4264(texel) 4284
+            4285:     47(int) CompositeExtract 4283 0
+            4286:         163 Load 165(s3D)
+            4287:175(f16vec3) Load 177(f16c3)
+            4288:6(float16_t) Load 4274(f16lodClamp)
+            4289:6(float16_t) Load 137(f16bias)
+            4290:3102(ResType) ImageSparseSampleImplicitLod 4286 4287 Bias MinLod 4289 4288
+            4291:  7(f16vec4) CompositeExtract 4290 1
+                              Store 4264(texel) 4291
+            4292:     47(int) CompositeExtract 4290 0
+            4293:         184 Load 186(sCube)
+            4294:  167(fvec3) Load 169(c3)
+            4295:   52(float) Load 4267(lodClamp)
+            4296:3102(ResType) ImageSparseSampleImplicitLod 4293 4294 MinLod 4295
+            4297:  7(f16vec4) CompositeExtract 4296 1
+                              Store 4264(texel) 4297
+            4298:     47(int) CompositeExtract 4296 0
+            4299:         184 Load 186(sCube)
+            4300:175(f16vec3) Load 177(f16c3)
+            4301:6(float16_t) Load 4274(f16lodClamp)
+            4302:6(float16_t) Load 137(f16bias)
+            4303:3102(ResType) ImageSparseSampleImplicitLod 4299 4300 Bias MinLod 4302 4301
+            4304:  7(f16vec4) CompositeExtract 4303 1
+                              Store 4264(texel) 4304
+            4305:     47(int) CompositeExtract 4303 0
+            4306:         224 Load 226(s2DShadow)
+            4307:  167(fvec3) Load 169(c3)
+            4308:   52(float) Load 4267(lodClamp)
+            4309:    208(ptr) AccessChain 4264(texel) 207
+            4310:   52(float) CompositeExtract 4307 2
+            4311:3138(ResType) ImageSparseSampleDrefImplicitLod 4306 4307 4310 MinLod 4308
+            4312:6(float16_t) CompositeExtract 4311 1
+                              Store 4309 4312
+            4313:     47(int) CompositeExtract 4311 0
+            4314:         224 Load 226(s2DShadow)
+            4315:154(f16vec2) Load 156(f16c2)
+            4316:   52(float) Load 215(compare)
+            4317:6(float16_t) Load 4274(f16lodClamp)
+            4318:    208(ptr) AccessChain 4264(texel) 207
+            4319:6(float16_t) Load 137(f16bias)
+            4320:3138(ResType) ImageSparseSampleDrefImplicitLod 4314 4315 4316 Bias MinLod 4319 4317
+            4321:6(float16_t) CompositeExtract 4320 1
+                              Store 4318 4321
+            4322:     47(int) CompositeExtract 4320 0
+            4323:         245 Load 247(sCubeShadow)
+            4324:  249(fvec4) Load 251(c4)
+            4325:   52(float) Load 4267(lodClamp)
+            4326:    208(ptr) AccessChain 4264(texel) 207
+            4327:   52(float) CompositeExtract 4324 3
+            4328:3138(ResType) ImageSparseSampleDrefImplicitLod 4323 4324 4327 MinLod 4325
+            4329:6(float16_t) CompositeExtract 4328 1
+                              Store 4326 4329
+            4330:     47(int) CompositeExtract 4328 0
+            4331:         245 Load 247(sCubeShadow)
+            4332:175(f16vec3) Load 177(f16c3)
+            4333:   52(float) Load 215(compare)
+            4334:6(float16_t) Load 4274(f16lodClamp)
+            4335:    208(ptr) AccessChain 4264(texel) 207
+            4336:6(float16_t) Load 137(f16bias)
+            4337:3138(ResType) ImageSparseSampleDrefImplicitLod 4331 4332 4333 Bias MinLod 4336 4334
+            4338:6(float16_t) CompositeExtract 4337 1
+                              Store 4335 4338
+            4339:     47(int) CompositeExtract 4337 0
+            4340:         284 Load 286(s2DArray)
+            4341:  167(fvec3) Load 169(c3)
+            4342:   52(float) Load 4267(lodClamp)
+            4343:3102(ResType) ImageSparseSampleImplicitLod 4340 4341 MinLod 4342
+            4344:  7(f16vec4) CompositeExtract 4343 1
+                              Store 4264(texel) 4344
+            4345:     47(int) CompositeExtract 4343 0
+            4346:         284 Load 286(s2DArray)
+            4347:175(f16vec3) Load 177(f16c3)
+            4348:6(float16_t) Load 4274(f16lodClamp)
+            4349:6(float16_t) Load 137(f16bias)
+            4350:3102(ResType) ImageSparseSampleImplicitLod 4346 4347 Bias MinLod 4349 4348
+            4351:  7(f16vec4) CompositeExtract 4350 1
+                              Store 4264(texel) 4351
+            4352:     47(int) CompositeExtract 4350 0
+            4353:         299 Load 301(sCubeArray)
+            4354:  249(fvec4) Load 251(c4)
+            4355:   52(float) Load 4267(lodClamp)
+            4356:3102(ResType) ImageSparseSampleImplicitLod 4353 4354 MinLod 4355
+            4357:  7(f16vec4) CompositeExtract 4356 1
+                              Store 4264(texel) 4357
+            4358:     47(int) CompositeExtract 4356 0
+            4359:         299 Load 301(sCubeArray)
+            4360:  7(f16vec4) Load 309(f16c4)
+            4361:6(float16_t) Load 4274(f16lodClamp)
+            4362:6(float16_t) Load 137(f16bias)
+            4363:3102(ResType) ImageSparseSampleImplicitLod 4359 4360 Bias MinLod 4362 4361
+            4364:  7(f16vec4) CompositeExtract 4363 1
+                              Store 4264(texel) 4364
+            4365:     47(int) CompositeExtract 4363 0
+            4366:         337 Load 339(s2DArrayShadow)
+            4367:  249(fvec4) Load 251(c4)
+            4368:   52(float) Load 4267(lodClamp)
+            4369:    208(ptr) AccessChain 4264(texel) 207
+            4370:   52(float) CompositeExtract 4367 3
+            4371:3138(ResType) ImageSparseSampleDrefImplicitLod 4366 4367 4370 MinLod 4368
+            4372:6(float16_t) CompositeExtract 4371 1
+                              Store 4369 4372
+            4373:     47(int) CompositeExtract 4371 0
+            4374:         337 Load 339(s2DArrayShadow)
+            4375:175(f16vec3) Load 177(f16c3)
+            4376:   52(float) Load 215(compare)
+            4377:6(float16_t) Load 4274(f16lodClamp)
+            4378:    208(ptr) AccessChain 4264(texel) 207
+            4379:3138(ResType) ImageSparseSampleDrefImplicitLod 4374 4375 4376 MinLod 4377
+            4380:6(float16_t) CompositeExtract 4379 1
+                              Store 4378 4380
+            4381:     47(int) CompositeExtract 4379 0
+            4382:         391 Load 393(sCubeArrayShadow)
+            4383:  249(fvec4) Load 251(c4)
+            4384:   52(float) Load 215(compare)
+            4385:   52(float) Load 4267(lodClamp)
+            4386:    208(ptr) AccessChain 4264(texel) 207
+            4387:3138(ResType) ImageSparseSampleDrefImplicitLod 4382 4383 4384 MinLod 4385
+            4388:6(float16_t) CompositeExtract 4387 1
+                              Store 4386 4388
+            4389:     47(int) CompositeExtract 4387 0
+            4390:         391 Load 393(sCubeArrayShadow)
+            4391:  7(f16vec4) Load 309(f16c4)
+            4392:   52(float) Load 215(compare)
+            4393:6(float16_t) Load 4274(f16lodClamp)
+            4394:    208(ptr) AccessChain 4264(texel) 207
+            4395:3138(ResType) ImageSparseSampleDrefImplicitLod 4390 4391 4392 MinLod 4393
+            4396:6(float16_t) CompositeExtract 4395 1
+                              Store 4394 4396
+            4397:     47(int) CompositeExtract 4395 0
+            4398:  7(f16vec4) Load 4264(texel)
+                              ReturnValue 4398
                               FunctionEnd
 101(testTextureClamp():  7(f16vec4) Function None 8
              102:             Label
-     4391(texel):     64(ptr) Variable Function
-                              Store 4391(texel) 121
-            4392:         123 Load 125(s1D)
-            4393:   52(float) Load 128(c1)
-            4394:   52(float) Load 4257(lodClamp)
-            4395:  7(f16vec4) ImageSampleImplicitLod 4392 4393 MinLod 4394
-            4396:  7(f16vec4) Load 4391(texel)
-            4397:  7(f16vec4) FAdd 4396 4395
-                              Store 4391(texel) 4397
-            4398:         123 Load 125(s1D)
-            4399:6(float16_t) Load 135(f16c1)
-            4400:6(float16_t) Load 4264(f16lodClamp)
-            4401:6(float16_t) Load 137(f16bias)
-            4402:  7(f16vec4) ImageSampleImplicitLod 4398 4399 Bias MinLod 4401 4400
-            4403:  7(f16vec4) Load 4391(texel)
-            4404:  7(f16vec4) FAdd 4403 4402
-                              Store 4391(texel) 4404
-            4405:         143 Load 145(s2D)
-            4406:   53(fvec2) Load 148(c2)
-            4407:   52(float) Load 4257(lodClamp)
-            4408:  7(f16vec4) ImageSampleImplicitLod 4405 4406 MinLod 4407
-            4409:  7(f16vec4) Load 4391(texel)
-            4410:  7(f16vec4) FAdd 4409 4408
-                              Store 4391(texel) 4410
-            4411:         143 Load 145(s2D)
-            4412:154(f16vec2) Load 156(f16c2)
-            4413:6(float16_t) Load 4264(f16lodClamp)
-            4414:6(float16_t) Load 137(f16bias)
-            4415:  7(f16vec4) ImageSampleImplicitLod 4411 4412 Bias MinLod 4414 4413
-            4416:  7(f16vec4) Load 4391(texel)
-            4417:  7(f16vec4) FAdd 4416 4415
-                              Store 4391(texel) 4417
-            4418:         163 Load 165(s3D)
-            4419:  167(fvec3) Load 169(c3)
-            4420:   52(float) Load 4257(lodClamp)
-            4421:  7(f16vec4) ImageSampleImplicitLod 4418 4419 MinLod 4420
-            4422:  7(f16vec4) Load 4391(texel)
-            4423:  7(f16vec4) FAdd 4422 4421
-                              Store 4391(texel) 4423
-            4424:         163 Load 165(s3D)
-            4425:175(f16vec3) Load 177(f16c3)
-            4426:6(float16_t) Load 4264(f16lodClamp)
-            4427:6(float16_t) Load 137(f16bias)
-            4428:  7(f16vec4) ImageSampleImplicitLod 4424 4425 Bias MinLod 4427 4426
-            4429:  7(f16vec4) Load 4391(texel)
-            4430:  7(f16vec4) FAdd 4429 4428
-                              Store 4391(texel) 4430
-            4431:         184 Load 186(sCube)
-            4432:  167(fvec3) Load 169(c3)
-            4433:   52(float) Load 4257(lodClamp)
-            4434:  7(f16vec4) ImageSampleImplicitLod 4431 4432 MinLod 4433
-            4435:  7(f16vec4) Load 4391(texel)
-            4436:  7(f16vec4) FAdd 4435 4434
-                              Store 4391(texel) 4436
-            4437:         184 Load 186(sCube)
-            4438:175(f16vec3) Load 177(f16c3)
-            4439:6(float16_t) Load 4264(f16lodClamp)
-            4440:6(float16_t) Load 137(f16bias)
-            4441:  7(f16vec4) ImageSampleImplicitLod 4437 4438 Bias MinLod 4440 4439
-            4442:  7(f16vec4) Load 4391(texel)
-            4443:  7(f16vec4) FAdd 4442 4441
-                              Store 4391(texel) 4443
-            4444:         199 Load 201(s1DShadow)
-            4445:  167(fvec3) Load 169(c3)
-            4446:   52(float) Load 4257(lodClamp)
-            4447:   52(float) CompositeExtract 4445 2
-            4448:6(float16_t) ImageSampleDrefImplicitLod 4444 4445 4447 MinLod 4446
-            4449:    208(ptr) AccessChain 4391(texel) 207
-            4450:6(float16_t) Load 4449
-            4451:6(float16_t) FAdd 4450 4448
-            4452:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4452 4451
-            4453:         199 Load 201(s1DShadow)
-            4454:154(f16vec2) Load 156(f16c2)
-            4455:   52(float) Load 215(compare)
-            4456:6(float16_t) Load 4264(f16lodClamp)
-            4457:6(float16_t) Load 137(f16bias)
-            4458:6(float16_t) ImageSampleDrefImplicitLod 4453 4454 4455 Bias MinLod 4457 4456
-            4459:    208(ptr) AccessChain 4391(texel) 207
+     4401(texel):     64(ptr) Variable Function
+                              Store 4401(texel) 121
+            4402:         123 Load 125(s1D)
+            4403:   52(float) Load 128(c1)
+            4404:   52(float) Load 4267(lodClamp)
+            4405:  7(f16vec4) ImageSampleImplicitLod 4402 4403 MinLod 4404
+            4406:  7(f16vec4) Load 4401(texel)
+            4407:  7(f16vec4) FAdd 4406 4405
+                              Store 4401(texel) 4407
+            4408:         123 Load 125(s1D)
+            4409:6(float16_t) Load 135(f16c1)
+            4410:6(float16_t) Load 4274(f16lodClamp)
+            4411:6(float16_t) Load 137(f16bias)
+            4412:  7(f16vec4) ImageSampleImplicitLod 4408 4409 Bias MinLod 4411 4410
+            4413:  7(f16vec4) Load 4401(texel)
+            4414:  7(f16vec4) FAdd 4413 4412
+                              Store 4401(texel) 4414
+            4415:         143 Load 145(s2D)
+            4416:   53(fvec2) Load 148(c2)
+            4417:   52(float) Load 4267(lodClamp)
+            4418:  7(f16vec4) ImageSampleImplicitLod 4415 4416 MinLod 4417
+            4419:  7(f16vec4) Load 4401(texel)
+            4420:  7(f16vec4) FAdd 4419 4418
+                              Store 4401(texel) 4420
+            4421:         143 Load 145(s2D)
+            4422:154(f16vec2) Load 156(f16c2)
+            4423:6(float16_t) Load 4274(f16lodClamp)
+            4424:6(float16_t) Load 137(f16bias)
+            4425:  7(f16vec4) ImageSampleImplicitLod 4421 4422 Bias MinLod 4424 4423
+            4426:  7(f16vec4) Load 4401(texel)
+            4427:  7(f16vec4) FAdd 4426 4425
+                              Store 4401(texel) 4427
+            4428:         163 Load 165(s3D)
+            4429:  167(fvec3) Load 169(c3)
+            4430:   52(float) Load 4267(lodClamp)
+            4431:  7(f16vec4) ImageSampleImplicitLod 4428 4429 MinLod 4430
+            4432:  7(f16vec4) Load 4401(texel)
+            4433:  7(f16vec4) FAdd 4432 4431
+                              Store 4401(texel) 4433
+            4434:         163 Load 165(s3D)
+            4435:175(f16vec3) Load 177(f16c3)
+            4436:6(float16_t) Load 4274(f16lodClamp)
+            4437:6(float16_t) Load 137(f16bias)
+            4438:  7(f16vec4) ImageSampleImplicitLod 4434 4435 Bias MinLod 4437 4436
+            4439:  7(f16vec4) Load 4401(texel)
+            4440:  7(f16vec4) FAdd 4439 4438
+                              Store 4401(texel) 4440
+            4441:         184 Load 186(sCube)
+            4442:  167(fvec3) Load 169(c3)
+            4443:   52(float) Load 4267(lodClamp)
+            4444:  7(f16vec4) ImageSampleImplicitLod 4441 4442 MinLod 4443
+            4445:  7(f16vec4) Load 4401(texel)
+            4446:  7(f16vec4) FAdd 4445 4444
+                              Store 4401(texel) 4446
+            4447:         184 Load 186(sCube)
+            4448:175(f16vec3) Load 177(f16c3)
+            4449:6(float16_t) Load 4274(f16lodClamp)
+            4450:6(float16_t) Load 137(f16bias)
+            4451:  7(f16vec4) ImageSampleImplicitLod 4447 4448 Bias MinLod 4450 4449
+            4452:  7(f16vec4) Load 4401(texel)
+            4453:  7(f16vec4) FAdd 4452 4451
+                              Store 4401(texel) 4453
+            4454:         199 Load 201(s1DShadow)
+            4455:  167(fvec3) Load 169(c3)
+            4456:   52(float) Load 4267(lodClamp)
+            4457:   52(float) CompositeExtract 4455 2
+            4458:6(float16_t) ImageSampleDrefImplicitLod 4454 4455 4457 MinLod 4456
+            4459:    208(ptr) AccessChain 4401(texel) 207
             4460:6(float16_t) Load 4459
             4461:6(float16_t) FAdd 4460 4458
-            4462:    208(ptr) AccessChain 4391(texel) 207
+            4462:    208(ptr) AccessChain 4401(texel) 207
                               Store 4462 4461
-            4463:         224 Load 226(s2DShadow)
-            4464:  167(fvec3) Load 169(c3)
-            4465:   52(float) Load 4257(lodClamp)
-            4466:   52(float) CompositeExtract 4464 2
-            4467:6(float16_t) ImageSampleDrefImplicitLod 4463 4464 4466 MinLod 4465
-            4468:    208(ptr) AccessChain 4391(texel) 207
-            4469:6(float16_t) Load 4468
-            4470:6(float16_t) FAdd 4469 4467
-            4471:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4471 4470
-            4472:         224 Load 226(s2DShadow)
-            4473:154(f16vec2) Load 156(f16c2)
-            4474:   52(float) Load 215(compare)
-            4475:6(float16_t) Load 4264(f16lodClamp)
-            4476:6(float16_t) Load 137(f16bias)
-            4477:6(float16_t) ImageSampleDrefImplicitLod 4472 4473 4474 Bias MinLod 4476 4475
-            4478:    208(ptr) AccessChain 4391(texel) 207
+            4463:         199 Load 201(s1DShadow)
+            4464:154(f16vec2) Load 156(f16c2)
+            4465:   52(float) Load 215(compare)
+            4466:6(float16_t) Load 4274(f16lodClamp)
+            4467:6(float16_t) Load 137(f16bias)
+            4468:6(float16_t) ImageSampleDrefImplicitLod 4463 4464 4465 Bias MinLod 4467 4466
+            4469:    208(ptr) AccessChain 4401(texel) 207
+            4470:6(float16_t) Load 4469
+            4471:6(float16_t) FAdd 4470 4468
+            4472:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4472 4471
+            4473:         224 Load 226(s2DShadow)
+            4474:  167(fvec3) Load 169(c3)
+            4475:   52(float) Load 4267(lodClamp)
+            4476:   52(float) CompositeExtract 4474 2
+            4477:6(float16_t) ImageSampleDrefImplicitLod 4473 4474 4476 MinLod 4475
+            4478:    208(ptr) AccessChain 4401(texel) 207
             4479:6(float16_t) Load 4478
             4480:6(float16_t) FAdd 4479 4477
-            4481:    208(ptr) AccessChain 4391(texel) 207
+            4481:    208(ptr) AccessChain 4401(texel) 207
                               Store 4481 4480
-            4482:         245 Load 247(sCubeShadow)
-            4483:  249(fvec4) Load 251(c4)
-            4484:   52(float) Load 4257(lodClamp)
-            4485:   52(float) CompositeExtract 4483 3
-            4486:6(float16_t) ImageSampleDrefImplicitLod 4482 4483 4485 MinLod 4484
-            4487:    208(ptr) AccessChain 4391(texel) 207
-            4488:6(float16_t) Load 4487
-            4489:6(float16_t) FAdd 4488 4486
-            4490:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4490 4489
-            4491:         245 Load 247(sCubeShadow)
-            4492:175(f16vec3) Load 177(f16c3)
-            4493:   52(float) Load 215(compare)
-            4494:6(float16_t) Load 4264(f16lodClamp)
-            4495:6(float16_t) Load 137(f16bias)
-            4496:6(float16_t) ImageSampleDrefImplicitLod 4491 4492 4493 Bias MinLod 4495 4494
-            4497:    208(ptr) AccessChain 4391(texel) 207
+            4482:         224 Load 226(s2DShadow)
+            4483:154(f16vec2) Load 156(f16c2)
+            4484:   52(float) Load 215(compare)
+            4485:6(float16_t) Load 4274(f16lodClamp)
+            4486:6(float16_t) Load 137(f16bias)
+            4487:6(float16_t) ImageSampleDrefImplicitLod 4482 4483 4484 Bias MinLod 4486 4485
+            4488:    208(ptr) AccessChain 4401(texel) 207
+            4489:6(float16_t) Load 4488
+            4490:6(float16_t) FAdd 4489 4487
+            4491:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4491 4490
+            4492:         245 Load 247(sCubeShadow)
+            4493:  249(fvec4) Load 251(c4)
+            4494:   52(float) Load 4267(lodClamp)
+            4495:   52(float) CompositeExtract 4493 3
+            4496:6(float16_t) ImageSampleDrefImplicitLod 4492 4493 4495 MinLod 4494
+            4497:    208(ptr) AccessChain 4401(texel) 207
             4498:6(float16_t) Load 4497
             4499:6(float16_t) FAdd 4498 4496
-            4500:    208(ptr) AccessChain 4391(texel) 207
+            4500:    208(ptr) AccessChain 4401(texel) 207
                               Store 4500 4499
-            4501:         269 Load 271(s1DArray)
-            4502:   53(fvec2) Load 148(c2)
-            4503:   52(float) Load 4257(lodClamp)
-            4504:  7(f16vec4) ImageSampleImplicitLod 4501 4502 MinLod 4503
-            4505:  7(f16vec4) Load 4391(texel)
-            4506:  7(f16vec4) FAdd 4505 4504
-                              Store 4391(texel) 4506
-            4507:         269 Load 271(s1DArray)
-            4508:154(f16vec2) Load 156(f16c2)
-            4509:6(float16_t) Load 4264(f16lodClamp)
-            4510:6(float16_t) Load 137(f16bias)
-            4511:  7(f16vec4) ImageSampleImplicitLod 4507 4508 Bias MinLod 4510 4509
-            4512:  7(f16vec4) Load 4391(texel)
-            4513:  7(f16vec4) FAdd 4512 4511
-                              Store 4391(texel) 4513
-            4514:         284 Load 286(s2DArray)
-            4515:  167(fvec3) Load 169(c3)
-            4516:   52(float) Load 4257(lodClamp)
-            4517:  7(f16vec4) ImageSampleImplicitLod 4514 4515 MinLod 4516
-            4518:  7(f16vec4) Load 4391(texel)
-            4519:  7(f16vec4) FAdd 4518 4517
-                              Store 4391(texel) 4519
-            4520:         284 Load 286(s2DArray)
-            4521:175(f16vec3) Load 177(f16c3)
-            4522:6(float16_t) Load 4264(f16lodClamp)
-            4523:6(float16_t) Load 137(f16bias)
-            4524:  7(f16vec4) ImageSampleImplicitLod 4520 4521 Bias MinLod 4523 4522
-            4525:  7(f16vec4) Load 4391(texel)
-            4526:  7(f16vec4) FAdd 4525 4524
-                              Store 4391(texel) 4526
-            4527:         299 Load 301(sCubeArray)
-            4528:  249(fvec4) Load 251(c4)
-            4529:   52(float) Load 4257(lodClamp)
-            4530:  7(f16vec4) ImageSampleImplicitLod 4527 4528 MinLod 4529
-            4531:  7(f16vec4) Load 4391(texel)
-            4532:  7(f16vec4) FAdd 4531 4530
-                              Store 4391(texel) 4532
-            4533:         299 Load 301(sCubeArray)
-            4534:  7(f16vec4) Load 309(f16c4)
-            4535:6(float16_t) Load 4264(f16lodClamp)
-            4536:6(float16_t) Load 137(f16bias)
-            4537:  7(f16vec4) ImageSampleImplicitLod 4533 4534 Bias MinLod 4536 4535
-            4538:  7(f16vec4) Load 4391(texel)
-            4539:  7(f16vec4) FAdd 4538 4537
-                              Store 4391(texel) 4539
-            4540:         316 Load 318(s1DArrayShadow)
-            4541:  167(fvec3) Load 169(c3)
-            4542:   52(float) Load 4257(lodClamp)
-            4543:   52(float) CompositeExtract 4541 2
-            4544:6(float16_t) ImageSampleDrefImplicitLod 4540 4541 4543 MinLod 4542
-            4545:    208(ptr) AccessChain 4391(texel) 207
-            4546:6(float16_t) Load 4545
-            4547:6(float16_t) FAdd 4546 4544
-            4548:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4548 4547
-            4549:         316 Load 318(s1DArrayShadow)
-            4550:154(f16vec2) Load 156(f16c2)
-            4551:   52(float) Load 215(compare)
-            4552:6(float16_t) Load 4264(f16lodClamp)
-            4553:6(float16_t) Load 137(f16bias)
-            4554:6(float16_t) ImageSampleDrefImplicitLod 4549 4550 4551 Bias MinLod 4553 4552
-            4555:    208(ptr) AccessChain 4391(texel) 207
+            4501:         245 Load 247(sCubeShadow)
+            4502:175(f16vec3) Load 177(f16c3)
+            4503:   52(float) Load 215(compare)
+            4504:6(float16_t) Load 4274(f16lodClamp)
+            4505:6(float16_t) Load 137(f16bias)
+            4506:6(float16_t) ImageSampleDrefImplicitLod 4501 4502 4503 Bias MinLod 4505 4504
+            4507:    208(ptr) AccessChain 4401(texel) 207
+            4508:6(float16_t) Load 4507
+            4509:6(float16_t) FAdd 4508 4506
+            4510:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4510 4509
+            4511:         269 Load 271(s1DArray)
+            4512:   53(fvec2) Load 148(c2)
+            4513:   52(float) Load 4267(lodClamp)
+            4514:  7(f16vec4) ImageSampleImplicitLod 4511 4512 MinLod 4513
+            4515:  7(f16vec4) Load 4401(texel)
+            4516:  7(f16vec4) FAdd 4515 4514
+                              Store 4401(texel) 4516
+            4517:         269 Load 271(s1DArray)
+            4518:154(f16vec2) Load 156(f16c2)
+            4519:6(float16_t) Load 4274(f16lodClamp)
+            4520:6(float16_t) Load 137(f16bias)
+            4521:  7(f16vec4) ImageSampleImplicitLod 4517 4518 Bias MinLod 4520 4519
+            4522:  7(f16vec4) Load 4401(texel)
+            4523:  7(f16vec4) FAdd 4522 4521
+                              Store 4401(texel) 4523
+            4524:         284 Load 286(s2DArray)
+            4525:  167(fvec3) Load 169(c3)
+            4526:   52(float) Load 4267(lodClamp)
+            4527:  7(f16vec4) ImageSampleImplicitLod 4524 4525 MinLod 4526
+            4528:  7(f16vec4) Load 4401(texel)
+            4529:  7(f16vec4) FAdd 4528 4527
+                              Store 4401(texel) 4529
+            4530:         284 Load 286(s2DArray)
+            4531:175(f16vec3) Load 177(f16c3)
+            4532:6(float16_t) Load 4274(f16lodClamp)
+            4533:6(float16_t) Load 137(f16bias)
+            4534:  7(f16vec4) ImageSampleImplicitLod 4530 4531 Bias MinLod 4533 4532
+            4535:  7(f16vec4) Load 4401(texel)
+            4536:  7(f16vec4) FAdd 4535 4534
+                              Store 4401(texel) 4536
+            4537:         299 Load 301(sCubeArray)
+            4538:  249(fvec4) Load 251(c4)
+            4539:   52(float) Load 4267(lodClamp)
+            4540:  7(f16vec4) ImageSampleImplicitLod 4537 4538 MinLod 4539
+            4541:  7(f16vec4) Load 4401(texel)
+            4542:  7(f16vec4) FAdd 4541 4540
+                              Store 4401(texel) 4542
+            4543:         299 Load 301(sCubeArray)
+            4544:  7(f16vec4) Load 309(f16c4)
+            4545:6(float16_t) Load 4274(f16lodClamp)
+            4546:6(float16_t) Load 137(f16bias)
+            4547:  7(f16vec4) ImageSampleImplicitLod 4543 4544 Bias MinLod 4546 4545
+            4548:  7(f16vec4) Load 4401(texel)
+            4549:  7(f16vec4) FAdd 4548 4547
+                              Store 4401(texel) 4549
+            4550:         316 Load 318(s1DArrayShadow)
+            4551:  167(fvec3) Load 169(c3)
+            4552:   52(float) Load 4267(lodClamp)
+            4553:   52(float) CompositeExtract 4551 2
+            4554:6(float16_t) ImageSampleDrefImplicitLod 4550 4551 4553 MinLod 4552
+            4555:    208(ptr) AccessChain 4401(texel) 207
             4556:6(float16_t) Load 4555
             4557:6(float16_t) FAdd 4556 4554
-            4558:    208(ptr) AccessChain 4391(texel) 207
+            4558:    208(ptr) AccessChain 4401(texel) 207
                               Store 4558 4557
-            4559:         337 Load 339(s2DArrayShadow)
-            4560:  249(fvec4) Load 251(c4)
-            4561:   52(float) Load 4257(lodClamp)
-            4562:   52(float) CompositeExtract 4560 3
-            4563:6(float16_t) ImageSampleDrefImplicitLod 4559 4560 4562 MinLod 4561
-            4564:    208(ptr) AccessChain 4391(texel) 207
-            4565:6(float16_t) Load 4564
-            4566:6(float16_t) FAdd 4565 4563
-            4567:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4567 4566
-            4568:         337 Load 339(s2DArrayShadow)
-            4569:175(f16vec3) Load 177(f16c3)
-            4570:   52(float) Load 215(compare)
-            4571:6(float16_t) Load 4264(f16lodClamp)
-            4572:6(float16_t) ImageSampleDrefImplicitLod 4568 4569 4570 MinLod 4571
-            4573:    208(ptr) AccessChain 4391(texel) 207
-            4574:6(float16_t) Load 4573
-            4575:6(float16_t) FAdd 4574 4572
-            4576:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4576 4575
-            4577:         391 Load 393(sCubeArrayShadow)
-            4578:  249(fvec4) Load 251(c4)
-            4579:   52(float) Load 215(compare)
-            4580:   52(float) Load 4257(lodClamp)
-            4581:6(float16_t) ImageSampleDrefImplicitLod 4577 4578 4579 MinLod 4580
-            4582:    208(ptr) AccessChain 4391(texel) 207
-            4583:6(float16_t) Load 4582
-            4584:6(float16_t) FAdd 4583 4581
-            4585:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4585 4584
-            4586:         391 Load 393(sCubeArrayShadow)
-            4587:  7(f16vec4) Load 309(f16c4)
-            4588:   52(float) Load 215(compare)
-            4589:6(float16_t) Load 4264(f16lodClamp)
-            4590:6(float16_t) ImageSampleDrefImplicitLod 4586 4587 4588 MinLod 4589
-            4591:    208(ptr) AccessChain 4391(texel) 207
-            4592:6(float16_t) Load 4591
-            4593:6(float16_t) FAdd 4592 4590
-            4594:    208(ptr) AccessChain 4391(texel) 207
-                              Store 4594 4593
-            4595:  7(f16vec4) Load 4391(texel)
-                              ReturnValue 4595
+            4559:         316 Load 318(s1DArrayShadow)
+            4560:154(f16vec2) Load 156(f16c2)
+            4561:   52(float) Load 215(compare)
+            4562:6(float16_t) Load 4274(f16lodClamp)
+            4563:6(float16_t) Load 137(f16bias)
+            4564:6(float16_t) ImageSampleDrefImplicitLod 4559 4560 4561 Bias MinLod 4563 4562
+            4565:    208(ptr) AccessChain 4401(texel) 207
+            4566:6(float16_t) Load 4565
+            4567:6(float16_t) FAdd 4566 4564
+            4568:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4568 4567
+            4569:         337 Load 339(s2DArrayShadow)
+            4570:  249(fvec4) Load 251(c4)
+            4571:   52(float) Load 4267(lodClamp)
+            4572:   52(float) CompositeExtract 4570 3
+            4573:6(float16_t) ImageSampleDrefImplicitLod 4569 4570 4572 MinLod 4571
+            4574:    208(ptr) AccessChain 4401(texel) 207
+            4575:6(float16_t) Load 4574
+            4576:6(float16_t) FAdd 4575 4573
+            4577:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4577 4576
+            4578:         337 Load 339(s2DArrayShadow)
+            4579:175(f16vec3) Load 177(f16c3)
+            4580:   52(float) Load 215(compare)
+            4581:6(float16_t) Load 4274(f16lodClamp)
+            4582:6(float16_t) ImageSampleDrefImplicitLod 4578 4579 4580 MinLod 4581
+            4583:    208(ptr) AccessChain 4401(texel) 207
+            4584:6(float16_t) Load 4583
+            4585:6(float16_t) FAdd 4584 4582
+            4586:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4586 4585
+            4587:         391 Load 393(sCubeArrayShadow)
+            4588:  249(fvec4) Load 251(c4)
+            4589:   52(float) Load 215(compare)
+            4590:   52(float) Load 4267(lodClamp)
+            4591:6(float16_t) ImageSampleDrefImplicitLod 4587 4588 4589 MinLod 4590
+            4592:    208(ptr) AccessChain 4401(texel) 207
+            4593:6(float16_t) Load 4592
+            4594:6(float16_t) FAdd 4593 4591
+            4595:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4595 4594
+            4596:         391 Load 393(sCubeArrayShadow)
+            4597:  7(f16vec4) Load 309(f16c4)
+            4598:   52(float) Load 215(compare)
+            4599:6(float16_t) Load 4274(f16lodClamp)
+            4600:6(float16_t) ImageSampleDrefImplicitLod 4596 4597 4598 MinLod 4599
+            4601:    208(ptr) AccessChain 4401(texel) 207
+            4602:6(float16_t) Load 4601
+            4603:6(float16_t) FAdd 4602 4600
+            4604:    208(ptr) AccessChain 4401(texel) 207
+                              Store 4604 4603
+            4605:  7(f16vec4) Load 4401(texel)
+                              ReturnValue 4605
                               FunctionEnd
 103(testSparseTextureOffsetClamp():  7(f16vec4) Function None 8
              104:             Label
-     4598(texel):     64(ptr) Variable Function
-                              Store 4598(texel) 121
-            4599:         143 Load 145(s2D)
-            4600:   53(fvec2) Load 148(c2)
-            4601:   52(float) Load 4257(lodClamp)
-            4602:3102(ResType) ImageSparseSampleImplicitLod 4599 4600 ConstOffset MinLod 722 4601
-            4603:  7(f16vec4) CompositeExtract 4602 1
-                              Store 4598(texel) 4603
-            4604:     47(int) CompositeExtract 4602 0
-            4605:         143 Load 145(s2D)
-            4606:154(f16vec2) Load 156(f16c2)
-            4607:6(float16_t) Load 4264(f16lodClamp)
-            4608:6(float16_t) Load 137(f16bias)
-            4609:3102(ResType) ImageSparseSampleImplicitLod 4605 4606 Bias ConstOffset MinLod 4608 722 4607
-            4610:  7(f16vec4) CompositeExtract 4609 1
-                              Store 4598(texel) 4610
-            4611:     47(int) CompositeExtract 4609 0
-            4612:         163 Load 165(s3D)
-            4613:  167(fvec3) Load 169(c3)
-            4614:   52(float) Load 4257(lodClamp)
-            4615:3102(ResType) ImageSparseSampleImplicitLod 4612 4613 ConstOffset MinLod 735 4614
-            4616:  7(f16vec4) CompositeExtract 4615 1
-                              Store 4598(texel) 4616
-            4617:     47(int) CompositeExtract 4615 0
-            4618:         163 Load 165(s3D)
-            4619:175(f16vec3) Load 177(f16c3)
-            4620:6(float16_t) Load 4264(f16lodClamp)
-            4621:6(float16_t) Load 137(f16bias)
-            4622:3102(ResType) ImageSparseSampleImplicitLod 4618 4619 Bias ConstOffset MinLod 4621 735 4620
-            4623:  7(f16vec4) CompositeExtract 4622 1
-                              Store 4598(texel) 4623
-            4624:     47(int) CompositeExtract 4622 0
-            4625:         224 Load 226(s2DShadow)
-            4626:  167(fvec3) Load 169(c3)
-            4627:   52(float) Load 4257(lodClamp)
-            4628:    208(ptr) AccessChain 4598(texel) 207
-            4629:   52(float) CompositeExtract 4626 2
-            4630:3138(ResType) ImageSparseSampleDrefImplicitLod 4625 4626 4629 ConstOffset MinLod 722 4627
-            4631:6(float16_t) CompositeExtract 4630 1
-                              Store 4628 4631
-            4632:     47(int) CompositeExtract 4630 0
-            4633:         224 Load 226(s2DShadow)
-            4634:154(f16vec2) Load 156(f16c2)
-            4635:   52(float) Load 215(compare)
-            4636:6(float16_t) Load 4264(f16lodClamp)
-            4637:    208(ptr) AccessChain 4598(texel) 207
-            4638:6(float16_t) Load 137(f16bias)
-            4639:3138(ResType) ImageSparseSampleDrefImplicitLod 4633 4634 4635 Bias ConstOffset MinLod 4638 722 4636
-            4640:6(float16_t) CompositeExtract 4639 1
-                              Store 4637 4640
-            4641:     47(int) CompositeExtract 4639 0
-            4642:         284 Load 286(s2DArray)
-            4643:  167(fvec3) Load 169(c3)
-            4644:   52(float) Load 4257(lodClamp)
-            4645:3102(ResType) ImageSparseSampleImplicitLod 4642 4643 ConstOffset MinLod 722 4644
-            4646:  7(f16vec4) CompositeExtract 4645 1
-                              Store 4598(texel) 4646
-            4647:     47(int) CompositeExtract 4645 0
-            4648:         284 Load 286(s2DArray)
-            4649:175(f16vec3) Load 177(f16c3)
-            4650:6(float16_t) Load 4264(f16lodClamp)
-            4651:6(float16_t) Load 137(f16bias)
-            4652:3102(ResType) ImageSparseSampleImplicitLod 4648 4649 Bias ConstOffset MinLod 4651 722 4650
-            4653:  7(f16vec4) CompositeExtract 4652 1
-                              Store 4598(texel) 4653
-            4654:     47(int) CompositeExtract 4652 0
-            4655:         337 Load 339(s2DArrayShadow)
-            4656:  249(fvec4) Load 251(c4)
-            4657:   52(float) Load 4257(lodClamp)
-            4658:    208(ptr) AccessChain 4598(texel) 207
-            4659:   52(float) CompositeExtract 4656 3
-            4660:3138(ResType) ImageSparseSampleDrefImplicitLod 4655 4656 4659 ConstOffset MinLod 722 4657
-            4661:6(float16_t) CompositeExtract 4660 1
-                              Store 4658 4661
-            4662:     47(int) CompositeExtract 4660 0
-            4663:         337 Load 339(s2DArrayShadow)
-            4664:175(f16vec3) Load 177(f16c3)
-            4665:   52(float) Load 215(compare)
-            4666:6(float16_t) Load 4264(f16lodClamp)
-            4667:    208(ptr) AccessChain 4598(texel) 207
-            4668:3138(ResType) ImageSparseSampleDrefImplicitLod 4663 4664 4665 ConstOffset MinLod 722 4666
-            4669:6(float16_t) CompositeExtract 4668 1
-                              Store 4667 4669
-            4670:     47(int) CompositeExtract 4668 0
-            4671:  7(f16vec4) Load 4598(texel)
-                              ReturnValue 4671
+     4608(texel):     64(ptr) Variable Function
+                              Store 4608(texel) 121
+            4609:         143 Load 145(s2D)
+            4610:   53(fvec2) Load 148(c2)
+            4611:   52(float) Load 4267(lodClamp)
+            4612:3102(ResType) ImageSparseSampleImplicitLod 4609 4610 ConstOffset MinLod 722 4611
+            4613:  7(f16vec4) CompositeExtract 4612 1
+                              Store 4608(texel) 4613
+            4614:     47(int) CompositeExtract 4612 0
+            4615:         143 Load 145(s2D)
+            4616:154(f16vec2) Load 156(f16c2)
+            4617:6(float16_t) Load 4274(f16lodClamp)
+            4618:6(float16_t) Load 137(f16bias)
+            4619:3102(ResType) ImageSparseSampleImplicitLod 4615 4616 Bias ConstOffset MinLod 4618 722 4617
+            4620:  7(f16vec4) CompositeExtract 4619 1
+                              Store 4608(texel) 4620
+            4621:     47(int) CompositeExtract 4619 0
+            4622:         163 Load 165(s3D)
+            4623:  167(fvec3) Load 169(c3)
+            4624:   52(float) Load 4267(lodClamp)
+            4625:3102(ResType) ImageSparseSampleImplicitLod 4622 4623 ConstOffset MinLod 735 4624
+            4626:  7(f16vec4) CompositeExtract 4625 1
+                              Store 4608(texel) 4626
+            4627:     47(int) CompositeExtract 4625 0
+            4628:         163 Load 165(s3D)
+            4629:175(f16vec3) Load 177(f16c3)
+            4630:6(float16_t) Load 4274(f16lodClamp)
+            4631:6(float16_t) Load 137(f16bias)
+            4632:3102(ResType) ImageSparseSampleImplicitLod 4628 4629 Bias ConstOffset MinLod 4631 735 4630
+            4633:  7(f16vec4) CompositeExtract 4632 1
+                              Store 4608(texel) 4633
+            4634:     47(int) CompositeExtract 4632 0
+            4635:         224 Load 226(s2DShadow)
+            4636:  167(fvec3) Load 169(c3)
+            4637:   52(float) Load 4267(lodClamp)
+            4638:    208(ptr) AccessChain 4608(texel) 207
+            4639:   52(float) CompositeExtract 4636 2
+            4640:3138(ResType) ImageSparseSampleDrefImplicitLod 4635 4636 4639 ConstOffset MinLod 722 4637
+            4641:6(float16_t) CompositeExtract 4640 1
+                              Store 4638 4641
+            4642:     47(int) CompositeExtract 4640 0
+            4643:         224 Load 226(s2DShadow)
+            4644:154(f16vec2) Load 156(f16c2)
+            4645:   52(float) Load 215(compare)
+            4646:6(float16_t) Load 4274(f16lodClamp)
+            4647:    208(ptr) AccessChain 4608(texel) 207
+            4648:6(float16_t) Load 137(f16bias)
+            4649:3138(ResType) ImageSparseSampleDrefImplicitLod 4643 4644 4645 Bias ConstOffset MinLod 4648 722 4646
+            4650:6(float16_t) CompositeExtract 4649 1
+                              Store 4647 4650
+            4651:     47(int) CompositeExtract 4649 0
+            4652:         284 Load 286(s2DArray)
+            4653:  167(fvec3) Load 169(c3)
+            4654:   52(float) Load 4267(lodClamp)
+            4655:3102(ResType) ImageSparseSampleImplicitLod 4652 4653 ConstOffset MinLod 722 4654
+            4656:  7(f16vec4) CompositeExtract 4655 1
+                              Store 4608(texel) 4656
+            4657:     47(int) CompositeExtract 4655 0
+            4658:         284 Load 286(s2DArray)
+            4659:175(f16vec3) Load 177(f16c3)
+            4660:6(float16_t) Load 4274(f16lodClamp)
+            4661:6(float16_t) Load 137(f16bias)
+            4662:3102(ResType) ImageSparseSampleImplicitLod 4658 4659 Bias ConstOffset MinLod 4661 722 4660
+            4663:  7(f16vec4) CompositeExtract 4662 1
+                              Store 4608(texel) 4663
+            4664:     47(int) CompositeExtract 4662 0
+            4665:         337 Load 339(s2DArrayShadow)
+            4666:  249(fvec4) Load 251(c4)
+            4667:   52(float) Load 4267(lodClamp)
+            4668:    208(ptr) AccessChain 4608(texel) 207
+            4669:   52(float) CompositeExtract 4666 3
+            4670:3138(ResType) ImageSparseSampleDrefImplicitLod 4665 4666 4669 ConstOffset MinLod 722 4667
+            4671:6(float16_t) CompositeExtract 4670 1
+                              Store 4668 4671
+            4672:     47(int) CompositeExtract 4670 0
+            4673:         337 Load 339(s2DArrayShadow)
+            4674:175(f16vec3) Load 177(f16c3)
+            4675:   52(float) Load 215(compare)
+            4676:6(float16_t) Load 4274(f16lodClamp)
+            4677:    208(ptr) AccessChain 4608(texel) 207
+            4678:3138(ResType) ImageSparseSampleDrefImplicitLod 4673 4674 4675 ConstOffset MinLod 722 4676
+            4679:6(float16_t) CompositeExtract 4678 1
+                              Store 4677 4679
+            4680:     47(int) CompositeExtract 4678 0
+            4681:  7(f16vec4) Load 4608(texel)
+                              ReturnValue 4681
                               FunctionEnd
 105(testTextureOffsetClamp():  7(f16vec4) Function None 8
              106:             Label
-     4674(texel):     64(ptr) Variable Function
-                              Store 4674(texel) 121
-            4675:         123 Load 125(s1D)
-            4676:   52(float) Load 128(c1)
-            4677:   52(float) Load 4257(lodClamp)
-            4678:  7(f16vec4) ImageSampleImplicitLod 4675 4676 ConstOffset MinLod 709 4677
-            4679:  7(f16vec4) Load 4674(texel)
-            4680:  7(f16vec4) FAdd 4679 4678
-                              Store 4674(texel) 4680
-            4681:         123 Load 125(s1D)
-            4682:6(float16_t) Load 135(f16c1)
-            4683:6(float16_t) Load 4264(f16lodClamp)
-            4684:6(float16_t) Load 137(f16bias)
-            4685:  7(f16vec4) ImageSampleImplicitLod 4681 4682 Bias ConstOffset MinLod 4684 709 4683
-            4686:  7(f16vec4) Load 4674(texel)
-            4687:  7(f16vec4) FAdd 4686 4685
-                              Store 4674(texel) 4687
-            4688:         143 Load 145(s2D)
-            4689:   53(fvec2) Load 148(c2)
-            4690:   52(float) Load 4257(lodClamp)
-            4691:  7(f16vec4) ImageSampleImplicitLod 4688 4689 ConstOffset MinLod 722 4690
-            4692:  7(f16vec4) Load 4674(texel)
-            4693:  7(f16vec4) FAdd 4692 4691
-                              Store 4674(texel) 4693
-            4694:         143 Load 145(s2D)
-            4695:154(f16vec2) Load 156(f16c2)
-            4696:6(float16_t) Load 4264(f16lodClamp)
-            4697:6(float16_t) Load 137(f16bias)
-            4698:  7(f16vec4) ImageSampleImplicitLod 4694 4695 Bias ConstOffset MinLod 4697 722 4696
-            4699:  7(f16vec4) Load 4674(texel)
-            4700:  7(f16vec4) FAdd 4699 4698
-                              Store 4674(texel) 4700
-            4701:         163 Load 165(s3D)
-            4702:  167(fvec3) Load 169(c3)
-            4703:   52(float) Load 4257(lodClamp)
-            4704:  7(f16vec4) ImageSampleImplicitLod 4701 4702 ConstOffset MinLod 735 4703
-            4705:  7(f16vec4) Load 4674(texel)
-            4706:  7(f16vec4) FAdd 4705 4704
-                              Store 4674(texel) 4706
-            4707:         163 Load 165(s3D)
-            4708:175(f16vec3) Load 177(f16c3)
-            4709:6(float16_t) Load 4264(f16lodClamp)
-            4710:6(float16_t) Load 137(f16bias)
-            4711:  7(f16vec4) ImageSampleImplicitLod 4707 4708 Bias ConstOffset MinLod 4710 735 4709
-            4712:  7(f16vec4) Load 4674(texel)
-            4713:  7(f16vec4) FAdd 4712 4711
-                              Store 4674(texel) 4713
-            4714:         199 Load 201(s1DShadow)
-            4715:  167(fvec3) Load 169(c3)
-            4716:   52(float) Load 4257(lodClamp)
-            4717:   52(float) CompositeExtract 4715 2
-            4718:6(float16_t) ImageSampleDrefImplicitLod 4714 4715 4717 ConstOffset MinLod 709 4716
-            4719:    208(ptr) AccessChain 4674(texel) 207
-            4720:6(float16_t) Load 4719
-            4721:6(float16_t) FAdd 4720 4718
-            4722:    208(ptr) AccessChain 4674(texel) 207
-                              Store 4722 4721
-            4723:         199 Load 201(s1DShadow)
-            4724:154(f16vec2) Load 156(f16c2)
-            4725:   52(float) Load 215(compare)
-            4726:6(float16_t) Load 4264(f16lodClamp)
-            4727:6(float16_t) Load 137(f16bias)
-            4728:6(float16_t) ImageSampleDrefImplicitLod 4723 4724 4725 Bias ConstOffset MinLod 4727 709 4726
-            4729:    208(ptr) AccessChain 4674(texel) 207
+     4684(texel):     64(ptr) Variable Function
+                              Store 4684(texel) 121
+            4685:         123 Load 125(s1D)
+            4686:   52(float) Load 128(c1)
+            4687:   52(float) Load 4267(lodClamp)
+            4688:  7(f16vec4) ImageSampleImplicitLod 4685 4686 ConstOffset MinLod 709 4687
+            4689:  7(f16vec4) Load 4684(texel)
+            4690:  7(f16vec4) FAdd 4689 4688
+                              Store 4684(texel) 4690
+            4691:         123 Load 125(s1D)
+            4692:6(float16_t) Load 135(f16c1)
+            4693:6(float16_t) Load 4274(f16lodClamp)
+            4694:6(float16_t) Load 137(f16bias)
+            4695:  7(f16vec4) ImageSampleImplicitLod 4691 4692 Bias ConstOffset MinLod 4694 709 4693
+            4696:  7(f16vec4) Load 4684(texel)
+            4697:  7(f16vec4) FAdd 4696 4695
+                              Store 4684(texel) 4697
+            4698:         143 Load 145(s2D)
+            4699:   53(fvec2) Load 148(c2)
+            4700:   52(float) Load 4267(lodClamp)
+            4701:  7(f16vec4) ImageSampleImplicitLod 4698 4699 ConstOffset MinLod 722 4700
+            4702:  7(f16vec4) Load 4684(texel)
+            4703:  7(f16vec4) FAdd 4702 4701
+                              Store 4684(texel) 4703
+            4704:         143 Load 145(s2D)
+            4705:154(f16vec2) Load 156(f16c2)
+            4706:6(float16_t) Load 4274(f16lodClamp)
+            4707:6(float16_t) Load 137(f16bias)
+            4708:  7(f16vec4) ImageSampleImplicitLod 4704 4705 Bias ConstOffset MinLod 4707 722 4706
+            4709:  7(f16vec4) Load 4684(texel)
+            4710:  7(f16vec4) FAdd 4709 4708
+                              Store 4684(texel) 4710
+            4711:         163 Load 165(s3D)
+            4712:  167(fvec3) Load 169(c3)
+            4713:   52(float) Load 4267(lodClamp)
+            4714:  7(f16vec4) ImageSampleImplicitLod 4711 4712 ConstOffset MinLod 735 4713
+            4715:  7(f16vec4) Load 4684(texel)
+            4716:  7(f16vec4) FAdd 4715 4714
+                              Store 4684(texel) 4716
+            4717:         163 Load 165(s3D)
+            4718:175(f16vec3) Load 177(f16c3)
+            4719:6(float16_t) Load 4274(f16lodClamp)
+            4720:6(float16_t) Load 137(f16bias)
+            4721:  7(f16vec4) ImageSampleImplicitLod 4717 4718 Bias ConstOffset MinLod 4720 735 4719
+            4722:  7(f16vec4) Load 4684(texel)
+            4723:  7(f16vec4) FAdd 4722 4721
+                              Store 4684(texel) 4723
+            4724:         199 Load 201(s1DShadow)
+            4725:  167(fvec3) Load 169(c3)
+            4726:   52(float) Load 4267(lodClamp)
+            4727:   52(float) CompositeExtract 4725 2
+            4728:6(float16_t) ImageSampleDrefImplicitLod 4724 4725 4727 ConstOffset MinLod 709 4726
+            4729:    208(ptr) AccessChain 4684(texel) 207
             4730:6(float16_t) Load 4729
             4731:6(float16_t) FAdd 4730 4728
-            4732:    208(ptr) AccessChain 4674(texel) 207
+            4732:    208(ptr) AccessChain 4684(texel) 207
                               Store 4732 4731
-            4733:         224 Load 226(s2DShadow)
-            4734:  167(fvec3) Load 169(c3)
-            4735:   52(float) Load 4257(lodClamp)
-            4736:   52(float) CompositeExtract 4734 2
-            4737:6(float16_t) ImageSampleDrefImplicitLod 4733 4734 4736 ConstOffset MinLod 722 4735
-            4738:    208(ptr) AccessChain 4674(texel) 207
-            4739:6(float16_t) Load 4738
-            4740:6(float16_t) FAdd 4739 4737
-            4741:    208(ptr) AccessChain 4674(texel) 207
-                              Store 4741 4740
-            4742:         224 Load 226(s2DShadow)
-            4743:154(f16vec2) Load 156(f16c2)
-            4744:   52(float) Load 215(compare)
-            4745:6(float16_t) Load 4264(f16lodClamp)
-            4746:6(float16_t) Load 137(f16bias)
-            4747:6(float16_t) ImageSampleDrefImplicitLod 4742 4743 4744 Bias ConstOffset MinLod 4746 722 4745
-            4748:    208(ptr) AccessChain 4674(texel) 207
+            4733:         199 Load 201(s1DShadow)
+            4734:154(f16vec2) Load 156(f16c2)
+            4735:   52(float) Load 215(compare)
+            4736:6(float16_t) Load 4274(f16lodClamp)
+            4737:6(float16_t) Load 137(f16bias)
+            4738:6(float16_t) ImageSampleDrefImplicitLod 4733 4734 4735 Bias ConstOffset MinLod 4737 709 4736
+            4739:    208(ptr) AccessChain 4684(texel) 207
+            4740:6(float16_t) Load 4739
+            4741:6(float16_t) FAdd 4740 4738
+            4742:    208(ptr) AccessChain 4684(texel) 207
+                              Store 4742 4741
+            4743:         224 Load 226(s2DShadow)
+            4744:  167(fvec3) Load 169(c3)
+            4745:   52(float) Load 4267(lodClamp)
+            4746:   52(float) CompositeExtract 4744 2
+            4747:6(float16_t) ImageSampleDrefImplicitLod 4743 4744 4746 ConstOffset MinLod 722 4745
+            4748:    208(ptr) AccessChain 4684(texel) 207
             4749:6(float16_t) Load 4748
             4750:6(float16_t) FAdd 4749 4747
-            4751:    208(ptr) AccessChain 4674(texel) 207
+            4751:    208(ptr) AccessChain 4684(texel) 207
                               Store 4751 4750
-            4752:         269 Load 271(s1DArray)
-            4753:   53(fvec2) Load 148(c2)
-            4754:   52(float) Load 4257(lodClamp)
-            4755:  7(f16vec4) ImageSampleImplicitLod 4752 4753 ConstOffset MinLod 709 4754
-            4756:  7(f16vec4) Load 4674(texel)
-            4757:  7(f16vec4) FAdd 4756 4755
-                              Store 4674(texel) 4757
-            4758:         269 Load 271(s1DArray)
-            4759:154(f16vec2) Load 156(f16c2)
-            4760:6(float16_t) Load 4264(f16lodClamp)
-            4761:6(float16_t) Load 137(f16bias)
-            4762:  7(f16vec4) ImageSampleImplicitLod 4758 4759 Bias ConstOffset MinLod 4761 709 4760
-            4763:  7(f16vec4) Load 4674(texel)
-            4764:  7(f16vec4) FAdd 4763 4762
-                              Store 4674(texel) 4764
-            4765:         284 Load 286(s2DArray)
-            4766:  167(fvec3) Load 169(c3)
-            4767:   52(float) Load 4257(lodClamp)
-            4768:  7(f16vec4) ImageSampleImplicitLod 4765 4766 ConstOffset MinLod 722 4767
-            4769:  7(f16vec4) Load 4674(texel)
-            4770:  7(f16vec4) FAdd 4769 4768
-                              Store 4674(texel) 4770
-            4771:         284 Load 286(s2DArray)
-            4772:175(f16vec3) Load 177(f16c3)
-            4773:6(float16_t) Load 4264(f16lodClamp)
-            4774:6(float16_t) Load 137(f16bias)
-            4775:  7(f16vec4) ImageSampleImplicitLod 4771 4772 Bias ConstOffset MinLod 4774 722 4773
-            4776:  7(f16vec4) Load 4674(texel)
-            4777:  7(f16vec4) FAdd 4776 4775
-                              Store 4674(texel) 4777
-            4778:         316 Load 318(s1DArrayShadow)
-            4779:  167(fvec3) Load 169(c3)
-            4780:   52(float) Load 4257(lodClamp)
-            4781:   52(float) CompositeExtract 4779 2
-            4782:6(float16_t) ImageSampleDrefImplicitLod 4778 4779 4781 ConstOffset MinLod 709 4780
-            4783:    208(ptr) AccessChain 4674(texel) 207
-            4784:6(float16_t) Load 4783
-            4785:6(float16_t) FAdd 4784 4782
-            4786:    208(ptr) AccessChain 4674(texel) 207
-                              Store 4786 4785
-            4787:         316 Load 318(s1DArrayShadow)
-            4788:154(f16vec2) Load 156(f16c2)
-            4789:   52(float) Load 215(compare)
-            4790:6(float16_t) Load 4264(f16lodClamp)
-            4791:6(float16_t) Load 137(f16bias)
-            4792:6(float16_t) ImageSampleDrefImplicitLod 4787 4788 4789 Bias ConstOffset MinLod 4791 709 4790
-            4793:    208(ptr) AccessChain 4674(texel) 207
+            4752:         224 Load 226(s2DShadow)
+            4753:154(f16vec2) Load 156(f16c2)
+            4754:   52(float) Load 215(compare)
+            4755:6(float16_t) Load 4274(f16lodClamp)
+            4756:6(float16_t) Load 137(f16bias)
+            4757:6(float16_t) ImageSampleDrefImplicitLod 4752 4753 4754 Bias ConstOffset MinLod 4756 722 4755
+            4758:    208(ptr) AccessChain 4684(texel) 207
+            4759:6(float16_t) Load 4758
+            4760:6(float16_t) FAdd 4759 4757
+            4761:    208(ptr) AccessChain 4684(texel) 207
+                              Store 4761 4760
+            4762:         269 Load 271(s1DArray)
+            4763:   53(fvec2) Load 148(c2)
+            4764:   52(float) Load 4267(lodClamp)
+            4765:  7(f16vec4) ImageSampleImplicitLod 4762 4763 ConstOffset MinLod 709 4764
+            4766:  7(f16vec4) Load 4684(texel)
+            4767:  7(f16vec4) FAdd 4766 4765
+                              Store 4684(texel) 4767
+            4768:         269 Load 271(s1DArray)
+            4769:154(f16vec2) Load 156(f16c2)
+            4770:6(float16_t) Load 4274(f16lodClamp)
+            4771:6(float16_t) Load 137(f16bias)
+            4772:  7(f16vec4) ImageSampleImplicitLod 4768 4769 Bias ConstOffset MinLod 4771 709 4770
+            4773:  7(f16vec4) Load 4684(texel)
+            4774:  7(f16vec4) FAdd 4773 4772
+                              Store 4684(texel) 4774
+            4775:         284 Load 286(s2DArray)
+            4776:  167(fvec3) Load 169(c3)
+            4777:   52(float) Load 4267(lodClamp)
+            4778:  7(f16vec4) ImageSampleImplicitLod 4775 4776 ConstOffset MinLod 722 4777
+            4779:  7(f16vec4) Load 4684(texel)
+            4780:  7(f16vec4) FAdd 4779 4778
+                              Store 4684(texel) 4780
+            4781:         284 Load 286(s2DArray)
+            4782:175(f16vec3) Load 177(f16c3)
+            4783:6(float16_t) Load 4274(f16lodClamp)
+            4784:6(float16_t) Load 137(f16bias)
+            4785:  7(f16vec4) ImageSampleImplicitLod 4781 4782 Bias ConstOffset MinLod 4784 722 4783
+            4786:  7(f16vec4) Load 4684(texel)
+            4787:  7(f16vec4) FAdd 4786 4785
+                              Store 4684(texel) 4787
+            4788:         316 Load 318(s1DArrayShadow)
+            4789:  167(fvec3) Load 169(c3)
+            4790:   52(float) Load 4267(lodClamp)
+            4791:   52(float) CompositeExtract 4789 2
+            4792:6(float16_t) ImageSampleDrefImplicitLod 4788 4789 4791 ConstOffset MinLod 709 4790
+            4793:    208(ptr) AccessChain 4684(texel) 207
             4794:6(float16_t) Load 4793
             4795:6(float16_t) FAdd 4794 4792
-            4796:    208(ptr) AccessChain 4674(texel) 207
+            4796:    208(ptr) AccessChain 4684(texel) 207
                               Store 4796 4795
-            4797:         337 Load 339(s2DArrayShadow)
-            4798:  249(fvec4) Load 251(c4)
-            4799:   52(float) Load 4257(lodClamp)
-            4800:   52(float) CompositeExtract 4798 3
-            4801:6(float16_t) ImageSampleDrefImplicitLod 4797 4798 4800 ConstOffset MinLod 722 4799
-            4802:    208(ptr) AccessChain 4674(texel) 207
-            4803:6(float16_t) Load 4802
-            4804:6(float16_t) FAdd 4803 4801
-            4805:    208(ptr) AccessChain 4674(texel) 207
-                              Store 4805 4804
-            4806:         337 Load 339(s2DArrayShadow)
-            4807:175(f16vec3) Load 177(f16c3)
-            4808:   52(float) Load 215(compare)
-            4809:6(float16_t) Load 4264(f16lodClamp)
-            4810:6(float16_t) ImageSampleDrefImplicitLod 4806 4807 4808 ConstOffset MinLod 722 4809
-            4811:    208(ptr) AccessChain 4674(texel) 207
-            4812:6(float16_t) Load 4811
-            4813:6(float16_t) FAdd 4812 4810
-            4814:    208(ptr) AccessChain 4674(texel) 207
-                              Store 4814 4813
-            4815:  7(f16vec4) Load 4674(texel)
-                              ReturnValue 4815
+            4797:         316 Load 318(s1DArrayShadow)
+            4798:154(f16vec2) Load 156(f16c2)
+            4799:   52(float) Load 215(compare)
+            4800:6(float16_t) Load 4274(f16lodClamp)
+            4801:6(float16_t) Load 137(f16bias)
+            4802:6(float16_t) ImageSampleDrefImplicitLod 4797 4798 4799 Bias ConstOffset MinLod 4801 709 4800
+            4803:    208(ptr) AccessChain 4684(texel) 207
+            4804:6(float16_t) Load 4803
+            4805:6(float16_t) FAdd 4804 4802
+            4806:    208(ptr) AccessChain 4684(texel) 207
+                              Store 4806 4805
+            4807:         337 Load 339(s2DArrayShadow)
+            4808:  249(fvec4) Load 251(c4)
+            4809:   52(float) Load 4267(lodClamp)
+            4810:   52(float) CompositeExtract 4808 3
+            4811:6(float16_t) ImageSampleDrefImplicitLod 4807 4808 4810 ConstOffset MinLod 722 4809
+            4812:    208(ptr) AccessChain 4684(texel) 207
+            4813:6(float16_t) Load 4812
+            4814:6(float16_t) FAdd 4813 4811
+            4815:    208(ptr) AccessChain 4684(texel) 207
+                              Store 4815 4814
+            4816:         337 Load 339(s2DArrayShadow)
+            4817:175(f16vec3) Load 177(f16c3)
+            4818:   52(float) Load 215(compare)
+            4819:6(float16_t) Load 4274(f16lodClamp)
+            4820:6(float16_t) ImageSampleDrefImplicitLod 4816 4817 4818 ConstOffset MinLod 722 4819
+            4821:    208(ptr) AccessChain 4684(texel) 207
+            4822:6(float16_t) Load 4821
+            4823:6(float16_t) FAdd 4822 4820
+            4824:    208(ptr) AccessChain 4684(texel) 207
+                              Store 4824 4823
+            4825:  7(f16vec4) Load 4684(texel)
+                              ReturnValue 4825
                               FunctionEnd
 107(testSparseTextureGradClamp():  7(f16vec4) Function None 8
              108:             Label
-     4818(texel):     64(ptr) Variable Function
-                              Store 4818(texel) 121
-            4819:         143 Load 145(s2D)
-            4820:   53(fvec2) Load 148(c2)
-            4821:   53(fvec2) Load 1409(dPdxy2)
-            4822:   53(fvec2) Load 1409(dPdxy2)
-            4823:   52(float) Load 4257(lodClamp)
-            4824:3102(ResType) ImageSparseSampleExplicitLod 4819 4820 Grad MinLod 4821 4822 4823
-            4825:  7(f16vec4) CompositeExtract 4824 1
-                              Store 4818(texel) 4825
-            4826:     47(int) CompositeExtract 4824 0
-            4827:         143 Load 145(s2D)
-            4828:154(f16vec2) Load 156(f16c2)
-            4829:154(f16vec2) Load 1417(f16dPdxy2)
-            4830:154(f16vec2) Load 1417(f16dPdxy2)
-            4831:6(float16_t) Load 4264(f16lodClamp)
-            4832:3102(ResType) ImageSparseSampleExplicitLod 4827 4828 Grad MinLod 4829 4830 4831
-            4833:  7(f16vec4) CompositeExtract 4832 1
-                              Store 4818(texel) 4833
-            4834:     47(int) CompositeExtract 4832 0
-            4835:         163 Load 165(s3D)
-            4836:  167(fvec3) Load 169(c3)
-            4837:  167(fvec3) Load 1425(dPdxy3)
-            4838:  167(fvec3) Load 1425(dPdxy3)
-            4839:   52(float) Load 4257(lodClamp)
-            4840:3102(ResType) ImageSparseSampleExplicitLod 4835 4836 Grad MinLod 4837 4838 4839
-            4841:  7(f16vec4) CompositeExtract 4840 1
-                              Store 4818(texel) 4841
-            4842:     47(int) CompositeExtract 4840 0
-            4843:         163 Load 165(s3D)
-            4844:175(f16vec3) Load 177(f16c3)
-            4845:175(f16vec3) Load 1433(f16dPdxy3)
-            4846:175(f16vec3) Load 1433(f16dPdxy3)
-            4847:6(float16_t) Load 4264(f16lodClamp)
-            4848:3102(ResType) ImageSparseSampleExplicitLod 4843 4844 Grad MinLod 4845 4846 4847
-            4849:  7(f16vec4) CompositeExtract 4848 1
-                              Store 4818(texel) 4849
-            4850:     47(int) CompositeExtract 4848 0
-            4851:         184 Load 186(sCube)
-            4852:  167(fvec3) Load 169(c3)
-            4853:  167(fvec3) Load 1425(dPdxy3)
-            4854:  167(fvec3) Load 1425(dPdxy3)
-            4855:   52(float) Load 4257(lodClamp)
-            4856:3102(ResType) ImageSparseSampleExplicitLod 4851 4852 Grad MinLod 4853 4854 4855
-            4857:  7(f16vec4) CompositeExtract 4856 1
-                              Store 4818(texel) 4857
-            4858:     47(int) CompositeExtract 4856 0
-            4859:         184 Load 186(sCube)
-            4860:175(f16vec3) Load 177(f16c3)
-            4861:175(f16vec3) Load 1433(f16dPdxy3)
-            4862:175(f16vec3) Load 1433(f16dPdxy3)
-            4863:6(float16_t) Load 4264(f16lodClamp)
-            4864:3102(ResType) ImageSparseSampleExplicitLod 4859 4860 Grad MinLod 4861 4862 4863
-            4865:  7(f16vec4) CompositeExtract 4864 1
-                              Store 4818(texel) 4865
-            4866:     47(int) CompositeExtract 4864 0
-            4867:         224 Load 226(s2DShadow)
-            4868:  167(fvec3) Load 169(c3)
-            4869:   53(fvec2) Load 1409(dPdxy2)
-            4870:   53(fvec2) Load 1409(dPdxy2)
-            4871:   52(float) Load 4257(lodClamp)
-            4872:    208(ptr) AccessChain 4818(texel) 207
-            4873:   52(float) CompositeExtract 4868 2
-            4874:3138(ResType) ImageSparseSampleDrefExplicitLod 4867 4868 4873 Grad MinLod 4869 4870 4871
-            4875:6(float16_t) CompositeExtract 4874 1
-                              Store 4872 4875
+     4828(texel):     64(ptr) Variable Function
+                              Store 4828(texel) 121
+            4829:         143 Load 145(s2D)
+            4830:   53(fvec2) Load 148(c2)
+            4831:   53(fvec2) Load 1409(dPdxy2)
+            4832:   53(fvec2) Load 1409(dPdxy2)
+            4833:   52(float) Load 4267(lodClamp)
+            4834:3102(ResType) ImageSparseSampleExplicitLod 4829 4830 Grad MinLod 4831 4832 4833
+            4835:  7(f16vec4) CompositeExtract 4834 1
+                              Store 4828(texel) 4835
+            4836:     47(int) CompositeExtract 4834 0
+            4837:         143 Load 145(s2D)
+            4838:154(f16vec2) Load 156(f16c2)
+            4839:154(f16vec2) Load 1417(f16dPdxy2)
+            4840:154(f16vec2) Load 1417(f16dPdxy2)
+            4841:6(float16_t) Load 4274(f16lodClamp)
+            4842:3102(ResType) ImageSparseSampleExplicitLod 4837 4838 Grad MinLod 4839 4840 4841
+            4843:  7(f16vec4) CompositeExtract 4842 1
+                              Store 4828(texel) 4843
+            4844:     47(int) CompositeExtract 4842 0
+            4845:         163 Load 165(s3D)
+            4846:  167(fvec3) Load 169(c3)
+            4847:  167(fvec3) Load 1425(dPdxy3)
+            4848:  167(fvec3) Load 1425(dPdxy3)
+            4849:   52(float) Load 4267(lodClamp)
+            4850:3102(ResType) ImageSparseSampleExplicitLod 4845 4846 Grad MinLod 4847 4848 4849
+            4851:  7(f16vec4) CompositeExtract 4850 1
+                              Store 4828(texel) 4851
+            4852:     47(int) CompositeExtract 4850 0
+            4853:         163 Load 165(s3D)
+            4854:175(f16vec3) Load 177(f16c3)
+            4855:175(f16vec3) Load 1433(f16dPdxy3)
+            4856:175(f16vec3) Load 1433(f16dPdxy3)
+            4857:6(float16_t) Load 4274(f16lodClamp)
+            4858:3102(ResType) ImageSparseSampleExplicitLod 4853 4854 Grad MinLod 4855 4856 4857
+            4859:  7(f16vec4) CompositeExtract 4858 1
+                              Store 4828(texel) 4859
+            4860:     47(int) CompositeExtract 4858 0
+            4861:         184 Load 186(sCube)
+            4862:  167(fvec3) Load 169(c3)
+            4863:  167(fvec3) Load 1425(dPdxy3)
+            4864:  167(fvec3) Load 1425(dPdxy3)
+            4865:   52(float) Load 4267(lodClamp)
+            4866:3102(ResType) ImageSparseSampleExplicitLod 4861 4862 Grad MinLod 4863 4864 4865
+            4867:  7(f16vec4) CompositeExtract 4866 1
+                              Store 4828(texel) 4867
+            4868:     47(int) CompositeExtract 4866 0
+            4869:         184 Load 186(sCube)
+            4870:175(f16vec3) Load 177(f16c3)
+            4871:175(f16vec3) Load 1433(f16dPdxy3)
+            4872:175(f16vec3) Load 1433(f16dPdxy3)
+            4873:6(float16_t) Load 4274(f16lodClamp)
+            4874:3102(ResType) ImageSparseSampleExplicitLod 4869 4870 Grad MinLod 4871 4872 4873
+            4875:  7(f16vec4) CompositeExtract 4874 1
+                              Store 4828(texel) 4875
             4876:     47(int) CompositeExtract 4874 0
             4877:         224 Load 226(s2DShadow)
-            4878:154(f16vec2) Load 156(f16c2)
-            4879:   52(float) Load 215(compare)
-            4880:154(f16vec2) Load 1417(f16dPdxy2)
-            4881:154(f16vec2) Load 1417(f16dPdxy2)
-            4882:6(float16_t) Load 4264(f16lodClamp)
-            4883:    208(ptr) AccessChain 4818(texel) 207
-            4884:3138(ResType) ImageSparseSampleDrefExplicitLod 4877 4878 4879 Grad MinLod 4880 4881 4882
+            4878:  167(fvec3) Load 169(c3)
+            4879:   53(fvec2) Load 1409(dPdxy2)
+            4880:   53(fvec2) Load 1409(dPdxy2)
+            4881:   52(float) Load 4267(lodClamp)
+            4882:    208(ptr) AccessChain 4828(texel) 207
+            4883:   52(float) CompositeExtract 4878 2
+            4884:3138(ResType) ImageSparseSampleDrefExplicitLod 4877 4878 4883 Grad MinLod 4879 4880 4881
             4885:6(float16_t) CompositeExtract 4884 1
-                              Store 4883 4885
+                              Store 4882 4885
             4886:     47(int) CompositeExtract 4884 0
-            4887:         245 Load 247(sCubeShadow)
-            4888:  249(fvec4) Load 251(c4)
-            4889:  167(fvec3) Load 1425(dPdxy3)
-            4890:  167(fvec3) Load 1425(dPdxy3)
-            4891:   52(float) Load 4257(lodClamp)
-            4892:    208(ptr) AccessChain 4818(texel) 207
-            4893:   52(float) CompositeExtract 4888 3
-            4894:3138(ResType) ImageSparseSampleDrefExplicitLod 4887 4888 4893 Grad MinLod 4889 4890 4891
+            4887:         224 Load 226(s2DShadow)
+            4888:154(f16vec2) Load 156(f16c2)
+            4889:   52(float) Load 215(compare)
+            4890:154(f16vec2) Load 1417(f16dPdxy2)
+            4891:154(f16vec2) Load 1417(f16dPdxy2)
+            4892:6(float16_t) Load 4274(f16lodClamp)
+            4893:    208(ptr) AccessChain 4828(texel) 207
+            4894:3138(ResType) ImageSparseSampleDrefExplicitLod 4887 4888 4889 Grad MinLod 4890 4891 4892
             4895:6(float16_t) CompositeExtract 4894 1
-                              Store 4892 4895
+                              Store 4893 4895
             4896:     47(int) CompositeExtract 4894 0
             4897:         245 Load 247(sCubeShadow)
-            4898:175(f16vec3) Load 177(f16c3)
-            4899:   52(float) Load 215(compare)
-            4900:175(f16vec3) Load 1433(f16dPdxy3)
-            4901:175(f16vec3) Load 1433(f16dPdxy3)
-            4902:6(float16_t) Load 4264(f16lodClamp)
-            4903:    208(ptr) AccessChain 4818(texel) 207
-            4904:3138(ResType) ImageSparseSampleDrefExplicitLod 4897 4898 4899 Grad MinLod 4900 4901 4902
+            4898:  249(fvec4) Load 251(c4)
+            4899:  167(fvec3) Load 1425(dPdxy3)
+            4900:  167(fvec3) Load 1425(dPdxy3)
+            4901:   52(float) Load 4267(lodClamp)
+            4902:    208(ptr) AccessChain 4828(texel) 207
+            4903:   52(float) CompositeExtract 4898 3
+            4904:3138(ResType) ImageSparseSampleDrefExplicitLod 4897 4898 4903 Grad MinLod 4899 4900 4901
             4905:6(float16_t) CompositeExtract 4904 1
-                              Store 4903 4905
+                              Store 4902 4905
             4906:     47(int) CompositeExtract 4904 0
-            4907:         284 Load 286(s2DArray)
-            4908:  167(fvec3) Load 169(c3)
-            4909:   53(fvec2) Load 1409(dPdxy2)
-            4910:   53(fvec2) Load 1409(dPdxy2)
-            4911:   52(float) Load 4257(lodClamp)
-            4912:3102(ResType) ImageSparseSampleExplicitLod 4907 4908 Grad MinLod 4909 4910 4911
-            4913:  7(f16vec4) CompositeExtract 4912 1
-                              Store 4818(texel) 4913
-            4914:     47(int) CompositeExtract 4912 0
-            4915:         284 Load 286(s2DArray)
-            4916:175(f16vec3) Load 177(f16c3)
-            4917:154(f16vec2) Load 1417(f16dPdxy2)
-            4918:154(f16vec2) Load 1417(f16dPdxy2)
-            4919:6(float16_t) Load 4264(f16lodClamp)
-            4920:3102(ResType) ImageSparseSampleExplicitLod 4915 4916 Grad MinLod 4917 4918 4919
-            4921:  7(f16vec4) CompositeExtract 4920 1
-                              Store 4818(texel) 4921
-            4922:     47(int) CompositeExtract 4920 0
-            4923:         337 Load 339(s2DArrayShadow)
-            4924:  249(fvec4) Load 251(c4)
-            4925:   53(fvec2) Load 1409(dPdxy2)
-            4926:   53(fvec2) Load 1409(dPdxy2)
-            4927:   52(float) Load 4257(lodClamp)
-            4928:    208(ptr) AccessChain 4818(texel) 207
-            4929:   52(float) CompositeExtract 4924 3
-            4930:3138(ResType) ImageSparseSampleDrefExplicitLod 4923 4924 4929 Grad MinLod 4925 4926 4927
-            4931:6(float16_t) CompositeExtract 4930 1
-                              Store 4928 4931
+            4907:         245 Load 247(sCubeShadow)
+            4908:175(f16vec3) Load 177(f16c3)
+            4909:   52(float) Load 215(compare)
+            4910:175(f16vec3) Load 1433(f16dPdxy3)
+            4911:175(f16vec3) Load 1433(f16dPdxy3)
+            4912:6(float16_t) Load 4274(f16lodClamp)
+            4913:    208(ptr) AccessChain 4828(texel) 207
+            4914:3138(ResType) ImageSparseSampleDrefExplicitLod 4907 4908 4909 Grad MinLod 4910 4911 4912
+            4915:6(float16_t) CompositeExtract 4914 1
+                              Store 4913 4915
+            4916:     47(int) CompositeExtract 4914 0
+            4917:         284 Load 286(s2DArray)
+            4918:  167(fvec3) Load 169(c3)
+            4919:   53(fvec2) Load 1409(dPdxy2)
+            4920:   53(fvec2) Load 1409(dPdxy2)
+            4921:   52(float) Load 4267(lodClamp)
+            4922:3102(ResType) ImageSparseSampleExplicitLod 4917 4918 Grad MinLod 4919 4920 4921
+            4923:  7(f16vec4) CompositeExtract 4922 1
+                              Store 4828(texel) 4923
+            4924:     47(int) CompositeExtract 4922 0
+            4925:         284 Load 286(s2DArray)
+            4926:175(f16vec3) Load 177(f16c3)
+            4927:154(f16vec2) Load 1417(f16dPdxy2)
+            4928:154(f16vec2) Load 1417(f16dPdxy2)
+            4929:6(float16_t) Load 4274(f16lodClamp)
+            4930:3102(ResType) ImageSparseSampleExplicitLod 4925 4926 Grad MinLod 4927 4928 4929
+            4931:  7(f16vec4) CompositeExtract 4930 1
+                              Store 4828(texel) 4931
             4932:     47(int) CompositeExtract 4930 0
             4933:         337 Load 339(s2DArrayShadow)
-            4934:175(f16vec3) Load 177(f16c3)
-            4935:   52(float) Load 215(compare)
-            4936:154(f16vec2) Load 1417(f16dPdxy2)
-            4937:154(f16vec2) Load 1417(f16dPdxy2)
-            4938:6(float16_t) Load 4264(f16lodClamp)
-            4939:    208(ptr) AccessChain 4818(texel) 207
-            4940:3138(ResType) ImageSparseSampleDrefExplicitLod 4933 4934 4935 Grad MinLod 4936 4937 4938
+            4934:  249(fvec4) Load 251(c4)
+            4935:   53(fvec2) Load 1409(dPdxy2)
+            4936:   53(fvec2) Load 1409(dPdxy2)
+            4937:   52(float) Load 4267(lodClamp)
+            4938:    208(ptr) AccessChain 4828(texel) 207
+            4939:   52(float) CompositeExtract 4934 3
+            4940:3138(ResType) ImageSparseSampleDrefExplicitLod 4933 4934 4939 Grad MinLod 4935 4936 4937
             4941:6(float16_t) CompositeExtract 4940 1
-                              Store 4939 4941
+                              Store 4938 4941
             4942:     47(int) CompositeExtract 4940 0
-            4943:         299 Load 301(sCubeArray)
-            4944:  249(fvec4) Load 251(c4)
-            4945:  167(fvec3) Load 1425(dPdxy3)
-            4946:  167(fvec3) Load 1425(dPdxy3)
-            4947:   52(float) Load 4257(lodClamp)
-            4948:3102(ResType) ImageSparseSampleExplicitLod 4943 4944 Grad MinLod 4945 4946 4947
-            4949:  7(f16vec4) CompositeExtract 4948 1
-                              Store 4818(texel) 4949
-            4950:     47(int) CompositeExtract 4948 0
-            4951:         299 Load 301(sCubeArray)
-            4952:  7(f16vec4) Load 309(f16c4)
-            4953:175(f16vec3) Load 1433(f16dPdxy3)
-            4954:175(f16vec3) Load 1433(f16dPdxy3)
-            4955:6(float16_t) Load 4264(f16lodClamp)
-            4956:3102(ResType) ImageSparseSampleExplicitLod 4951 4952 Grad MinLod 4953 4954 4955
-            4957:  7(f16vec4) CompositeExtract 4956 1
-                              Store 4818(texel) 4957
-            4958:     47(int) CompositeExtract 4956 0
-            4959:  7(f16vec4) Load 4818(texel)
-                              ReturnValue 4959
+            4943:         337 Load 339(s2DArrayShadow)
+            4944:175(f16vec3) Load 177(f16c3)
+            4945:   52(float) Load 215(compare)
+            4946:154(f16vec2) Load 1417(f16dPdxy2)
+            4947:154(f16vec2) Load 1417(f16dPdxy2)
+            4948:6(float16_t) Load 4274(f16lodClamp)
+            4949:    208(ptr) AccessChain 4828(texel) 207
+            4950:3138(ResType) ImageSparseSampleDrefExplicitLod 4943 4944 4945 Grad MinLod 4946 4947 4948
+            4951:6(float16_t) CompositeExtract 4950 1
+                              Store 4949 4951
+            4952:     47(int) CompositeExtract 4950 0
+            4953:         299 Load 301(sCubeArray)
+            4954:  249(fvec4) Load 251(c4)
+            4955:  167(fvec3) Load 1425(dPdxy3)
+            4956:  167(fvec3) Load 1425(dPdxy3)
+            4957:   52(float) Load 4267(lodClamp)
+            4958:3102(ResType) ImageSparseSampleExplicitLod 4953 4954 Grad MinLod 4955 4956 4957
+            4959:  7(f16vec4) CompositeExtract 4958 1
+                              Store 4828(texel) 4959
+            4960:     47(int) CompositeExtract 4958 0
+            4961:         299 Load 301(sCubeArray)
+            4962:  7(f16vec4) Load 309(f16c4)
+            4963:175(f16vec3) Load 1433(f16dPdxy3)
+            4964:175(f16vec3) Load 1433(f16dPdxy3)
+            4965:6(float16_t) Load 4274(f16lodClamp)
+            4966:3102(ResType) ImageSparseSampleExplicitLod 4961 4962 Grad MinLod 4963 4964 4965
+            4967:  7(f16vec4) CompositeExtract 4966 1
+                              Store 4828(texel) 4967
+            4968:     47(int) CompositeExtract 4966 0
+            4969:  7(f16vec4) Load 4828(texel)
+                              ReturnValue 4969
                               FunctionEnd
 109(testTextureGradClamp():  7(f16vec4) Function None 8
              110:             Label
-     4962(texel):     64(ptr) Variable Function
-                              Store 4962(texel) 121
-            4963:         123 Load 125(s1D)
-            4964:   52(float) Load 128(c1)
-            4965:   52(float) Load 1393(dPdxy1)
-            4966:   52(float) Load 1393(dPdxy1)
-            4967:   52(float) Load 4257(lodClamp)
-            4968:  7(f16vec4) ImageSampleExplicitLod 4963 4964 Grad MinLod 4965 4966 4967
-            4969:  7(f16vec4) Load 4962(texel)
-            4970:  7(f16vec4) FAdd 4969 4968
-                              Store 4962(texel) 4970
-            4971:         123 Load 125(s1D)
-            4972:6(float16_t) Load 135(f16c1)
-            4973:6(float16_t) Load 1401(f16dPdxy1)
-            4974:6(float16_t) Load 1401(f16dPdxy1)
-            4975:6(float16_t) Load 4264(f16lodClamp)
-            4976:  7(f16vec4) ImageSampleExplicitLod 4971 4972 Grad MinLod 4973 4974 4975
-            4977:  7(f16vec4) Load 4962(texel)
-            4978:  7(f16vec4) FAdd 4977 4976
-                              Store 4962(texel) 4978
-            4979:         143 Load 145(s2D)
-            4980:   53(fvec2) Load 148(c2)
-            4981:   53(fvec2) Load 1409(dPdxy2)
-            4982:   53(fvec2) Load 1409(dPdxy2)
-            4983:   52(float) Load 4257(lodClamp)
-            4984:  7(f16vec4) ImageSampleExplicitLod 4979 4980 Grad MinLod 4981 4982 4983
-            4985:  7(f16vec4) Load 4962(texel)
-            4986:  7(f16vec4) FAdd 4985 4984
-                              Store 4962(texel) 4986
-            4987:         143 Load 145(s2D)
-            4988:154(f16vec2) Load 156(f16c2)
-            4989:154(f16vec2) Load 1417(f16dPdxy2)
-            4990:154(f16vec2) Load 1417(f16dPdxy2)
-            4991:6(float16_t) Load 4264(f16lodClamp)
-            4992:  7(f16vec4) ImageSampleExplicitLod 4987 4988 Grad MinLod 4989 4990 4991
-            4993:  7(f16vec4) Load 4962(texel)
-            4994:  7(f16vec4) FAdd 4993 4992
-                              Store 4962(texel) 4994
-            4995:         163 Load 165(s3D)
-            4996:  167(fvec3) Load 169(c3)
-            4997:  167(fvec3) Load 1425(dPdxy3)
-            4998:  167(fvec3) Load 1425(dPdxy3)
-            4999:   52(float) Load 4257(lodClamp)
-            5000:  7(f16vec4) ImageSampleExplicitLod 4995 4996 Grad MinLod 4997 4998 4999
-            5001:  7(f16vec4) Load 4962(texel)
-            5002:  7(f16vec4) FAdd 5001 5000
-                              Store 4962(texel) 5002
-            5003:         163 Load 165(s3D)
-            5004:175(f16vec3) Load 177(f16c3)
-            5005:175(f16vec3) Load 1433(f16dPdxy3)
-            5006:175(f16vec3) Load 1433(f16dPdxy3)
-            5007:6(float16_t) Load 4264(f16lodClamp)
-            5008:  7(f16vec4) ImageSampleExplicitLod 5003 5004 Grad MinLod 5005 5006 5007
-            5009:  7(f16vec4) Load 4962(texel)
-            5010:  7(f16vec4) FAdd 5009 5008
-                              Store 4962(texel) 5010
-            5011:         184 Load 186(sCube)
-            5012:  167(fvec3) Load 169(c3)
-            5013:  167(fvec3) Load 1425(dPdxy3)
-            5014:  167(fvec3) Load 1425(dPdxy3)
-            5015:   52(float) Load 4257(lodClamp)
-            5016:  7(f16vec4) ImageSampleExplicitLod 5011 5012 Grad MinLod 5013 5014 5015
-            5017:  7(f16vec4) Load 4962(texel)
-            5018:  7(f16vec4) FAdd 5017 5016
-                              Store 4962(texel) 5018
-            5019:         184 Load 186(sCube)
-            5020:175(f16vec3) Load 177(f16c3)
-            5021:175(f16vec3) Load 1433(f16dPdxy3)
-            5022:175(f16vec3) Load 1433(f16dPdxy3)
-            5023:6(float16_t) Load 4264(f16lodClamp)
-            5024:  7(f16vec4) ImageSampleExplicitLod 5019 5020 Grad MinLod 5021 5022 5023
-            5025:  7(f16vec4) Load 4962(texel)
-            5026:  7(f16vec4) FAdd 5025 5024
-                              Store 4962(texel) 5026
-            5027:         199 Load 201(s1DShadow)
-            5028:  167(fvec3) Load 169(c3)
-            5029:   52(float) Load 1393(dPdxy1)
-            5030:   52(float) Load 1393(dPdxy1)
-            5031:   52(float) Load 4257(lodClamp)
-            5032:   52(float) CompositeExtract 5028 2
-            5033:6(float16_t) ImageSampleDrefExplicitLod 5027 5028 5032 Grad MinLod 5029 5030 5031
-            5034:    208(ptr) AccessChain 4962(texel) 207
-            5035:6(float16_t) Load 5034
-            5036:6(float16_t) FAdd 5035 5033
-            5037:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5037 5036
-            5038:         199 Load 201(s1DShadow)
-            5039:154(f16vec2) Load 156(f16c2)
-            5040:   52(float) Load 215(compare)
-            5041:6(float16_t) Load 1401(f16dPdxy1)
-            5042:6(float16_t) Load 1401(f16dPdxy1)
-            5043:6(float16_t) Load 4264(f16lodClamp)
-            5044:6(float16_t) ImageSampleDrefExplicitLod 5038 5039 5040 Grad MinLod 5041 5042 5043
-            5045:    208(ptr) AccessChain 4962(texel) 207
-            5046:6(float16_t) Load 5045
-            5047:6(float16_t) FAdd 5046 5044
-            5048:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5048 5047
-            5049:         224 Load 226(s2DShadow)
-            5050:  167(fvec3) Load 169(c3)
-            5051:   53(fvec2) Load 1409(dPdxy2)
-            5052:   53(fvec2) Load 1409(dPdxy2)
-            5053:   52(float) Load 4257(lodClamp)
-            5054:   52(float) CompositeExtract 5050 2
-            5055:6(float16_t) ImageSampleDrefExplicitLod 5049 5050 5054 Grad MinLod 5051 5052 5053
-            5056:    208(ptr) AccessChain 4962(texel) 207
-            5057:6(float16_t) Load 5056
-            5058:6(float16_t) FAdd 5057 5055
-            5059:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5059 5058
-            5060:         224 Load 226(s2DShadow)
-            5061:154(f16vec2) Load 156(f16c2)
-            5062:   52(float) Load 215(compare)
-            5063:154(f16vec2) Load 1417(f16dPdxy2)
-            5064:154(f16vec2) Load 1417(f16dPdxy2)
-            5065:6(float16_t) Load 4264(f16lodClamp)
-            5066:6(float16_t) ImageSampleDrefExplicitLod 5060 5061 5062 Grad MinLod 5063 5064 5065
-            5067:    208(ptr) AccessChain 4962(texel) 207
-            5068:6(float16_t) Load 5067
-            5069:6(float16_t) FAdd 5068 5066
-            5070:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5070 5069
-            5071:         245 Load 247(sCubeShadow)
-            5072:  249(fvec4) Load 251(c4)
-            5073:  167(fvec3) Load 1425(dPdxy3)
-            5074:  167(fvec3) Load 1425(dPdxy3)
-            5075:   52(float) Load 4257(lodClamp)
-            5076:   52(float) CompositeExtract 5072 3
-            5077:6(float16_t) ImageSampleDrefExplicitLod 5071 5072 5076 Grad MinLod 5073 5074 5075
-            5078:    208(ptr) AccessChain 4962(texel) 207
-            5079:6(float16_t) Load 5078
-            5080:6(float16_t) FAdd 5079 5077
-            5081:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5081 5080
-            5082:         245 Load 247(sCubeShadow)
-            5083:175(f16vec3) Load 177(f16c3)
-            5084:   52(float) Load 215(compare)
-            5085:175(f16vec3) Load 1433(f16dPdxy3)
-            5086:175(f16vec3) Load 1433(f16dPdxy3)
-            5087:6(float16_t) Load 4264(f16lodClamp)
-            5088:6(float16_t) ImageSampleDrefExplicitLod 5082 5083 5084 Grad MinLod 5085 5086 5087
-            5089:    208(ptr) AccessChain 4962(texel) 207
-            5090:6(float16_t) Load 5089
-            5091:6(float16_t) FAdd 5090 5088
-            5092:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5092 5091
-            5093:         269 Load 271(s1DArray)
-            5094:   53(fvec2) Load 148(c2)
-            5095:   52(float) Load 1393(dPdxy1)
-            5096:   52(float) Load 1393(dPdxy1)
-            5097:   52(float) Load 4257(lodClamp)
-            5098:  7(f16vec4) ImageSampleExplicitLod 5093 5094 Grad MinLod 5095 5096 5097
-            5099:  7(f16vec4) Load 4962(texel)
-            5100:  7(f16vec4) FAdd 5099 5098
-                              Store 4962(texel) 5100
-            5101:         269 Load 271(s1DArray)
-            5102:154(f16vec2) Load 156(f16c2)
-            5103:6(float16_t) Load 1401(f16dPdxy1)
-            5104:6(float16_t) Load 1401(f16dPdxy1)
-            5105:6(float16_t) Load 4264(f16lodClamp)
-            5106:  7(f16vec4) ImageSampleExplicitLod 5101 5102 Grad MinLod 5103 5104 5105
-            5107:  7(f16vec4) Load 4962(texel)
-            5108:  7(f16vec4) FAdd 5107 5106
-                              Store 4962(texel) 5108
-            5109:         284 Load 286(s2DArray)
-            5110:  167(fvec3) Load 169(c3)
-            5111:   53(fvec2) Load 1409(dPdxy2)
-            5112:   53(fvec2) Load 1409(dPdxy2)
-            5113:   52(float) Load 4257(lodClamp)
-            5114:  7(f16vec4) ImageSampleExplicitLod 5109 5110 Grad MinLod 5111 5112 5113
-            5115:  7(f16vec4) Load 4962(texel)
-            5116:  7(f16vec4) FAdd 5115 5114
-                              Store 4962(texel) 5116
-            5117:         284 Load 286(s2DArray)
-            5118:175(f16vec3) Load 177(f16c3)
-            5119:154(f16vec2) Load 1417(f16dPdxy2)
-            5120:154(f16vec2) Load 1417(f16dPdxy2)
-            5121:6(float16_t) Load 4264(f16lodClamp)
-            5122:  7(f16vec4) ImageSampleExplicitLod 5117 5118 Grad MinLod 5119 5120 5121
-            5123:  7(f16vec4) Load 4962(texel)
-            5124:  7(f16vec4) FAdd 5123 5122
-                              Store 4962(texel) 5124
-            5125:         316 Load 318(s1DArrayShadow)
-            5126:  167(fvec3) Load 169(c3)
-            5127:   52(float) Load 1393(dPdxy1)
-            5128:   52(float) Load 1393(dPdxy1)
-            5129:   52(float) Load 4257(lodClamp)
-            5130:   52(float) CompositeExtract 5126 2
-            5131:6(float16_t) ImageSampleDrefExplicitLod 5125 5126 5130 Grad MinLod 5127 5128 5129
-            5132:    208(ptr) AccessChain 4962(texel) 207
-            5133:6(float16_t) Load 5132
-            5134:6(float16_t) FAdd 5133 5131
-            5135:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5135 5134
-            5136:         316 Load 318(s1DArrayShadow)
-            5137:154(f16vec2) Load 156(f16c2)
-            5138:   52(float) Load 215(compare)
-            5139:6(float16_t) Load 1401(f16dPdxy1)
-            5140:6(float16_t) Load 1401(f16dPdxy1)
-            5141:6(float16_t) Load 4264(f16lodClamp)
-            5142:6(float16_t) ImageSampleDrefExplicitLod 5136 5137 5138 Grad MinLod 5139 5140 5141
-            5143:    208(ptr) AccessChain 4962(texel) 207
-            5144:6(float16_t) Load 5143
-            5145:6(float16_t) FAdd 5144 5142
-            5146:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5146 5145
-            5147:         337 Load 339(s2DArrayShadow)
-            5148:  249(fvec4) Load 251(c4)
-            5149:   53(fvec2) Load 1409(dPdxy2)
-            5150:   53(fvec2) Load 1409(dPdxy2)
-            5151:   52(float) Load 4257(lodClamp)
-            5152:   52(float) CompositeExtract 5148 3
-            5153:6(float16_t) ImageSampleDrefExplicitLod 5147 5148 5152 Grad MinLod 5149 5150 5151
-            5154:    208(ptr) AccessChain 4962(texel) 207
-            5155:6(float16_t) Load 5154
-            5156:6(float16_t) FAdd 5155 5153
-            5157:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5157 5156
-            5158:         337 Load 339(s2DArrayShadow)
-            5159:175(f16vec3) Load 177(f16c3)
-            5160:   52(float) Load 215(compare)
-            5161:154(f16vec2) Load 1417(f16dPdxy2)
-            5162:154(f16vec2) Load 1417(f16dPdxy2)
-            5163:6(float16_t) Load 4264(f16lodClamp)
-            5164:6(float16_t) ImageSampleDrefExplicitLod 5158 5159 5160 Grad MinLod 5161 5162 5163
-            5165:    208(ptr) AccessChain 4962(texel) 207
-            5166:6(float16_t) Load 5165
-            5167:6(float16_t) FAdd 5166 5164
-            5168:    208(ptr) AccessChain 4962(texel) 207
-                              Store 5168 5167
-            5169:         299 Load 301(sCubeArray)
-            5170:  249(fvec4) Load 251(c4)
-            5171:  167(fvec3) Load 1425(dPdxy3)
-            5172:  167(fvec3) Load 1425(dPdxy3)
-            5173:   52(float) Load 4257(lodClamp)
-            5174:  7(f16vec4) ImageSampleExplicitLod 5169 5170 Grad MinLod 5171 5172 5173
-            5175:  7(f16vec4) Load 4962(texel)
-            5176:  7(f16vec4) FAdd 5175 5174
-                              Store 4962(texel) 5176
-            5177:         299 Load 301(sCubeArray)
-            5178:  7(f16vec4) Load 309(f16c4)
-            5179:175(f16vec3) Load 1433(f16dPdxy3)
-            5180:175(f16vec3) Load 1433(f16dPdxy3)
-            5181:6(float16_t) Load 4264(f16lodClamp)
-            5182:  7(f16vec4) ImageSampleExplicitLod 5177 5178 Grad MinLod 5179 5180 5181
-            5183:  7(f16vec4) Load 4962(texel)
-            5184:  7(f16vec4) FAdd 5183 5182
-                              Store 4962(texel) 5184
-            5185:  7(f16vec4) Load 4962(texel)
-                              ReturnValue 5185
+     4972(texel):     64(ptr) Variable Function
+                              Store 4972(texel) 121
+            4973:         123 Load 125(s1D)
+            4974:   52(float) Load 128(c1)
+            4975:   52(float) Load 1393(dPdxy1)
+            4976:   52(float) Load 1393(dPdxy1)
+            4977:   52(float) Load 4267(lodClamp)
+            4978:  7(f16vec4) ImageSampleExplicitLod 4973 4974 Grad MinLod 4975 4976 4977
+            4979:  7(f16vec4) Load 4972(texel)
+            4980:  7(f16vec4) FAdd 4979 4978
+                              Store 4972(texel) 4980
+            4981:         123 Load 125(s1D)
+            4982:6(float16_t) Load 135(f16c1)
+            4983:6(float16_t) Load 1401(f16dPdxy1)
+            4984:6(float16_t) Load 1401(f16dPdxy1)
+            4985:6(float16_t) Load 4274(f16lodClamp)
+            4986:  7(f16vec4) ImageSampleExplicitLod 4981 4982 Grad MinLod 4983 4984 4985
+            4987:  7(f16vec4) Load 4972(texel)
+            4988:  7(f16vec4) FAdd 4987 4986
+                              Store 4972(texel) 4988
+            4989:         143 Load 145(s2D)
+            4990:   53(fvec2) Load 148(c2)
+            4991:   53(fvec2) Load 1409(dPdxy2)
+            4992:   53(fvec2) Load 1409(dPdxy2)
+            4993:   52(float) Load 4267(lodClamp)
+            4994:  7(f16vec4) ImageSampleExplicitLod 4989 4990 Grad MinLod 4991 4992 4993
+            4995:  7(f16vec4) Load 4972(texel)
+            4996:  7(f16vec4) FAdd 4995 4994
+                              Store 4972(texel) 4996
+            4997:         143 Load 145(s2D)
+            4998:154(f16vec2) Load 156(f16c2)
+            4999:154(f16vec2) Load 1417(f16dPdxy2)
+            5000:154(f16vec2) Load 1417(f16dPdxy2)
+            5001:6(float16_t) Load 4274(f16lodClamp)
+            5002:  7(f16vec4) ImageSampleExplicitLod 4997 4998 Grad MinLod 4999 5000 5001
+            5003:  7(f16vec4) Load 4972(texel)
+            5004:  7(f16vec4) FAdd 5003 5002
+                              Store 4972(texel) 5004
+            5005:         163 Load 165(s3D)
+            5006:  167(fvec3) Load 169(c3)
+            5007:  167(fvec3) Load 1425(dPdxy3)
+            5008:  167(fvec3) Load 1425(dPdxy3)
+            5009:   52(float) Load 4267(lodClamp)
+            5010:  7(f16vec4) ImageSampleExplicitLod 5005 5006 Grad MinLod 5007 5008 5009
+            5011:  7(f16vec4) Load 4972(texel)
+            5012:  7(f16vec4) FAdd 5011 5010
+                              Store 4972(texel) 5012
+            5013:         163 Load 165(s3D)
+            5014:175(f16vec3) Load 177(f16c3)
+            5015:175(f16vec3) Load 1433(f16dPdxy3)
+            5016:175(f16vec3) Load 1433(f16dPdxy3)
+            5017:6(float16_t) Load 4274(f16lodClamp)
+            5018:  7(f16vec4) ImageSampleExplicitLod 5013 5014 Grad MinLod 5015 5016 5017
+            5019:  7(f16vec4) Load 4972(texel)
+            5020:  7(f16vec4) FAdd 5019 5018
+                              Store 4972(texel) 5020
+            5021:         184 Load 186(sCube)
+            5022:  167(fvec3) Load 169(c3)
+            5023:  167(fvec3) Load 1425(dPdxy3)
+            5024:  167(fvec3) Load 1425(dPdxy3)
+            5025:   52(float) Load 4267(lodClamp)
+            5026:  7(f16vec4) ImageSampleExplicitLod 5021 5022 Grad MinLod 5023 5024 5025
+            5027:  7(f16vec4) Load 4972(texel)
+            5028:  7(f16vec4) FAdd 5027 5026
+                              Store 4972(texel) 5028
+            5029:         184 Load 186(sCube)
+            5030:175(f16vec3) Load 177(f16c3)
+            5031:175(f16vec3) Load 1433(f16dPdxy3)
+            5032:175(f16vec3) Load 1433(f16dPdxy3)
+            5033:6(float16_t) Load 4274(f16lodClamp)
+            5034:  7(f16vec4) ImageSampleExplicitLod 5029 5030 Grad MinLod 5031 5032 5033
+            5035:  7(f16vec4) Load 4972(texel)
+            5036:  7(f16vec4) FAdd 5035 5034
+                              Store 4972(texel) 5036
+            5037:         199 Load 201(s1DShadow)
+            5038:  167(fvec3) Load 169(c3)
+            5039:   52(float) Load 1393(dPdxy1)
+            5040:   52(float) Load 1393(dPdxy1)
+            5041:   52(float) Load 4267(lodClamp)
+            5042:   52(float) CompositeExtract 5038 2
+            5043:6(float16_t) ImageSampleDrefExplicitLod 5037 5038 5042 Grad MinLod 5039 5040 5041
+            5044:    208(ptr) AccessChain 4972(texel) 207
+            5045:6(float16_t) Load 5044
+            5046:6(float16_t) FAdd 5045 5043
+            5047:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5047 5046
+            5048:         199 Load 201(s1DShadow)
+            5049:154(f16vec2) Load 156(f16c2)
+            5050:   52(float) Load 215(compare)
+            5051:6(float16_t) Load 1401(f16dPdxy1)
+            5052:6(float16_t) Load 1401(f16dPdxy1)
+            5053:6(float16_t) Load 4274(f16lodClamp)
+            5054:6(float16_t) ImageSampleDrefExplicitLod 5048 5049 5050 Grad MinLod 5051 5052 5053
+            5055:    208(ptr) AccessChain 4972(texel) 207
+            5056:6(float16_t) Load 5055
+            5057:6(float16_t) FAdd 5056 5054
+            5058:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5058 5057
+            5059:         224 Load 226(s2DShadow)
+            5060:  167(fvec3) Load 169(c3)
+            5061:   53(fvec2) Load 1409(dPdxy2)
+            5062:   53(fvec2) Load 1409(dPdxy2)
+            5063:   52(float) Load 4267(lodClamp)
+            5064:   52(float) CompositeExtract 5060 2
+            5065:6(float16_t) ImageSampleDrefExplicitLod 5059 5060 5064 Grad MinLod 5061 5062 5063
+            5066:    208(ptr) AccessChain 4972(texel) 207
+            5067:6(float16_t) Load 5066
+            5068:6(float16_t) FAdd 5067 5065
+            5069:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5069 5068
+            5070:         224 Load 226(s2DShadow)
+            5071:154(f16vec2) Load 156(f16c2)
+            5072:   52(float) Load 215(compare)
+            5073:154(f16vec2) Load 1417(f16dPdxy2)
+            5074:154(f16vec2) Load 1417(f16dPdxy2)
+            5075:6(float16_t) Load 4274(f16lodClamp)
+            5076:6(float16_t) ImageSampleDrefExplicitLod 5070 5071 5072 Grad MinLod 5073 5074 5075
+            5077:    208(ptr) AccessChain 4972(texel) 207
+            5078:6(float16_t) Load 5077
+            5079:6(float16_t) FAdd 5078 5076
+            5080:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5080 5079
+            5081:         245 Load 247(sCubeShadow)
+            5082:  249(fvec4) Load 251(c4)
+            5083:  167(fvec3) Load 1425(dPdxy3)
+            5084:  167(fvec3) Load 1425(dPdxy3)
+            5085:   52(float) Load 4267(lodClamp)
+            5086:   52(float) CompositeExtract 5082 3
+            5087:6(float16_t) ImageSampleDrefExplicitLod 5081 5082 5086 Grad MinLod 5083 5084 5085
+            5088:    208(ptr) AccessChain 4972(texel) 207
+            5089:6(float16_t) Load 5088
+            5090:6(float16_t) FAdd 5089 5087
+            5091:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5091 5090
+            5092:         245 Load 247(sCubeShadow)
+            5093:175(f16vec3) Load 177(f16c3)
+            5094:   52(float) Load 215(compare)
+            5095:175(f16vec3) Load 1433(f16dPdxy3)
+            5096:175(f16vec3) Load 1433(f16dPdxy3)
+            5097:6(float16_t) Load 4274(f16lodClamp)
+            5098:6(float16_t) ImageSampleDrefExplicitLod 5092 5093 5094 Grad MinLod 5095 5096 5097
+            5099:    208(ptr) AccessChain 4972(texel) 207
+            5100:6(float16_t) Load 5099
+            5101:6(float16_t) FAdd 5100 5098
+            5102:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5102 5101
+            5103:         269 Load 271(s1DArray)
+            5104:   53(fvec2) Load 148(c2)
+            5105:   52(float) Load 1393(dPdxy1)
+            5106:   52(float) Load 1393(dPdxy1)
+            5107:   52(float) Load 4267(lodClamp)
+            5108:  7(f16vec4) ImageSampleExplicitLod 5103 5104 Grad MinLod 5105 5106 5107
+            5109:  7(f16vec4) Load 4972(texel)
+            5110:  7(f16vec4) FAdd 5109 5108
+                              Store 4972(texel) 5110
+            5111:         269 Load 271(s1DArray)
+            5112:154(f16vec2) Load 156(f16c2)
+            5113:6(float16_t) Load 1401(f16dPdxy1)
+            5114:6(float16_t) Load 1401(f16dPdxy1)
+            5115:6(float16_t) Load 4274(f16lodClamp)
+            5116:  7(f16vec4) ImageSampleExplicitLod 5111 5112 Grad MinLod 5113 5114 5115
+            5117:  7(f16vec4) Load 4972(texel)
+            5118:  7(f16vec4) FAdd 5117 5116
+                              Store 4972(texel) 5118
+            5119:         284 Load 286(s2DArray)
+            5120:  167(fvec3) Load 169(c3)
+            5121:   53(fvec2) Load 1409(dPdxy2)
+            5122:   53(fvec2) Load 1409(dPdxy2)
+            5123:   52(float) Load 4267(lodClamp)
+            5124:  7(f16vec4) ImageSampleExplicitLod 5119 5120 Grad MinLod 5121 5122 5123
+            5125:  7(f16vec4) Load 4972(texel)
+            5126:  7(f16vec4) FAdd 5125 5124
+                              Store 4972(texel) 5126
+            5127:         284 Load 286(s2DArray)
+            5128:175(f16vec3) Load 177(f16c3)
+            5129:154(f16vec2) Load 1417(f16dPdxy2)
+            5130:154(f16vec2) Load 1417(f16dPdxy2)
+            5131:6(float16_t) Load 4274(f16lodClamp)
+            5132:  7(f16vec4) ImageSampleExplicitLod 5127 5128 Grad MinLod 5129 5130 5131
+            5133:  7(f16vec4) Load 4972(texel)
+            5134:  7(f16vec4) FAdd 5133 5132
+                              Store 4972(texel) 5134
+            5135:         316 Load 318(s1DArrayShadow)
+            5136:  167(fvec3) Load 169(c3)
+            5137:   52(float) Load 1393(dPdxy1)
+            5138:   52(float) Load 1393(dPdxy1)
+            5139:   52(float) Load 4267(lodClamp)
+            5140:   52(float) CompositeExtract 5136 2
+            5141:6(float16_t) ImageSampleDrefExplicitLod 5135 5136 5140 Grad MinLod 5137 5138 5139
+            5142:    208(ptr) AccessChain 4972(texel) 207
+            5143:6(float16_t) Load 5142
+            5144:6(float16_t) FAdd 5143 5141
+            5145:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5145 5144
+            5146:         316 Load 318(s1DArrayShadow)
+            5147:154(f16vec2) Load 156(f16c2)
+            5148:   52(float) Load 215(compare)
+            5149:6(float16_t) Load 1401(f16dPdxy1)
+            5150:6(float16_t) Load 1401(f16dPdxy1)
+            5151:6(float16_t) Load 4274(f16lodClamp)
+            5152:6(float16_t) ImageSampleDrefExplicitLod 5146 5147 5148 Grad MinLod 5149 5150 5151
+            5153:    208(ptr) AccessChain 4972(texel) 207
+            5154:6(float16_t) Load 5153
+            5155:6(float16_t) FAdd 5154 5152
+            5156:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5156 5155
+            5157:         337 Load 339(s2DArrayShadow)
+            5158:  249(fvec4) Load 251(c4)
+            5159:   53(fvec2) Load 1409(dPdxy2)
+            5160:   53(fvec2) Load 1409(dPdxy2)
+            5161:   52(float) Load 4267(lodClamp)
+            5162:   52(float) CompositeExtract 5158 3
+            5163:6(float16_t) ImageSampleDrefExplicitLod 5157 5158 5162 Grad MinLod 5159 5160 5161
+            5164:    208(ptr) AccessChain 4972(texel) 207
+            5165:6(float16_t) Load 5164
+            5166:6(float16_t) FAdd 5165 5163
+            5167:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5167 5166
+            5168:         337 Load 339(s2DArrayShadow)
+            5169:175(f16vec3) Load 177(f16c3)
+            5170:   52(float) Load 215(compare)
+            5171:154(f16vec2) Load 1417(f16dPdxy2)
+            5172:154(f16vec2) Load 1417(f16dPdxy2)
+            5173:6(float16_t) Load 4274(f16lodClamp)
+            5174:6(float16_t) ImageSampleDrefExplicitLod 5168 5169 5170 Grad MinLod 5171 5172 5173
+            5175:    208(ptr) AccessChain 4972(texel) 207
+            5176:6(float16_t) Load 5175
+            5177:6(float16_t) FAdd 5176 5174
+            5178:    208(ptr) AccessChain 4972(texel) 207
+                              Store 5178 5177
+            5179:         299 Load 301(sCubeArray)
+            5180:  249(fvec4) Load 251(c4)
+            5181:  167(fvec3) Load 1425(dPdxy3)
+            5182:  167(fvec3) Load 1425(dPdxy3)
+            5183:   52(float) Load 4267(lodClamp)
+            5184:  7(f16vec4) ImageSampleExplicitLod 5179 5180 Grad MinLod 5181 5182 5183
+            5185:  7(f16vec4) Load 4972(texel)
+            5186:  7(f16vec4) FAdd 5185 5184
+                              Store 4972(texel) 5186
+            5187:         299 Load 301(sCubeArray)
+            5188:  7(f16vec4) Load 309(f16c4)
+            5189:175(f16vec3) Load 1433(f16dPdxy3)
+            5190:175(f16vec3) Load 1433(f16dPdxy3)
+            5191:6(float16_t) Load 4274(f16lodClamp)
+            5192:  7(f16vec4) ImageSampleExplicitLod 5187 5188 Grad MinLod 5189 5190 5191
+            5193:  7(f16vec4) Load 4972(texel)
+            5194:  7(f16vec4) FAdd 5193 5192
+                              Store 4972(texel) 5194
+            5195:  7(f16vec4) Load 4972(texel)
+                              ReturnValue 5195
                               FunctionEnd
 111(testSparseTextureGradOffsetClamp():  7(f16vec4) Function None 8
              112:             Label
-     5188(texel):     64(ptr) Variable Function
-                              Store 5188(texel) 121
-            5189:         143 Load 145(s2D)
-            5190:   53(fvec2) Load 148(c2)
-            5191:   53(fvec2) Load 1409(dPdxy2)
-            5192:   53(fvec2) Load 1409(dPdxy2)
-            5193:   52(float) Load 4257(lodClamp)
-            5194:3102(ResType) ImageSparseSampleExplicitLod 5189 5190 Grad ConstOffset MinLod 5191 5192 722 5193
-            5195:  7(f16vec4) CompositeExtract 5194 1
-                              Store 5188(texel) 5195
-            5196:     47(int) CompositeExtract 5194 0
-            5197:         143 Load 145(s2D)
-            5198:154(f16vec2) Load 156(f16c2)
-            5199:154(f16vec2) Load 1417(f16dPdxy2)
-            5200:154(f16vec2) Load 1417(f16dPdxy2)
-            5201:6(float16_t) Load 4264(f16lodClamp)
-            5202:3102(ResType) ImageSparseSampleExplicitLod 5197 5198 Grad ConstOffset MinLod 5199 5200 722 5201
-            5203:  7(f16vec4) CompositeExtract 5202 1
-                              Store 5188(texel) 5203
-            5204:     47(int) CompositeExtract 5202 0
-            5205:         163 Load 165(s3D)
-            5206:  167(fvec3) Load 169(c3)
-            5207:  167(fvec3) Load 1425(dPdxy3)
-            5208:  167(fvec3) Load 1425(dPdxy3)
-            5209:   52(float) Load 4257(lodClamp)
-            5210:3102(ResType) ImageSparseSampleExplicitLod 5205 5206 Grad ConstOffset MinLod 5207 5208 735 5209
-            5211:  7(f16vec4) CompositeExtract 5210 1
-                              Store 5188(texel) 5211
-            5212:     47(int) CompositeExtract 5210 0
-            5213:         163 Load 165(s3D)
-            5214:175(f16vec3) Load 177(f16c3)
-            5215:175(f16vec3) Load 1433(f16dPdxy3)
-            5216:175(f16vec3) Load 1433(f16dPdxy3)
-            5217:6(float16_t) Load 4264(f16lodClamp)
-            5218:3102(ResType) ImageSparseSampleExplicitLod 5213 5214 Grad ConstOffset MinLod 5215 5216 735 5217
-            5219:  7(f16vec4) CompositeExtract 5218 1
-                              Store 5188(texel) 5219
-            5220:     47(int) CompositeExtract 5218 0
-            5221:         224 Load 226(s2DShadow)
-            5222:  167(fvec3) Load 169(c3)
-            5223:   53(fvec2) Load 1409(dPdxy2)
-            5224:   53(fvec2) Load 1409(dPdxy2)
-            5225:   52(float) Load 4257(lodClamp)
-            5226:    208(ptr) AccessChain 5188(texel) 207
-            5227:   52(float) CompositeExtract 5222 2
-            5228:3138(ResType) ImageSparseSampleDrefExplicitLod 5221 5222 5227 Grad ConstOffset MinLod 5223 5224 722 5225
-            5229:6(float16_t) CompositeExtract 5228 1
-                              Store 5226 5229
+     5198(texel):     64(ptr) Variable Function
+                              Store 5198(texel) 121
+            5199:         143 Load 145(s2D)
+            5200:   53(fvec2) Load 148(c2)
+            5201:   53(fvec2) Load 1409(dPdxy2)
+            5202:   53(fvec2) Load 1409(dPdxy2)
+            5203:   52(float) Load 4267(lodClamp)
+            5204:3102(ResType) ImageSparseSampleExplicitLod 5199 5200 Grad ConstOffset MinLod 5201 5202 722 5203
+            5205:  7(f16vec4) CompositeExtract 5204 1
+                              Store 5198(texel) 5205
+            5206:     47(int) CompositeExtract 5204 0
+            5207:         143 Load 145(s2D)
+            5208:154(f16vec2) Load 156(f16c2)
+            5209:154(f16vec2) Load 1417(f16dPdxy2)
+            5210:154(f16vec2) Load 1417(f16dPdxy2)
+            5211:6(float16_t) Load 4274(f16lodClamp)
+            5212:3102(ResType) ImageSparseSampleExplicitLod 5207 5208 Grad ConstOffset MinLod 5209 5210 722 5211
+            5213:  7(f16vec4) CompositeExtract 5212 1
+                              Store 5198(texel) 5213
+            5214:     47(int) CompositeExtract 5212 0
+            5215:         163 Load 165(s3D)
+            5216:  167(fvec3) Load 169(c3)
+            5217:  167(fvec3) Load 1425(dPdxy3)
+            5218:  167(fvec3) Load 1425(dPdxy3)
+            5219:   52(float) Load 4267(lodClamp)
+            5220:3102(ResType) ImageSparseSampleExplicitLod 5215 5216 Grad ConstOffset MinLod 5217 5218 735 5219
+            5221:  7(f16vec4) CompositeExtract 5220 1
+                              Store 5198(texel) 5221
+            5222:     47(int) CompositeExtract 5220 0
+            5223:         163 Load 165(s3D)
+            5224:175(f16vec3) Load 177(f16c3)
+            5225:175(f16vec3) Load 1433(f16dPdxy3)
+            5226:175(f16vec3) Load 1433(f16dPdxy3)
+            5227:6(float16_t) Load 4274(f16lodClamp)
+            5228:3102(ResType) ImageSparseSampleExplicitLod 5223 5224 Grad ConstOffset MinLod 5225 5226 735 5227
+            5229:  7(f16vec4) CompositeExtract 5228 1
+                              Store 5198(texel) 5229
             5230:     47(int) CompositeExtract 5228 0
             5231:         224 Load 226(s2DShadow)
-            5232:154(f16vec2) Load 156(f16c2)
-            5233:   52(float) Load 215(compare)
-            5234:154(f16vec2) Load 1417(f16dPdxy2)
-            5235:154(f16vec2) Load 1417(f16dPdxy2)
-            5236:6(float16_t) Load 4264(f16lodClamp)
-            5237:    208(ptr) AccessChain 5188(texel) 207
-            5238:3138(ResType) ImageSparseSampleDrefExplicitLod 5231 5232 5233 Grad ConstOffset MinLod 5234 5235 722 5236
+            5232:  167(fvec3) Load 169(c3)
+            5233:   53(fvec2) Load 1409(dPdxy2)
+            5234:   53(fvec2) Load 1409(dPdxy2)
+            5235:   52(float) Load 4267(lodClamp)
+            5236:    208(ptr) AccessChain 5198(texel) 207
+            5237:   52(float) CompositeExtract 5232 2
+            5238:3138(ResType) ImageSparseSampleDrefExplicitLod 5231 5232 5237 Grad ConstOffset MinLod 5233 5234 722 5235
             5239:6(float16_t) CompositeExtract 5238 1
-                              Store 5237 5239
+                              Store 5236 5239
             5240:     47(int) CompositeExtract 5238 0
-            5241:         284 Load 286(s2DArray)
-            5242:  167(fvec3) Load 169(c3)
-            5243:   53(fvec2) Load 1409(dPdxy2)
-            5244:   53(fvec2) Load 1409(dPdxy2)
-            5245:   52(float) Load 4257(lodClamp)
-            5246:3102(ResType) ImageSparseSampleExplicitLod 5241 5242 Grad ConstOffset MinLod 5243 5244 722 5245
-            5247:  7(f16vec4) CompositeExtract 5246 1
-                              Store 5188(texel) 5247
-            5248:     47(int) CompositeExtract 5246 0
-            5249:         284 Load 286(s2DArray)
-            5250:175(f16vec3) Load 177(f16c3)
-            5251:154(f16vec2) Load 1417(f16dPdxy2)
-            5252:154(f16vec2) Load 1417(f16dPdxy2)
-            5253:6(float16_t) Load 4264(f16lodClamp)
-            5254:3102(ResType) ImageSparseSampleExplicitLod 5249 5250 Grad ConstOffset MinLod 5251 5252 722 5253
-            5255:  7(f16vec4) CompositeExtract 5254 1
-                              Store 5188(texel) 5255
-            5256:     47(int) CompositeExtract 5254 0
-            5257:         337 Load 339(s2DArrayShadow)
-            5258:  249(fvec4) Load 251(c4)
-            5259:   53(fvec2) Load 1409(dPdxy2)
-            5260:   53(fvec2) Load 1409(dPdxy2)
-            5261:   52(float) Load 4257(lodClamp)
-            5262:    208(ptr) AccessChain 5188(texel) 207
-            5263:   52(float) CompositeExtract 5258 3
-            5264:3138(ResType) ImageSparseSampleDrefExplicitLod 5257 5258 5263 Grad ConstOffset MinLod 5259 5260 722 5261
-            5265:6(float16_t) CompositeExtract 5264 1
-                              Store 5262 5265
+            5241:         224 Load 226(s2DShadow)
+            5242:154(f16vec2) Load 156(f16c2)
+            5243:   52(float) Load 215(compare)
+            5244:154(f16vec2) Load 1417(f16dPdxy2)
+            5245:154(f16vec2) Load 1417(f16dPdxy2)
+            5246:6(float16_t) Load 4274(f16lodClamp)
+            5247:    208(ptr) AccessChain 5198(texel) 207
+            5248:3138(ResType) ImageSparseSampleDrefExplicitLod 5241 5242 5243 Grad ConstOffset MinLod 5244 5245 722 5246
+            5249:6(float16_t) CompositeExtract 5248 1
+                              Store 5247 5249
+            5250:     47(int) CompositeExtract 5248 0
+            5251:         284 Load 286(s2DArray)
+            5252:  167(fvec3) Load 169(c3)
+            5253:   53(fvec2) Load 1409(dPdxy2)
+            5254:   53(fvec2) Load 1409(dPdxy2)
+            5255:   52(float) Load 4267(lodClamp)
+            5256:3102(ResType) ImageSparseSampleExplicitLod 5251 5252 Grad ConstOffset MinLod 5253 5254 722 5255
+            5257:  7(f16vec4) CompositeExtract 5256 1
+                              Store 5198(texel) 5257
+            5258:     47(int) CompositeExtract 5256 0
+            5259:         284 Load 286(s2DArray)
+            5260:175(f16vec3) Load 177(f16c3)
+            5261:154(f16vec2) Load 1417(f16dPdxy2)
+            5262:154(f16vec2) Load 1417(f16dPdxy2)
+            5263:6(float16_t) Load 4274(f16lodClamp)
+            5264:3102(ResType) ImageSparseSampleExplicitLod 5259 5260 Grad ConstOffset MinLod 5261 5262 722 5263
+            5265:  7(f16vec4) CompositeExtract 5264 1
+                              Store 5198(texel) 5265
             5266:     47(int) CompositeExtract 5264 0
             5267:         337 Load 339(s2DArrayShadow)
-            5268:175(f16vec3) Load 177(f16c3)
-            5269:   52(float) Load 215(compare)
-            5270:154(f16vec2) Load 1417(f16dPdxy2)
-            5271:154(f16vec2) Load 1417(f16dPdxy2)
-            5272:6(float16_t) Load 4264(f16lodClamp)
-            5273:    208(ptr) AccessChain 5188(texel) 207
-            5274:3138(ResType) ImageSparseSampleDrefExplicitLod 5267 5268 5269 Grad ConstOffset MinLod 5270 5271 722 5272
+            5268:  249(fvec4) Load 251(c4)
+            5269:   53(fvec2) Load 1409(dPdxy2)
+            5270:   53(fvec2) Load 1409(dPdxy2)
+            5271:   52(float) Load 4267(lodClamp)
+            5272:    208(ptr) AccessChain 5198(texel) 207
+            5273:   52(float) CompositeExtract 5268 3
+            5274:3138(ResType) ImageSparseSampleDrefExplicitLod 5267 5268 5273 Grad ConstOffset MinLod 5269 5270 722 5271
             5275:6(float16_t) CompositeExtract 5274 1
-                              Store 5273 5275
+                              Store 5272 5275
             5276:     47(int) CompositeExtract 5274 0
-            5277:  7(f16vec4) Load 5188(texel)
-                              ReturnValue 5277
+            5277:         337 Load 339(s2DArrayShadow)
+            5278:175(f16vec3) Load 177(f16c3)
+            5279:   52(float) Load 215(compare)
+            5280:154(f16vec2) Load 1417(f16dPdxy2)
+            5281:154(f16vec2) Load 1417(f16dPdxy2)
+            5282:6(float16_t) Load 4274(f16lodClamp)
+            5283:    208(ptr) AccessChain 5198(texel) 207
+            5284:3138(ResType) ImageSparseSampleDrefExplicitLod 5277 5278 5279 Grad ConstOffset MinLod 5280 5281 722 5282
+            5285:6(float16_t) CompositeExtract 5284 1
+                              Store 5283 5285
+            5286:     47(int) CompositeExtract 5284 0
+            5287:  7(f16vec4) Load 5198(texel)
+                              ReturnValue 5287
                               FunctionEnd
 113(testTextureGradOffsetClamp():  7(f16vec4) Function None 8
              114:             Label
-     5280(texel):     64(ptr) Variable Function
-                              Store 5280(texel) 121
-            5281:         123 Load 125(s1D)
-            5282:   52(float) Load 128(c1)
-            5283:   52(float) Load 1393(dPdxy1)
-            5284:   52(float) Load 1393(dPdxy1)
-            5285:   52(float) Load 4257(lodClamp)
-            5286:  7(f16vec4) ImageSampleExplicitLod 5281 5282 Grad ConstOffset MinLod 5283 5284 709 5285
-            5287:  7(f16vec4) Load 5280(texel)
-            5288:  7(f16vec4) FAdd 5287 5286
-                              Store 5280(texel) 5288
-            5289:         123 Load 125(s1D)
-            5290:6(float16_t) Load 135(f16c1)
-            5291:6(float16_t) Load 1401(f16dPdxy1)
-            5292:6(float16_t) Load 1401(f16dPdxy1)
-            5293:6(float16_t) Load 4264(f16lodClamp)
-            5294:  7(f16vec4) ImageSampleExplicitLod 5289 5290 Grad ConstOffset MinLod 5291 5292 709 5293
-            5295:  7(f16vec4) Load 5280(texel)
-            5296:  7(f16vec4) FAdd 5295 5294
-                              Store 5280(texel) 5296
-            5297:         143 Load 145(s2D)
-            5298:   53(fvec2) Load 148(c2)
-            5299:   53(fvec2) Load 1409(dPdxy2)
-            5300:   53(fvec2) Load 1409(dPdxy2)
-            5301:   52(float) Load 4257(lodClamp)
-            5302:  7(f16vec4) ImageSampleExplicitLod 5297 5298 Grad ConstOffset MinLod 5299 5300 722 5301
-            5303:  7(f16vec4) Load 5280(texel)
-            5304:  7(f16vec4) FAdd 5303 5302
-                              Store 5280(texel) 5304
-            5305:         143 Load 145(s2D)
-            5306:154(f16vec2) Load 156(f16c2)
-            5307:154(f16vec2) Load 1417(f16dPdxy2)
-            5308:154(f16vec2) Load 1417(f16dPdxy2)
-            5309:6(float16_t) Load 4264(f16lodClamp)
-            5310:  7(f16vec4) ImageSampleExplicitLod 5305 5306 Grad ConstOffset MinLod 5307 5308 722 5309
-            5311:  7(f16vec4) Load 5280(texel)
-            5312:  7(f16vec4) FAdd 5311 5310
-                              Store 5280(texel) 5312
-            5313:         163 Load 165(s3D)
-            5314:  167(fvec3) Load 169(c3)
-            5315:  167(fvec3) Load 1425(dPdxy3)
-            5316:  167(fvec3) Load 1425(dPdxy3)
-            5317:   52(float) Load 4257(lodClamp)
-            5318:  7(f16vec4) ImageSampleExplicitLod 5313 5314 Grad ConstOffset MinLod 5315 5316 735 5317
-            5319:  7(f16vec4) Load 5280(texel)
-            5320:  7(f16vec4) FAdd 5319 5318
-                              Store 5280(texel) 5320
-            5321:         163 Load 165(s3D)
-            5322:175(f16vec3) Load 177(f16c3)
-            5323:175(f16vec3) Load 1433(f16dPdxy3)
-            5324:175(f16vec3) Load 1433(f16dPdxy3)
-            5325:6(float16_t) Load 4264(f16lodClamp)
-            5326:  7(f16vec4) ImageSampleExplicitLod 5321 5322 Grad ConstOffset MinLod 5323 5324 735 5325
-            5327:  7(f16vec4) Load 5280(texel)
-            5328:  7(f16vec4) FAdd 5327 5326
-                              Store 5280(texel) 5328
-            5329:         199 Load 201(s1DShadow)
-            5330:  167(fvec3) Load 169(c3)
-            5331:   52(float) Load 1393(dPdxy1)
-            5332:   52(float) Load 1393(dPdxy1)
-            5333:   52(float) Load 4257(lodClamp)
-            5334:   52(float) CompositeExtract 5330 2
-            5335:6(float16_t) ImageSampleDrefExplicitLod 5329 5330 5334 Grad ConstOffset MinLod 5331 5332 709 5333
-            5336:    208(ptr) AccessChain 5280(texel) 207
-            5337:6(float16_t) Load 5336
-            5338:6(float16_t) FAdd 5337 5335
-            5339:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5339 5338
-            5340:         199 Load 201(s1DShadow)
-            5341:154(f16vec2) Load 156(f16c2)
-            5342:   52(float) Load 215(compare)
-            5343:6(float16_t) Load 1401(f16dPdxy1)
-            5344:6(float16_t) Load 1401(f16dPdxy1)
-            5345:6(float16_t) Load 4264(f16lodClamp)
-            5346:6(float16_t) ImageSampleDrefExplicitLod 5340 5341 5342 Grad ConstOffset MinLod 5343 5344 709 5345
-            5347:    208(ptr) AccessChain 5280(texel) 207
-            5348:6(float16_t) Load 5347
-            5349:6(float16_t) FAdd 5348 5346
-            5350:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5350 5349
-            5351:         224 Load 226(s2DShadow)
-            5352:  167(fvec3) Load 169(c3)
-            5353:   53(fvec2) Load 1409(dPdxy2)
-            5354:   53(fvec2) Load 1409(dPdxy2)
-            5355:   52(float) Load 4257(lodClamp)
-            5356:   52(float) CompositeExtract 5352 2
-            5357:6(float16_t) ImageSampleDrefExplicitLod 5351 5352 5356 Grad ConstOffset MinLod 5353 5354 722 5355
-            5358:    208(ptr) AccessChain 5280(texel) 207
-            5359:6(float16_t) Load 5358
-            5360:6(float16_t) FAdd 5359 5357
-            5361:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5361 5360
-            5362:         224 Load 226(s2DShadow)
-            5363:154(f16vec2) Load 156(f16c2)
-            5364:   52(float) Load 215(compare)
-            5365:154(f16vec2) Load 1417(f16dPdxy2)
-            5366:154(f16vec2) Load 1417(f16dPdxy2)
-            5367:6(float16_t) Load 4264(f16lodClamp)
-            5368:6(float16_t) ImageSampleDrefExplicitLod 5362 5363 5364 Grad ConstOffset MinLod 5365 5366 722 5367
-            5369:    208(ptr) AccessChain 5280(texel) 207
-            5370:6(float16_t) Load 5369
-            5371:6(float16_t) FAdd 5370 5368
-            5372:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5372 5371
-            5373:         269 Load 271(s1DArray)
-            5374:   53(fvec2) Load 148(c2)
-            5375:   52(float) Load 1393(dPdxy1)
-            5376:   52(float) Load 1393(dPdxy1)
-            5377:   52(float) Load 4257(lodClamp)
-            5378:  7(f16vec4) ImageSampleExplicitLod 5373 5374 Grad ConstOffset MinLod 5375 5376 709 5377
-            5379:  7(f16vec4) Load 5280(texel)
-            5380:  7(f16vec4) FAdd 5379 5378
-                              Store 5280(texel) 5380
-            5381:         269 Load 271(s1DArray)
-            5382:154(f16vec2) Load 156(f16c2)
-            5383:6(float16_t) Load 1401(f16dPdxy1)
-            5384:6(float16_t) Load 1401(f16dPdxy1)
-            5385:6(float16_t) Load 4264(f16lodClamp)
-            5386:  7(f16vec4) ImageSampleExplicitLod 5381 5382 Grad ConstOffset MinLod 5383 5384 709 5385
-            5387:  7(f16vec4) Load 5280(texel)
-            5388:  7(f16vec4) FAdd 5387 5386
-                              Store 5280(texel) 5388
-            5389:         284 Load 286(s2DArray)
-            5390:  167(fvec3) Load 169(c3)
-            5391:   53(fvec2) Load 1409(dPdxy2)
-            5392:   53(fvec2) Load 1409(dPdxy2)
-            5393:   52(float) Load 4257(lodClamp)
-            5394:  7(f16vec4) ImageSampleExplicitLod 5389 5390 Grad ConstOffset MinLod 5391 5392 722 5393
-            5395:  7(f16vec4) Load 5280(texel)
-            5396:  7(f16vec4) FAdd 5395 5394
-                              Store 5280(texel) 5396
-            5397:         284 Load 286(s2DArray)
-            5398:175(f16vec3) Load 177(f16c3)
-            5399:154(f16vec2) Load 1417(f16dPdxy2)
-            5400:154(f16vec2) Load 1417(f16dPdxy2)
-            5401:6(float16_t) Load 4264(f16lodClamp)
-            5402:  7(f16vec4) ImageSampleExplicitLod 5397 5398 Grad ConstOffset MinLod 5399 5400 722 5401
-            5403:  7(f16vec4) Load 5280(texel)
-            5404:  7(f16vec4) FAdd 5403 5402
-                              Store 5280(texel) 5404
-            5405:         316 Load 318(s1DArrayShadow)
-            5406:  167(fvec3) Load 169(c3)
-            5407:   52(float) Load 1393(dPdxy1)
-            5408:   52(float) Load 1393(dPdxy1)
-            5409:   52(float) Load 4257(lodClamp)
-            5410:   52(float) CompositeExtract 5406 2
-            5411:6(float16_t) ImageSampleDrefExplicitLod 5405 5406 5410 Grad ConstOffset MinLod 5407 5408 709 5409
-            5412:    208(ptr) AccessChain 5280(texel) 207
-            5413:6(float16_t) Load 5412
-            5414:6(float16_t) FAdd 5413 5411
-            5415:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5415 5414
-            5416:         316 Load 318(s1DArrayShadow)
-            5417:154(f16vec2) Load 156(f16c2)
-            5418:   52(float) Load 215(compare)
-            5419:6(float16_t) Load 1401(f16dPdxy1)
-            5420:6(float16_t) Load 1401(f16dPdxy1)
-            5421:6(float16_t) Load 4264(f16lodClamp)
-            5422:6(float16_t) ImageSampleDrefExplicitLod 5416 5417 5418 Grad ConstOffset MinLod 5419 5420 709 5421
-            5423:    208(ptr) AccessChain 5280(texel) 207
-            5424:6(float16_t) Load 5423
-            5425:6(float16_t) FAdd 5424 5422
-            5426:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5426 5425
-            5427:         337 Load 339(s2DArrayShadow)
-            5428:  249(fvec4) Load 251(c4)
-            5429:   53(fvec2) Load 1409(dPdxy2)
-            5430:   53(fvec2) Load 1409(dPdxy2)
-            5431:   52(float) Load 4257(lodClamp)
-            5432:   52(float) CompositeExtract 5428 3
-            5433:6(float16_t) ImageSampleDrefExplicitLod 5427 5428 5432 Grad ConstOffset MinLod 5429 5430 722 5431
-            5434:    208(ptr) AccessChain 5280(texel) 207
-            5435:6(float16_t) Load 5434
-            5436:6(float16_t) FAdd 5435 5433
-            5437:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5437 5436
-            5438:         337 Load 339(s2DArrayShadow)
-            5439:175(f16vec3) Load 177(f16c3)
-            5440:   52(float) Load 215(compare)
-            5441:154(f16vec2) Load 1417(f16dPdxy2)
-            5442:154(f16vec2) Load 1417(f16dPdxy2)
-            5443:6(float16_t) Load 4264(f16lodClamp)
-            5444:6(float16_t) ImageSampleDrefExplicitLod 5438 5439 5440 Grad ConstOffset MinLod 5441 5442 722 5443
-            5445:    208(ptr) AccessChain 5280(texel) 207
-            5446:6(float16_t) Load 5445
-            5447:6(float16_t) FAdd 5446 5444
-            5448:    208(ptr) AccessChain 5280(texel) 207
-                              Store 5448 5447
-            5449:  7(f16vec4) Load 5280(texel)
-                              ReturnValue 5449
+     5290(texel):     64(ptr) Variable Function
+                              Store 5290(texel) 121
+            5291:         123 Load 125(s1D)
+            5292:   52(float) Load 128(c1)
+            5293:   52(float) Load 1393(dPdxy1)
+            5294:   52(float) Load 1393(dPdxy1)
+            5295:   52(float) Load 4267(lodClamp)
+            5296:  7(f16vec4) ImageSampleExplicitLod 5291 5292 Grad ConstOffset MinLod 5293 5294 709 5295
+            5297:  7(f16vec4) Load 5290(texel)
+            5298:  7(f16vec4) FAdd 5297 5296
+                              Store 5290(texel) 5298
+            5299:         123 Load 125(s1D)
+            5300:6(float16_t) Load 135(f16c1)
+            5301:6(float16_t) Load 1401(f16dPdxy1)
+            5302:6(float16_t) Load 1401(f16dPdxy1)
+            5303:6(float16_t) Load 4274(f16lodClamp)
+            5304:  7(f16vec4) ImageSampleExplicitLod 5299 5300 Grad ConstOffset MinLod 5301 5302 709 5303
+            5305:  7(f16vec4) Load 5290(texel)
+            5306:  7(f16vec4) FAdd 5305 5304
+                              Store 5290(texel) 5306
+            5307:         143 Load 145(s2D)
+            5308:   53(fvec2) Load 148(c2)
+            5309:   53(fvec2) Load 1409(dPdxy2)
+            5310:   53(fvec2) Load 1409(dPdxy2)
+            5311:   52(float) Load 4267(lodClamp)
+            5312:  7(f16vec4) ImageSampleExplicitLod 5307 5308 Grad ConstOffset MinLod 5309 5310 722 5311
+            5313:  7(f16vec4) Load 5290(texel)
+            5314:  7(f16vec4) FAdd 5313 5312
+                              Store 5290(texel) 5314
+            5315:         143 Load 145(s2D)
+            5316:154(f16vec2) Load 156(f16c2)
+            5317:154(f16vec2) Load 1417(f16dPdxy2)
+            5318:154(f16vec2) Load 1417(f16dPdxy2)
+            5319:6(float16_t) Load 4274(f16lodClamp)
+            5320:  7(f16vec4) ImageSampleExplicitLod 5315 5316 Grad ConstOffset MinLod 5317 5318 722 5319
+            5321:  7(f16vec4) Load 5290(texel)
+            5322:  7(f16vec4) FAdd 5321 5320
+                              Store 5290(texel) 5322
+            5323:         163 Load 165(s3D)
+            5324:  167(fvec3) Load 169(c3)
+            5325:  167(fvec3) Load 1425(dPdxy3)
+            5326:  167(fvec3) Load 1425(dPdxy3)
+            5327:   52(float) Load 4267(lodClamp)
+            5328:  7(f16vec4) ImageSampleExplicitLod 5323 5324 Grad ConstOffset MinLod 5325 5326 735 5327
+            5329:  7(f16vec4) Load 5290(texel)
+            5330:  7(f16vec4) FAdd 5329 5328
+                              Store 5290(texel) 5330
+            5331:         163 Load 165(s3D)
+            5332:175(f16vec3) Load 177(f16c3)
+            5333:175(f16vec3) Load 1433(f16dPdxy3)
+            5334:175(f16vec3) Load 1433(f16dPdxy3)
+            5335:6(float16_t) Load 4274(f16lodClamp)
+            5336:  7(f16vec4) ImageSampleExplicitLod 5331 5332 Grad ConstOffset MinLod 5333 5334 735 5335
+            5337:  7(f16vec4) Load 5290(texel)
+            5338:  7(f16vec4) FAdd 5337 5336
+                              Store 5290(texel) 5338
+            5339:         199 Load 201(s1DShadow)
+            5340:  167(fvec3) Load 169(c3)
+            5341:   52(float) Load 1393(dPdxy1)
+            5342:   52(float) Load 1393(dPdxy1)
+            5343:   52(float) Load 4267(lodClamp)
+            5344:   52(float) CompositeExtract 5340 2
+            5345:6(float16_t) ImageSampleDrefExplicitLod 5339 5340 5344 Grad ConstOffset MinLod 5341 5342 709 5343
+            5346:    208(ptr) AccessChain 5290(texel) 207
+            5347:6(float16_t) Load 5346
+            5348:6(float16_t) FAdd 5347 5345
+            5349:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5349 5348
+            5350:         199 Load 201(s1DShadow)
+            5351:154(f16vec2) Load 156(f16c2)
+            5352:   52(float) Load 215(compare)
+            5353:6(float16_t) Load 1401(f16dPdxy1)
+            5354:6(float16_t) Load 1401(f16dPdxy1)
+            5355:6(float16_t) Load 4274(f16lodClamp)
+            5356:6(float16_t) ImageSampleDrefExplicitLod 5350 5351 5352 Grad ConstOffset MinLod 5353 5354 709 5355
+            5357:    208(ptr) AccessChain 5290(texel) 207
+            5358:6(float16_t) Load 5357
+            5359:6(float16_t) FAdd 5358 5356
+            5360:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5360 5359
+            5361:         224 Load 226(s2DShadow)
+            5362:  167(fvec3) Load 169(c3)
+            5363:   53(fvec2) Load 1409(dPdxy2)
+            5364:   53(fvec2) Load 1409(dPdxy2)
+            5365:   52(float) Load 4267(lodClamp)
+            5366:   52(float) CompositeExtract 5362 2
+            5367:6(float16_t) ImageSampleDrefExplicitLod 5361 5362 5366 Grad ConstOffset MinLod 5363 5364 722 5365
+            5368:    208(ptr) AccessChain 5290(texel) 207
+            5369:6(float16_t) Load 5368
+            5370:6(float16_t) FAdd 5369 5367
+            5371:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5371 5370
+            5372:         224 Load 226(s2DShadow)
+            5373:154(f16vec2) Load 156(f16c2)
+            5374:   52(float) Load 215(compare)
+            5375:154(f16vec2) Load 1417(f16dPdxy2)
+            5376:154(f16vec2) Load 1417(f16dPdxy2)
+            5377:6(float16_t) Load 4274(f16lodClamp)
+            5378:6(float16_t) ImageSampleDrefExplicitLod 5372 5373 5374 Grad ConstOffset MinLod 5375 5376 722 5377
+            5379:    208(ptr) AccessChain 5290(texel) 207
+            5380:6(float16_t) Load 5379
+            5381:6(float16_t) FAdd 5380 5378
+            5382:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5382 5381
+            5383:         269 Load 271(s1DArray)
+            5384:   53(fvec2) Load 148(c2)
+            5385:   52(float) Load 1393(dPdxy1)
+            5386:   52(float) Load 1393(dPdxy1)
+            5387:   52(float) Load 4267(lodClamp)
+            5388:  7(f16vec4) ImageSampleExplicitLod 5383 5384 Grad ConstOffset MinLod 5385 5386 709 5387
+            5389:  7(f16vec4) Load 5290(texel)
+            5390:  7(f16vec4) FAdd 5389 5388
+                              Store 5290(texel) 5390
+            5391:         269 Load 271(s1DArray)
+            5392:154(f16vec2) Load 156(f16c2)
+            5393:6(float16_t) Load 1401(f16dPdxy1)
+            5394:6(float16_t) Load 1401(f16dPdxy1)
+            5395:6(float16_t) Load 4274(f16lodClamp)
+            5396:  7(f16vec4) ImageSampleExplicitLod 5391 5392 Grad ConstOffset MinLod 5393 5394 709 5395
+            5397:  7(f16vec4) Load 5290(texel)
+            5398:  7(f16vec4) FAdd 5397 5396
+                              Store 5290(texel) 5398
+            5399:         284 Load 286(s2DArray)
+            5400:  167(fvec3) Load 169(c3)
+            5401:   53(fvec2) Load 1409(dPdxy2)
+            5402:   53(fvec2) Load 1409(dPdxy2)
+            5403:   52(float) Load 4267(lodClamp)
+            5404:  7(f16vec4) ImageSampleExplicitLod 5399 5400 Grad ConstOffset MinLod 5401 5402 722 5403
+            5405:  7(f16vec4) Load 5290(texel)
+            5406:  7(f16vec4) FAdd 5405 5404
+                              Store 5290(texel) 5406
+            5407:         284 Load 286(s2DArray)
+            5408:175(f16vec3) Load 177(f16c3)
+            5409:154(f16vec2) Load 1417(f16dPdxy2)
+            5410:154(f16vec2) Load 1417(f16dPdxy2)
+            5411:6(float16_t) Load 4274(f16lodClamp)
+            5412:  7(f16vec4) ImageSampleExplicitLod 5407 5408 Grad ConstOffset MinLod 5409 5410 722 5411
+            5413:  7(f16vec4) Load 5290(texel)
+            5414:  7(f16vec4) FAdd 5413 5412
+                              Store 5290(texel) 5414
+            5415:         316 Load 318(s1DArrayShadow)
+            5416:  167(fvec3) Load 169(c3)
+            5417:   52(float) Load 1393(dPdxy1)
+            5418:   52(float) Load 1393(dPdxy1)
+            5419:   52(float) Load 4267(lodClamp)
+            5420:   52(float) CompositeExtract 5416 2
+            5421:6(float16_t) ImageSampleDrefExplicitLod 5415 5416 5420 Grad ConstOffset MinLod 5417 5418 709 5419
+            5422:    208(ptr) AccessChain 5290(texel) 207
+            5423:6(float16_t) Load 5422
+            5424:6(float16_t) FAdd 5423 5421
+            5425:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5425 5424
+            5426:         316 Load 318(s1DArrayShadow)
+            5427:154(f16vec2) Load 156(f16c2)
+            5428:   52(float) Load 215(compare)
+            5429:6(float16_t) Load 1401(f16dPdxy1)
+            5430:6(float16_t) Load 1401(f16dPdxy1)
+            5431:6(float16_t) Load 4274(f16lodClamp)
+            5432:6(float16_t) ImageSampleDrefExplicitLod 5426 5427 5428 Grad ConstOffset MinLod 5429 5430 709 5431
+            5433:    208(ptr) AccessChain 5290(texel) 207
+            5434:6(float16_t) Load 5433
+            5435:6(float16_t) FAdd 5434 5432
+            5436:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5436 5435
+            5437:         337 Load 339(s2DArrayShadow)
+            5438:  249(fvec4) Load 251(c4)
+            5439:   53(fvec2) Load 1409(dPdxy2)
+            5440:   53(fvec2) Load 1409(dPdxy2)
+            5441:   52(float) Load 4267(lodClamp)
+            5442:   52(float) CompositeExtract 5438 3
+            5443:6(float16_t) ImageSampleDrefExplicitLod 5437 5438 5442 Grad ConstOffset MinLod 5439 5440 722 5441
+            5444:    208(ptr) AccessChain 5290(texel) 207
+            5445:6(float16_t) Load 5444
+            5446:6(float16_t) FAdd 5445 5443
+            5447:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5447 5446
+            5448:         337 Load 339(s2DArrayShadow)
+            5449:175(f16vec3) Load 177(f16c3)
+            5450:   52(float) Load 215(compare)
+            5451:154(f16vec2) Load 1417(f16dPdxy2)
+            5452:154(f16vec2) Load 1417(f16dPdxy2)
+            5453:6(float16_t) Load 4274(f16lodClamp)
+            5454:6(float16_t) ImageSampleDrefExplicitLod 5448 5449 5450 Grad ConstOffset MinLod 5451 5452 722 5453
+            5455:    208(ptr) AccessChain 5290(texel) 207
+            5456:6(float16_t) Load 5455
+            5457:6(float16_t) FAdd 5456 5454
+            5458:    208(ptr) AccessChain 5290(texel) 207
+                              Store 5458 5457
+            5459:  7(f16vec4) Load 5290(texel)
+                              ReturnValue 5459
                               FunctionEnd
 115(testCombinedTextureSampler():  7(f16vec4) Function None 8
              116:             Label
-     5452(texel):     64(ptr) Variable Function
-                              Store 5452(texel) 121
-            5455:         122 Load 5454(t1D)
-            5459:        5456 Load 5458(s)
-            5460:         123 SampledImage 5455 5459
-            5461:   52(float) Load 128(c1)
-            5462:  7(f16vec4) ImageSampleImplicitLod 5460 5461
-            5463:  7(f16vec4) Load 5452(texel)
-            5464:  7(f16vec4) FAdd 5463 5462
-                              Store 5452(texel) 5464
-            5465:         122 Load 5454(t1D)
-            5466:        5456 Load 5458(s)
-            5467:         123 SampledImage 5465 5466
-            5468:6(float16_t) Load 135(f16c1)
-            5469:6(float16_t) Load 137(f16bias)
-            5470:  7(f16vec4) ImageSampleImplicitLod 5467 5468 Bias 5469
-            5471:  7(f16vec4) Load 5452(texel)
-            5472:  7(f16vec4) FAdd 5471 5470
-                              Store 5452(texel) 5472
-            5475:         142 Load 5474(t2D)
-            5476:        5456 Load 5458(s)
-            5477:         143 SampledImage 5475 5476
-            5478:   53(fvec2) Load 148(c2)
-            5479:  7(f16vec4) ImageSampleImplicitLod 5477 5478
-            5480:  7(f16vec4) Load 5452(texel)
-            5481:  7(f16vec4) FAdd 5480 5479
-                              Store 5452(texel) 5481
-            5482:         142 Load 5474(t2D)
-            5483:        5456 Load 5458(s)
-            5484:         143 SampledImage 5482 5483
-            5485:154(f16vec2) Load 156(f16c2)
-            5486:6(float16_t) Load 137(f16bias)
-            5487:  7(f16vec4) ImageSampleImplicitLod 5484 5485 Bias 5486
-            5488:  7(f16vec4) Load 5452(texel)
-            5489:  7(f16vec4) FAdd 5488 5487
-                              Store 5452(texel) 5489
-            5492:         162 Load 5491(t3D)
-            5493:        5456 Load 5458(s)
-            5494:         163 SampledImage 5492 5493
-            5495:  167(fvec3) Load 169(c3)
-            5496:  7(f16vec4) ImageSampleImplicitLod 5494 5495
-            5497:  7(f16vec4) Load 5452(texel)
-            5498:  7(f16vec4) FAdd 5497 5496
-                              Store 5452(texel) 5498
-            5499:         162 Load 5491(t3D)
-            5500:        5456 Load 5458(s)
-            5501:         163 SampledImage 5499 5500
-            5502:175(f16vec3) Load 177(f16c3)
-            5503:6(float16_t) Load 137(f16bias)
-            5504:  7(f16vec4) ImageSampleImplicitLod 5501 5502 Bias 5503
-            5505:  7(f16vec4) Load 5452(texel)
-            5506:  7(f16vec4) FAdd 5505 5504
-                              Store 5452(texel) 5506
-            5509:         183 Load 5508(tCube)
-            5510:        5456 Load 5458(s)
-            5511:         184 SampledImage 5509 5510
-            5512:  167(fvec3) Load 169(c3)
-            5513:  7(f16vec4) ImageSampleImplicitLod 5511 5512
-            5514:  7(f16vec4) Load 5452(texel)
-            5515:  7(f16vec4) FAdd 5514 5513
-                              Store 5452(texel) 5515
-            5516:         183 Load 5508(tCube)
-            5517:        5456 Load 5458(s)
-            5518:         184 SampledImage 5516 5517
-            5519:175(f16vec3) Load 177(f16c3)
-            5520:6(float16_t) Load 137(f16bias)
-            5521:  7(f16vec4) ImageSampleImplicitLod 5518 5519 Bias 5520
-            5522:  7(f16vec4) Load 5452(texel)
-            5523:  7(f16vec4) FAdd 5522 5521
-                              Store 5452(texel) 5523
-            5524:         122 Load 5454(t1D)
-            5526:        5456 Load 5525(sShadow)
-            5527:         199 SampledImage 5524 5526
-            5528:  167(fvec3) Load 169(c3)
-            5529:   52(float) CompositeExtract 5528 2
-            5530:6(float16_t) ImageSampleDrefImplicitLod 5527 5528 5529
-            5531:    208(ptr) AccessChain 5452(texel) 207
-            5532:6(float16_t) Load 5531
-            5533:6(float16_t) FAdd 5532 5530
-            5534:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5534 5533
-            5535:         122 Load 5454(t1D)
-            5536:        5456 Load 5525(sShadow)
-            5537:         199 SampledImage 5535 5536
-            5538:154(f16vec2) Load 156(f16c2)
-            5539:   52(float) Load 215(compare)
-            5540:6(float16_t) Load 137(f16bias)
-            5541:6(float16_t) ImageSampleDrefImplicitLod 5537 5538 5539 Bias 5540
-            5542:    208(ptr) AccessChain 5452(texel) 207
-            5543:6(float16_t) Load 5542
-            5544:6(float16_t) FAdd 5543 5541
-            5545:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5545 5544
-            5546:         142 Load 5474(t2D)
-            5547:        5456 Load 5525(sShadow)
-            5548:         224 SampledImage 5546 5547
-            5549:  167(fvec3) Load 169(c3)
-            5550:   52(float) CompositeExtract 5549 2
-            5551:6(float16_t) ImageSampleDrefImplicitLod 5548 5549 5550
-            5552:    208(ptr) AccessChain 5452(texel) 207
+     5462(texel):     64(ptr) Variable Function
+                              Store 5462(texel) 121
+            5465:         122 Load 5464(t1D)
+            5469:        5466 Load 5468(s)
+            5470:         123 SampledImage 5465 5469
+            5471:   52(float) Load 128(c1)
+            5472:  7(f16vec4) ImageSampleImplicitLod 5470 5471
+            5473:  7(f16vec4) Load 5462(texel)
+            5474:  7(f16vec4) FAdd 5473 5472
+                              Store 5462(texel) 5474
+            5475:         122 Load 5464(t1D)
+            5476:        5466 Load 5468(s)
+            5477:         123 SampledImage 5475 5476
+            5478:6(float16_t) Load 135(f16c1)
+            5479:6(float16_t) Load 137(f16bias)
+            5480:  7(f16vec4) ImageSampleImplicitLod 5477 5478 Bias 5479
+            5481:  7(f16vec4) Load 5462(texel)
+            5482:  7(f16vec4) FAdd 5481 5480
+                              Store 5462(texel) 5482
+            5485:         142 Load 5484(t2D)
+            5486:        5466 Load 5468(s)
+            5487:         143 SampledImage 5485 5486
+            5488:   53(fvec2) Load 148(c2)
+            5489:  7(f16vec4) ImageSampleImplicitLod 5487 5488
+            5490:  7(f16vec4) Load 5462(texel)
+            5491:  7(f16vec4) FAdd 5490 5489
+                              Store 5462(texel) 5491
+            5492:         142 Load 5484(t2D)
+            5493:        5466 Load 5468(s)
+            5494:         143 SampledImage 5492 5493
+            5495:154(f16vec2) Load 156(f16c2)
+            5496:6(float16_t) Load 137(f16bias)
+            5497:  7(f16vec4) ImageSampleImplicitLod 5494 5495 Bias 5496
+            5498:  7(f16vec4) Load 5462(texel)
+            5499:  7(f16vec4) FAdd 5498 5497
+                              Store 5462(texel) 5499
+            5502:         162 Load 5501(t3D)
+            5503:        5466 Load 5468(s)
+            5504:         163 SampledImage 5502 5503
+            5505:  167(fvec3) Load 169(c3)
+            5506:  7(f16vec4) ImageSampleImplicitLod 5504 5505
+            5507:  7(f16vec4) Load 5462(texel)
+            5508:  7(f16vec4) FAdd 5507 5506
+                              Store 5462(texel) 5508
+            5509:         162 Load 5501(t3D)
+            5510:        5466 Load 5468(s)
+            5511:         163 SampledImage 5509 5510
+            5512:175(f16vec3) Load 177(f16c3)
+            5513:6(float16_t) Load 137(f16bias)
+            5514:  7(f16vec4) ImageSampleImplicitLod 5511 5512 Bias 5513
+            5515:  7(f16vec4) Load 5462(texel)
+            5516:  7(f16vec4) FAdd 5515 5514
+                              Store 5462(texel) 5516
+            5519:         183 Load 5518(tCube)
+            5520:        5466 Load 5468(s)
+            5521:         184 SampledImage 5519 5520
+            5522:  167(fvec3) Load 169(c3)
+            5523:  7(f16vec4) ImageSampleImplicitLod 5521 5522
+            5524:  7(f16vec4) Load 5462(texel)
+            5525:  7(f16vec4) FAdd 5524 5523
+                              Store 5462(texel) 5525
+            5526:         183 Load 5518(tCube)
+            5527:        5466 Load 5468(s)
+            5528:         184 SampledImage 5526 5527
+            5529:175(f16vec3) Load 177(f16c3)
+            5530:6(float16_t) Load 137(f16bias)
+            5531:  7(f16vec4) ImageSampleImplicitLod 5528 5529 Bias 5530
+            5532:  7(f16vec4) Load 5462(texel)
+            5533:  7(f16vec4) FAdd 5532 5531
+                              Store 5462(texel) 5533
+            5534:         122 Load 5464(t1D)
+            5536:        5466 Load 5535(sShadow)
+            5537:         199 SampledImage 5534 5536
+            5538:  167(fvec3) Load 169(c3)
+            5539:   52(float) CompositeExtract 5538 2
+            5540:6(float16_t) ImageSampleDrefImplicitLod 5537 5538 5539
+            5541:    208(ptr) AccessChain 5462(texel) 207
+            5542:6(float16_t) Load 5541
+            5543:6(float16_t) FAdd 5542 5540
+            5544:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5544 5543
+            5545:         122 Load 5464(t1D)
+            5546:        5466 Load 5535(sShadow)
+            5547:         199 SampledImage 5545 5546
+            5548:154(f16vec2) Load 156(f16c2)
+            5549:   52(float) Load 215(compare)
+            5550:6(float16_t) Load 137(f16bias)
+            5551:6(float16_t) ImageSampleDrefImplicitLod 5547 5548 5549 Bias 5550
+            5552:    208(ptr) AccessChain 5462(texel) 207
             5553:6(float16_t) Load 5552
             5554:6(float16_t) FAdd 5553 5551
-            5555:    208(ptr) AccessChain 5452(texel) 207
+            5555:    208(ptr) AccessChain 5462(texel) 207
                               Store 5555 5554
-            5556:         142 Load 5474(t2D)
-            5557:        5456 Load 5525(sShadow)
+            5556:         142 Load 5484(t2D)
+            5557:        5466 Load 5535(sShadow)
             5558:         224 SampledImage 5556 5557
-            5559:154(f16vec2) Load 156(f16c2)
-            5560:   52(float) Load 215(compare)
-            5561:6(float16_t) Load 137(f16bias)
-            5562:6(float16_t) ImageSampleDrefImplicitLod 5558 5559 5560 Bias 5561
-            5563:    208(ptr) AccessChain 5452(texel) 207
-            5564:6(float16_t) Load 5563
-            5565:6(float16_t) FAdd 5564 5562
-            5566:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5566 5565
-            5567:         183 Load 5508(tCube)
-            5568:        5456 Load 5525(sShadow)
-            5569:         245 SampledImage 5567 5568
-            5570:  249(fvec4) Load 251(c4)
-            5571:   52(float) CompositeExtract 5570 3
-            5572:6(float16_t) ImageSampleDrefImplicitLod 5569 5570 5571
-            5573:    208(ptr) AccessChain 5452(texel) 207
+            5559:  167(fvec3) Load 169(c3)
+            5560:   52(float) CompositeExtract 5559 2
+            5561:6(float16_t) ImageSampleDrefImplicitLod 5558 5559 5560
+            5562:    208(ptr) AccessChain 5462(texel) 207
+            5563:6(float16_t) Load 5562
+            5564:6(float16_t) FAdd 5563 5561
+            5565:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5565 5564
+            5566:         142 Load 5484(t2D)
+            5567:        5466 Load 5535(sShadow)
+            5568:         224 SampledImage 5566 5567
+            5569:154(f16vec2) Load 156(f16c2)
+            5570:   52(float) Load 215(compare)
+            5571:6(float16_t) Load 137(f16bias)
+            5572:6(float16_t) ImageSampleDrefImplicitLod 5568 5569 5570 Bias 5571
+            5573:    208(ptr) AccessChain 5462(texel) 207
             5574:6(float16_t) Load 5573
             5575:6(float16_t) FAdd 5574 5572
-            5576:    208(ptr) AccessChain 5452(texel) 207
+            5576:    208(ptr) AccessChain 5462(texel) 207
                               Store 5576 5575
-            5577:         183 Load 5508(tCube)
-            5578:        5456 Load 5525(sShadow)
+            5577:         183 Load 5518(tCube)
+            5578:        5466 Load 5535(sShadow)
             5579:         245 SampledImage 5577 5578
-            5580:175(f16vec3) Load 177(f16c3)
-            5581:   52(float) Load 215(compare)
-            5582:6(float16_t) Load 137(f16bias)
-            5583:6(float16_t) ImageSampleDrefImplicitLod 5579 5580 5581 Bias 5582
-            5584:    208(ptr) AccessChain 5452(texel) 207
-            5585:6(float16_t) Load 5584
-            5586:6(float16_t) FAdd 5585 5583
-            5587:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5587 5586
-            5590:         268 Load 5589(t1DArray)
-            5591:        5456 Load 5458(s)
-            5592:         269 SampledImage 5590 5591
-            5593:   53(fvec2) Load 148(c2)
-            5594:  7(f16vec4) ImageSampleImplicitLod 5592 5593
-            5595:  7(f16vec4) Load 5452(texel)
-            5596:  7(f16vec4) FAdd 5595 5594
-                              Store 5452(texel) 5596
-            5597:         268 Load 5589(t1DArray)
-            5598:        5456 Load 5458(s)
-            5599:         269 SampledImage 5597 5598
-            5600:154(f16vec2) Load 156(f16c2)
-            5601:6(float16_t) Load 137(f16bias)
-            5602:  7(f16vec4) ImageSampleImplicitLod 5599 5600 Bias 5601
-            5603:  7(f16vec4) Load 5452(texel)
-            5604:  7(f16vec4) FAdd 5603 5602
-                              Store 5452(texel) 5604
-            5607:         283 Load 5606(t2DArray)
-            5608:        5456 Load 5458(s)
-            5609:         284 SampledImage 5607 5608
-            5610:  167(fvec3) Load 169(c3)
-            5611:  7(f16vec4) ImageSampleImplicitLod 5609 5610
-            5612:  7(f16vec4) Load 5452(texel)
-            5613:  7(f16vec4) FAdd 5612 5611
-                              Store 5452(texel) 5613
-            5614:         283 Load 5606(t2DArray)
-            5615:        5456 Load 5458(s)
-            5616:         284 SampledImage 5614 5615
-            5617:175(f16vec3) Load 177(f16c3)
-            5618:6(float16_t) Load 137(f16bias)
-            5619:  7(f16vec4) ImageSampleImplicitLod 5616 5617 Bias 5618
-            5620:  7(f16vec4) Load 5452(texel)
-            5621:  7(f16vec4) FAdd 5620 5619
-                              Store 5452(texel) 5621
-            5624:         298 Load 5623(tCubeArray)
-            5625:        5456 Load 5458(s)
-            5626:         299 SampledImage 5624 5625
-            5627:  249(fvec4) Load 251(c4)
-            5628:  7(f16vec4) ImageSampleImplicitLod 5626 5627
-            5629:  7(f16vec4) Load 5452(texel)
-            5630:  7(f16vec4) FAdd 5629 5628
-                              Store 5452(texel) 5630
-            5631:         298 Load 5623(tCubeArray)
-            5632:        5456 Load 5458(s)
-            5633:         299 SampledImage 5631 5632
-            5634:  7(f16vec4) Load 309(f16c4)
-            5635:6(float16_t) Load 137(f16bias)
-            5636:  7(f16vec4) ImageSampleImplicitLod 5633 5634 Bias 5635
-            5637:  7(f16vec4) Load 5452(texel)
-            5638:  7(f16vec4) FAdd 5637 5636
-                              Store 5452(texel) 5638
-            5639:         268 Load 5589(t1DArray)
-            5640:        5456 Load 5525(sShadow)
-            5641:         316 SampledImage 5639 5640
-            5642:  167(fvec3) Load 169(c3)
-            5643:   52(float) CompositeExtract 5642 2
-            5644:6(float16_t) ImageSampleDrefImplicitLod 5641 5642 5643
-            5645:    208(ptr) AccessChain 5452(texel) 207
-            5646:6(float16_t) Load 5645
-            5647:6(float16_t) FAdd 5646 5644
-            5648:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5648 5647
-            5649:         268 Load 5589(t1DArray)
-            5650:        5456 Load 5525(sShadow)
+            5580:  249(fvec4) Load 251(c4)
+            5581:   52(float) CompositeExtract 5580 3
+            5582:6(float16_t) ImageSampleDrefImplicitLod 5579 5580 5581
+            5583:    208(ptr) AccessChain 5462(texel) 207
+            5584:6(float16_t) Load 5583
+            5585:6(float16_t) FAdd 5584 5582
+            5586:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5586 5585
+            5587:         183 Load 5518(tCube)
+            5588:        5466 Load 5535(sShadow)
+            5589:         245 SampledImage 5587 5588
+            5590:175(f16vec3) Load 177(f16c3)
+            5591:   52(float) Load 215(compare)
+            5592:6(float16_t) Load 137(f16bias)
+            5593:6(float16_t) ImageSampleDrefImplicitLod 5589 5590 5591 Bias 5592
+            5594:    208(ptr) AccessChain 5462(texel) 207
+            5595:6(float16_t) Load 5594
+            5596:6(float16_t) FAdd 5595 5593
+            5597:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5597 5596
+            5600:         268 Load 5599(t1DArray)
+            5601:        5466 Load 5468(s)
+            5602:         269 SampledImage 5600 5601
+            5603:   53(fvec2) Load 148(c2)
+            5604:  7(f16vec4) ImageSampleImplicitLod 5602 5603
+            5605:  7(f16vec4) Load 5462(texel)
+            5606:  7(f16vec4) FAdd 5605 5604
+                              Store 5462(texel) 5606
+            5607:         268 Load 5599(t1DArray)
+            5608:        5466 Load 5468(s)
+            5609:         269 SampledImage 5607 5608
+            5610:154(f16vec2) Load 156(f16c2)
+            5611:6(float16_t) Load 137(f16bias)
+            5612:  7(f16vec4) ImageSampleImplicitLod 5609 5610 Bias 5611
+            5613:  7(f16vec4) Load 5462(texel)
+            5614:  7(f16vec4) FAdd 5613 5612
+                              Store 5462(texel) 5614
+            5617:         283 Load 5616(t2DArray)
+            5618:        5466 Load 5468(s)
+            5619:         284 SampledImage 5617 5618
+            5620:  167(fvec3) Load 169(c3)
+            5621:  7(f16vec4) ImageSampleImplicitLod 5619 5620
+            5622:  7(f16vec4) Load 5462(texel)
+            5623:  7(f16vec4) FAdd 5622 5621
+                              Store 5462(texel) 5623
+            5624:         283 Load 5616(t2DArray)
+            5625:        5466 Load 5468(s)
+            5626:         284 SampledImage 5624 5625
+            5627:175(f16vec3) Load 177(f16c3)
+            5628:6(float16_t) Load 137(f16bias)
+            5629:  7(f16vec4) ImageSampleImplicitLod 5626 5627 Bias 5628
+            5630:  7(f16vec4) Load 5462(texel)
+            5631:  7(f16vec4) FAdd 5630 5629
+                              Store 5462(texel) 5631
+            5634:         298 Load 5633(tCubeArray)
+            5635:        5466 Load 5468(s)
+            5636:         299 SampledImage 5634 5635
+            5637:  249(fvec4) Load 251(c4)
+            5638:  7(f16vec4) ImageSampleImplicitLod 5636 5637
+            5639:  7(f16vec4) Load 5462(texel)
+            5640:  7(f16vec4) FAdd 5639 5638
+                              Store 5462(texel) 5640
+            5641:         298 Load 5633(tCubeArray)
+            5642:        5466 Load 5468(s)
+            5643:         299 SampledImage 5641 5642
+            5644:  7(f16vec4) Load 309(f16c4)
+            5645:6(float16_t) Load 137(f16bias)
+            5646:  7(f16vec4) ImageSampleImplicitLod 5643 5644 Bias 5645
+            5647:  7(f16vec4) Load 5462(texel)
+            5648:  7(f16vec4) FAdd 5647 5646
+                              Store 5462(texel) 5648
+            5649:         268 Load 5599(t1DArray)
+            5650:        5466 Load 5535(sShadow)
             5651:         316 SampledImage 5649 5650
-            5652:154(f16vec2) Load 156(f16c2)
-            5653:   52(float) Load 215(compare)
-            5654:6(float16_t) Load 137(f16bias)
-            5655:6(float16_t) ImageSampleDrefImplicitLod 5651 5652 5653 Bias 5654
-            5656:    208(ptr) AccessChain 5452(texel) 207
-            5657:6(float16_t) Load 5656
-            5658:6(float16_t) FAdd 5657 5655
-            5659:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5659 5658
-            5660:         283 Load 5606(t2DArray)
-            5661:        5456 Load 5525(sShadow)
-            5662:         337 SampledImage 5660 5661
-            5663:  249(fvec4) Load 251(c4)
-            5664:   52(float) CompositeExtract 5663 3
-            5665:6(float16_t) ImageSampleDrefImplicitLod 5662 5663 5664
-            5666:    208(ptr) AccessChain 5452(texel) 207
+            5652:  167(fvec3) Load 169(c3)
+            5653:   52(float) CompositeExtract 5652 2
+            5654:6(float16_t) ImageSampleDrefImplicitLod 5651 5652 5653
+            5655:    208(ptr) AccessChain 5462(texel) 207
+            5656:6(float16_t) Load 5655
+            5657:6(float16_t) FAdd 5656 5654
+            5658:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5658 5657
+            5659:         268 Load 5599(t1DArray)
+            5660:        5466 Load 5535(sShadow)
+            5661:         316 SampledImage 5659 5660
+            5662:154(f16vec2) Load 156(f16c2)
+            5663:   52(float) Load 215(compare)
+            5664:6(float16_t) Load 137(f16bias)
+            5665:6(float16_t) ImageSampleDrefImplicitLod 5661 5662 5663 Bias 5664
+            5666:    208(ptr) AccessChain 5462(texel) 207
             5667:6(float16_t) Load 5666
             5668:6(float16_t) FAdd 5667 5665
-            5669:    208(ptr) AccessChain 5452(texel) 207
+            5669:    208(ptr) AccessChain 5462(texel) 207
                               Store 5669 5668
-            5670:         283 Load 5606(t2DArray)
-            5671:        5456 Load 5525(sShadow)
+            5670:         283 Load 5616(t2DArray)
+            5671:        5466 Load 5535(sShadow)
             5672:         337 SampledImage 5670 5671
-            5673:175(f16vec3) Load 177(f16c3)
-            5674:   52(float) Load 215(compare)
+            5673:  249(fvec4) Load 251(c4)
+            5674:   52(float) CompositeExtract 5673 3
             5675:6(float16_t) ImageSampleDrefImplicitLod 5672 5673 5674
-            5676:    208(ptr) AccessChain 5452(texel) 207
+            5676:    208(ptr) AccessChain 5462(texel) 207
             5677:6(float16_t) Load 5676
             5678:6(float16_t) FAdd 5677 5675
-            5679:    208(ptr) AccessChain 5452(texel) 207
+            5679:    208(ptr) AccessChain 5462(texel) 207
                               Store 5679 5678
-            5682:         356 Load 5681(t2DRect)
-            5683:        5456 Load 5458(s)
-            5684:         357 SampledImage 5682 5683
-            5685:   53(fvec2) Load 148(c2)
-            5686:  7(f16vec4) ImageSampleImplicitLod 5684 5685
-            5687:  7(f16vec4) Load 5452(texel)
-            5688:  7(f16vec4) FAdd 5687 5686
-                              Store 5452(texel) 5688
-            5689:         356 Load 5681(t2DRect)
-            5690:        5456 Load 5458(s)
-            5691:         357 SampledImage 5689 5690
-            5692:154(f16vec2) Load 156(f16c2)
-            5693:  7(f16vec4) ImageSampleImplicitLod 5691 5692
-            5694:  7(f16vec4) Load 5452(texel)
-            5695:  7(f16vec4) FAdd 5694 5693
-                              Store 5452(texel) 5695
-            5696:         356 Load 5681(t2DRect)
-            5697:        5456 Load 5525(sShadow)
-            5698:         371 SampledImage 5696 5697
-            5699:  167(fvec3) Load 169(c3)
-            5700:   52(float) CompositeExtract 5699 2
-            5701:6(float16_t) ImageSampleDrefImplicitLod 5698 5699 5700
-            5702:    208(ptr) AccessChain 5452(texel) 207
-            5703:6(float16_t) Load 5702
-            5704:6(float16_t) FAdd 5703 5701
-            5705:    208(ptr) AccessChain 5452(texel) 207
-                              Store 5705 5704
-            5706:         356 Load 5681(t2DRect)
-            5707:        5456 Load 5525(sShadow)
+            5680:         283 Load 5616(t2DArray)
+            5681:        5466 Load 5535(sShadow)
+            5682:         337 SampledImage 5680 5681
+            5683:175(f16vec3) Load 177(f16c3)
+            5684:   52(float) Load 215(compare)
+            5685:6(float16_t) ImageSampleDrefImplicitLod 5682 5683 5684
+            5686:    208(ptr) AccessChain 5462(texel) 207
+            5687:6(float16_t) Load 5686
+            5688:6(float16_t) FAdd 5687 5685
+            5689:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5689 5688
+            5692:         356 Load 5691(t2DRect)
+            5693:        5466 Load 5468(s)
+            5694:         357 SampledImage 5692 5693
+            5695:   53(fvec2) Load 148(c2)
+            5696:  7(f16vec4) ImageSampleImplicitLod 5694 5695
+            5697:  7(f16vec4) Load 5462(texel)
+            5698:  7(f16vec4) FAdd 5697 5696
+                              Store 5462(texel) 5698
+            5699:         356 Load 5691(t2DRect)
+            5700:        5466 Load 5468(s)
+            5701:         357 SampledImage 5699 5700
+            5702:154(f16vec2) Load 156(f16c2)
+            5703:  7(f16vec4) ImageSampleImplicitLod 5701 5702
+            5704:  7(f16vec4) Load 5462(texel)
+            5705:  7(f16vec4) FAdd 5704 5703
+                              Store 5462(texel) 5705
+            5706:         356 Load 5691(t2DRect)
+            5707:        5466 Load 5535(sShadow)
             5708:         371 SampledImage 5706 5707
-            5709:154(f16vec2) Load 156(f16c2)
-            5710:   52(float) Load 215(compare)
+            5709:  167(fvec3) Load 169(c3)
+            5710:   52(float) CompositeExtract 5709 2
             5711:6(float16_t) ImageSampleDrefImplicitLod 5708 5709 5710
-            5712:    208(ptr) AccessChain 5452(texel) 207
+            5712:    208(ptr) AccessChain 5462(texel) 207
             5713:6(float16_t) Load 5712
             5714:6(float16_t) FAdd 5713 5711
-            5715:    208(ptr) AccessChain 5452(texel) 207
+            5715:    208(ptr) AccessChain 5462(texel) 207
                               Store 5715 5714
-            5716:         298 Load 5623(tCubeArray)
-            5717:        5456 Load 5525(sShadow)
-            5718:         391 SampledImage 5716 5717
-            5719:  249(fvec4) Load 251(c4)
+            5716:         356 Load 5691(t2DRect)
+            5717:        5466 Load 5535(sShadow)
+            5718:         371 SampledImage 5716 5717
+            5719:154(f16vec2) Load 156(f16c2)
             5720:   52(float) Load 215(compare)
             5721:6(float16_t) ImageSampleDrefImplicitLod 5718 5719 5720
-            5722:    208(ptr) AccessChain 5452(texel) 207
+            5722:    208(ptr) AccessChain 5462(texel) 207
             5723:6(float16_t) Load 5722
             5724:6(float16_t) FAdd 5723 5721
-            5725:    208(ptr) AccessChain 5452(texel) 207
+            5725:    208(ptr) AccessChain 5462(texel) 207
                               Store 5725 5724
-            5726:         298 Load 5623(tCubeArray)
-            5727:        5456 Load 5525(sShadow)
+            5726:         298 Load 5633(tCubeArray)
+            5727:        5466 Load 5535(sShadow)
             5728:         391 SampledImage 5726 5727
-            5729:  7(f16vec4) Load 309(f16c4)
+            5729:  249(fvec4) Load 251(c4)
             5730:   52(float) Load 215(compare)
             5731:6(float16_t) ImageSampleDrefImplicitLod 5728 5729 5730
-            5732:    208(ptr) AccessChain 5452(texel) 207
+            5732:    208(ptr) AccessChain 5462(texel) 207
             5733:6(float16_t) Load 5732
             5734:6(float16_t) FAdd 5733 5731
-            5735:    208(ptr) AccessChain 5452(texel) 207
+            5735:    208(ptr) AccessChain 5462(texel) 207
                               Store 5735 5734
-            5736:  7(f16vec4) Load 5452(texel)
-                              ReturnValue 5736
+            5736:         298 Load 5633(tCubeArray)
+            5737:        5466 Load 5535(sShadow)
+            5738:         391 SampledImage 5736 5737
+            5739:  7(f16vec4) Load 309(f16c4)
+            5740:   52(float) Load 215(compare)
+            5741:6(float16_t) ImageSampleDrefImplicitLod 5738 5739 5740
+            5742:    208(ptr) AccessChain 5462(texel) 207
+            5743:6(float16_t) Load 5742
+            5744:6(float16_t) FAdd 5743 5741
+            5745:    208(ptr) AccessChain 5462(texel) 207
+                              Store 5745 5744
+            5746:  7(f16vec4) Load 5462(texel)
+                              ReturnValue 5746
                               FunctionEnd
 117(testSubpassLoad():  7(f16vec4) Function None 8
              118:             Label
-            5742:        5739 Load 5741(subpass)
-            5744:  7(f16vec4) ImageRead 5742 5743
-            5748:        5745 Load 5747(subpassMS)
-            5749:  7(f16vec4) ImageRead 5748 5743 Sample 1326
-            5750:  7(f16vec4) FAdd 5744 5749
-                              ReturnValue 5750
+            5752:        5749 Load 5751(subpass)
+            5754:  7(f16vec4) ImageRead 5752 5753
+            5758:        5755 Load 5757(subpassMS)
+            5759:  7(f16vec4) ImageRead 5758 5753 Sample 1326
+            5760:  7(f16vec4) FAdd 5754 5759
+                              ReturnValue 5760
                               FunctionEnd
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 2f83604..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): 8000a
-// Id's are bound by 82
+// 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.intcoopmat.comp.out b/Test/baseResults/spv.intcoopmat.comp.out
index e74f44e..6a69743 100644
--- a/Test/baseResults/spv.intcoopmat.comp.out
+++ b/Test/baseResults/spv.intcoopmat.comp.out
@@ -10,8 +10,8 @@
                               Capability VulkanMemoryModelKHR
                               Capability PhysicalStorageBufferAddressesEXT
                               Capability CooperativeMatrixNV
-                              Extension  "SPV_EXT_physical_storage_buffer"
                               Extension  "SPV_KHR_8bit_storage"
+                              Extension  "SPV_KHR_physical_storage_buffer"
                               Extension  "SPV_KHR_storage_buffer_storage_class"
                               Extension  "SPV_KHR_vulkan_memory_model"
                               Extension  "SPV_NV_cooperative_matrix"
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.meshShaderBuiltins.mesh.out b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
index f0c252a..b26122e 100644
--- a/Test/baseResults/spv.meshShaderBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderBuiltins.mesh.out
@@ -5,7 +5,6 @@
 
                               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 907ae28..86a4fd2 100644
--- a/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderPerViewBuiltins.mesh.out
@@ -3,7 +3,6 @@
 // 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 26e8624..e9eaed3 100644
--- a/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
+++ b/Test/baseResults/spv.meshShaderPerViewUserDefined.mesh.out
@@ -1,5 +1,4 @@
 spv.meshShaderPerViewUserDefined.mesh
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 108
diff --git a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
index 66c3a0d..bfd2d85 100644
--- a/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
+++ b/Test/baseResults/spv.meshShaderRedeclBuiltins.mesh.out
@@ -5,7 +5,6 @@
 
                               Capability ClipDistance
                               Capability CullDistance
-                              Capability MultiViewport
                               Capability ShaderViewportMaskNV
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
diff --git a/Test/baseResults/spv.nonuniform.frag.out b/Test/baseResults/spv.nonuniform.frag.out
index 8d61619..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): 8000a
-// Id's are bound by 212
+// 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.nonuniform4.frag.out b/Test/baseResults/spv.nonuniform4.frag.out
index 92cbd36..6bfc957 100644
--- a/Test/baseResults/spv.nonuniform4.frag.out
+++ b/Test/baseResults/spv.nonuniform4.frag.out
@@ -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.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.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.precision.frag.out b/Test/baseResults/spv.precision.frag.out
index 973147d..1d31230 100644
--- a/Test/baseResults/spv.precision.frag.out
+++ b/Test/baseResults/spv.precision.frag.out
@@ -1,14 +1,15 @@
 spv.precision.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 146
+// Id's are bound by 165
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 23 62 64 76 119
+                              EntryPoint Fragment 4  "main" 23 62 64 76 119 149
                               ExecutionMode 4 OriginUpperLeft
                               Source ESSL 310
+                              SourceExtension  "GL_OES_sample_variables"
                               Name 4  "main"
                               Name 12  "foo(vf3;"
                               Name 11  "mv3"
@@ -33,6 +34,7 @@
                               MemberName 117(S) 0  "a"
                               MemberName 117(S) 1  "b"
                               Name 119  "s"
+                              Name 149  "gl_SampleMaskIn"
                               Decorate 12(foo(vf3;) RelaxedPrecision
                               Decorate 11(mv3) RelaxedPrecision
                               Decorate 23(highfin) Location 2
@@ -97,6 +99,15 @@
                               Decorate 143 RelaxedPrecision
                               Decorate 144 RelaxedPrecision
                               Decorate 145 RelaxedPrecision
+                              Decorate 149(gl_SampleMaskIn) Flat
+                              Decorate 149(gl_SampleMaskIn) BuiltIn SampleMask
+                              Decorate 153 RelaxedPrecision
+                              Decorate 156 RelaxedPrecision
+                              Decorate 159 RelaxedPrecision
+                              Decorate 160 RelaxedPrecision
+                              Decorate 162 RelaxedPrecision
+                              Decorate 163 RelaxedPrecision
+                              Decorate 164 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -147,6 +158,11 @@
              133:    6(float) Constant 1082549862
              138:    6(float) Constant 1073741824
              142:    6(float) Constant 1077936128
+             146:     95(int) Constant 1
+             147:             TypeArray 39(int) 146
+             148:             TypePointer Input 147
+149(gl_SampleMaskIn):    148(ptr) Variable Input
+             150:             TypePointer Input 39(int)
          4(main):           2 Function None 3
                5:             Label
          41(sum):     40(ptr) Variable Function
@@ -156,6 +172,7 @@
  72(local_highp):     71(ptr) Variable Function
       108(param):     16(ptr) Variable Function
              135:     71(ptr) Variable Function
+             156:     71(ptr) Variable Function
               44:     39(int) Load 43(uniform_medium)
               46:     39(int) Load 45(uniform_high)
               47:     39(int) IAdd 44 46
@@ -249,6 +266,26 @@
              137:             Label
              145:   21(fvec4) Load 135
                               Store 76(mediumfout) 145
+             151:    150(ptr) AccessChain 149(gl_SampleMaskIn) 120
+             152:     39(int) Load 151
+             153:     39(int) Load 43(uniform_medium)
+             154:     39(int) ShiftRightArithmetic 152 153
+             155:    14(bool) SGreaterThan 154 120
+                              SelectionMerge 158 None
+                              BranchConditional 155 157 161
+             157:               Label
+             159:   21(fvec4)   Load 76(mediumfout)
+             160:   21(fvec4)   VectorTimesScalar 159 138
+                                Store 156 160
+                                Branch 158
+             161:               Label
+             162:   21(fvec4)   Load 76(mediumfout)
+             163:   21(fvec4)   VectorTimesScalar 162 142
+                                Store 156 163
+                                Branch 158
+             158:             Label
+             164:   21(fvec4) Load 156
+                              Store 76(mediumfout) 164
                               Return
                               FunctionEnd
     12(foo(vf3;):    9(fvec2) Function None 10
diff --git a/Test/baseResults/spv.precisionArgs.frag.out b/Test/baseResults/spv.precisionArgs.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.precisionTexture.frag.out b/Test/baseResults/spv.precisionTexture.frag.out
old mode 100755
new mode 100644
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.rw.autoassign.frag.out b/Test/baseResults/spv.rw.autoassign.frag.out
index 43adedd..c696c52 100644
--- a/Test/baseResults/spv.rw.autoassign.frag.out
+++ b/Test/baseResults/spv.rw.autoassign.frag.out
@@ -1,4 +1,5 @@
 spv.rw.autoassign.frag
+Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 42
diff --git a/Test/baseResults/spv.scalarlayout.frag.out b/Test/baseResults/spv.scalarlayout.frag.out
index 549efaa..e08721f 100644
--- a/Test/baseResults/spv.scalarlayout.frag.out
+++ b/Test/baseResults/spv.scalarlayout.frag.out
@@ -1,5 +1,4 @@
 spv.scalarlayout.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 20
diff --git a/Test/baseResults/spv.scalarlayoutfloat16.frag.out b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
index fc0dca8..4f22730 100644
--- a/Test/baseResults/spv.scalarlayoutfloat16.frag.out
+++ b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
@@ -1,5 +1,4 @@
 spv.scalarlayoutfloat16.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
 // Id's are bound by 18
diff --git a/Test/baseResults/spv.sparseTexture.frag.out b/Test/baseResults/spv.sparseTexture.frag.out
index 0f7c687..bf44b81 100644
--- a/Test/baseResults/spv.sparseTexture.frag.out
+++ b/Test/baseResults/spv.sparseTexture.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 438
+// Id's are bound by 442
 
                               Capability Shader
                               Capability ImageGatherExtended
@@ -12,7 +12,7 @@
                               Capability SampledCubeArray
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 33 48 89 365 393 405 423
+                              EntryPoint Fragment 4  "main" 33 48 89 397 409 427
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_ARB_sparse_texture2"
@@ -40,13 +40,12 @@
                               Name 228  "is2DArray"
                               Name 261  "sCubeShadow"
                               Name 294  "s2DRectShadow"
-                              Name 365  "offsets"
-                              Name 390  "i2D"
-                              Name 393  "ic2"
-                              Name 402  "ii3D"
-                              Name 405  "ic3"
-                              Name 414  "i2DMS"
-                              Name 423  "outColor"
+                              Name 394  "i2D"
+                              Name 397  "ic2"
+                              Name 406  "ii3D"
+                              Name 409  "ic3"
+                              Name 418  "i2DMS"
+                              Name 427  "outColor"
                               Decorate 29(s2D) DescriptorSet 0
                               Decorate 29(s2D) Binding 0
                               Decorate 33(c2) Location 0
@@ -74,19 +73,17 @@
                               Decorate 261(sCubeShadow) Binding 3
                               Decorate 294(s2DRectShadow) DescriptorSet 0
                               Decorate 294(s2DRectShadow) Binding 5
-                              Decorate 365(offsets) Flat
-                              Decorate 365(offsets) Location 5
-                              Decorate 390(i2D) DescriptorSet 0
-                              Decorate 390(i2D) Binding 12
-                              Decorate 393(ic2) Flat
-                              Decorate 393(ic2) Location 3
-                              Decorate 402(ii3D) DescriptorSet 0
-                              Decorate 402(ii3D) Binding 13
-                              Decorate 405(ic3) Flat
-                              Decorate 405(ic3) Location 4
-                              Decorate 414(i2DMS) DescriptorSet 0
-                              Decorate 414(i2DMS) Binding 14
-                              Decorate 423(outColor) Location 0
+                              Decorate 394(i2D) DescriptorSet 0
+                              Decorate 394(i2D) Binding 12
+                              Decorate 397(ic2) Flat
+                              Decorate 397(ic2) Location 3
+                              Decorate 406(ii3D) DescriptorSet 0
+                              Decorate 406(ii3D) Binding 13
+                              Decorate 409(ic3) Flat
+                              Decorate 409(ic3) Location 4
+                              Decorate 418(i2DMS) DescriptorSet 0
+                              Decorate 418(i2DMS) Binding 14
+                              Decorate 427(outColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -189,31 +186,38 @@
              340:  143(ivec2) ConstantComposite 192 192
              362:     20(int) Constant 4
              363:             TypeArray 143(ivec2) 362
-             364:             TypePointer Input 363
-    365(offsets):    364(ptr) Variable Input
-             388:             TypeImage 10(float) 2D nonsampled format:Rgba32f
-             389:             TypePointer UniformConstant 388
-        390(i2D):    389(ptr) Variable UniformConstant
-             392:             TypePointer Input 143(ivec2)
-        393(ic2):    392(ptr) Variable Input
-             400:             TypeImage 6(int) 3D nonsampled format:Rgba32i
-             401:             TypePointer UniformConstant 400
-       402(ii3D):    401(ptr) Variable UniformConstant
-             404:             TypePointer Input 129(ivec3)
-        405(ic3):    404(ptr) Variable Input
-             412:             TypeImage 10(float) 2D multi-sampled nonsampled format:Rgba32f
-             413:             TypePointer UniformConstant 412
-      414(i2DMS):    413(ptr) Variable UniformConstant
-             422:             TypePointer Output 11(fvec4)
-   423(outColor):    422(ptr) Variable Output
-             425:             TypeBool
+             364:      6(int) Constant 1
+             365:  143(ivec2) ConstantComposite 364 130
+             366:  143(ivec2) ConstantComposite 144 192
+             367:      6(int) Constant 15
+             368:      6(int) Constant 16
+             369:  143(ivec2) ConstantComposite 367 368
+             370:      6(int) Constant 4294967294
+             371:  143(ivec2) ConstantComposite 370 9
+             372:         363 ConstantComposite 365 366 369 371
+             392:             TypeImage 10(float) 2D nonsampled format:Rgba32f
+             393:             TypePointer UniformConstant 392
+        394(i2D):    393(ptr) Variable UniformConstant
+             396:             TypePointer Input 143(ivec2)
+        397(ic2):    396(ptr) Variable Input
+             404:             TypeImage 6(int) 3D nonsampled format:Rgba32i
+             405:             TypePointer UniformConstant 404
+       406(ii3D):    405(ptr) Variable UniformConstant
+             408:             TypePointer Input 129(ivec3)
+        409(ic3):    408(ptr) Variable Input
+             416:             TypeImage 10(float) 2D multi-sampled nonsampled format:Rgba32f
+             417:             TypePointer UniformConstant 416
+      418(i2DMS):    417(ptr) Variable UniformConstant
+             426:             TypePointer Output 11(fvec4)
+   427(outColor):    426(ptr) Variable Output
+             429:             TypeBool
          4(main):           2 Function None 3
                5:             Label
      8(resident):      7(ptr) Variable Function
        13(texel):     12(ptr) Variable Function
       18(itexel):     17(ptr) Variable Function
       23(utexel):     22(ptr) Variable Function
-             427:     12(ptr) Variable Function
+             431:     12(ptr) Variable Function
                               Store 8(resident) 9
                               Store 13(texel) 15
                               Store 18(itexel) 19
@@ -534,79 +538,76 @@
                               Store 8(resident) 359
              360:          27 Load 29(s2D)
              361:   31(fvec2) Load 33(c2)
-             366:         363 Load 365(offsets)
-             367: 35(ResType) ImageSparseGather 360 361 9 ConstOffsets 366
-             368:   11(fvec4) CompositeExtract 367 1
-                              Store 13(texel) 368
-             369:      6(int) CompositeExtract 367 0
-             370:      6(int) Load 8(resident)
-             371:      6(int) BitwiseOr 370 369
-                              Store 8(resident) 371
-             372:         226 Load 228(is2DArray)
-             373:   46(fvec3) Load 48(c3)
-             374:         363 Load 365(offsets)
-             375: 62(ResType) ImageSparseGather 372 373 130 ConstOffsets 374
-             376:   16(ivec4) CompositeExtract 375 1
-                              Store 18(itexel) 376
-             377:      6(int) CompositeExtract 375 0
-             378:      6(int) Load 8(resident)
-             379:      6(int) BitwiseOr 378 377
-                              Store 8(resident) 379
-             380:         292 Load 294(s2DRectShadow)
-             381:   31(fvec2) Load 33(c2)
-             382:         363 Load 365(offsets)
-             383: 35(ResType) ImageSparseDrefGather 380 381 50 ConstOffsets 382
-             384:   11(fvec4) CompositeExtract 383 1
-                              Store 13(texel) 384
-             385:      6(int) CompositeExtract 383 0
-             386:      6(int) Load 8(resident)
-             387:      6(int) BitwiseOr 386 385
-                              Store 8(resident) 387
-             391:         388 Load 390(i2D)
-             394:  143(ivec2) Load 393(ic2)
-             395: 35(ResType) ImageSparseRead 391 394
-             396:   11(fvec4) CompositeExtract 395 1
-                              Store 13(texel) 396
-             397:      6(int) CompositeExtract 395 0
-             398:      6(int) Load 8(resident)
-             399:      6(int) BitwiseOr 398 397
-                              Store 8(resident) 399
-             403:         400 Load 402(ii3D)
-             406:  129(ivec3) Load 405(ic3)
-             407: 62(ResType) ImageSparseRead 403 406
-             408:   16(ivec4) CompositeExtract 407 1
-                              Store 18(itexel) 408
-             409:      6(int) CompositeExtract 407 0
-             410:      6(int) Load 8(resident)
-             411:      6(int) BitwiseOr 410 409
-                              Store 8(resident) 411
-             415:         412 Load 414(i2DMS)
-             416:  143(ivec2) Load 393(ic2)
-             417: 35(ResType) ImageSparseRead 415 416 Sample 144
-             418:   11(fvec4) CompositeExtract 417 1
-                              Store 13(texel) 418
-             419:      6(int) CompositeExtract 417 0
-             420:      6(int) Load 8(resident)
-             421:      6(int) BitwiseOr 420 419
-                              Store 8(resident) 421
+             373: 35(ResType) ImageSparseGather 360 361 9 ConstOffsets 372
+             374:   11(fvec4) CompositeExtract 373 1
+                              Store 13(texel) 374
+             375:      6(int) CompositeExtract 373 0
+             376:      6(int) Load 8(resident)
+             377:      6(int) BitwiseOr 376 375
+                              Store 8(resident) 377
+             378:         226 Load 228(is2DArray)
+             379:   46(fvec3) Load 48(c3)
+             380: 62(ResType) ImageSparseGather 378 379 130 ConstOffsets 372
+             381:   16(ivec4) CompositeExtract 380 1
+                              Store 18(itexel) 381
+             382:      6(int) CompositeExtract 380 0
+             383:      6(int) Load 8(resident)
+             384:      6(int) BitwiseOr 383 382
+                              Store 8(resident) 384
+             385:         292 Load 294(s2DRectShadow)
+             386:   31(fvec2) Load 33(c2)
+             387: 35(ResType) ImageSparseDrefGather 385 386 50 ConstOffsets 372
+             388:   11(fvec4) CompositeExtract 387 1
+                              Store 13(texel) 388
+             389:      6(int) CompositeExtract 387 0
+             390:      6(int) Load 8(resident)
+             391:      6(int) BitwiseOr 390 389
+                              Store 8(resident) 391
+             395:         392 Load 394(i2D)
+             398:  143(ivec2) Load 397(ic2)
+             399: 35(ResType) ImageSparseRead 395 398
+             400:   11(fvec4) CompositeExtract 399 1
+                              Store 13(texel) 400
+             401:      6(int) CompositeExtract 399 0
+             402:      6(int) Load 8(resident)
+             403:      6(int) BitwiseOr 402 401
+                              Store 8(resident) 403
+             407:         404 Load 406(ii3D)
+             410:  129(ivec3) Load 409(ic3)
+             411: 62(ResType) ImageSparseRead 407 410
+             412:   16(ivec4) CompositeExtract 411 1
+                              Store 18(itexel) 412
+             413:      6(int) CompositeExtract 411 0
+             414:      6(int) Load 8(resident)
+             415:      6(int) BitwiseOr 414 413
+                              Store 8(resident) 415
+             419:         416 Load 418(i2DMS)
+             420:  143(ivec2) Load 397(ic2)
+             421: 35(ResType) ImageSparseRead 419 420 Sample 144
+             422:   11(fvec4) CompositeExtract 421 1
+                              Store 13(texel) 422
+             423:      6(int) CompositeExtract 421 0
              424:      6(int) Load 8(resident)
-             426:   425(bool) ImageSparseTexelsResident 424
-                              SelectionMerge 429 None
-                              BranchConditional 426 428 431
-             428:               Label
-             430:   11(fvec4)   Load 13(texel)
-                                Store 427 430
-                                Branch 429
-             431:               Label
-             432:   16(ivec4)   Load 18(itexel)
-             433:   11(fvec4)   ConvertSToF 432
-             434:   21(ivec4)   Load 23(utexel)
-             435:   11(fvec4)   ConvertUToF 434
-             436:   11(fvec4)   FAdd 433 435
-                                Store 427 436
-                                Branch 429
-             429:             Label
-             437:   11(fvec4) Load 427
-                              Store 423(outColor) 437
+             425:      6(int) BitwiseOr 424 423
+                              Store 8(resident) 425
+             428:      6(int) Load 8(resident)
+             430:   429(bool) ImageSparseTexelsResident 428
+                              SelectionMerge 433 None
+                              BranchConditional 430 432 435
+             432:               Label
+             434:   11(fvec4)   Load 13(texel)
+                                Store 431 434
+                                Branch 433
+             435:               Label
+             436:   16(ivec4)   Load 18(itexel)
+             437:   11(fvec4)   ConvertSToF 436
+             438:   21(ivec4)   Load 23(utexel)
+             439:   11(fvec4)   ConvertUToF 438
+             440:   11(fvec4)   FAdd 437 439
+                                Store 431 440
+                                Branch 433
+             433:             Label
+             441:   11(fvec4) Load 431
+                              Store 427(outColor) 441
                               Return
                               FunctionEnd
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.vert.out b/Test/baseResults/spv.specConstant.vert.out
index 921cc68..f7d4381 100644
--- a/Test/baseResults/spv.specConstant.vert.out
+++ b/Test/baseResults/spv.specConstant.vert.out
@@ -11,7 +11,7 @@
                               Source GLSL 400
                               Name 4  "main"
                               Name 9  "arraySize"
-                              Name 14  "foo(vf4[s4546];"
+                              Name 14  "foo(vf4[s216172782];"
                               Name 13  "p"
                               Name 17  "builtin_spec_constant("
                               Name 20  "color"
@@ -106,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[s216172782];) 47(param)
                               Return
                               FunctionEnd
-14(foo(vf4[s4546];):           2 Function None 12
+14(foo(vf4[s216172782];):           2 Function None 12
            13(p):     11(ptr) FunctionParameter
               15:             Label
               54:     24(ptr) AccessChain 53(dupUcol) 23
diff --git a/Test/baseResults/spv.specTexture.frag.out b/Test/baseResults/spv.specTexture.frag.out
old mode 100755
new mode 100644
diff --git a/Test/baseResults/spv.stereoViewRendering.tesc.out b/Test/baseResults/spv.stereoViewRendering.tesc.out
index a357346..f01e53b 100644
--- a/Test/baseResults/spv.stereoViewRendering.tesc.out
+++ b/Test/baseResults/spv.stereoViewRendering.tesc.out
@@ -3,7 +3,6 @@
 // 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 0667cb8..e74921a 100644
--- a/Test/baseResults/spv.stereoViewRendering.vert.out
+++ b/Test/baseResults/spv.stereoViewRendering.vert.out
@@ -4,7 +4,6 @@
 // Id's are bound by 27
 
                               Capability Shader
-                              Capability Geometry
                               Capability ShaderViewportIndexLayerNV
                               Capability ShaderViewportMaskNV
                               Capability ShaderStereoViewNV
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.viewportArray2.tesc.out b/Test/baseResults/spv.viewportArray2.tesc.out
index 6a9dccc..74235a5 100644
--- a/Test/baseResults/spv.viewportArray2.tesc.out
+++ b/Test/baseResults/spv.viewportArray2.tesc.out
@@ -4,9 +4,7 @@
 // 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 96e5b07..cf29cd7 100644
--- a/Test/baseResults/spv.viewportArray2.vert.out
+++ b/Test/baseResults/spv.viewportArray2.vert.out
@@ -4,8 +4,6 @@
 // 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/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/vk.relaxed.changeSet.vert.out b/Test/baseResults/vk.relaxed.changeSet.vert.out
new file mode 100755
index 0000000..f6bce29
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.changeSet.vert.out
@@ -0,0 +1,281 @@
+vk.relaxed.changeSet.vert
+Shader version: 460
+0:? Sequence
+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        'Color' ( smooth out highp 4-component vector of float)
+0:13        'aColor' ( in highp 4-component vector of float)
+0:14      move second child to first child ( temp highp 2-component vector of float)
+0:14        'UV' ( smooth out highp 2-component vector of float)
+0:14        'aUV' ( in highp 2-component vector of float)
+0:15      move second child to first child ( temp highp 4-component vector of float)
+0:15        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:15          'anon@1' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:15          Constant:
+0:15            0 (const uint)
+0:15        matrix-times-vector ( temp highp 4-component vector of float)
+0:15          projectionMatrix: direct index for structure ( uniform highp 4X4 matrix of float)
+0:15            'anon@0' (layout( column_major std140) uniform block{ uniform highp 4X4 matrix of float projectionMatrix})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          Construct vec4 ( temp highp 4-component vector of float)
+0:15            'aPos' ( in highp 2-component vector of float)
+0:15            Constant:
+0:15              0.000000
+0:15            Constant:
+0:15              1.000000
+0:?   Linker Objects
+0:?     'aPos' ( in highp 2-component vector of float)
+0:?     'aUV' ( in highp 2-component vector of float)
+0:?     'aColor' ( in highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4X4 matrix of float projectionMatrix})
+0:?     'Color' ( smooth out highp 4-component vector of float)
+0:?     'UV' ( smooth out highp 2-component vector of float)
+0:?     'anon@1' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out unsized 1-element array of float ClipDistance gl_ClipDistance,  out unsized 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+
+vk.relaxed.changeSet.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp highp 4-component vector of float)
+0:12        'fragColor' (layout( location=0) out highp 4-component vector of float)
+0:12        vector-scale ( temp highp 4-component vector of float)
+0:12          'Color' ( smooth in highp 4-component vector of float)
+0:12          direct index ( temp highp float)
+0:12            texture ( global highp 4-component vector of float)
+0:12              'sTexture' ( uniform highp sampler2D)
+0:12              vector swizzle ( temp highp 2-component vector of float)
+0:12                'UV' ( smooth in highp 2-component vector of float)
+0:12                Sequence
+0:12                  Constant:
+0:12                    0 (const int)
+0:12                  Constant:
+0:12                    1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:?   Linker Objects
+0:?     'fragColor' (layout( location=0) out highp 4-component vector of float)
+0:?     'sTexture' ( uniform highp sampler2D)
+0:?     'Color' ( smooth in highp 4-component vector of float)
+0:?     'UV' ( smooth in highp 2-component vector of float)
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+0:? Sequence
+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        'Color' ( smooth out highp 4-component vector of float)
+0:13        'aColor' ( in highp 4-component vector of float)
+0:14      move second child to first child ( temp highp 2-component vector of float)
+0:14        'UV' ( smooth out highp 2-component vector of float)
+0:14        'aUV' ( in highp 2-component vector of float)
+0:15      move second child to first child ( temp highp 4-component vector of float)
+0:15        gl_Position: direct index for structure ( gl_Position highp 4-component vector of float Position)
+0:15          'anon@1' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  out 1-element array of float CullDistance gl_CullDistance})
+0:15          Constant:
+0:15            0 (const uint)
+0:15        matrix-times-vector ( temp highp 4-component vector of float)
+0:15          projectionMatrix: direct index for structure ( uniform highp 4X4 matrix of float)
+0:15            'anon@0' (layout( column_major std140) uniform block{ uniform highp 4X4 matrix of float projectionMatrix})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          Construct vec4 ( temp highp 4-component vector of float)
+0:15            'aPos' ( in highp 2-component vector of float)
+0:15            Constant:
+0:15              0.000000
+0:15            Constant:
+0:15              1.000000
+0:?   Linker Objects
+0:?     'aPos' ( in highp 2-component vector of float)
+0:?     'aUV' ( in highp 2-component vector of float)
+0:?     'aColor' ( in highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4X4 matrix of float projectionMatrix})
+0:?     'Color' ( smooth out highp 4-component vector of float)
+0:?     'UV' ( smooth out highp 2-component vector of float)
+0:?     'anon@1' ( out block{ gl_Position 4-component vector of float Position gl_Position,  gl_PointSize float PointSize gl_PointSize,  out 1-element array of float ClipDistance gl_ClipDistance,  out 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: main( ( global void)
+0:10    Function Parameters: 
+0:12    Sequence
+0:12      move second child to first child ( temp highp 4-component vector of float)
+0:12        'fragColor' (layout( location=0) out highp 4-component vector of float)
+0:12        vector-scale ( temp highp 4-component vector of float)
+0:12          'Color' ( smooth in highp 4-component vector of float)
+0:12          direct index ( temp highp float)
+0:12            texture ( global highp 4-component vector of float)
+0:12              'sTexture' ( uniform highp sampler2D)
+0:12              vector swizzle ( temp highp 2-component vector of float)
+0:12                'UV' ( smooth in highp 2-component vector of float)
+0:12                Sequence
+0:12                  Constant:
+0:12                    0 (const int)
+0:12                  Constant:
+0:12                    1 (const int)
+0:12            Constant:
+0:12              0 (const int)
+0:?   Linker Objects
+0:?     'fragColor' (layout( location=0) out highp 4-component vector of float)
+0:?     'sTexture' ( uniform highp sampler2D)
+0:?     'Color' ( smooth in highp 4-component vector of float)
+0:?     'UV' ( smooth in highp 2-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 46
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 9 11 15 17 24 34 44 45
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "Color"
+                              Name 11  "aColor"
+                              Name 15  "UV"
+                              Name 17  "aUV"
+                              Name 22  "gl_PerVertex"
+                              MemberName 22(gl_PerVertex) 0  "gl_Position"
+                              MemberName 22(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 22(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 22(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 24  ""
+                              Name 28  "gl_DefaultUniformBlock"
+                              MemberName 28(gl_DefaultUniformBlock) 0  "projectionMatrix"
+                              Name 30  ""
+                              Name 34  "aPos"
+                              Name 44  "gl_VertexID"
+                              Name 45  "gl_InstanceID"
+                              Decorate 9(Color) Location 0
+                              Decorate 11(aColor) Location 2
+                              Decorate 15(UV) Location 1
+                              Decorate 17(aUV) Location 1
+                              MemberDecorate 22(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 22(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 22(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 22(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 22(gl_PerVertex) Block
+                              MemberDecorate 28(gl_DefaultUniformBlock) 0 ColMajor
+                              MemberDecorate 28(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 28(gl_DefaultUniformBlock) 0 MatrixStride 16
+                              Decorate 28(gl_DefaultUniformBlock) Block
+                              Decorate 30 DescriptorSet 0
+                              Decorate 30 Binding 0
+                              Decorate 34(aPos) Location 0
+                              Decorate 44(gl_VertexID) BuiltIn VertexIndex
+                              Decorate 45(gl_InstanceID) BuiltIn InstanceIndex
+               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:             TypePointer Input 7(fvec4)
+      11(aColor):     10(ptr) Variable Input
+              13:             TypeVector 6(float) 2
+              14:             TypePointer Output 13(fvec2)
+          15(UV):     14(ptr) Variable Output
+              16:             TypePointer Input 13(fvec2)
+         17(aUV):     16(ptr) Variable Input
+              19:             TypeInt 32 0
+              20:     19(int) Constant 1
+              21:             TypeArray 6(float) 20
+22(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 21 21
+              23:             TypePointer Output 22(gl_PerVertex)
+              24:     23(ptr) Variable Output
+              25:             TypeInt 32 1
+              26:     25(int) Constant 0
+              27:             TypeMatrix 7(fvec4) 4
+28(gl_DefaultUniformBlock):             TypeStruct 27
+              29:             TypePointer Uniform 28(gl_DefaultUniformBlock)
+              30:     29(ptr) Variable Uniform
+              31:             TypePointer Uniform 27
+        34(aPos):     16(ptr) Variable Input
+              36:    6(float) Constant 0
+              37:    6(float) Constant 1065353216
+              43:             TypePointer Input 25(int)
+ 44(gl_VertexID):     43(ptr) Variable Input
+45(gl_InstanceID):     43(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(fvec4) Load 11(aColor)
+                              Store 9(Color) 12
+              18:   13(fvec2) Load 17(aUV)
+                              Store 15(UV) 18
+              32:     31(ptr) AccessChain 30 26
+              33:          27 Load 32
+              35:   13(fvec2) Load 34(aPos)
+              38:    6(float) CompositeExtract 35 0
+              39:    6(float) CompositeExtract 35 1
+              40:    7(fvec4) CompositeConstruct 38 39 36 37
+              41:    7(fvec4) MatrixTimesVector 33 40
+              42:      8(ptr) AccessChain 24 26
+                              Store 42 41
+                              Return
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 27
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11 20
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "fragColor"
+                              Name 11  "Color"
+                              Name 16  "sTexture"
+                              Name 20  "UV"
+                              Decorate 9(fragColor) Location 0
+                              Decorate 11(Color) Location 0
+                              Decorate 16(sTexture) DescriptorSet 1
+                              Decorate 16(sTexture) Binding 0
+                              Decorate 20(UV) Location 1
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+    9(fragColor):      8(ptr) Variable Output
+              10:             TypePointer Input 7(fvec4)
+       11(Color):     10(ptr) Variable Input
+              13:             TypeImage 6(float) 2D sampled format:Unknown
+              14:             TypeSampledImage 13
+              15:             TypePointer UniformConstant 14
+    16(sTexture):     15(ptr) Variable UniformConstant
+              18:             TypeVector 6(float) 2
+              19:             TypePointer Input 18(fvec2)
+          20(UV):     19(ptr) Variable Input
+              23:             TypeInt 32 0
+              24:     23(int) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(fvec4) Load 11(Color)
+              17:          14 Load 16(sTexture)
+              21:   18(fvec2) Load 20(UV)
+              22:    7(fvec4) ImageSampleImplicitLod 17 21
+              25:    6(float) CompositeExtract 22 0
+              26:    7(fvec4) VectorTimesScalar 12 25
+                              Store 9(fragColor) 26
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/vk.relaxed.errorcheck.vert.out b/Test/baseResults/vk.relaxed.errorcheck.vert.out
new file mode 100644
index 0000000..f19eae6
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.errorcheck.vert.out
@@ -0,0 +1,124 @@
+vk.relaxed.errorcheck.vert
+Shader version: 460
+0:? Sequence
+0:9  Function Definition: foo( ( global highp 4-component vector of float)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Branch: Return with expression
+0:10        vector swizzle ( temp highp 4-component vector of float)
+0:10          a: direct index for structure ( uniform highp 2-component vector of float)
+0:10            'anon@0' (layout( column_major std140) uniform block{ uniform highp 2-component vector of float a})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          Sequence
+0:10            Constant:
+0:10              0 (const int)
+0:10            Constant:
+0:10              1 (const int)
+0:10            Constant:
+0:10              0 (const int)
+0:10            Constant:
+0:10              1 (const int)
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp highp 4-component vector of float)
+0:14        'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:14        Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 2-component vector of float a})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+
+vk.relaxed.errorcheck.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: foo( ( global highp 4-component vector of float)
+0:10    Function Parameters: 
+0:11    Sequence
+0:11      Branch: Return with expression
+0:11        a: direct index for structure ( uniform highp 4-component vector of float)
+0:11          'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a})
+0:11          Constant:
+0:11            0 (const uint)
+0:14  Function Definition: main( ( global void)
+0:14    Function Parameters: 
+0:15    Sequence
+0:15      move second child to first child ( temp highp 4-component vector of float)
+0:15        'o' ( out highp 4-component vector of float)
+0:15        add ( temp highp 4-component vector of float)
+0:15          'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:15          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a})
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+ERROR: Linking unknown stage stage: Types must match:
+    a: " uniform highp 2-component vector of float" versus " uniform highp 4-component vector of float"
+
+Shader version: 460
+0:? Sequence
+0:9  Function Definition: foo( ( global highp 4-component vector of float)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Branch: Return with expression
+0:10        vector swizzle ( temp highp 4-component vector of float)
+0:10          a: direct index for structure ( uniform highp 2-component vector of float)
+0:10            'anon@0' (layout( column_major std140) uniform block{ uniform highp 2-component vector of float a})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          Sequence
+0:10            Constant:
+0:10              0 (const int)
+0:10            Constant:
+0:10              1 (const int)
+0:10            Constant:
+0:10              0 (const int)
+0:10            Constant:
+0:10              1 (const int)
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp highp 4-component vector of float)
+0:14        'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:14        Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 2-component vector of float a})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:10  Function Definition: foo( ( global highp 4-component vector of float)
+0:10    Function Parameters: 
+0:11    Sequence
+0:11      Branch: Return with expression
+0:11        a: direct index for structure ( uniform highp 4-component vector of float)
+0:11          'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a})
+0:11          Constant:
+0:11            0 (const uint)
+0:14  Function Definition: main( ( global void)
+0:14    Function Parameters: 
+0:15    Sequence
+0:15      move second child to first child ( temp highp 4-component vector of float)
+0:15        'o' ( out highp 4-component vector of float)
+0:15        add ( temp highp 4-component vector of float)
+0:15          'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:15          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a})
+
+Validation failed
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/vk.relaxed.frag.out b/Test/baseResults/vk.relaxed.frag.out
new file mode 100644
index 0000000..d98910e
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.frag.out
@@ -0,0 +1,826 @@
+vk.relaxed.frag
+WARNING: 0:7: 'b' : Ignoring initializer for uniform 
+WARNING: 0:8: 'c' : ignoring layout qualifier for uniform location
+
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:36  Function Definition: bar( ( global highp uint)
+0:36    Function Parameters: 
+0:37    Sequence
+0:37      Sequence
+0:37        move second child to first child ( temp highp uint)
+0:37          'j' ( temp highp uint)
+0:37          Constant:
+0:37            0 (const uint)
+0:38      move second child to first child ( temp highp uint)
+0:38        'j' ( temp highp uint)
+0:38        AtomicAdd ( global highp uint)
+0:38          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:38            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:38            Constant:
+0:38              0 (const uint)
+0:38          Constant:
+0:38            1 (const uint)
+0:39      move second child to first child ( temp highp uint)
+0:39        'j' ( temp highp uint)
+0:39        subtract ( temp highp uint)
+0:39          AtomicAdd ( global highp uint)
+0:39            counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:39              'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            Constant:
+0:39              4294967295 (const uint)
+0:39          Constant:
+0:39            1 (const uint)
+0:40      move second child to first child ( temp highp uint)
+0:40        'j' ( temp highp uint)
+0:40        counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:40          'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:40          Constant:
+0:40            0 (const uint)
+0:42      move second child to first child ( temp highp uint)
+0:42        'j' ( temp highp uint)
+0:42        AtomicAdd ( global highp uint)
+0:42          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:42            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:42            Constant:
+0:42              0 (const uint)
+0:42          Constant:
+0:42            1 (const uint)
+0:43      move second child to first child ( temp highp uint)
+0:43        'j' ( temp highp uint)
+0:43        AtomicAdd ( global highp uint)
+0:43          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:43            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:43            Constant:
+0:43              0 (const uint)
+0:43          Constant:
+0:43            4294967295 (const uint)
+0:44      move second child to first child ( temp highp uint)
+0:44        'j' ( temp highp uint)
+0:44        AtomicSubtract ( global highp uint)
+0:44          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:44            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:44            Constant:
+0:44              0 (const uint)
+0:44          Constant:
+0:44            1 (const uint)
+0:46      move second child to first child ( temp highp uint)
+0:46        'j' ( temp highp uint)
+0:46        AtomicMin ( global highp uint)
+0:46          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:46            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:46            Constant:
+0:46              0 (const uint)
+0:46          'j' ( temp highp uint)
+0:47      move second child to first child ( temp highp uint)
+0:47        'j' ( temp highp uint)
+0:47        AtomicMax ( global highp uint)
+0:47          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:47            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:47            Constant:
+0:47              0 (const uint)
+0:47          'j' ( temp highp uint)
+0:48      move second child to first child ( temp highp uint)
+0:48        'j' ( temp highp uint)
+0:48        AtomicAnd ( global highp uint)
+0:48          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:48            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:48            Constant:
+0:48              0 (const uint)
+0:48          'j' ( temp highp uint)
+0:50      move second child to first child ( temp highp uint)
+0:50        'j' ( temp highp uint)
+0:50        AtomicOr ( global highp uint)
+0:50          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:50            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:50            Constant:
+0:50              0 (const uint)
+0:50          'j' ( temp highp uint)
+0:51      move second child to first child ( temp highp uint)
+0:51        'j' ( temp highp uint)
+0:51        AtomicXor ( global highp uint)
+0:51          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:51            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:51            Constant:
+0:51              0 (const uint)
+0:51          'j' ( temp highp uint)
+0:53      move second child to first child ( temp highp uint)
+0:53        'j' ( temp highp uint)
+0:53        AtomicExchange ( global highp uint)
+0:53          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:53            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:53            Constant:
+0:53              0 (const uint)
+0:53          'j' ( temp highp uint)
+0:54      move second child to first child ( temp highp uint)
+0:54        'j' ( temp highp uint)
+0:54        AtomicCompSwap ( global highp uint)
+0:54          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:54            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:54            Constant:
+0:54              0 (const uint)
+0:54          Constant:
+0:54            0 (const uint)
+0:54          'j' ( temp highp uint)
+0:56      AtomicAdd ( global highp uint)
+0:56        counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:56          'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:56          Constant:
+0:56            1 (const uint)
+0:56        Constant:
+0:56          1 (const uint)
+0:57      AtomicAdd ( global highp uint)
+0:57        counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:57          'anon@3' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3})
+0:57          Constant:
+0:57            0 (const uint)
+0:57        Constant:
+0:57          1 (const uint)
+0:59      MemoryBarrierBuffer ( global void)
+0:61      Branch: Return with expression
+0:61        'j' ( temp highp uint)
+0:64  Function Definition: foo( ( global highp 4-component vector of float)
+0:64    Function Parameters: 
+0:65    Sequence
+0:65      Sequence
+0:65        move second child to first child ( temp highp float)
+0:65          'f' ( temp highp float)
+0:65          add ( temp highp float)
+0:65            add ( temp highp float)
+0:65              add ( temp highp float)
+0:65                j: direct index for structure (layout( column_major std140) uniform highp float)
+0:65                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                j: direct index for structure (layout( column_major std430) buffer highp float)
+0:65                  'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              y: direct index for structure ( global highp float)
+0:65                structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:65                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:65                  Constant:
+0:65                    4 (const uint)
+0:65                Constant:
+0:65                  1 (const int)
+0:65            Convert uint to float ( temp highp float)
+0:65              z: direct index for structure ( global highp uint)
+0:65                structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:65                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:65                  Constant:
+0:65                    4 (const uint)
+0:65                Constant:
+0:65                  2 (const int)
+0:66      Sequence
+0:66        move second child to first child ( temp highp 2-component vector of float)
+0:66          'v2' ( temp highp 2-component vector of float)
+0:66          add ( temp highp 2-component vector of float)
+0:66            add ( temp highp 2-component vector of float)
+0:66              b: direct index for structure ( uniform highp 2-component vector of float)
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  1 (const uint)
+0:66              c: direct index for structure ( uniform highp 2-component vector of float)
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  2 (const uint)
+0:66            x: direct index for structure ( global highp 2-component vector of float)
+0:66              structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  4 (const uint)
+0:66              Constant:
+0:66                0 (const int)
+0:67      Sequence
+0:67        move second child to first child ( temp highp 4-component vector of float)
+0:67          'v4' ( temp highp 4-component vector of float)
+0:67          add ( temp highp 4-component vector of float)
+0:67            add ( temp highp 4-component vector of float)
+0:67              add ( temp highp 4-component vector of float)
+0:67                add ( temp highp 4-component vector of float)
+0:67                  add ( temp highp 4-component vector of float)
+0:67                    add ( temp highp 4-component vector of float)
+0:67                      a: direct index for structure ( uniform highp 4-component vector of float)
+0:67                        'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                        Constant:
+0:67                          0 (const uint)
+0:67                      direct index ( temp highp 4-component vector of float)
+0:67                        d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                          'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                          Constant:
+0:67                            3 (const uint)
+0:67                        Constant:
+0:67                          0 (const int)
+0:67                    direct index ( temp highp 4-component vector of float)
+0:67                      d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                        'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                        Constant:
+0:67                          3 (const uint)
+0:67                      Constant:
+0:67                        1 (const int)
+0:67                  direct index ( temp highp 4-component vector of float)
+0:67                    d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                      Constant:
+0:67                        3 (const uint)
+0:67                    Constant:
+0:67                      2 (const int)
+0:67                k: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:67                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:67                  Constant:
+0:67                    1 (const uint)
+0:67              k: direct index for structure (layout( column_major std430) buffer highp 4-component vector of float)
+0:67                'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:67                Constant:
+0:67                  1 (const int)
+0:67            texture ( global highp 4-component vector of float)
+0:67              't1' ( uniform highp sampler2D)
+0:67              Constant:
+0:67                0.000000
+0:67                0.000000
+0:68      Branch: Return with expression
+0:68        component-wise multiply ( temp highp 4-component vector of float)
+0:68          component-wise multiply ( temp highp 4-component vector of float)
+0:68            Construct vec4 ( temp highp 4-component vector of float)
+0:68              'f' ( temp highp float)
+0:68            Construct vec4 ( temp highp 4-component vector of float)
+0:68              'v2' ( temp highp 2-component vector of float)
+0:68              Constant:
+0:68                1.000000
+0:68              Constant:
+0:68                1.000000
+0:68          'v4' ( temp highp 4-component vector of float)
+0:71  Function Definition: main( ( global void)
+0:71    Function Parameters: 
+0:72    Sequence
+0:72      Sequence
+0:72        move second child to first child ( temp highp float)
+0:72          'j' ( temp highp float)
+0:72          Convert uint to float ( temp highp float)
+0:72            Function Call: bar( ( global highp uint)
+0:73      move second child to first child ( temp highp 4-component vector of float)
+0:73        'o' ( out highp 4-component vector of float)
+0:73        vector-scale ( temp highp 4-component vector of float)
+0:73          'j' ( temp highp float)
+0:73          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:?     't1' ( uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:?     'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:?     'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:?     'anon@3' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3})
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:36  Function Definition: bar( ( global highp uint)
+0:36    Function Parameters: 
+0:37    Sequence
+0:37      Sequence
+0:37        move second child to first child ( temp highp uint)
+0:37          'j' ( temp highp uint)
+0:37          Constant:
+0:37            0 (const uint)
+0:38      move second child to first child ( temp highp uint)
+0:38        'j' ( temp highp uint)
+0:38        AtomicAdd ( global highp uint)
+0:38          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:38            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:38            Constant:
+0:38              0 (const uint)
+0:38          Constant:
+0:38            1 (const uint)
+0:39      move second child to first child ( temp highp uint)
+0:39        'j' ( temp highp uint)
+0:39        subtract ( temp highp uint)
+0:39          AtomicAdd ( global highp uint)
+0:39            counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:39              'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:39              Constant:
+0:39                0 (const uint)
+0:39            Constant:
+0:39              4294967295 (const uint)
+0:39          Constant:
+0:39            1 (const uint)
+0:40      move second child to first child ( temp highp uint)
+0:40        'j' ( temp highp uint)
+0:40        counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:40          'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:40          Constant:
+0:40            0 (const uint)
+0:42      move second child to first child ( temp highp uint)
+0:42        'j' ( temp highp uint)
+0:42        AtomicAdd ( global highp uint)
+0:42          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:42            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:42            Constant:
+0:42              0 (const uint)
+0:42          Constant:
+0:42            1 (const uint)
+0:43      move second child to first child ( temp highp uint)
+0:43        'j' ( temp highp uint)
+0:43        AtomicAdd ( global highp uint)
+0:43          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:43            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:43            Constant:
+0:43              0 (const uint)
+0:43          Constant:
+0:43            4294967295 (const uint)
+0:44      move second child to first child ( temp highp uint)
+0:44        'j' ( temp highp uint)
+0:44        AtomicSubtract ( global highp uint)
+0:44          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:44            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:44            Constant:
+0:44              0 (const uint)
+0:44          Constant:
+0:44            1 (const uint)
+0:46      move second child to first child ( temp highp uint)
+0:46        'j' ( temp highp uint)
+0:46        AtomicMin ( global highp uint)
+0:46          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:46            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:46            Constant:
+0:46              0 (const uint)
+0:46          'j' ( temp highp uint)
+0:47      move second child to first child ( temp highp uint)
+0:47        'j' ( temp highp uint)
+0:47        AtomicMax ( global highp uint)
+0:47          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:47            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:47            Constant:
+0:47              0 (const uint)
+0:47          'j' ( temp highp uint)
+0:48      move second child to first child ( temp highp uint)
+0:48        'j' ( temp highp uint)
+0:48        AtomicAnd ( global highp uint)
+0:48          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:48            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:48            Constant:
+0:48              0 (const uint)
+0:48          'j' ( temp highp uint)
+0:50      move second child to first child ( temp highp uint)
+0:50        'j' ( temp highp uint)
+0:50        AtomicOr ( global highp uint)
+0:50          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:50            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:50            Constant:
+0:50              0 (const uint)
+0:50          'j' ( temp highp uint)
+0:51      move second child to first child ( temp highp uint)
+0:51        'j' ( temp highp uint)
+0:51        AtomicXor ( global highp uint)
+0:51          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:51            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:51            Constant:
+0:51              0 (const uint)
+0:51          'j' ( temp highp uint)
+0:53      move second child to first child ( temp highp uint)
+0:53        'j' ( temp highp uint)
+0:53        AtomicExchange ( global highp uint)
+0:53          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:53            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:53            Constant:
+0:53              0 (const uint)
+0:53          'j' ( temp highp uint)
+0:54      move second child to first child ( temp highp uint)
+0:54        'j' ( temp highp uint)
+0:54        AtomicCompSwap ( global highp uint)
+0:54          counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:54            'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:54            Constant:
+0:54              0 (const uint)
+0:54          Constant:
+0:54            0 (const uint)
+0:54          'j' ( temp highp uint)
+0:56      AtomicAdd ( global highp uint)
+0:56        counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:56          'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:56          Constant:
+0:56            1 (const uint)
+0:56        Constant:
+0:56          1 (const uint)
+0:57      AtomicAdd ( global highp uint)
+0:57        counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:57          'anon@3' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3})
+0:57          Constant:
+0:57            0 (const uint)
+0:57        Constant:
+0:57          1 (const uint)
+0:59      MemoryBarrierBuffer ( global void)
+0:61      Branch: Return with expression
+0:61        'j' ( temp highp uint)
+0:64  Function Definition: foo( ( global highp 4-component vector of float)
+0:64    Function Parameters: 
+0:65    Sequence
+0:65      Sequence
+0:65        move second child to first child ( temp highp float)
+0:65          'f' ( temp highp float)
+0:65          add ( temp highp float)
+0:65            add ( temp highp float)
+0:65              add ( temp highp float)
+0:65                j: direct index for structure (layout( column_major std140) uniform highp float)
+0:65                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:65                  Constant:
+0:65                    0 (const uint)
+0:65                j: direct index for structure (layout( column_major std430) buffer highp float)
+0:65                  'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:65                  Constant:
+0:65                    0 (const int)
+0:65              y: direct index for structure ( global highp float)
+0:65                structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:65                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:65                  Constant:
+0:65                    4 (const uint)
+0:65                Constant:
+0:65                  1 (const int)
+0:65            Convert uint to float ( temp highp float)
+0:65              z: direct index for structure ( global highp uint)
+0:65                structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:65                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:65                  Constant:
+0:65                    4 (const uint)
+0:65                Constant:
+0:65                  2 (const int)
+0:66      Sequence
+0:66        move second child to first child ( temp highp 2-component vector of float)
+0:66          'v2' ( temp highp 2-component vector of float)
+0:66          add ( temp highp 2-component vector of float)
+0:66            add ( temp highp 2-component vector of float)
+0:66              b: direct index for structure ( uniform highp 2-component vector of float)
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  1 (const uint)
+0:66              c: direct index for structure ( uniform highp 2-component vector of float)
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  2 (const uint)
+0:66            x: direct index for structure ( global highp 2-component vector of float)
+0:66              structUniform: direct index for structure ( uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z})
+0:66                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:66                Constant:
+0:66                  4 (const uint)
+0:66              Constant:
+0:66                0 (const int)
+0:67      Sequence
+0:67        move second child to first child ( temp highp 4-component vector of float)
+0:67          'v4' ( temp highp 4-component vector of float)
+0:67          add ( temp highp 4-component vector of float)
+0:67            add ( temp highp 4-component vector of float)
+0:67              add ( temp highp 4-component vector of float)
+0:67                add ( temp highp 4-component vector of float)
+0:67                  add ( temp highp 4-component vector of float)
+0:67                    add ( temp highp 4-component vector of float)
+0:67                      a: direct index for structure ( uniform highp 4-component vector of float)
+0:67                        'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                        Constant:
+0:67                          0 (const uint)
+0:67                      direct index ( temp highp 4-component vector of float)
+0:67                        d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                          'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                          Constant:
+0:67                            3 (const uint)
+0:67                        Constant:
+0:67                          0 (const int)
+0:67                    direct index ( temp highp 4-component vector of float)
+0:67                      d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                        'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                        Constant:
+0:67                          3 (const uint)
+0:67                      Constant:
+0:67                        1 (const int)
+0:67                  direct index ( temp highp 4-component vector of float)
+0:67                    d: direct index for structure ( uniform 10-element array of highp 4-component vector of float)
+0:67                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:67                      Constant:
+0:67                        3 (const uint)
+0:67                    Constant:
+0:67                      2 (const int)
+0:67                k: direct index for structure (layout( column_major std140) uniform highp 4-component vector of float)
+0:67                  'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:67                  Constant:
+0:67                    1 (const uint)
+0:67              k: direct index for structure (layout( column_major std430) buffer highp 4-component vector of float)
+0:67                'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:67                Constant:
+0:67                  1 (const int)
+0:67            texture ( global highp 4-component vector of float)
+0:67              't1' ( uniform highp sampler2D)
+0:67              Constant:
+0:67                0.000000
+0:67                0.000000
+0:68      Branch: Return with expression
+0:68        component-wise multiply ( temp highp 4-component vector of float)
+0:68          component-wise multiply ( temp highp 4-component vector of float)
+0:68            Construct vec4 ( temp highp 4-component vector of float)
+0:68              'f' ( temp highp float)
+0:68            Construct vec4 ( temp highp 4-component vector of float)
+0:68              'v2' ( temp highp 2-component vector of float)
+0:68              Constant:
+0:68                1.000000
+0:68              Constant:
+0:68                1.000000
+0:68          'v4' ( temp highp 4-component vector of float)
+0:71  Function Definition: main( ( global void)
+0:71    Function Parameters: 
+0:72    Sequence
+0:72      Sequence
+0:72        move second child to first child ( temp highp float)
+0:72          'j' ( temp highp float)
+0:72          Convert uint to float ( temp highp float)
+0:72            Function Call: bar( ( global highp uint)
+0:73      move second child to first child ( temp highp 4-component vector of float)
+0:73        'o' ( out highp 4-component vector of float)
+0:73        vector-scale ( temp highp 4-component vector of float)
+0:73          'j' ( temp highp float)
+0:73          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b,  uniform highp 2-component vector of float c,  uniform 10-element array of highp 4-component vector of float d,  uniform structure{ global highp 2-component vector of float x,  global highp float y,  global highp uint z} structUniform})
+0:?     't1' ( uniform highp sampler2D)
+0:?     'anon@1' (layout( column_major std140) uniform block{layout( column_major std140) uniform highp float j, layout( column_major std140) uniform highp 4-component vector of float k})
+0:?     'bufferInstance' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float j, layout( column_major std430) buffer highp 4-component vector of float k})
+0:?     'anon@2' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:?     'anon@3' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 163
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 159
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "bar("
+                              Name 13  "foo("
+                              Name 16  "j"
+                              Name 18  "gl_AtomicCounterBlock_0"
+                              MemberName 18(gl_AtomicCounterBlock_0) 0  "counter1"
+                              MemberName 18(gl_AtomicCounterBlock_0) 1  "counter2"
+                              Name 20  ""
+                              Name 63  "gl_AtomicCounterBlock_1"
+                              MemberName 63(gl_AtomicCounterBlock_1) 0  "counter3"
+                              Name 65  ""
+                              Name 73  "f"
+                              Name 74  "UniformBlock"
+                              MemberName 74(UniformBlock) 0  "j"
+                              MemberName 74(UniformBlock) 1  "k"
+                              Name 76  ""
+                              Name 80  "BufferBlock"
+                              MemberName 80(BufferBlock) 0  "j"
+                              MemberName 80(BufferBlock) 1  "k"
+                              Name 82  "bufferInstance"
+                              Name 89  "e"
+                              MemberName 89(e) 0  "x"
+                              MemberName 89(e) 1  "y"
+                              MemberName 89(e) 2  "z"
+                              Name 90  "gl_DefaultUniformBlock"
+                              MemberName 90(gl_DefaultUniformBlock) 0  "a"
+                              MemberName 90(gl_DefaultUniformBlock) 1  "b"
+                              MemberName 90(gl_DefaultUniformBlock) 2  "c"
+                              MemberName 90(gl_DefaultUniformBlock) 3  "d"
+                              MemberName 90(gl_DefaultUniformBlock) 4  "structUniform"
+                              Name 92  ""
+                              Name 103  "v2"
+                              Name 114  "v4"
+                              Name 137  "t1"
+                              Name 155  "j"
+                              Name 159  "o"
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 0 Volatile
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 0 Offset 0
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 1 Volatile
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 18(gl_AtomicCounterBlock_0) 1 Offset 4
+                              Decorate 18(gl_AtomicCounterBlock_0) BufferBlock
+                              Decorate 20 DescriptorSet 0
+                              Decorate 20 Binding 4
+                              MemberDecorate 63(gl_AtomicCounterBlock_1) 0 Coherent
+                              MemberDecorate 63(gl_AtomicCounterBlock_1) 0 Volatile
+                              MemberDecorate 63(gl_AtomicCounterBlock_1) 0 Coherent
+                              MemberDecorate 63(gl_AtomicCounterBlock_1) 0 Offset 0
+                              Decorate 63(gl_AtomicCounterBlock_1) BufferBlock
+                              Decorate 65 DescriptorSet 0
+                              Decorate 65 Binding 5
+                              MemberDecorate 74(UniformBlock) 0 Offset 0
+                              MemberDecorate 74(UniformBlock) 1 Offset 16
+                              Decorate 74(UniformBlock) Block
+                              Decorate 76 DescriptorSet 0
+                              Decorate 76 Binding 2
+                              MemberDecorate 80(BufferBlock) 0 Offset 0
+                              MemberDecorate 80(BufferBlock) 1 Offset 16
+                              Decorate 80(BufferBlock) BufferBlock
+                              Decorate 82(bufferInstance) DescriptorSet 0
+                              Decorate 82(bufferInstance) Binding 3
+                              Decorate 88 ArrayStride 16
+                              MemberDecorate 89(e) 0 Offset 0
+                              MemberDecorate 89(e) 1 Offset 8
+                              MemberDecorate 89(e) 2 Offset 12
+                              MemberDecorate 90(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 90(gl_DefaultUniformBlock) 1 Offset 16
+                              MemberDecorate 90(gl_DefaultUniformBlock) 2 Offset 24
+                              MemberDecorate 90(gl_DefaultUniformBlock) 3 Offset 32
+                              MemberDecorate 90(gl_DefaultUniformBlock) 4 Offset 192
+                              Decorate 90(gl_DefaultUniformBlock) Block
+                              Decorate 92 DescriptorSet 0
+                              Decorate 92 Binding 0
+                              Decorate 137(t1) DescriptorSet 0
+                              Decorate 137(t1) Binding 1
+                              Decorate 159(o) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeFunction 6(int)
+              10:             TypeFloat 32
+              11:             TypeVector 10(float) 4
+              12:             TypeFunction 11(fvec4)
+              15:             TypePointer Function 6(int)
+              17:      6(int) Constant 0
+18(gl_AtomicCounterBlock_0):             TypeStruct 6(int) 6(int)
+              19:             TypePointer Uniform 18(gl_AtomicCounterBlock_0)
+              20:     19(ptr) Variable Uniform
+              21:             TypeInt 32 1
+              22:     21(int) Constant 0
+              23:             TypePointer Uniform 6(int)
+              25:      6(int) Constant 1
+              28:      6(int) Constant 4294967295
+              60:     21(int) Constant 1
+63(gl_AtomicCounterBlock_1):             TypeStruct 6(int)
+              64:             TypePointer Uniform 63(gl_AtomicCounterBlock_1)
+              65:     64(ptr) Variable Uniform
+              68:      6(int) Constant 72
+              72:             TypePointer Function 10(float)
+74(UniformBlock):             TypeStruct 10(float) 11(fvec4)
+              75:             TypePointer Uniform 74(UniformBlock)
+              76:     75(ptr) Variable Uniform
+              77:             TypePointer Uniform 10(float)
+ 80(BufferBlock):             TypeStruct 10(float) 11(fvec4)
+              81:             TypePointer Uniform 80(BufferBlock)
+82(bufferInstance):     81(ptr) Variable Uniform
+              86:             TypeVector 10(float) 2
+              87:      6(int) Constant 10
+              88:             TypeArray 11(fvec4) 87
+           89(e):             TypeStruct 86(fvec2) 10(float) 6(int)
+90(gl_DefaultUniformBlock):             TypeStruct 11(fvec4) 86(fvec2) 86(fvec2) 88 89(e)
+              91:             TypePointer Uniform 90(gl_DefaultUniformBlock)
+              92:     91(ptr) Variable Uniform
+              93:     21(int) Constant 4
+              97:     21(int) Constant 2
+             102:             TypePointer Function 86(fvec2)
+             104:             TypePointer Uniform 86(fvec2)
+             113:             TypePointer Function 11(fvec4)
+             115:             TypePointer Uniform 11(fvec4)
+             118:     21(int) Constant 3
+             134:             TypeImage 10(float) 2D sampled format:Unknown
+             135:             TypeSampledImage 134
+             136:             TypePointer UniformConstant 135
+         137(t1):    136(ptr) Variable UniformConstant
+             139:   10(float) Constant 0
+             140:   86(fvec2) ConstantComposite 139 139
+             146:   10(float) Constant 1065353216
+             158:             TypePointer Output 11(fvec4)
+          159(o):    158(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+          155(j):     72(ptr) Variable Function
+             156:      6(int) FunctionCall 8(bar()
+             157:   10(float) ConvertUToF 156
+                              Store 155(j) 157
+             160:   10(float) Load 155(j)
+             161:   11(fvec4) FunctionCall 13(foo()
+             162:   11(fvec4) VectorTimesScalar 161 160
+                              Store 159(o) 162
+                              Return
+                              FunctionEnd
+         8(bar():      6(int) Function None 7
+               9:             Label
+           16(j):     15(ptr) Variable Function
+                              Store 16(j) 17
+              24:     23(ptr) AccessChain 20 22
+              26:      6(int) AtomicIAdd 24 25 17 25
+                              Store 16(j) 26
+              27:     23(ptr) AccessChain 20 22
+              29:      6(int) AtomicIAdd 27 25 17 28
+              30:      6(int) ISub 29 25
+                              Store 16(j) 30
+              31:     23(ptr) AccessChain 20 22
+              32:      6(int) Load 31
+                              Store 16(j) 32
+              33:     23(ptr) AccessChain 20 22
+              34:      6(int) AtomicIAdd 33 25 17 25
+                              Store 16(j) 34
+              35:     23(ptr) AccessChain 20 22
+              36:      6(int) AtomicIAdd 35 25 17 28
+                              Store 16(j) 36
+              37:     23(ptr) AccessChain 20 22
+              38:      6(int) AtomicISub 37 25 17 25
+                              Store 16(j) 38
+              39:     23(ptr) AccessChain 20 22
+              40:      6(int) Load 16(j)
+              41:      6(int) AtomicUMin 39 25 17 40
+                              Store 16(j) 41
+              42:     23(ptr) AccessChain 20 22
+              43:      6(int) Load 16(j)
+              44:      6(int) AtomicUMax 42 25 17 43
+                              Store 16(j) 44
+              45:     23(ptr) AccessChain 20 22
+              46:      6(int) Load 16(j)
+              47:      6(int) AtomicAnd 45 25 17 46
+                              Store 16(j) 47
+              48:     23(ptr) AccessChain 20 22
+              49:      6(int) Load 16(j)
+              50:      6(int) AtomicOr 48 25 17 49
+                              Store 16(j) 50
+              51:     23(ptr) AccessChain 20 22
+              52:      6(int) Load 16(j)
+              53:      6(int) AtomicXor 51 25 17 52
+                              Store 16(j) 53
+              54:     23(ptr) AccessChain 20 22
+              55:      6(int) Load 16(j)
+              56:      6(int) AtomicExchange 54 25 17 55
+                              Store 16(j) 56
+              57:     23(ptr) AccessChain 20 22
+              58:      6(int) Load 16(j)
+              59:      6(int) AtomicCompareExchange 57 25 17 17 58 17
+                              Store 16(j) 59
+              61:     23(ptr) AccessChain 20 60
+              62:      6(int) AtomicIAdd 61 25 17 25
+              66:     23(ptr) AccessChain 65 22
+              67:      6(int) AtomicIAdd 66 25 17 25
+                              MemoryBarrier 25 68
+              69:      6(int) Load 16(j)
+                              ReturnValue 69
+                              FunctionEnd
+        13(foo():   11(fvec4) Function None 12
+              14:             Label
+           73(f):     72(ptr) Variable Function
+         103(v2):    102(ptr) Variable Function
+         114(v4):    113(ptr) Variable Function
+              78:     77(ptr) AccessChain 76 22
+              79:   10(float) Load 78
+              83:     77(ptr) AccessChain 82(bufferInstance) 22
+              84:   10(float) Load 83
+              85:   10(float) FAdd 79 84
+              94:     77(ptr) AccessChain 92 93 60
+              95:   10(float) Load 94
+              96:   10(float) FAdd 85 95
+              98:     23(ptr) AccessChain 92 93 97
+              99:      6(int) Load 98
+             100:   10(float) ConvertUToF 99
+             101:   10(float) FAdd 96 100
+                              Store 73(f) 101
+             105:    104(ptr) AccessChain 92 60
+             106:   86(fvec2) Load 105
+             107:    104(ptr) AccessChain 92 97
+             108:   86(fvec2) Load 107
+             109:   86(fvec2) FAdd 106 108
+             110:    104(ptr) AccessChain 92 93 22
+             111:   86(fvec2) Load 110
+             112:   86(fvec2) FAdd 109 111
+                              Store 103(v2) 112
+             116:    115(ptr) AccessChain 92 22
+             117:   11(fvec4) Load 116
+             119:    115(ptr) AccessChain 92 118 22
+             120:   11(fvec4) Load 119
+             121:   11(fvec4) FAdd 117 120
+             122:    115(ptr) AccessChain 92 118 60
+             123:   11(fvec4) Load 122
+             124:   11(fvec4) FAdd 121 123
+             125:    115(ptr) AccessChain 92 118 97
+             126:   11(fvec4) Load 125
+             127:   11(fvec4) FAdd 124 126
+             128:    115(ptr) AccessChain 76 60
+             129:   11(fvec4) Load 128
+             130:   11(fvec4) FAdd 127 129
+             131:    115(ptr) AccessChain 82(bufferInstance) 60
+             132:   11(fvec4) Load 131
+             133:   11(fvec4) FAdd 130 132
+             138:         135 Load 137(t1)
+             141:   11(fvec4) ImageSampleImplicitLod 138 140
+             142:   11(fvec4) FAdd 133 141
+                              Store 114(v4) 142
+             143:   10(float) Load 73(f)
+             144:   11(fvec4) CompositeConstruct 143 143 143 143
+             145:   86(fvec2) Load 103(v2)
+             147:   10(float) CompositeExtract 145 0
+             148:   10(float) CompositeExtract 145 1
+             149:   11(fvec4) CompositeConstruct 147 148 146 146
+             150:   11(fvec4) FMul 144 149
+             151:   11(fvec4) Load 114(v4)
+             152:   11(fvec4) FMul 150 151
+                              ReturnValue 152
+                              FunctionEnd
diff --git a/Test/baseResults/vk.relaxed.link1.frag.out b/Test/baseResults/vk.relaxed.link1.frag.out
new file mode 100644
index 0000000..9dac4c6
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.link1.frag.out
@@ -0,0 +1,515 @@
+vk.relaxed.link1.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: bar( ( global highp 4-component vector of float)
+0:19    Function Parameters: 
+0:20    Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp highp uint)
+0:20          'j' ( temp highp uint)
+0:20          add ( temp highp uint)
+0:20            AtomicAdd ( global highp uint)
+0:20              counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:20                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:20            subtract ( temp highp uint)
+0:20              AtomicAdd ( global highp uint)
+0:20                counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:20                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                  Constant:
+0:20                    1 (const uint)
+0:20                Constant:
+0:20                  4294967295 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'v' ( temp highp 4-component vector of float)
+0:21          add ( temp highp 4-component vector of float)
+0:21            add ( temp highp 4-component vector of float)
+0:21              add ( temp highp 4-component vector of float)
+0:21                a: direct index for structure ( uniform highp 4-component vector of float)
+0:21                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                Construct vec4 ( temp highp 4-component vector of float)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21              c1: direct index for structure ( uniform highp 4-component vector of float)
+0:21                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                Constant:
+0:21                  3 (const uint)
+0:21            d: direct index for structure ( uniform highp 4-component vector of float)
+0:21              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21              Constant:
+0:21                4 (const uint)
+0:23      Branch: Return with expression
+0:23        vector-scale ( temp highp 4-component vector of float)
+0:23          Convert uint to float ( temp highp float)
+0:23            'j' ( temp highp uint)
+0:23          'v' ( temp highp 4-component vector of float)
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:27    Sequence
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        'o' ( out highp 4-component vector of float)
+0:27        add ( temp highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:27          Function Call: bar( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+
+vk.relaxed.link2.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:14  Function Definition: foo( ( global highp 4-component vector of float)
+0:14    Function Parameters: 
+0:15    Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp highp uint)
+0:15          'j' ( temp highp uint)
+0:15          add ( temp highp uint)
+0:15            AtomicAdd ( global highp uint)
+0:15              counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:15                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:15                Constant:
+0:15                  1 (const uint)
+0:15              Constant:
+0:15                1 (const uint)
+0:15            subtract ( temp highp uint)
+0:15              AtomicAdd ( global highp uint)
+0:15                counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:15                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:15                  Constant:
+0:15                    0 (const uint)
+0:15                Constant:
+0:15                  4294967295 (const uint)
+0:15              Constant:
+0:15                1 (const uint)
+0:16      Sequence
+0:16        move second child to first child ( temp highp 4-component vector of float)
+0:16          'v' ( temp highp 4-component vector of float)
+0:16          add ( temp highp 4-component vector of float)
+0:16            add ( temp highp 4-component vector of float)
+0:16              add ( temp highp 4-component vector of float)
+0:16                a: direct index for structure ( uniform highp 4-component vector of float)
+0:16                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                Construct vec4 ( temp highp 4-component vector of float)
+0:16                  direct index ( temp highp float)
+0:16                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      1 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                      Constant:
+0:16                        1 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                      Constant:
+0:16                        1 (const uint)
+0:16                    Constant:
+0:16                      1 (const int)
+0:16              c2: direct index for structure ( uniform highp 4-component vector of float)
+0:16                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16                Constant:
+0:16                  3 (const uint)
+0:16            d: direct index for structure ( uniform highp 4-component vector of float)
+0:16              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:16              Constant:
+0:16                4 (const uint)
+0:18      Branch: Return with expression
+0:18        vector-scale ( temp highp 4-component vector of float)
+0:18          Convert uint to float ( temp highp float)
+0:18            'j' ( temp highp uint)
+0:18          'v' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: bar( ( global highp 4-component vector of float)
+0:19    Function Parameters: 
+0:20    Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp highp uint)
+0:20          'j' ( temp highp uint)
+0:20          add ( temp highp uint)
+0:20            AtomicAdd ( global highp uint)
+0:20              counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:20                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2,  coherent volatile buffer highp uint counter3})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:20            subtract ( temp highp uint)
+0:20              AtomicAdd ( global highp uint)
+0:20                counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:20                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2,  coherent volatile buffer highp uint counter3})
+0:20                  Constant:
+0:20                    1 (const uint)
+0:20                Constant:
+0:20                  4294967295 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'v' ( temp highp 4-component vector of float)
+0:21          add ( temp highp 4-component vector of float)
+0:21            add ( temp highp 4-component vector of float)
+0:21              add ( temp highp 4-component vector of float)
+0:21                a: direct index for structure ( uniform highp 4-component vector of float)
+0:21                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                Construct vec4 ( temp highp 4-component vector of float)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21              c1: direct index for structure ( uniform highp 4-component vector of float)
+0:21                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21                Constant:
+0:21                  3 (const uint)
+0:21            d: direct index for structure ( uniform highp 4-component vector of float)
+0:21              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:21              Constant:
+0:21                4 (const uint)
+0:23      Branch: Return with expression
+0:23        vector-scale ( temp highp 4-component vector of float)
+0:23          Convert uint to float ( temp highp float)
+0:23            'j' ( temp highp uint)
+0:23          'v' ( temp highp 4-component vector of float)
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:27    Sequence
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        'o' ( out highp 4-component vector of float)
+0:27        add ( temp highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:27          Function Call: bar( ( global highp 4-component vector of float)
+0:14  Function Definition: foo( ( global highp 4-component vector of float)
+0:14    Function Parameters: 
+0:15    Sequence
+0:15      Sequence
+0:15        move second child to first child ( temp highp uint)
+0:15          'j' ( temp highp uint)
+0:15          add ( temp highp uint)
+0:15            AtomicAdd ( global highp uint)
+0:15              counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:15                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2,  coherent volatile buffer highp uint counter3})
+0:15                Constant:
+0:15                  1 (const uint)
+0:15              Constant:
+0:15                1 (const uint)
+0:15            subtract ( temp highp uint)
+0:15              AtomicAdd ( global highp uint)
+0:15                counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:15                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2,  coherent volatile buffer highp uint counter3})
+0:15                  Constant:
+0:15                    2 (const uint)
+0:15                Constant:
+0:15                  4294967295 (const uint)
+0:15              Constant:
+0:15                1 (const uint)
+0:16      Sequence
+0:16        move second child to first child ( temp highp 4-component vector of float)
+0:16          'v' ( temp highp 4-component vector of float)
+0:16          add ( temp highp 4-component vector of float)
+0:16            add ( temp highp 4-component vector of float)
+0:16              add ( temp highp 4-component vector of float)
+0:16                a: direct index for structure ( uniform highp 4-component vector of float)
+0:16                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                  Constant:
+0:16                    0 (const uint)
+0:16                Construct vec4 ( temp highp 4-component vector of float)
+0:16                  direct index ( temp highp float)
+0:16                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                      Constant:
+0:16                        1 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                      Constant:
+0:16                        1 (const uint)
+0:16                    Constant:
+0:16                      1 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      0 (const int)
+0:16                  direct index ( temp highp float)
+0:16                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:16                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                      Constant:
+0:16                        2 (const uint)
+0:16                    Constant:
+0:16                      1 (const int)
+0:16              c2: direct index for structure ( uniform highp 4-component vector of float)
+0:16                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16                Constant:
+0:16                  5 (const uint)
+0:16            d: direct index for structure ( uniform highp 4-component vector of float)
+0:16              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:16              Constant:
+0:16                4 (const uint)
+0:18      Branch: Return with expression
+0:18        vector-scale ( temp highp 4-component vector of float)
+0:18          Convert uint to float ( temp highp float)
+0:18            'j' ( temp highp uint)
+0:18          'v' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d,  uniform highp 4-component vector of float c2})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2,  coherent volatile buffer highp uint counter3})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 105
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 68
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "bar("
+                              Name 11  "foo("
+                              Name 15  "j"
+                              Name 16  "gl_AtomicCounterBlock_0"
+                              MemberName 16(gl_AtomicCounterBlock_0) 0  "counter1"
+                              MemberName 16(gl_AtomicCounterBlock_0) 1  "counter2"
+                              MemberName 16(gl_AtomicCounterBlock_0) 2  "counter3"
+                              Name 18  ""
+                              Name 33  "v"
+                              Name 35  "gl_DefaultUniformBlock"
+                              MemberName 35(gl_DefaultUniformBlock) 0  "a"
+                              MemberName 35(gl_DefaultUniformBlock) 1  "b1"
+                              MemberName 35(gl_DefaultUniformBlock) 2  "b2"
+                              MemberName 35(gl_DefaultUniformBlock) 3  "c1"
+                              MemberName 35(gl_DefaultUniformBlock) 4  "d"
+                              MemberName 35(gl_DefaultUniformBlock) 5  "c2"
+                              Name 37  ""
+                              Name 68  "o"
+                              Name 72  "j"
+                              Name 79  "v"
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 0 Volatile
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 0 Offset 0
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 1 Volatile
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 1 Offset 4
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 2 Volatile
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 16(gl_AtomicCounterBlock_0) 2 Offset 8
+                              Decorate 16(gl_AtomicCounterBlock_0) BufferBlock
+                              Decorate 18 DescriptorSet 0
+                              Decorate 18 Binding 1
+                              MemberDecorate 35(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 35(gl_DefaultUniformBlock) 1 Offset 16
+                              MemberDecorate 35(gl_DefaultUniformBlock) 2 Offset 24
+                              MemberDecorate 35(gl_DefaultUniformBlock) 3 Offset 32
+                              MemberDecorate 35(gl_DefaultUniformBlock) 4 Offset 48
+                              MemberDecorate 35(gl_DefaultUniformBlock) 5 Offset 64
+                              Decorate 35(gl_DefaultUniformBlock) Block
+                              Decorate 37 DescriptorSet 0
+                              Decorate 37 Binding 0
+                              Decorate 68(o) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              13:             TypeInt 32 0
+              14:             TypePointer Function 13(int)
+16(gl_AtomicCounterBlock_0):             TypeStruct 13(int) 13(int) 13(int)
+              17:             TypePointer Uniform 16(gl_AtomicCounterBlock_0)
+              18:     17(ptr) Variable Uniform
+              19:             TypeInt 32 1
+              20:     19(int) Constant 0
+              21:             TypePointer Uniform 13(int)
+              23:     13(int) Constant 1
+              24:     13(int) Constant 0
+              26:     19(int) Constant 1
+              28:     13(int) Constant 4294967295
+              32:             TypePointer Function 7(fvec4)
+              34:             TypeVector 6(float) 2
+35(gl_DefaultUniformBlock):             TypeStruct 7(fvec4) 34(fvec2) 34(fvec2) 7(fvec4) 7(fvec4) 7(fvec4)
+              36:             TypePointer Uniform 35(gl_DefaultUniformBlock)
+              37:     36(ptr) Variable Uniform
+              38:             TypePointer Uniform 7(fvec4)
+              41:             TypePointer Uniform 6(float)
+              46:     19(int) Constant 2
+              53:     19(int) Constant 3
+              57:     19(int) Constant 4
+              67:             TypePointer Output 7(fvec4)
+           68(o):     67(ptr) Variable Output
+              92:     19(int) Constant 5
+         4(main):           2 Function None 3
+               5:             Label
+              69:    7(fvec4) FunctionCall 11(foo()
+              70:    7(fvec4) FunctionCall 9(bar()
+              71:    7(fvec4) FAdd 69 70
+                              Store 68(o) 71
+                              Return
+                              FunctionEnd
+         9(bar():    7(fvec4) Function None 8
+              10:             Label
+           15(j):     14(ptr) Variable Function
+           33(v):     32(ptr) Variable Function
+              22:     21(ptr) AccessChain 18 20
+              25:     13(int) AtomicIAdd 22 23 24 23
+              27:     21(ptr) AccessChain 18 26
+              29:     13(int) AtomicIAdd 27 23 24 28
+              30:     13(int) ISub 29 23
+              31:     13(int) IAdd 25 30
+                              Store 15(j) 31
+              39:     38(ptr) AccessChain 37 20
+              40:    7(fvec4) Load 39
+              42:     41(ptr) AccessChain 37 26 24
+              43:    6(float) Load 42
+              44:     41(ptr) AccessChain 37 26 23
+              45:    6(float) Load 44
+              47:     41(ptr) AccessChain 37 46 24
+              48:    6(float) Load 47
+              49:     41(ptr) AccessChain 37 46 23
+              50:    6(float) Load 49
+              51:    7(fvec4) CompositeConstruct 43 45 48 50
+              52:    7(fvec4) FAdd 40 51
+              54:     38(ptr) AccessChain 37 53
+              55:    7(fvec4) Load 54
+              56:    7(fvec4) FAdd 52 55
+              58:     38(ptr) AccessChain 37 57
+              59:    7(fvec4) Load 58
+              60:    7(fvec4) FAdd 56 59
+                              Store 33(v) 60
+              61:     13(int) Load 15(j)
+              62:    6(float) ConvertUToF 61
+              63:    7(fvec4) Load 33(v)
+              64:    7(fvec4) VectorTimesScalar 63 62
+                              ReturnValue 64
+                              FunctionEnd
+        11(foo():    7(fvec4) Function None 8
+              12:             Label
+           72(j):     14(ptr) Variable Function
+           79(v):     32(ptr) Variable Function
+              73:     21(ptr) AccessChain 18 26
+              74:     13(int) AtomicIAdd 73 23 24 23
+              75:     21(ptr) AccessChain 18 46
+              76:     13(int) AtomicIAdd 75 23 24 28
+              77:     13(int) ISub 76 23
+              78:     13(int) IAdd 74 77
+                              Store 72(j) 78
+              80:     38(ptr) AccessChain 37 20
+              81:    7(fvec4) Load 80
+              82:     41(ptr) AccessChain 37 26 24
+              83:    6(float) Load 82
+              84:     41(ptr) AccessChain 37 26 23
+              85:    6(float) Load 84
+              86:     41(ptr) AccessChain 37 46 24
+              87:    6(float) Load 86
+              88:     41(ptr) AccessChain 37 46 23
+              89:    6(float) Load 88
+              90:    7(fvec4) CompositeConstruct 83 85 87 89
+              91:    7(fvec4) FAdd 81 90
+              93:     38(ptr) AccessChain 37 92
+              94:    7(fvec4) Load 93
+              95:    7(fvec4) FAdd 91 94
+              96:     38(ptr) AccessChain 37 57
+              97:    7(fvec4) Load 96
+              98:    7(fvec4) FAdd 95 97
+                              Store 79(v) 98
+              99:     13(int) Load 72(j)
+             100:    6(float) ConvertUToF 99
+             101:    7(fvec4) Load 79(v)
+             102:    7(fvec4) VectorTimesScalar 101 100
+                              ReturnValue 102
+                              FunctionEnd
diff --git a/Test/baseResults/vk.relaxed.stagelink.vert.out b/Test/baseResults/vk.relaxed.stagelink.vert.out
new file mode 100644
index 0000000..a63f10c
--- /dev/null
+++ b/Test/baseResults/vk.relaxed.stagelink.vert.out
@@ -0,0 +1,717 @@
+vk.relaxed.stagelink.vert
+Shader version: 460
+0:? Sequence
+0:18  Function Definition: foo( ( global highp 4-component vector of float)
+0:18    Function Parameters: 
+0:19    Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp highp uint)
+0:19          'j' ( temp highp uint)
+0:19          add ( temp highp uint)
+0:19            AtomicAdd ( global highp uint)
+0:19              counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:19                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:19                Constant:
+0:19                  1 (const uint)
+0:19              Constant:
+0:19                1 (const uint)
+0:19            subtract ( temp highp uint)
+0:19              AtomicAdd ( global highp uint)
+0:19                counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:19                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:19                  Constant:
+0:19                    0 (const uint)
+0:19                Constant:
+0:19                  4294967295 (const uint)
+0:19              Constant:
+0:19                1 (const uint)
+0:20      Sequence
+0:20        move second child to first child ( temp highp 4-component vector of float)
+0:20          'v' ( temp highp 4-component vector of float)
+0:20          add ( temp highp 4-component vector of float)
+0:20            add ( temp highp 4-component vector of float)
+0:20              add ( temp highp 4-component vector of float)
+0:20                a: direct index for structure ( uniform highp 4-component vector of float)
+0:20                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                Construct vec4 ( temp highp 4-component vector of float)
+0:20                  direct index ( temp highp float)
+0:20                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        2 (const uint)
+0:20                    Constant:
+0:20                      0 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        2 (const uint)
+0:20                    Constant:
+0:20                      1 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        1 (const uint)
+0:20                    Constant:
+0:20                      0 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        1 (const uint)
+0:20                    Constant:
+0:20                      1 (const int)
+0:20              c2: direct index for structure ( uniform highp 4-component vector of float)
+0:20                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                Constant:
+0:20                  3 (const uint)
+0:20            d: direct index for structure ( uniform highp 4-component vector of float)
+0:20              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20              Constant:
+0:20                4 (const uint)
+0:22      Branch: Return with expression
+0:22        vector-scale ( temp highp 4-component vector of float)
+0:22          Convert uint to float ( temp highp float)
+0:22            'j' ( temp highp uint)
+0:22          'v' ( temp highp 4-component vector of float)
+0:25  Function Definition: main( ( global void)
+0:25    Function Parameters: 
+0:27    Sequence
+0:27      Sequence
+0:27        move second child to first child ( temp highp 4-component vector of float)
+0:27          'v' ( temp highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:28      move second child to first child ( temp highp 4-component vector of float)
+0:28        'v' ( temp highp 4-component vector of float)
+0:28        add ( temp highp 4-component vector of float)
+0:28          'v' ( temp highp 4-component vector of float)
+0:28          indirect index ( temp highp 4-component vector of float)
+0:28            s: direct index for structure ( uniform 4-element array of highp 4-component vector of float)
+0:28              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:28              Constant:
+0:28                5 (const uint)
+0:28            'gl_VertexID' ( in int VertexIndex)
+0:29      move second child to first child ( temp highp float)
+0:29        direct index ( temp highp float)
+0:29          'v' ( temp highp 4-component vector of float)
+0:29          Constant:
+0:29            0 (const int)
+0:29        subtract ( temp highp float)
+0:29          direct index ( temp highp float)
+0:29            'v' ( temp highp 4-component vector of float)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Convert int to float ( temp highp float)
+0:29            'gl_InstanceID' ( in highp int InstanceIndex)
+0:30      move second child to first child ( temp highp 4-component vector of float)
+0:30        'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:30        'v' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+
+vk.relaxed.stagelink.frag
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: foo( ( global highp 4-component vector of float)
+0:19    Function Parameters: 
+0:20    Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp highp uint)
+0:20          'j' ( temp highp uint)
+0:20          add ( temp highp uint)
+0:20            AtomicAdd ( global highp uint)
+0:20              counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:20                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:20            subtract ( temp highp uint)
+0:20              AtomicAdd ( global highp uint)
+0:20                counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:20                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                  Constant:
+0:20                    1 (const uint)
+0:20                Constant:
+0:20                  4294967295 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'v' ( temp highp 4-component vector of float)
+0:21          add ( temp highp 4-component vector of float)
+0:21            add ( temp highp 4-component vector of float)
+0:21              add ( temp highp 4-component vector of float)
+0:21                a: direct index for structure ( uniform highp 4-component vector of float)
+0:21                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                Construct vec4 ( temp highp 4-component vector of float)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21              c1: direct index for structure ( uniform highp 4-component vector of float)
+0:21                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                Constant:
+0:21                  3 (const uint)
+0:21            d: direct index for structure ( uniform highp 4-component vector of float)
+0:21              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21              Constant:
+0:21                4 (const uint)
+0:23      Branch: Return with expression
+0:23        vector-scale ( temp highp 4-component vector of float)
+0:23          Convert uint to float ( temp highp float)
+0:23            'j' ( temp highp uint)
+0:23          'v' ( temp highp 4-component vector of float)
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:27    Sequence
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        'o' ( out highp 4-component vector of float)
+0:27        add ( temp highp 4-component vector of float)
+0:27          'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+
+
+Linked vertex stage:
+
+
+Linked fragment stage:
+
+
+Shader version: 460
+0:? Sequence
+0:18  Function Definition: foo( ( global highp 4-component vector of float)
+0:18    Function Parameters: 
+0:19    Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp highp uint)
+0:19          'j' ( temp highp uint)
+0:19          add ( temp highp uint)
+0:19            AtomicAdd ( global highp uint)
+0:19              counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:19                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:19                Constant:
+0:19                  1 (const uint)
+0:19              Constant:
+0:19                1 (const uint)
+0:19            subtract ( temp highp uint)
+0:19              AtomicAdd ( global highp uint)
+0:19                counter3: direct index for structure ( coherent volatile buffer highp uint)
+0:19                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:19                  Constant:
+0:19                    0 (const uint)
+0:19                Constant:
+0:19                  4294967295 (const uint)
+0:19              Constant:
+0:19                1 (const uint)
+0:20      Sequence
+0:20        move second child to first child ( temp highp 4-component vector of float)
+0:20          'v' ( temp highp 4-component vector of float)
+0:20          add ( temp highp 4-component vector of float)
+0:20            add ( temp highp 4-component vector of float)
+0:20              add ( temp highp 4-component vector of float)
+0:20                a: direct index for structure ( uniform highp 4-component vector of float)
+0:20                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                  Constant:
+0:20                    0 (const uint)
+0:20                Construct vec4 ( temp highp 4-component vector of float)
+0:20                  direct index ( temp highp float)
+0:20                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        2 (const uint)
+0:20                    Constant:
+0:20                      0 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        2 (const uint)
+0:20                    Constant:
+0:20                      1 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        1 (const uint)
+0:20                    Constant:
+0:20                      0 (const int)
+0:20                  direct index ( temp highp float)
+0:20                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:20                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                      Constant:
+0:20                        1 (const uint)
+0:20                    Constant:
+0:20                      1 (const int)
+0:20              c2: direct index for structure ( uniform highp 4-component vector of float)
+0:20                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20                Constant:
+0:20                  3 (const uint)
+0:20            d: direct index for structure ( uniform highp 4-component vector of float)
+0:20              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:20              Constant:
+0:20                4 (const uint)
+0:22      Branch: Return with expression
+0:22        vector-scale ( temp highp 4-component vector of float)
+0:22          Convert uint to float ( temp highp float)
+0:22            'j' ( temp highp uint)
+0:22          'v' ( temp highp 4-component vector of float)
+0:25  Function Definition: main( ( global void)
+0:25    Function Parameters: 
+0:27    Sequence
+0:27      Sequence
+0:27        move second child to first child ( temp highp 4-component vector of float)
+0:27          'v' ( temp highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:28      move second child to first child ( temp highp 4-component vector of float)
+0:28        'v' ( temp highp 4-component vector of float)
+0:28        add ( temp highp 4-component vector of float)
+0:28          'v' ( temp highp 4-component vector of float)
+0:28          indirect index ( temp highp 4-component vector of float)
+0:28            s: direct index for structure ( uniform 4-element array of highp 4-component vector of float)
+0:28              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:28              Constant:
+0:28                5 (const uint)
+0:28            'gl_VertexID' ( in int VertexIndex)
+0:29      move second child to first child ( temp highp float)
+0:29        direct index ( temp highp float)
+0:29          'v' ( temp highp 4-component vector of float)
+0:29          Constant:
+0:29            0 (const int)
+0:29        subtract ( temp highp float)
+0:29          direct index ( temp highp float)
+0:29            'v' ( temp highp 4-component vector of float)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Convert int to float ( temp highp float)
+0:29            'gl_InstanceID' ( in highp int InstanceIndex)
+0:30      move second child to first child ( temp highp 4-component vector of float)
+0:30        'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:30        'v' ( temp highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b2,  uniform highp 2-component vector of float b1,  uniform highp 4-component vector of float c2,  uniform highp 4-component vector of float d,  uniform 4-element array of highp 4-component vector of float s})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter3,  coherent volatile buffer highp uint counter2})
+0:?     'gl_VertexID' ( in int VertexIndex)
+0:?     'gl_InstanceID' ( in int InstanceIndex)
+Shader version: 460
+gl_FragCoord origin is upper left
+0:? Sequence
+0:19  Function Definition: foo( ( global highp 4-component vector of float)
+0:19    Function Parameters: 
+0:20    Sequence
+0:20      Sequence
+0:20        move second child to first child ( temp highp uint)
+0:20          'j' ( temp highp uint)
+0:20          add ( temp highp uint)
+0:20            AtomicAdd ( global highp uint)
+0:20              counter1: direct index for structure ( coherent volatile buffer highp uint)
+0:20                'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                Constant:
+0:20                  0 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:20            subtract ( temp highp uint)
+0:20              AtomicAdd ( global highp uint)
+0:20                counter2: direct index for structure ( coherent volatile buffer highp uint)
+0:20                  'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+0:20                  Constant:
+0:20                    1 (const uint)
+0:20                Constant:
+0:20                  4294967295 (const uint)
+0:20              Constant:
+0:20                1 (const uint)
+0:21      Sequence
+0:21        move second child to first child ( temp highp 4-component vector of float)
+0:21          'v' ( temp highp 4-component vector of float)
+0:21          add ( temp highp 4-component vector of float)
+0:21            add ( temp highp 4-component vector of float)
+0:21              add ( temp highp 4-component vector of float)
+0:21                a: direct index for structure ( uniform highp 4-component vector of float)
+0:21                  'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                  Constant:
+0:21                    0 (const uint)
+0:21                Construct vec4 ( temp highp 4-component vector of float)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b1: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        1 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      0 (const int)
+0:21                  direct index ( temp highp float)
+0:21                    b2: direct index for structure ( uniform highp 2-component vector of float)
+0:21                      'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                      Constant:
+0:21                        2 (const uint)
+0:21                    Constant:
+0:21                      1 (const int)
+0:21              c1: direct index for structure ( uniform highp 4-component vector of float)
+0:21                'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21                Constant:
+0:21                  3 (const uint)
+0:21            d: direct index for structure ( uniform highp 4-component vector of float)
+0:21              'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:21              Constant:
+0:21                4 (const uint)
+0:23      Branch: Return with expression
+0:23        vector-scale ( temp highp 4-component vector of float)
+0:23          Convert uint to float ( temp highp float)
+0:23            'j' ( temp highp uint)
+0:23          'v' ( temp highp 4-component vector of float)
+0:26  Function Definition: main( ( global void)
+0:26    Function Parameters: 
+0:27    Sequence
+0:27      move second child to first child ( temp highp 4-component vector of float)
+0:27        'o' ( out highp 4-component vector of float)
+0:27        add ( temp highp 4-component vector of float)
+0:27          'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:27          Function Call: foo( ( global highp 4-component vector of float)
+0:?   Linker Objects
+0:?     'io' (layout( location=0) smooth in highp 4-component vector of float)
+0:?     'o' ( out highp 4-component vector of float)
+0:?     'anon@0' (layout( column_major std140) uniform block{ uniform highp 4-component vector of float a,  uniform highp 2-component vector of float b1,  uniform highp 2-component vector of float b2,  uniform highp 4-component vector of float c1,  uniform highp 4-component vector of float d})
+0:?     'anon@1' (layout( column_major std430) buffer block{ coherent volatile buffer highp uint counter1,  coherent volatile buffer highp uint counter2})
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 88
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 72 80 86
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "foo("
+                              Name 13  "j"
+                              Name 14  "gl_AtomicCounterBlock_0"
+                              MemberName 14(gl_AtomicCounterBlock_0) 0  "counter3"
+                              MemberName 14(gl_AtomicCounterBlock_0) 1  "counter2"
+                              MemberName 14(gl_AtomicCounterBlock_0) 2  "counter1"
+                              Name 16  ""
+                              Name 31  "v"
+                              Name 35  "gl_DefaultUniformBlock"
+                              MemberName 35(gl_DefaultUniformBlock) 0  "a"
+                              MemberName 35(gl_DefaultUniformBlock) 1  "b2"
+                              MemberName 35(gl_DefaultUniformBlock) 2  "b1"
+                              MemberName 35(gl_DefaultUniformBlock) 3  "c2"
+                              MemberName 35(gl_DefaultUniformBlock) 4  "d"
+                              MemberName 35(gl_DefaultUniformBlock) 5  "s"
+                              MemberName 35(gl_DefaultUniformBlock) 6  "c1"
+                              Name 37  ""
+                              Name 67  "v"
+                              Name 72  "gl_VertexID"
+                              Name 80  "gl_InstanceID"
+                              Name 86  "io"
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Offset 0
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Offset 4
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Offset 8
+                              Decorate 14(gl_AtomicCounterBlock_0) BufferBlock
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 1
+                              Decorate 34 ArrayStride 16
+                              MemberDecorate 35(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 35(gl_DefaultUniformBlock) 1 Offset 16
+                              MemberDecorate 35(gl_DefaultUniformBlock) 2 Offset 24
+                              MemberDecorate 35(gl_DefaultUniformBlock) 3 Offset 32
+                              MemberDecorate 35(gl_DefaultUniformBlock) 4 Offset 48
+                              MemberDecorate 35(gl_DefaultUniformBlock) 5 Offset 64
+                              MemberDecorate 35(gl_DefaultUniformBlock) 6 Offset 128
+                              Decorate 35(gl_DefaultUniformBlock) Block
+                              Decorate 37 DescriptorSet 0
+                              Decorate 37 Binding 0
+                              Decorate 72(gl_VertexID) BuiltIn VertexIndex
+                              Decorate 80(gl_InstanceID) BuiltIn InstanceIndex
+                              Decorate 86(io) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 0
+              12:             TypePointer Function 11(int)
+14(gl_AtomicCounterBlock_0):             TypeStruct 11(int) 11(int) 11(int)
+              15:             TypePointer Uniform 14(gl_AtomicCounterBlock_0)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 1
+              19:             TypePointer Uniform 11(int)
+              21:     11(int) Constant 1
+              22:     11(int) Constant 0
+              24:     17(int) Constant 0
+              26:     11(int) Constant 4294967295
+              30:             TypePointer Function 7(fvec4)
+              32:             TypeVector 6(float) 2
+              33:     11(int) Constant 4
+              34:             TypeArray 7(fvec4) 33
+35(gl_DefaultUniformBlock):             TypeStruct 7(fvec4) 32(fvec2) 32(fvec2) 7(fvec4) 7(fvec4) 34 7(fvec4)
+              36:             TypePointer Uniform 35(gl_DefaultUniformBlock)
+              37:     36(ptr) Variable Uniform
+              38:             TypePointer Uniform 7(fvec4)
+              41:     17(int) Constant 2
+              42:             TypePointer Uniform 6(float)
+              53:     17(int) Constant 3
+              57:     17(int) Constant 4
+              70:     17(int) Constant 5
+              71:             TypePointer Input 17(int)
+ 72(gl_VertexID):     71(ptr) Variable Input
+              77:             TypePointer Function 6(float)
+80(gl_InstanceID):     71(ptr) Variable Input
+              85:             TypePointer Output 7(fvec4)
+          86(io):     85(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+           67(v):     30(ptr) Variable Function
+              68:    7(fvec4) FunctionCall 9(foo()
+                              Store 67(v) 68
+              69:    7(fvec4) Load 67(v)
+              73:     17(int) Load 72(gl_VertexID)
+              74:     38(ptr) AccessChain 37 70 73
+              75:    7(fvec4) Load 74
+              76:    7(fvec4) FAdd 69 75
+                              Store 67(v) 76
+              78:     77(ptr) AccessChain 67(v) 22
+              79:    6(float) Load 78
+              81:     17(int) Load 80(gl_InstanceID)
+              82:    6(float) ConvertSToF 81
+              83:    6(float) FSub 79 82
+              84:     77(ptr) AccessChain 67(v) 22
+                              Store 84 83
+              87:    7(fvec4) Load 67(v)
+                              Store 86(io) 87
+                              Return
+                              FunctionEnd
+         9(foo():    7(fvec4) Function None 8
+              10:             Label
+           13(j):     12(ptr) Variable Function
+           31(v):     30(ptr) Variable Function
+              20:     19(ptr) AccessChain 16 18
+              23:     11(int) AtomicIAdd 20 21 22 21
+              25:     19(ptr) AccessChain 16 24
+              27:     11(int) AtomicIAdd 25 21 22 26
+              28:     11(int) ISub 27 21
+              29:     11(int) IAdd 23 28
+                              Store 13(j) 29
+              39:     38(ptr) AccessChain 37 24
+              40:    7(fvec4) Load 39
+              43:     42(ptr) AccessChain 37 41 22
+              44:    6(float) Load 43
+              45:     42(ptr) AccessChain 37 41 21
+              46:    6(float) Load 45
+              47:     42(ptr) AccessChain 37 18 22
+              48:    6(float) Load 47
+              49:     42(ptr) AccessChain 37 18 21
+              50:    6(float) Load 49
+              51:    7(fvec4) CompositeConstruct 44 46 48 50
+              52:    7(fvec4) FAdd 40 51
+              54:     38(ptr) AccessChain 37 53
+              55:    7(fvec4) Load 54
+              56:    7(fvec4) FAdd 52 55
+              58:     38(ptr) AccessChain 37 57
+              59:    7(fvec4) Load 58
+              60:    7(fvec4) FAdd 56 59
+                              Store 31(v) 60
+              61:     11(int) Load 13(j)
+              62:    6(float) ConvertUToF 61
+              63:    7(fvec4) Load 31(v)
+              64:    7(fvec4) VectorTimesScalar 63 62
+                              ReturnValue 64
+                              FunctionEnd
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 74
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 68 70
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 9  "foo("
+                              Name 13  "j"
+                              Name 14  "gl_AtomicCounterBlock_0"
+                              MemberName 14(gl_AtomicCounterBlock_0) 0  "counter3"
+                              MemberName 14(gl_AtomicCounterBlock_0) 1  "counter2"
+                              MemberName 14(gl_AtomicCounterBlock_0) 2  "counter1"
+                              Name 16  ""
+                              Name 31  "v"
+                              Name 35  "gl_DefaultUniformBlock"
+                              MemberName 35(gl_DefaultUniformBlock) 0  "a"
+                              MemberName 35(gl_DefaultUniformBlock) 1  "b2"
+                              MemberName 35(gl_DefaultUniformBlock) 2  "b1"
+                              MemberName 35(gl_DefaultUniformBlock) 3  "c2"
+                              MemberName 35(gl_DefaultUniformBlock) 4  "d"
+                              MemberName 35(gl_DefaultUniformBlock) 5  "s"
+                              MemberName 35(gl_DefaultUniformBlock) 6  "c1"
+                              Name 37  ""
+                              Name 68  "o"
+                              Name 70  "io"
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 0 Offset 0
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 1 Offset 4
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Volatile
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Coherent
+                              MemberDecorate 14(gl_AtomicCounterBlock_0) 2 Offset 8
+                              Decorate 14(gl_AtomicCounterBlock_0) BufferBlock
+                              Decorate 16 DescriptorSet 0
+                              Decorate 16 Binding 1
+                              Decorate 34 ArrayStride 16
+                              MemberDecorate 35(gl_DefaultUniformBlock) 0 Offset 0
+                              MemberDecorate 35(gl_DefaultUniformBlock) 1 Offset 16
+                              MemberDecorate 35(gl_DefaultUniformBlock) 2 Offset 24
+                              MemberDecorate 35(gl_DefaultUniformBlock) 3 Offset 32
+                              MemberDecorate 35(gl_DefaultUniformBlock) 4 Offset 48
+                              MemberDecorate 35(gl_DefaultUniformBlock) 5 Offset 64
+                              MemberDecorate 35(gl_DefaultUniformBlock) 6 Offset 128
+                              Decorate 35(gl_DefaultUniformBlock) Block
+                              Decorate 37 DescriptorSet 0
+                              Decorate 37 Binding 0
+                              Decorate 68(o) Location 0
+                              Decorate 70(io) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 0
+              12:             TypePointer Function 11(int)
+14(gl_AtomicCounterBlock_0):             TypeStruct 11(int) 11(int) 11(int)
+              15:             TypePointer Uniform 14(gl_AtomicCounterBlock_0)
+              16:     15(ptr) Variable Uniform
+              17:             TypeInt 32 1
+              18:     17(int) Constant 2
+              19:             TypePointer Uniform 11(int)
+              21:     11(int) Constant 1
+              22:     11(int) Constant 0
+              24:     17(int) Constant 1
+              26:     11(int) Constant 4294967295
+              30:             TypePointer Function 7(fvec4)
+              32:             TypeVector 6(float) 2
+              33:     11(int) Constant 4
+              34:             TypeArray 7(fvec4) 33
+35(gl_DefaultUniformBlock):             TypeStruct 7(fvec4) 32(fvec2) 32(fvec2) 7(fvec4) 7(fvec4) 34 7(fvec4)
+              36:             TypePointer Uniform 35(gl_DefaultUniformBlock)
+              37:     36(ptr) Variable Uniform
+              38:     17(int) Constant 0
+              39:             TypePointer Uniform 7(fvec4)
+              42:             TypePointer Uniform 6(float)
+              53:     17(int) Constant 6
+              57:     17(int) Constant 4
+              67:             TypePointer Output 7(fvec4)
+           68(o):     67(ptr) Variable Output
+              69:             TypePointer Input 7(fvec4)
+          70(io):     69(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              71:    7(fvec4) Load 70(io)
+              72:    7(fvec4) FunctionCall 9(foo()
+              73:    7(fvec4) FAdd 71 72
+                              Store 68(o) 73
+                              Return
+                              FunctionEnd
+         9(foo():    7(fvec4) Function None 8
+              10:             Label
+           13(j):     12(ptr) Variable Function
+           31(v):     30(ptr) Variable Function
+              20:     19(ptr) AccessChain 16 18
+              23:     11(int) AtomicIAdd 20 21 22 21
+              25:     19(ptr) AccessChain 16 24
+              27:     11(int) AtomicIAdd 25 21 22 26
+              28:     11(int) ISub 27 21
+              29:     11(int) IAdd 23 28
+                              Store 13(j) 29
+              40:     39(ptr) AccessChain 37 38
+              41:    7(fvec4) Load 40
+              43:     42(ptr) AccessChain 37 18 22
+              44:    6(float) Load 43
+              45:     42(ptr) AccessChain 37 18 21
+              46:    6(float) Load 45
+              47:     42(ptr) AccessChain 37 24 22
+              48:    6(float) Load 47
+              49:     42(ptr) AccessChain 37 24 21
+              50:    6(float) Load 49
+              51:    7(fvec4) CompositeConstruct 44 46 48 50
+              52:    7(fvec4) FAdd 41 51
+              54:     39(ptr) AccessChain 37 53
+              55:    7(fvec4) Load 54
+              56:    7(fvec4) FAdd 52 55
+              58:     39(ptr) AccessChain 37 57
+              59:    7(fvec4) Load 58
+              60:    7(fvec4) FAdd 56 59
+                              Store 31(v) 60
+              61:     11(int) Load 13(j)
+              62:    6(float) ConvertUToF 61
+              63:    7(fvec4) Load 31(v)
+              64:    7(fvec4) VectorTimesScalar 63 62
+                              ReturnValue 64
+                              FunctionEnd
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/contradict_0.geom b/Test/contradict_0.geom
old mode 100755
new mode 100644
diff --git a/Test/contradict_1.geom b/Test/contradict_1.geom
old mode 100755
new mode 100644
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/hlsl.intrinsics.evalfns.frag b/Test/hlsl.intrinsics.evalfns.frag
index 9638706..7b7509d 100644
--- a/Test/hlsl.intrinsics.evalfns.frag
+++ b/Test/hlsl.intrinsics.evalfns.frag
@@ -1,10 +1,33 @@
-
-void main(float inF1, float2 inF2, float3 inF3, float4 inF4, int2 inI2) : COLOR
+struct PS_INPUT
 {
-    EvaluateAttributeSnapped(inF1, int2(8,15));
-    EvaluateAttributeSnapped(inF2, int2(0,1));
-    EvaluateAttributeSnapped(inF3, int2(3,10));
-    EvaluateAttributeSnapped(inF4, int2(7,8));
+        float2 vPos: TEXCOORD0;
+};
 
-    EvaluateAttributeSnapped(inF1, inI2);
+float4 main(float inF1, float2 inF2, float3 inF3, float4 inF4, int2 inI2, PS_INPUT i) : COLOR
+{
+    float  oF1 = EvaluateAttributeSnapped(inF1, int2(8,15));
+    float2 oF2 = EvaluateAttributeSnapped(inF2, int2(0,1));
+    float3 oF3 = EvaluateAttributeSnapped(inF3, int2(3,10));
+    float4 oF4 = EvaluateAttributeSnapped(inF4, int2(7,8));
+
+    oF1 += EvaluateAttributeSnapped(inF1, inI2);
+
+    oF1 += EvaluateAttributeAtSample(inF1, 3);
+    oF2 += EvaluateAttributeAtSample(inF2, 3);
+    oF3 += EvaluateAttributeAtSample(inF3, 3);
+    oF4 += EvaluateAttributeAtSample(inF4, 3);
+
+    oF1 += EvaluateAttributeAtSample(inF1, inI2.x);
+
+    oF1 += EvaluateAttributeAtCentroid(inF1);
+    oF2 += EvaluateAttributeAtCentroid(inF2);
+    oF3 += EvaluateAttributeAtCentroid(inF3);
+    oF4 += EvaluateAttributeAtCentroid(inF4);
+
+    oF2 += EvaluateAttributeSnapped(i.vPos, int2(0,1));
+    oF2 += EvaluateAttributeAtSample(i.vPos, 3);
+    oF2 += EvaluateAttributeAtCentroid(i.vPos);
+
+    float4 color = float4(oF1, oF2.y, oF3.z, oF4.w);
+    return color;
 }
diff --git a/Test/hlsl.intrinsics.frag b/Test/hlsl.intrinsics.frag
old mode 100755
new mode 100644
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.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/iomap.crossStage.2.frag b/Test/iomap.crossStage.2.frag
new file mode 100644
index 0000000..25756a6
--- /dev/null
+++ b/Test/iomap.crossStage.2.frag
@@ -0,0 +1,42 @@
+#version 460

+

+

+layout(location = 5) in outBlock {

+    vec4 o3;

+};

+

+

+in vec4 gfo1;

+in vec2 gfo2;

+

+out vec4 outColor;

+

+uniform vec2 u1;

+uniform vec3 u2;           // initializer present in vertex stage

+uniform vec4 u3 = vec4(0); // initializer matches initializer in vertex stage

+

+uniform mat2 um2 = mat2(4.0);

+

+layout (location = 0, binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+buffer fragOnlyBlock {

+    vec2 fb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName2 [2]; // instance name different from vert

+

+

+void main()

+{

+    vec4 color = gfo1 * u1.rgrg * u2.rgbr * u3.rgba;        // o1 is statically used

+    outColor = color;

+}

+

diff --git a/Test/iomap.crossStage.2.geom b/Test/iomap.crossStage.2.geom
new file mode 100644
index 0000000..91508ab
--- /dev/null
+++ b/Test/iomap.crossStage.2.geom
@@ -0,0 +1,39 @@
+#version 460

+

+layout(points) in;

+layout(triangle_strip, max_vertices=3) out;

+

+in vec4 vgo1[];

+in vec2 vgo2[];

+

+layout(location = 5) in outBlock {

+    vec4 o3;

+} inBlock[];

+

+out vec4 gfo1;

+out vec2 gfo2;

+

+layout(location = 5) out outBlock {

+    vec4 o3;

+} gf_out;

+

+uniform vec2 u1;

+uniform vec3 u2 = vec3(0); // initializer not present in fragment stage

+uniform vec4 u3 = vec4(0); // initializer matches initializer in fragment stage

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName1 [2]; // instance name different from frag

+

+void main()

+{

+    for (int i = 0; i < 3; i++) {

+        gfo1 = vec4(0);

+        gfo2 = vec2(0);

+        gf_out.o3 = inBlock[i].o3;

+        EmitVertex();

+    }

+    EndPrimitive();

+}

+

diff --git a/Test/iomap.crossStage.2.vert b/Test/iomap.crossStage.2.vert
new file mode 100644
index 0000000..ebb0d9d
--- /dev/null
+++ b/Test/iomap.crossStage.2.vert
@@ -0,0 +1,38 @@
+#version 460

+

+out vec4 vgo1; // declaration order different than fragment shader

+out vec2 vgo2; // declaration order different than fragment shader

+

+layout(location = 5) out outBlock {

+    vec4 o3;

+};

+

+uniform vec2 u1;

+uniform vec3 u2 = vec3(0); // initializer not present in fragment stage

+uniform vec4 u3 = vec4(0); // initializer matches initializer in fragment stage

+

+uniform mat2 um2 = mat2(4.0);

+

+layout (location = 0, binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+buffer vertOnlyBlock {

+    vec2 vb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName1 [2]; // instance name different from frag

+

+void main()

+{

+    vgo1 = vec4(0);

+    vgo2 = vec2(0);

+    o3 = vec4(0);

+}

+

diff --git a/Test/iomap.crossStage.frag b/Test/iomap.crossStage.frag
new file mode 100644
index 0000000..1624703
--- /dev/null
+++ b/Test/iomap.crossStage.frag
@@ -0,0 +1,41 @@
+#version 460

+

+

+layout(location = 5) in outBlock {

+    vec4 o3;

+};

+

+in vec2 o2; // declaration order different than vertex shader

+in vec4 o1; // declaration order different than vertex shader

+

+out vec4 outColor;

+

+uniform vec2 u1;

+uniform vec3 u2;    // initializer present in vertex stage

+uniform vec4 u3 = vec4(0); // initializer matches initializer in vertex stage

+

+uniform mat2 um2 = mat2(4.0);

+

+layout (location = 0, binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+buffer fragOnlyBlock {

+    vec2 fb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName2 [2]; // instance name different from vert

+

+

+void main()

+{

+    vec4 color = o1 * u1.rgrg * u2.rgbr * u3.rgba;        // o1 is statically used

+    outColor = color;

+}

+

diff --git a/Test/iomap.crossStage.vert b/Test/iomap.crossStage.vert
new file mode 100644
index 0000000..d05874f
--- /dev/null
+++ b/Test/iomap.crossStage.vert
@@ -0,0 +1,38 @@
+#version 460

+

+out vec4 o1; // declaration order different than fragment shader

+out vec2 o2; // declaration order different than fragment shader

+

+layout(location = 5) out outBlock {

+    vec4 o3;

+};

+

+uniform vec2 u1;

+uniform vec3 u2 = vec3(0); // initializer not present in fragment stage

+uniform vec4 u3 = vec4(0); // initializer matches initializer in fragment stage

+

+uniform mat2 um2 = mat2(4.0);

+

+layout (location = 0, binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+buffer vertOnlyBlock {

+    vec2 vb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName1 [2]; // instance name different from frag

+

+void main()

+{

+    o1 = vec4(0);

+    o2 = vec2(0);

+    o3 = vec4(0);

+}

+

diff --git a/Test/iomap.crossStage.vk.frag b/Test/iomap.crossStage.vk.frag
new file mode 100644
index 0000000..d09e687
--- /dev/null
+++ b/Test/iomap.crossStage.vk.frag
@@ -0,0 +1,50 @@
+#version 460

+

+

+layout(location = 5) in outBlock {

+    vec4 o3;

+};

+

+

+in vec4 gfo1;

+in vec2 gfo2;

+

+out vec4 outColor;

+

+layout (binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+readonly buffer fragOnlyBlock {

+    vec2 fb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName2 [2]; // instance name different from vert

+

+vec2 Bar() {

+    return  fb1 + 

+            blockName2[0].b +

+            blockName2[1].b;

+}

+

+vec4 Foo() {

+    return  a + 

+            b + 

+            blockName2[0].a +

+            blockName2[1].a +

+            vec4(Bar(), 0.0, 0.0);

+}

+

+void main()

+{

+    vec4 color = gfo1; // o1 is statically used

+    color = color + Foo();

+    outColor = color;

+}

+

diff --git a/Test/iomap.crossStage.vk.geom b/Test/iomap.crossStage.vk.geom
new file mode 100644
index 0000000..b951737
--- /dev/null
+++ b/Test/iomap.crossStage.vk.geom
@@ -0,0 +1,35 @@
+#version 460

+

+layout(points) in;

+layout(triangle_strip, max_vertices=3) out;

+

+in vec4 vgo1[];

+in vec2 vgo2[];

+

+layout(location = 5) in outBlock {

+    vec4 o3;

+} inBlock[];

+

+out vec4 gfo1;

+out vec2 gfo2;

+

+layout(location = 5) out outBlock {

+    vec4 o3;

+} gf_out;

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName1 [2]; // instance name different from frag

+

+void main()

+{

+    for (int i = 0; i < 3; i++) {

+        gfo1 = vec4(0);

+        gfo2 = vec2(0);

+        gf_out.o3 = inBlock[i].o3;

+        EmitVertex();

+    }

+    EndPrimitive();

+}

+

diff --git a/Test/iomap.crossStage.vk.vert b/Test/iomap.crossStage.vk.vert
new file mode 100644
index 0000000..e422131
--- /dev/null
+++ b/Test/iomap.crossStage.vk.vert
@@ -0,0 +1,32 @@
+#version 460

+

+out vec4 vgo1; // declaration order different than fragment shader

+out vec2 vgo2; // declaration order different than fragment shader

+

+layout(location = 5) out outBlock {

+    vec4 o3;

+};

+

+layout (binding = 0) uniform sampler2D glass;

+

+uniform crossStageBlock1 {

+    uniform vec4 a;

+    vec4 b;

+};

+

+readonly buffer vertOnlyBlock {

+    vec2 vb1;

+};

+

+uniform crossStageBlock2 {

+    uniform vec4 a;

+    vec2 b;

+} blockName1 [2]; // instance name different from frag

+

+void main()

+{

+    vgo1 = vec4(0);

+    vgo2 = vec2(0);

+    o3 = vec4(0);

+}

+

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.inconsistentGLPerVertex.0.geom b/Test/link.vk.inconsistentGLPerVertex.0.geom
new file mode 100755
index 0000000..4d192d6
--- /dev/null
+++ b/Test/link.vk.inconsistentGLPerVertex.0.geom
@@ -0,0 +1,27 @@
+#version 460 core
+
+layout(lines_adjacency) in; 
+layout(triangle_strip, max_vertices = 50) out;
+
+in vs_output 
+{ 
+	vec4 color;
+} gs_in[]; 
+
+out gs_output
+{
+	vec4 color;
+} gs_out;
+
+void main()
+{
+	gl_Position = gl_in[0].gl_Position;
+	gs_out.color = gs_in[0].color;
+	EmitVertex();
+	gs_out.color = gs_in[1].color;
+	gl_Position = gl_in[1].gl_Position;
+	EmitVertex();
+	gs_out.color = gs_in[0].color;
+	gl_Position = gl_in[0].gl_Position;
+	EmitVertex();
+}
diff --git a/Test/link.vk.inconsistentGLPerVertex.0.vert b/Test/link.vk.inconsistentGLPerVertex.0.vert
new file mode 100755
index 0000000..7658c68
--- /dev/null
+++ b/Test/link.vk.inconsistentGLPerVertex.0.vert
@@ -0,0 +1,20 @@
+#version 460 core
+
+// This test is to test isInconsistentGLPerVertexMember() workarounds.
+// Without that workaround this compile fails due to block declarations
+// in gl_PerVertex not being consistent for:
+// gl_SecondaryPositionNV
+// gl_PositionPerViewNV
+
+out vs_output 
+{ 
+	vec4 color;
+} vs_out; 
+
+in vec4 P;
+void main()
+{
+	vs_out.color = vec4(1.);
+	gl_PointSize = 1.0;
+	gl_Position = P;
+}
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/negativeWorkGroupSize.comp b/Test/negativeWorkGroupSize.comp
new file mode 100644
index 0000000..1f007d0
--- /dev/null
+++ b/Test/negativeWorkGroupSize.comp
@@ -0,0 +1,12 @@
+#version 460
+
+void fn(){
+    uvec3 wgs = gl_WorkGroupSize; // error: fixed workgroup size has not been declared
+}
+
+layout(local_size_x = 64) in; // declare workgroup size
+
+void main(){
+    fn();
+    uvec3 wgs = gl_WorkGroupSize; // valid
+}
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 df07046..51f1a6a 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -169,7 +169,7 @@
      -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
 run -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
+     -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
 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 --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.OpSelect.frag b/Test/spv.1.4.OpSelect.frag
old mode 100755
new mode 100644
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
old mode 100755
new mode 100644
diff --git a/Test/spv.atomicFloat_Error.comp b/Test/spv.atomicFloat_Error.comp
old mode 100755
new mode 100644
diff --git a/Test/spv.atomicStoreInt64.comp b/Test/spv.atomicStoreInt64.comp
new file mode 100644
index 0000000..879c37a
--- /dev/null
+++ b/Test/spv.atomicStoreInt64.comp
@@ -0,0 +1,11 @@
+#version 450
+#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable
+#extension GL_EXT_shader_atomic_int64 : enable
+#extension GL_KHR_memory_scope_semantics : enable
+
+layout(set = 0, binding = 0) buffer ssbo { uint64_t y; };
+layout(set = 0, binding = 1) uniform ubo { uint64_t z; };
+
+void main() {
+    atomicStore(y, z, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
+}
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.depthUnchanged.frag b/Test/spv.depthUnchanged.frag
new file mode 100644
index 0000000..bbc5139
--- /dev/null
+++ b/Test/spv.depthUnchanged.frag
@@ -0,0 +1,8 @@
+#version 430
+layout(location = 0) out vec4 outColor;
+layout(depth_unchanged) out float gl_FragDepth;
+void main() {
+  outColor = vec4(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = gl_FragCoord.y;
+}
+
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..05311c9 100644
--- a/Test/spv.ext.MissShader.rmiss
+++ b/Test/spv.ext.MissShader.rmiss
@@ -1,8 +1,19 @@
 #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
+#extension GL_ARB_sparse_texture_clamp: enable
+
 layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
 layout(location = 0) rayPayloadEXT vec4 localPayload;
 layout(location = 1) rayPayloadInEXT vec4 incomingPayload;
+
+layout(binding = 1, set = 0) uniform sampler2D    s2D;
+layout(location = 2) in vec2 c2;
+layout(location = 3) in float lodClamp;
+
 void main()
 {
 	uvec3 v0 = gl_LaunchIDEXT;
@@ -12,4 +23,6 @@
 	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);
+        vec4 texel = textureGradOffsetClampARB(s2D, c2, c2, c2, ivec2(5), lodClamp);
 }
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 9fedf3a..e9eb2cb 100644
--- a/Test/spv.ext.RayGenShader.rgen
+++ b/Test/spv.ext.RayGenShader.rgen
@@ -4,7 +4,7 @@
 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;
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.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.float16Fetch.frag b/Test/spv.float16Fetch.frag
index b1ba98c..eeda1dd 100644
--- a/Test/spv.float16Fetch.frag
+++ b/Test/spv.float16Fetch.frag
@@ -889,19 +889,20 @@
 f16vec4 testSparseTextureGatherOffsets()

 {

     f16vec4 texel = f16vec4(0.0hf);

+    const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));

 

-    sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel, 0);

-    sparseTextureGatherOffsetsARB(s2D, f16c2, offsets, texel, 0, f16bias);

-    sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, texel, 0);

-    sparseTextureGatherOffsetsARB(s2DArray, f16c3, offsets, texel, 0, f16bias);

-    sparseTextureGatherOffsetsARB(s2DRect, c2, offsets, texel, 0);

-    sparseTextureGatherOffsetsARB(s2DRect, f16c2, offsets, texel, 0);

-    sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, offsets, texel);

-    sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, offsets, texel);

-    sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, offsets, texel);

-    sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, offsets, texel);

-    sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, offsets, texel);

-    sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, offsets, texel);

+    sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2D, f16c2, constOffsets, texel, 0, f16bias);

+    sparseTextureGatherOffsetsARB(s2DArray, c3, constOffsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DArray, f16c3, constOffsets, texel, 0, f16bias);

+    sparseTextureGatherOffsetsARB(s2DRect, c2, constOffsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DRect, f16c2, constOffsets, texel, 0);

+    sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, constOffsets, texel);

+    sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, constOffsets, texel);

 

     return texel;

 }

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 463afdf..d887ce9 100644
--- a/Test/spv.precision.frag
+++ b/Test/spv.precision.frag
@@ -1,4 +1,5 @@
 #version 310 es

+#extension GL_OES_sample_variables : enable

 precision mediump float;

 in lowp float lowfin;

 in mediump float mediumfin;

@@ -59,4 +60,5 @@
     mediumfout *= s.b;

 

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

+    mediumfout = ((gl_SampleMaskIn[0] >> uniform_medium > 0) ? 2.0 * mediumfout : 3.0 * mediumfout);

 }

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.sparseTexture.frag b/Test/spv.sparseTexture.frag
index c995ee2..50ea272 100644
--- a/Test/spv.sparseTexture.frag
+++ b/Test/spv.sparseTexture.frag
@@ -27,8 +27,6 @@
 in flat ivec2 ic2;

 in flat ivec3 ic3;

 

-in flat ivec2 offsets[4];

-

 out vec4 outColor;

 

 void main()

@@ -79,9 +77,10 @@
     resident |= sparseTextureGatherOffsetARB(is2DArray, c3, ivec2(5), itexel, 2);

     resident |= sparseTextureGatherOffsetARB(s2DRectShadow, c2, 2.0, ivec2(7), texel);

 

-    resident |= sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel);

-    resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2);

-    resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel);

+    const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));

+    resident |= sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel);

+    resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, constOffsets, itexel, 2);

+    resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, constOffsets, texel);

 

     resident |= sparseImageLoadARB(i2D, ic2, texel);

     resident |= sparseImageLoadARB(ii3D, ic3, itexel);

diff --git a/Test/spv.specConstArrayCheck.vert b/Test/spv.specConstArrayCheck.vert
old mode 100755
new mode 100644
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.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/vk.relaxed.changeSet.frag b/Test/vk.relaxed.changeSet.frag
new file mode 100755
index 0000000..e2f2403
--- /dev/null
+++ b/Test/vk.relaxed.changeSet.frag
@@ -0,0 +1,13 @@
+#version 460
+
+layout(location = 0) out vec4 fragColor;
+
+uniform sampler2D sTexture;
+
+in vec4 Color;
+in vec2 UV;
+
+void main()
+{
+    fragColor = Color * texture(sTexture, UV.st).r;
+}
diff --git a/Test/vk.relaxed.changeSet.vert b/Test/vk.relaxed.changeSet.vert
new file mode 100755
index 0000000..419adba
--- /dev/null
+++ b/Test/vk.relaxed.changeSet.vert
@@ -0,0 +1,16 @@
+#version 460
+
+in vec2 aPos;
+in vec2 aUV;
+in vec4 aColor;
+uniform mat4 projectionMatrix;
+
+out vec4 Color;
+out vec2 UV;
+
+void main()
+{
+    Color = aColor;
+    UV = aUV;
+    gl_Position = projectionMatrix * vec4(aPos, 0, 1);
+}
diff --git a/Test/vk.relaxed.errorcheck.frag b/Test/vk.relaxed.errorcheck.frag
new file mode 100644
index 0000000..b75b50b
--- /dev/null
+++ b/Test/vk.relaxed.errorcheck.frag
@@ -0,0 +1,16 @@
+#version 460

+

+layout (location = 0) in vec4 io;

+

+out vec4 o;

+

+// default uniforms will be gathered into a uniform block

+uniform vec4 a;     // declared in both stages with different types

+

+vec4 foo() {

+    return a;

+}

+

+void main() {

+    o = io + foo();

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.errorcheck.vert b/Test/vk.relaxed.errorcheck.vert
new file mode 100644
index 0000000..b1bdbbe
--- /dev/null
+++ b/Test/vk.relaxed.errorcheck.vert
@@ -0,0 +1,15 @@
+#version 460

+

+layout (location = 0) out vec4 io;

+

+// default uniforms will be gathered into a uniform block

+// final global block will merge uniforms from all linked files

+uniform vec2 a;     // declared in both stages with different type

+

+vec4 foo() {

+    return a.xyxy;

+}

+

+void main() {

+    io = foo();

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.frag b/Test/vk.relaxed.frag
new file mode 100644
index 0000000..d43416e
--- /dev/null
+++ b/Test/vk.relaxed.frag
@@ -0,0 +1,74 @@
+#version 460

+

+out vec4 o;

+

+// default uniforms will be gathered into a uniform block

+uniform vec4 a;

+uniform vec2 b = vec2(0, 0);            // initializer will be ignored

+layout(location = 0) uniform vec2 c;    // location qualifier will be ignored

+uniform vec4 d[10];

+uniform struct e {                      

+    vec2 x;

+    float y;

+    uint z;

+} structUniform; 

+

+// opaque types will not be grouped into uniform block

+uniform sampler2D t1;

+

+// shared and packed layout qualifier are silently ignored

+layout(shared) uniform UniformBlock {

+    float j;

+    vec4 k;

+};

+

+layout(packed) buffer BufferBlock {

+    float j;

+    vec4 k;

+} bufferInstance;

+

+// atomic_uint will be converted to uint and gathered in a buffer block

+layout(binding = 0) uniform atomic_uint counter1; // offset not used

+layout(binding = 0) uniform atomic_uint counter2; // offset not used

+layout(binding = 1) uniform atomic_uint counter3; // offset not used

+

+// atomic counter functions will be converted to equivalent integer atomic operations

+uint bar() {

+    uint j = 0;

+    j = atomicCounterIncrement(counter1);

+    j = atomicCounterDecrement(counter1);

+    j = atomicCounter(counter1);

+

+    j = atomicCounterAdd(counter1, 1);

+    j = atomicCounterAdd(counter1, -1);

+    j = atomicCounterSubtract(counter1, 1);

+

+    j = atomicCounterMin(counter1, j);

+    j = atomicCounterMax(counter1, j);

+    j = atomicCounterAnd(counter1, j);

+

+    j = atomicCounterOr(counter1, j);

+    j = atomicCounterXor(counter1, j);

+    

+    j = atomicCounterExchange(counter1, j);

+    j = atomicCounterCompSwap(counter1, 0, j);

+

+    atomicCounterIncrement(counter2);

+    atomicCounterIncrement(counter3);

+

+    memoryBarrierAtomicCounter();

+    

+    return j;

+}

+

+vec4 foo() {

+    float f = j + bufferInstance.j + structUniform.y + structUniform.z;

+    vec2 v2 = b + c + structUniform.x;

+    vec4 v4 = a + d[0] + d[1] + d[2] + k + bufferInstance.k + texture(t1, vec2(0, 0));

+    return vec4(f) * vec4(v2, 1, 1) * v4;

+}

+

+void main() {

+    float j = float(bar());

+    o = j * foo();

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.link1.frag b/Test/vk.relaxed.link1.frag
new file mode 100644
index 0000000..95b609f
--- /dev/null
+++ b/Test/vk.relaxed.link1.frag
@@ -0,0 +1,28 @@
+#version 460

+

+out vec4 o;

+

+// default uniforms will be gathered into a uniform block

+// final global block will merge uniforms from all linked files

+uniform vec4 a;     // declared in both stages

+uniform vec2 b1;    // declaration order swapped in other stage

+uniform vec2 b2;

+uniform vec4 c1;    // not delcared in other file

+uniform vec4 d;

+

+// final global buffer will berge buffers from all linked files

+layout (binding = 0) uniform atomic_uint counter1;

+layout (binding = 0) uniform atomic_uint counter2;

+

+vec4 foo();

+

+vec4 bar() {

+    uint j = atomicCounterIncrement(counter1) + atomicCounterDecrement(counter2);

+    vec4 v = a + vec4(b1.x, b1.y, b2.x, b2.y) + c1 + d;

+

+    return float(j) * v;

+}

+

+void main() {

+    o = foo() + bar();

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.link2.frag b/Test/vk.relaxed.link2.frag
new file mode 100644
index 0000000..a4f468a
--- /dev/null
+++ b/Test/vk.relaxed.link2.frag
@@ -0,0 +1,19 @@
+#version 460

+

+// default uniforms will be gathered into a uniform block

+// final global block will merge uniforms from all linked files

+uniform vec4 a;     // declared in both stages

+uniform vec2 b2;    // declaration order swapped in other stage

+uniform vec2 b1;

+uniform vec4 c2;    // not delcared in other file

+uniform vec4 d;

+

+layout (binding = 0) uniform atomic_uint counter3;

+layout (binding = 0) uniform atomic_uint counter2;

+

+vec4 foo() {

+    uint j = atomicCounterIncrement(counter2) + atomicCounterDecrement(counter3);

+    vec4 v = a + vec4(b1.x, b1.y, b2.x, b2.y) + c2 + d;

+

+    return float(j) * v;

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.stagelink.frag b/Test/vk.relaxed.stagelink.frag
new file mode 100644
index 0000000..d1eebba
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.frag
@@ -0,0 +1,28 @@
+#version 460

+

+layout (location = 0) in vec4 io;

+

+out vec4 o;

+

+// default uniforms will be gathered into a uniform block

+// final global block will merge uniforms from all linked files

+uniform vec4 a;     // declared in both stages

+uniform vec2 b1;    // declaration order swapped in other stage

+uniform vec2 b2;

+uniform vec4 c1;    // not delcared in other file

+uniform vec4 d;

+

+// final global buffer will berge buffers from all linked files

+layout (binding = 0) uniform atomic_uint counter1;

+layout (binding = 0) uniform atomic_uint counter2;

+

+vec4 foo() {

+    uint j = atomicCounterIncrement(counter1) + atomicCounterDecrement(counter2);

+    vec4 v = a + vec4(b1.x, b1.y, b2.x, b2.y) + c1 + d;

+

+    return float(j) * v;

+}

+

+void main() {

+    o = io + foo();

+}
\ No newline at end of file
diff --git a/Test/vk.relaxed.stagelink.vert b/Test/vk.relaxed.stagelink.vert
new file mode 100644
index 0000000..52396ac
--- /dev/null
+++ b/Test/vk.relaxed.stagelink.vert
@@ -0,0 +1,31 @@
+#version 460

+

+layout (location = 0) out vec4 io;

+

+// default uniforms will be gathered into a uniform block

+// final global block will merge uniforms from all linked files

+uniform vec4 a;     // declared in both stages

+uniform vec2 b2;    // declaration order swapped in other stage

+uniform vec2 b1;

+uniform vec4 c2;    // not delcared in other file

+uniform vec4 d;

+

+uniform vec4 s[4];

+

+layout (binding = 0) uniform atomic_uint counter3;

+layout (binding = 0) uniform atomic_uint counter2;

+

+vec4 foo() {

+    uint j = atomicCounterIncrement(counter2) + atomicCounterDecrement(counter3);

+    vec4 v = a + vec4(b1.x, b1.y, b2.x, b2.y) + c2 + d;

+

+    return float(j) * v;

+}

+

+void main() {

+

+    vec4 v = foo();

+    v = v + s[gl_VertexID];

+    v.x = v.x - float(gl_InstanceID);

+    io = v;

+}
\ No newline at end of file
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/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
index eacecb0..5b5e9e6 100644
--- a/build_info.h.tmpl
+++ b/build_info.h.tmpl
@@ -34,10 +34,10 @@
 #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_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 && \
diff --git a/build_info.py b/build_info.py
index 2ac864b..7c1998f 100755
--- a/build_info.py
+++ b/build_info.py
@@ -201,13 +201,13 @@
     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)
+        .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)
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 54283e6..2e04f53 100644
--- a/glslang/CInterface/glslang_c_interface.cpp
+++ b/glslang/CInterface/glslang_c_interface.cpp
@@ -160,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)
 {
@@ -320,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);
@@ -344,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' */
@@ -365,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);
@@ -378,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;
@@ -391,14 +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_delete(glslang_program_t* program)
+GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program)
 {
     if (!program)
         return;
@@ -407,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 552da5e..fc925ea 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -52,7 +52,6 @@
     GenericCodeGen/Link.cpp)
 set_property(TARGET GenericCodeGen PROPERTY POSITION_INDEPENDENT_CODE ON)
 set_property(TARGET GenericCodeGen PROPERTY FOLDER glslang)
-glslang_default_to_hidden_visibility(GenericCodeGen)
 
 ################################################################################
 # MachineIndependent
@@ -134,7 +133,6 @@
 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_only_export_explicit_symbols(MachineIndependent)
 
 glslang_add_build_info_dependency(MachineIndependent)
 
@@ -170,7 +168,7 @@
     POSITION_INDEPENDENT_CODE ON
     VERSION   "${GLSLANG_VERSION}"
     SOVERSION "${GLSLANG_VERSION_MAJOR}")
-target_link_libraries(glslang PRIVATE OGLCompiler MachineIndependent)
+target_link_libraries(glslang PRIVATE OGLCompiler OSDependent MachineIndependent)
 target_include_directories(glslang PUBLIC
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
diff --git a/glslang/HLSL/hlslGrammar.cpp b/glslang/HLSL/hlslGrammar.cpp
index 5bfc53f..f30c640 100644
--- a/glslang/HLSL/hlslGrammar.cpp
+++ b/glslang/HLSL/hlslGrammar.cpp
@@ -480,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) {
diff --git a/glslang/HLSL/hlslParseHelper.cpp b/glslang/HLSL/hlslParseHelper.cpp
old mode 100755
new mode 100644
index ca0d207..d62f392
--- a/glslang/HLSL/hlslParseHelper.cpp
+++ b/glslang/HLSL/hlslParseHelper.cpp
@@ -1376,7 +1376,7 @@
 
     return flattened ? flattened : base;
 }
-TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage,
+TIntermTyped* HlslParseContext::flattenAccess(long long uniqueId, int member, TStorageQualifier outerStorage,
     const TType& dereferencedType, int subset)
 {
     const auto flattenData = flattenMap.find(uniqueId);
@@ -1444,7 +1444,7 @@
 };
 
 // Find and return the split IO TVariable for id, or nullptr if none.
-TVariable* HlslParseContext::getSplitNonIoVar(int id) const
+TVariable* HlslParseContext::getSplitNonIoVar(long long id) const
 {
     const auto splitNonIoVar = splitNonIoVars.find(id);
     if (splitNonIoVar == splitNonIoVars.end())
@@ -1953,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();
@@ -3252,7 +3256,7 @@
         // shadow state.  This depends on downstream optimization to
         // DCE one variant in [shadow, nonshadow] if both are present,
         // or the SPIR-V module would be invalid.
-        int newId = texSymbol->getId();
+        long long newId = texSymbol->getId();
 
         // Check to see if this texture has been given a shadow mode already.
         // If so, look up the one we already have.
@@ -5488,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());
@@ -6067,8 +6075,12 @@
     case EOpInterpolateAtCentroid:
     case EOpInterpolateAtSample:
     case EOpInterpolateAtOffset:
+        // TODO(greg-lunarg): Re-enable this check. It currently gives false errors for builtins
+        // defined and passed as members of a struct. In this case the storage class is showing to be
+        // Function. See glslang #2584
+
         // Make sure the first argument is an interpolant, or an array element of an interpolant
-        if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
+        // if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
             // It might still be an array element.
             //
             // We could check more, but the semantics of the first argument are already met; the
@@ -6076,11 +6088,11 @@
             //
             // ES and desktop 4.3 and earlier:  swizzles may not be used
             // desktop 4.4 and later: swizzles may be used
-            const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
-            if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
-                error(loc, "first argument must be an interpolant, or interpolant-array element",
-                      fnCandidate.getName().c_str(), "");
-        }
+            // const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
+            // if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
+            //     error(loc, "first argument must be an interpolant, or interpolant-array element",
+            //           fnCandidate.getName().c_str(), "");
+        // }
         break;
 
     default:
@@ -7624,7 +7636,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),
@@ -9851,7 +9873,7 @@
                 } else {
                     // Use the original declaration type for the linkage
                     paramType->getQualifier().builtIn = biType;
-                    if (biType == EbvTessLevelInner || biType == EbvTessLevelInner)
+                    if (biType == EbvTessLevelInner || biType == EbvTessLevelOuter)
                         paramType->getQualifier().patch = true;
 
                     if (notInEntryPoint.count(tInterstageIoData(biType, storage)) == 1)
diff --git a/glslang/HLSL/hlslParseHelper.h b/glslang/HLSL/hlslParseHelper.h
index b92856a..2d7165c 100644
--- a/glslang/HLSL/hlslParseHelper.h
+++ b/glslang/HLSL/hlslParseHelper.h
@@ -253,12 +253,12 @@
 
     // Array and struct flattening
     TIntermTyped* flattenAccess(TIntermTyped* base, int member);
-    TIntermTyped* flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage, const TType&, int subset = -1);
+    TIntermTyped* flattenAccess(long long uniqueId, int member, TStorageQualifier outerStorage, const TType&, int subset = -1);
     int findSubtreeOffset(const TIntermNode&) const;
     int findSubtreeOffset(const TType&, int subset, const TVector<int>& offsets) const;
     bool shouldFlatten(const TType&, TStorageQualifier, bool topLevel) const;
     bool wasFlattened(const TIntermTyped* node) const;
-    bool wasFlattened(int id) const { return flattenMap.find(id) != flattenMap.end(); }
+    bool wasFlattened(long long id) const { return flattenMap.find(id) != flattenMap.end(); }
     int  addFlattenedMember(const TVariable&, const TType&, TFlattenData&, const TString& name, bool linkage,
                             const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes);
 
@@ -267,8 +267,8 @@
     void splitBuiltIn(const TString& baseName, const TType& memberType, const TArraySizes*, const TQualifier&);
     const TType& split(const TType& type, const TString& name, const TQualifier&);
     bool wasSplit(const TIntermTyped* node) const;
-    bool wasSplit(int id) const { return splitNonIoVars.find(id) != splitNonIoVars.end(); }
-    TVariable* getSplitNonIoVar(int id) const;
+    bool wasSplit(long long id) const { return splitNonIoVars.find(id) != splitNonIoVars.end(); }
+    TVariable* getSplitNonIoVar(long long id) const;
     void addPatchConstantInvocation();
     void fixTextureShadowModes();
     void finalizeAppendMethods();
@@ -386,7 +386,7 @@
     //
     TVector<TSymbol*> ioArraySymbolResizeList;
 
-    TMap<int, TFlattenData> flattenMap;
+    TMap<long long, TFlattenData> flattenMap;
 
     // IO-type map. Maps a pure symbol-table form of a structure-member list into
     // each of the (up to) three kinds of IO, as each as different allowed decorations,
@@ -399,7 +399,7 @@
     TMap<const TTypeList*, tIoKinds> ioTypeMap;
 
     // Structure splitting data:
-    TMap<int, TVariable*> splitNonIoVars;  // variables with the built-in interstage IO removed, indexed by unique ID.
+    TMap<long long, TVariable*> splitNonIoVars;  // variables with the built-in interstage IO removed, indexed by unique ID.
 
     // Structuredbuffer shared types.  Typically there are only a few.
     TVector<TType*> structBufferTypes;
@@ -488,18 +488,18 @@
     struct tShadowTextureSymbols {
         tShadowTextureSymbols() { symId.fill(-1); }
 
-        void set(bool shadow, int id) { symId[int(shadow)] = id; }
-        int get(bool shadow) const { return symId[int(shadow)]; }
+        void set(bool shadow, long long id) { symId[int(shadow)] = id; }
+        long long get(bool shadow) const { return symId[int(shadow)]; }
 
         // True if this texture has been seen with both shadow and non-shadow modes
         bool overloaded() const { return symId[0] != -1 && symId[1] != -1; }
-        bool isShadowId(int id) const { return symId[1] == id; }
+        bool isShadowId(long long id) const { return symId[1] == id; }
 
     private:
-        std::array<int, 2> symId;
+        std::array<long long, 2> symId;
     };
 
-    TMap<int, tShadowTextureSymbols*> textureShadowVariant;
+    TMap<long long, tShadowTextureSymbols*> textureShadowVariant;
     bool parsingEntrypointParameters;
 };
 
diff --git a/glslang/HLSL/hlslParseables.cpp b/glslang/HLSL/hlslParseables.cpp
index 61c820b..4673b46 100644
--- a/glslang/HLSL/hlslParseables.cpp
+++ b/glslang/HLSL/hlslParseables.cpp
@@ -605,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 },
@@ -1107,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");
@@ -1123,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/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/InitializeGlobals.h b/glslang/Include/InitializeGlobals.h
index b7fdd7a..95d0a40 100644
--- a/glslang/Include/InitializeGlobals.h
+++ b/glslang/Include/InitializeGlobals.h
@@ -37,7 +37,7 @@
 
 namespace glslang {
 
-inline bool InitializePoolIndex() { return true; } // DEPRECATED: No need to call
+bool InitializePoolIndex();
 
 } // end namespace glslang
 
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 235ea3f..a3815ca 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,7 +499,9 @@
         declaredBuiltIn = EbvNone;
 #ifndef GLSLANG_WEB
         noContraction = false;
+        nullInit = false;
 #endif
+        defaultBlock = false;
     }
 
     // drop qualifiers that don't belong in a temporary variable
@@ -510,6 +514,8 @@
         clearMemory();
         specConstant = false;
         nonUniform = false;
+        nullInit = false;
+        defaultBlock = false;
         clearLayout();
     }
 
@@ -568,6 +574,7 @@
     bool specConstant : 1;
     bool nonUniform   : 1;
     bool explicitOffset   : 1;
+    bool defaultBlock : 1; // default blocks with matching names have structures merged when linking
 
 #ifdef GLSLANG_WEB
     bool isWriteOnly() const { return false; }
@@ -586,6 +593,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 +616,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 +652,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
@@ -747,6 +759,46 @@
         }
     }
 
+    TBlockStorageClass getBlockStorage() const {
+        if (storage == EvqUniform && !isPushConstant()) {
+            return EbsUniform;
+        }
+        else if (storage == EvqUniform) {
+            return EbsPushConstant;
+        }
+        else if (storage == EvqBuffer) {
+            return EbsStorageBuffer;
+        }
+        return EbsNone;
+    }
+
+    void setBlockStorage(TBlockStorageClass newBacking) {
+#ifndef GLSLANG_WEB
+        layoutPushConstant = (newBacking == EbsPushConstant);
+#endif
+        switch (newBacking) {
+        case EbsUniform :
+            if (layoutPacking == ElpStd430) {
+                // std430 would not be valid
+                layoutPacking = ElpStd140;
+            }
+            storage = EvqUniform;
+            break;
+        case EbsStorageBuffer : 
+            storage = EvqBuffer;
+            break;
+#ifndef GLSLANG_WEB
+        case EbsPushConstant :
+            storage = EvqUniform;
+            layoutSet = TQualifier::layoutSetEnd;
+            layoutBinding = TQualifier::layoutBindingEnd;
+            break;
+#endif
+        default:
+            break;
+        }
+    }
+
 #ifdef GLSLANG_WEB
     bool isPerView() const { return false; }
     bool isTaskMemory() const { return false; }
@@ -755,6 +807,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
@@ -837,6 +895,7 @@
         return hasNonXfbLayout() ||
                hasXfb();
     }
+
     TLayoutMatrix  layoutMatrix  : 3;
     TLayoutPacking layoutPacking : 4;
     int layoutOffset;
@@ -1117,6 +1176,8 @@
         case ElfR32ui:        return "r32ui";
         case ElfR16ui:        return "r16ui";
         case ElfR8ui:         return "r8ui";
+        case ElfR64ui:        return "r64ui";
+        case ElfR64i:         return "r64i";
         default:              return "none";
         }
     }
@@ -1677,6 +1738,7 @@
 
     virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray(); }
     virtual bool isScalarOrVec1() const { return isScalar() || vector1; }
+    virtual bool isScalarOrVector() const { return !isMatrix() && !isStruct() && !isArray(); }
     virtual bool isVector() const { return vectorSize > 1 || vector1; }
     virtual bool isMatrix() const { return matrixCols ? true : false; }
     virtual bool isArray()  const { return arraySizes != nullptr; }
@@ -1986,6 +2048,7 @@
         case EbtAccStruct:         return "accelerationStructureNV";
         case EbtRayQuery:          return "rayQueryEXT";
         case EbtReference:         return "reference";
+        case EbtString:            return "string";
 #endif
         default:                   return "unknown type";
         }
@@ -2153,6 +2216,8 @@
             appendStr(" specialization-constant");
         if (qualifier.nonUniform)
             appendStr(" nonuniform");
+        if (qualifier.isNullInit())
+            appendStr(" null-init");
         appendStr(" ");
         appendStr(getStorageQualifierString());
         if (isArray()) {
@@ -2272,6 +2337,17 @@
         name += ';' ;
     }
 
+    // These variables are inconsistently declared inside and outside of gl_PerVertex in glslang right now.
+    // They are declared inside of 'in gl_PerVertex', but sitting as standalone when they are 'out'puts.
+    bool isInconsistentGLPerVertexMember(const TString& name) const
+    {
+        if (name == "gl_SecondaryPositionNV" ||
+            name == "gl_PositionPerViewNV")
+            return true;
+        return false;
+    }
+
+
     // Do two structure types match?  They could be declared independently,
     // in different places, but still might satisfy the definition of matching.
     // From the spec:
@@ -2287,22 +2363,48 @@
             (isStruct() && right.isStruct() && structure == right.structure))
             return true;
 
-        // Both being nullptr was caught above, now they both have to be structures of the same number of elements
-        if (!isStruct() || !right.isStruct() ||
-            structure->size() != right.structure->size())
-            return false;
-
         // Structure names have to match
         if (*typeName != *right.typeName)
             return false;
 
-        // Compare the names and types of all the members, which have to match
-        for (unsigned int i = 0; i < structure->size(); ++i) {
-            if ((*structure)[i].type->getFieldName() != (*right.structure)[i].type->getFieldName())
-                return false;
+        // There are inconsistencies with how gl_PerVertex is setup. For now ignore those as errors if they
+        // are known inconsistencies.
+        bool isGLPerVertex = *typeName == "gl_PerVertex";
 
-            if (*(*structure)[i].type != *(*right.structure)[i].type)
-                return false;
+        // Both being nullptr was caught above, now they both have to be structures of the same number of elements
+        if (!isStruct() || !right.isStruct() ||
+            (structure->size() != right.structure->size() && !isGLPerVertex))
+            return false;
+
+        // Compare the names and types of all the members, which have to match
+        for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) {
+            if (li < structure->size() && ri < right.structure->size()) {
+                if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) {
+                    if (*(*structure)[li].type != *(*right.structure)[ri].type)
+                        return false;
+                } else {
+                    // If one of the members is something that's inconsistently declared, skip over it
+                    // for now.
+                    if (isGLPerVertex) {
+                        if (isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) {
+                            ri--;
+                            continue;
+                        } else if (isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) {
+                            li--;
+                            continue;
+                        }
+                    } else {
+                        return false;
+                    }
+                }
+            // If we get here, then there should only be inconsistently declared members left
+            } else if (li < structure->size()) {
+                if (!isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName()))
+                    return false;
+            } else {
+                if (!isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName()))
+                    return false;
+            }
         }
 
         return true;
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 d01a115..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 */
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 30cb6fb..6b2fbd1 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
     //
@@ -587,6 +593,7 @@
     EOpTime,
 
     EOpAtomicAdd,
+    EOpAtomicSubtract,
     EOpAtomicMin,
     EOpAtomicMax,
     EOpAtomicAnd,
@@ -628,13 +635,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 +761,7 @@
     EOpConstructNonuniform,     // expected to be transformed away, not present in final AST
     EOpConstructReference,
     EOpConstructCooperativeMatrix,
+    EOpConstructAccStruct,
     EOpConstructGuardEnd,
 
     //
@@ -911,11 +922,13 @@
     EOpAverageRounded,
     EOpMul32x16,
 
-    EOpTrace,
+    EOpTraceNV,
+    EOpTraceKHR,
     EOpReportIntersection,
-    EOpIgnoreIntersection,
-    EOpTerminateRay,
-    EOpExecuteCallable,
+    EOpIgnoreIntersectionNV,
+    EOpTerminateRayNV,
+    EOpExecuteCallableNV,
+    EOpExecuteCallableKHR,
     EOpWritePackedPrimitiveIndices4x8NV,
 
     //
@@ -1123,6 +1136,8 @@
     virtual TBasicType getBasicType() const { return type.getBasicType(); }
     virtual TQualifier& getQualifier() { return type.getQualifier(); }
     virtual const TQualifier& getQualifier() const { return type.getQualifier(); }
+    virtual TArraySizes* getArraySizes() { return type.getArraySizes(); }
+    virtual const TArraySizes* getArraySizes() const { return type.getArraySizes(); }
     virtual void propagatePrecision(TPrecisionQualifier);
     virtual int getVectorSize() const { return type.getVectorSize(); }
     virtual int getMatrixCols() const { return type.getMatrixCols(); }
@@ -1263,15 +1278,15 @@
     // if symbol is initialized as symbol(sym), the memory comes from the pool allocator of sym. If sym comes from
     // per process threadPoolAllocator, then it causes increased memory usage per compile
     // it is essential to use "symbol = sym" to assign to symbol
-    TIntermSymbol(int i, const TString& n, const TType& t)
+    TIntermSymbol(long long i, const TString& n, const TType& t)
         : TIntermTyped(t), id(i),
 #ifndef GLSLANG_WEB
         flattenSubset(-1),
 #endif
         constSubtree(nullptr)
           { name = n; }
-    virtual int getId() const { return id; }
-    virtual void changeId(int i) { id = i; }
+    virtual long long getId() const { return id; }
+    virtual void changeId(long long i) { id = i; }
     virtual const TString& getName() const { return name; }
     virtual void traverse(TIntermTraverser*);
     virtual       TIntermSymbol* getAsSymbolNode()       { return this; }
@@ -1282,15 +1297,17 @@
     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
 
     // This is meant for cases where a node has already been constructed, and
     // later on, it becomes necessary to switch to a different symbol.
-    virtual void switchId(int newId) { id = newId; }
+    virtual void switchId(long long newId) { id = newId; }
 
 protected:
-    int id;                      // the unique id of the symbol this node represents
+    long long id;                // the unique id of the symbol this node represents
 #ifndef GLSLANG_WEB
     int flattenSubset;           // how deeply the flattened object rooted at id has been dereferenced
 #endif
@@ -1658,6 +1675,7 @@
         flatten(false), dontFlatten(false) {}
     virtual void traverse(TIntermTraverser*);
     virtual TIntermTyped* getCondition() const { return condition; }
+    virtual void setCondition(TIntermTyped* c) { condition = c; };
     virtual TIntermNode* getTrueBlock() const { return trueBlock; }
     virtual TIntermNode* getFalseBlock() const { return falseBlock; }
     virtual       TIntermSelection* getAsSelectionNode()       { return this; }
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index e21cf42..8dc04a4 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -599,17 +599,11 @@
             newConstArray[i].setDConst(log(unionArray[i].getDConst()));
             break;
         case EOpExp2:
-            {
-                const double inv_log2_e = 0.69314718055994530941723212145818;
-                newConstArray[i].setDConst(exp(unionArray[i].getDConst() * inv_log2_e));
-                break;
-            }
+            newConstArray[i].setDConst(exp2(unionArray[i].getDConst()));
+            break;
         case EOpLog2:
-            {
-                const double log2_e = 1.4426950408889634073599246810019;
-                newConstArray[i].setDConst(log2_e * log(unionArray[i].getDConst()));
-                break;
-            }
+            newConstArray[i].setDConst(log2(unionArray[i].getDConst()));
+            break;
         case EOpSqrt:
             newConstArray[i].setDConst(sqrt(unionArray[i].getDConst()));
             break;
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 2a121b2..a9e5af4 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -147,6 +147,10 @@
 #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 },
@@ -415,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
@@ -499,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";
@@ -516,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
@@ -541,6 +549,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
     addTabledBuiltins(version, profile, spvVersion);
 
@@ -586,6 +597,7 @@
         "vec4  fwidthCoarse(vec4  p);"
     );
 
+#ifndef GLSLANG_ANGLE
     TString derivativesAndControl16bits (
         "float16_t dFdx(float16_t);"
         "f16vec2   dFdx(f16vec2);"
@@ -1173,6 +1185,7 @@
             "\n"
         );
     }
+#endif // !GLSLANG_ANGLE
 
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 430)) {
@@ -1210,6 +1223,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 440) {
         commonBuiltins.append(
             "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);"
@@ -1271,7 +1285,8 @@
             "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
@@ -1311,6 +1326,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 150) {  // ARB_gpu_shader_fp64
             commonBuiltins.append(
                 "double fma(double, double, double);"
@@ -1319,6 +1335,7 @@
                 "dvec4  fma(dvec4,  dvec4,  dvec4 );"
                 "\n");
     }
+#endif
 
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 400)) {
@@ -1336,6 +1353,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64
         commonBuiltins.append(
             "double frexp(double, out int);"
@@ -1354,6 +1372,7 @@
             "\n");
     }
 #endif
+#endif
 
     if ((profile == EEsProfile && version >= 300) ||
         (profile != EEsProfile && version >= 150)) {
@@ -1462,6 +1481,7 @@
     }
 
 #ifndef GLSLANG_WEB
+#ifndef GLSLANG_ANGLE
     //
     // Original-style texture functions existing in all stages.
     // (Per-stage functions below.)
@@ -1610,6 +1630,37 @@
                 "\n");
         }
     }
+    else if (spvVersion.vulkanRelaxed) {
+        //
+        // Atomic counter functions act as aliases to normal atomic functions.
+        // replace definitions to take 'volatile coherent uint' instead of 'atomic_uint'
+        // and map to equivalent non-counter atomic op
+        //
+        if ((profile != EEsProfile && version >= 300) ||
+            (profile == EEsProfile && version >= 310)) {
+            commonBuiltins.append(
+                "uint atomicCounterIncrement(volatile coherent uint);"
+                "uint atomicCounterDecrement(volatile coherent uint);"
+                "uint atomicCounter(volatile coherent uint);"
+
+                "\n");
+        }
+        if (profile != EEsProfile && version >= 460) {
+            commonBuiltins.append(
+                "uint atomicCounterAdd(volatile coherent uint, uint);"
+                "uint atomicCounterSubtract(volatile coherent uint, uint);"
+                "uint atomicCounterMin(volatile coherent uint, uint);"
+                "uint atomicCounterMax(volatile coherent uint, uint);"
+                "uint atomicCounterAnd(volatile coherent uint, uint);"
+                "uint atomicCounterOr(volatile coherent uint, uint);"
+                "uint atomicCounterXor(volatile coherent uint, uint);"
+                "uint atomicCounterExchange(volatile coherent uint, uint);"
+                "uint atomicCounterCompSwap(volatile coherent uint, uint, uint);"
+
+                "\n");
+        }
+    }
+#endif // !GLSLANG_ANGLE
 
     // Bitfield
     if ((profile == EEsProfile && version >= 310) ||
@@ -1752,6 +1803,7 @@
             "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // GL_ARB_shader_ballot
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
@@ -3072,6 +3124,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
@@ -3091,6 +3144,7 @@
                               "\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // GL_AMD_gpu_shader_half_float/Explicit types
     if (profile != EEsProfile && version >= 450) {
         commonBuiltins.append(
@@ -3941,28 +3995,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
 
     //============================================================================
     //
@@ -3978,6 +4034,7 @@
     if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion))
         stageBuiltins[EShLangVertex].append("vec4 ftransform();");
 
+#ifndef GLSLANG_ANGLE
     //
     // Original-style texture Functions with lod.
     //
@@ -4037,6 +4094,7 @@
                 "\n");
         }
     }
+#endif // !GLSLANG_ANGLE
 
     if ((profile != EEsProfile && version >= 150) ||
         (profile == EEsProfile && version >= 310)) {
@@ -4057,7 +4115,7 @@
             "void EndPrimitive();"
             "\n");
     }
-#endif
+#endif // !GLSLANG_WEB
 
     //============================================================================
     //
@@ -4096,7 +4154,7 @@
     }
 #ifndef GLSLANG_WEB
     if ((profile != EEsProfile && version >= 420) || esBarrier) {
-        if (spvVersion.vulkan == 0) {
+        if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed) {
             commonBuiltins.append("void memoryBarrierAtomicCounter();");
         }
         commonBuiltins.append("void memoryBarrierImage();");
@@ -4117,6 +4175,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
@@ -4240,6 +4299,7 @@
 
             "\n");
     }
+#endif // !GLSLANG_ANGLE
 
     // GL_ARB_derivative_control
     if (profile != EEsProfile && version >= 400) {
@@ -4277,6 +4337,7 @@
         "bool helperInvocationEXT();"
         "\n");
 
+#ifndef GLSLANG_ANGLE
     // GL_AMD_shader_explicit_vertex_parameter
     if (profile != EEsProfile && version >= 450) {
         stageBuiltins[EShLangFragment].append(
@@ -4390,9 +4451,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);"
@@ -4411,12 +4470,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);
@@ -4429,7 +4490,8 @@
             "void writePackedPrimitiveIndices4x8NV(uint, uint);"
             "\n");
     }
-#endif
+#endif // !GLSLANG_ANGLE
+#endif // !GLSLANG_WEB
 
     //============================================================================
     //
@@ -4466,7 +4528,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.
@@ -4584,7 +4646,7 @@
 
             "\n");
     }
-#endif
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
     //============================================================================
     //
@@ -4615,6 +4677,7 @@
     }
 
 #ifndef GLSLANG_WEB
+#ifndef GLSLANG_ANGLE
     //============================================================================
     //
     // Define the interface to the mesh/task shader.
@@ -4702,6 +4765,7 @@
                 "\n");
         }
     }
+#endif // !GLSLANG_ANGLE
 
     //============================================================================
     //
@@ -4814,6 +4878,13 @@
                 "in int gl_VertexIndex;"
                 "in int gl_InstanceIndex;"
                 );
+
+        if (spvVersion.vulkan > 0 && version >= 140 && spvVersion.vulkanRelaxed)
+            stageBuiltins[EShLangVertex].append(
+                "in int gl_VertexID;"         // declare with 'in' qualifier
+                "in int gl_InstanceID;"
+                );
+
         if (version >= 440) {
             stageBuiltins[EShLangVertex].append(
                 "in int gl_BaseVertexARB;"
@@ -4851,7 +4922,7 @@
                 "mediump float gl_PointSize;" // needs qualifier fixed later
                 );
         } else {
-            if (spvVersion.vulkan == 0)
+            if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed)
                 stageBuiltins[EShLangVertex].append(
                     "in highp int gl_VertexID;"      // needs qualifier fixed later
                     "in highp int gl_InstanceID;"    // needs qualifier fixed later
@@ -4894,6 +4965,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");
+    }
 
     //============================================================================
     //
@@ -5007,6 +5083,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.
@@ -5304,6 +5386,11 @@
                 "in vec3 gl_BaryCoordNoPerspNV;"
                 );
 
+        if (version >= 450)
+            stageBuiltins[EShLangFragment].append(
+                "flat in int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
+            );
+
     } else {
         // ES profile
 
@@ -5362,6 +5449,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
 
@@ -5372,6 +5463,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 =
@@ -5383,6 +5489,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;"
@@ -5400,14 +5515,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
@@ -5445,6 +5559,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);
@@ -5457,12 +5586,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
@@ -5530,7 +5660,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;"
@@ -5613,6 +5743,7 @@
         stageBuiltins[EShLangCallable].append(callableDecls);
 
     }
+
     if ((profile != EEsProfile && version >= 140)) {
         const char *deviceIndex =
             "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
@@ -5625,12 +5756,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");
@@ -5654,7 +5779,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());
@@ -5672,13 +5849,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
@@ -5704,7 +5884,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))
@@ -5743,7 +5927,6 @@
 #endif
                             if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint))
                                 continue;
-
                             //
                             // Now, make all the function prototypes for the type we just built...
                             //
@@ -5968,8 +6151,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;
 
@@ -6125,6 +6316,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     //
@@ -6201,7 +6395,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)
@@ -6214,7 +6408,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)
@@ -6226,7 +6420,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)
@@ -6281,7 +6475,7 @@
                                                 s.append("Offset");
                                             if (lodClamp)
                                                 s.append("Clamp");
-                                            if (lodClamp || sparse)
+                                            if (lodClamp != 0 || sparse)
                                                 s.append("ARB");
                                             s.append("(");
 
@@ -6381,7 +6575,7 @@
                                             s.append(");\n");
 
                                             // Add to the per-language set of built-ins
-                                            if (bias || lodClamp) {
+                                            if (!grad && (bias || lodClamp != 0)) {
                                                 stageBuiltins[EShLangFragment].append(s);
                                                 stageBuiltins[EShLangCompute].append(s);
                                             } else
@@ -6410,6 +6604,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     switch (sampler.dim) {
@@ -6653,6 +6850,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
 
     //
@@ -7081,6 +7281,7 @@
         s.append("\n");
     }
 
+#ifndef GLSLANG_ANGLE
     // atomic counters (some in compute below)
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 420)) {
@@ -7117,6 +7318,7 @@
 
         s.append("\n");
     }
+#endif // !GLSLANG_ANGLE
 
     // GL_ARB_cull_distance
     if (profile != EEsProfile && version >= 450) {
@@ -7133,6 +7335,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);
@@ -7156,6 +7359,7 @@
         s.append("\n");
     }
 #endif
+#endif
 
     s.append("\n");
 }
@@ -7239,6 +7443,9 @@
 #ifdef GLSLANG_WEB
     version = 310;
     profile = EEsProfile;
+#elif defined(GLSLANG_ANGLE)
+    version = 450;
+    profile = ECoreProfile;
 #endif
 
     //
@@ -7266,6 +7473,12 @@
             SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable);
         }
 
+        if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {
+            // treat these built-ins as aliases of VertexIndex and InstanceIndex
+            BuiltInVariable("gl_VertexID", EbvVertexIndex, symbolTable);
+            BuiltInVariable("gl_InstanceID", EbvInstanceIndex, symbolTable);
+        }
+
         if (profile != EEsProfile) {
             if (version >= 440) {
                 symbolTable.setVariableExtensions("gl_BaseVertexARB",   1, &E_GL_ARB_shader_draw_parameters);
@@ -7428,7 +7641,7 @@
 
     case EShLangTessEvaluation:
     case EShLangGeometry:
-#endif
+#endif // !GLSLANG_WEB
         SpecialQualifier("gl_Position",   EvqPosition,   EbvPosition,   symbolTable);
         SpecialQualifier("gl_PointSize",  EvqPointSize,  EbvPointSize,  symbolTable);
 
@@ -7589,7 +7802,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:
@@ -8095,7 +8322,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:
@@ -8227,10 +8465,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:
@@ -8281,9 +8527,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);
 
@@ -8376,6 +8620,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:
@@ -8520,6 +8771,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:
@@ -8620,6 +8879,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
 
@@ -8689,6 +8955,14 @@
     symbolTable.relateToOperator("memoryBarrierAtomicCounter", EOpMemoryBarrierAtomicCounter);
     symbolTable.relateToOperator("memoryBarrierImage",         EOpMemoryBarrierImage);
 
+    if (spvVersion.vulkanRelaxed) {
+        //
+        // functions signature have been replaced to take uint operations on buffer variables
+        // remap atomic counter functions to atomic operations
+        //
+        symbolTable.relateToOperator("memoryBarrierAtomicCounter", EOpMemoryBarrierBuffer);
+    }
+
     symbolTable.relateToOperator("atomicLoad",     EOpAtomicLoad);
     symbolTable.relateToOperator("atomicStore",    EOpAtomicStore);
 
@@ -8696,6 +8970,20 @@
     symbolTable.relateToOperator("atomicCounterDecrement", EOpAtomicCounterDecrement);
     symbolTable.relateToOperator("atomicCounter",          EOpAtomicCounter);
 
+    if (spvVersion.vulkanRelaxed) {
+        //
+        // functions signature have been replaced to take uint operations
+        // remap atomic counter functions to atomic operations
+        //
+        // these atomic counter functions do not match signatures of glsl
+        // atomic functions, so they will be remapped to semantically
+        // equivalent functions in the parser
+        //
+        symbolTable.relateToOperator("atomicCounterIncrement", EOpNull);
+        symbolTable.relateToOperator("atomicCounterDecrement", EOpNull);
+        symbolTable.relateToOperator("atomicCounter", EOpNull);
+    }
+
     symbolTable.relateToOperator("clockARB",     EOpReadClockSubgroupKHR);
     symbolTable.relateToOperator("clock2x32ARB", EOpReadClockSubgroupKHR);
 
@@ -8714,6 +9002,23 @@
         symbolTable.relateToOperator("atomicCounterCompSwap", EOpAtomicCounterCompSwap);
     }
 
+    if (spvVersion.vulkanRelaxed) {
+        //
+        // functions signature have been replaced to take 'uint' instead of 'atomic_uint'
+        // remap atomic counter functions to non-counter atomic ops so
+        // functions act as aliases to non-counter atomic ops
+        //
+        symbolTable.relateToOperator("atomicCounterAdd", EOpAtomicAdd);
+        symbolTable.relateToOperator("atomicCounterSubtract", EOpAtomicSubtract);
+        symbolTable.relateToOperator("atomicCounterMin", EOpAtomicMin);
+        symbolTable.relateToOperator("atomicCounterMax", EOpAtomicMax);
+        symbolTable.relateToOperator("atomicCounterAnd", EOpAtomicAnd);
+        symbolTable.relateToOperator("atomicCounterOr", EOpAtomicOr);
+        symbolTable.relateToOperator("atomicCounterXor", EOpAtomicXor);
+        symbolTable.relateToOperator("atomicCounterExchange", EOpAtomicExchange);
+        symbolTable.relateToOperator("atomicCounterCompSwap", EOpAtomicCompSwap);
+    }
+
     symbolTable.relateToOperator("fma",               EOpFma);
     symbolTable.relateToOperator("frexp",             EOpFrexp);
     symbolTable.relateToOperator("ldexp",             EOpLdexp);
@@ -9091,10 +9396,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:
@@ -9105,16 +9410,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:
@@ -9133,7 +9436,7 @@
     default:
         assert(false && "Language not supported");
     }
-#endif
+#endif // !GLSLANG_WEB
 }
 
 //
@@ -9148,6 +9451,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 bb03aa0..d1123d4
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -65,7 +65,7 @@
 // Returns the added node.
 //
 
-TIntermSymbol* TIntermediate::addSymbol(int id, const TString& name, const TType& type, const TConstUnionArray& constArray,
+TIntermSymbol* TIntermediate::addSymbol(long long id, const TString& name, const TType& type, const TConstUnionArray& constArray,
                                         TIntermTyped* constSubtree, const TSourceLoc& loc)
 {
     TIntermSymbol* node = new TIntermSymbol(id, name, type);
@@ -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,15 +1709,14 @@
             case EbtInt64:
             case EbtUint64:
             case EbtFloat:
-            case EbtDouble:
-                return version >= 400 || extensionRequested(E_GL_ARB_gpu_shader_fp64);
+                return version >= 400 || numericFeatures.contains(TNumericFeatures::gpu_shader_fp64);
             case EbtInt16:
             case EbtUint16:
-                return (version >= 400 || extensionRequested(E_GL_ARB_gpu_shader_fp64)) &&
-                       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 (version >= 400 || extensionRequested(E_GL_ARB_gpu_shader_fp64)) &&
-                       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;
            }
@@ -1748,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;
             }
@@ -1765,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;
             }
@@ -1791,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;
             }
@@ -1813,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;
             }
@@ -1823,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;
             }
@@ -1951,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);
 
@@ -2332,6 +2298,10 @@
     case EbtReference:
         op = EOpConstructReference;
         break;
+
+    case EbtAccStruct:
+        op = EOpConstructAccStruct;
+        break;
 #endif
     default:
         break;
@@ -2490,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);
 
@@ -2900,7 +2870,7 @@
             return;
     }
 
-    callGraph.push_front(TCall(caller, callee));
+    callGraph.emplace_front(caller, callee);
 }
 
 //
@@ -3806,11 +3776,16 @@
 {
      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);
-            right->propagatePrecision(getQualifier().precision);
-        }
+       if (op == EOpRightShift || op == EOpLeftShift) {
+         // For shifts get precision from left side only and thus no need to propagate
+         getQualifier().precision = left->getQualifier().precision;
+       } else {
+         getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision);
+         if (getQualifier().precision != EpqNone) {
+           left->propagatePrecision(getQualifier().precision);
+           right->propagatePrecision(getQualifier().precision);
+         }
+       }
     }
 }
 
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
index b464009..02cca40 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
@@ -579,7 +601,6 @@
         selector.push_back(0);
 }
 
-#ifdef ENABLE_HLSL
 //
 // Make the passed-in variable information become a member of the
 // global uniform block.  If this doesn't exist yet, make it.
@@ -624,7 +645,67 @@
 
     ++firstNewMember;
 }
-#endif
+
+void TParseContextBase::growAtomicCounterBlock(int binding, const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList) {
+    // Make the atomic counter block, if not yet made.
+    const auto &at  = atomicCounterBuffers.find(binding);
+    if (at == atomicCounterBuffers.end()) {
+        atomicCounterBuffers.insert({binding, (TVariable*)nullptr });
+        atomicCounterBlockFirstNewMember.insert({binding, 0});
+    }
+
+    TVariable*& atomicCounterBuffer = atomicCounterBuffers[binding];
+    int& bufferNewMember = atomicCounterBlockFirstNewMember[binding];
+
+    if (atomicCounterBuffer == nullptr) {
+        TQualifier blockQualifier;
+        blockQualifier.clear();
+        blockQualifier.storage = EvqBuffer;
+        
+        char charBuffer[512];
+        if (binding != TQualifier::layoutBindingEnd) {
+            snprintf(charBuffer, 512, "%s_%d", getAtomicCounterBlockName(), binding);
+        } else {
+            snprintf(charBuffer, 512, "%s_0", getAtomicCounterBlockName());
+        }
+        
+        TType blockType(new TTypeList, *NewPoolTString(charBuffer), blockQualifier);
+        setUniformBlockDefaults(blockType);
+        blockType.getQualifier().layoutPacking = ElpStd430;
+        atomicCounterBuffer = new TVariable(NewPoolTString(""), blockType, true);
+        // If we arn't auto mapping bindings then set the block to use the same
+        // binding as what the atomic was set to use
+        if (!intermediate.getAutoMapBindings()) {
+            atomicCounterBuffer->getWritableType().getQualifier().layoutBinding = binding;
+        }
+        bufferNewMember = 0;
+
+        atomicCounterBuffer->getWritableType().getQualifier().layoutSet = atomicCounterBlockSet;
+    }
+
+    // Add the requested member as a member to the global block.
+    TType* type = new TType;
+    type->shallowCopy(memberType);
+    type->setFieldName(memberName);
+    if (typeList)
+        type->setStruct(typeList);
+    TTypeLoc typeLoc = {type, loc};
+    atomicCounterBuffer->getType().getWritableStruct()->push_back(typeLoc);
+
+    // Insert into the symbol table.
+    if (bufferNewMember == 0) {
+        // This is the first request; we need a normal symbol table insert
+        if (symbolTable.insert(*atomicCounterBuffer))
+            trackLinkage(*atomicCounterBuffer);
+        else
+            error(loc, "failed to insert the global constant buffer", "buffer", "");
+    } else {
+        // This is a follow-on request; we need to amend the first insert
+        symbolTable.amend(*atomicCounterBuffer, bufferNewMember);
+    }
+
+    ++bufferNewMember;
+}
 
 void TParseContextBase::finish()
 {
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index c2e7021..bc2a38a 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
@@ -221,6 +225,108 @@
         error(getCurrentLoc(), "compilation terminated", "", "");
 }
 
+void TParseContext::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList)
+{
+    bool createBlock = globalUniformBlock == nullptr;
+
+    if (createBlock) {
+        globalUniformBinding = intermediate.getGlobalUniformBinding();
+        globalUniformSet = intermediate.getGlobalUniformSet();
+    }
+
+    // use base class function to create/expand block
+    TParseContextBase::growGlobalUniformBlock(loc, memberType, memberName, typeList);
+
+    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {
+        // check for a block storage override
+        TBlockStorageClass storageOverride = intermediate.getBlockStorageOverride(getGlobalUniformBlockName());
+        TQualifier& qualifier = globalUniformBlock->getWritableType().getQualifier();
+        qualifier.defaultBlock = true;
+
+        if (storageOverride != EbsNone) {
+            if (createBlock) {
+                // Remap block storage
+                qualifier.setBlockStorage(storageOverride);
+
+                // check that the change didn't create errors
+                blockQualifierCheck(loc, qualifier, false);
+            }
+
+            // remap meber storage as well
+            memberType.getQualifier().setBlockStorage(storageOverride);
+        }
+    }
+}
+
+void TParseContext::growAtomicCounterBlock(int binding, const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList)
+{
+    bool createBlock = atomicCounterBuffers.find(binding) == atomicCounterBuffers.end();
+
+    if (createBlock) {
+        atomicCounterBlockSet = intermediate.getAtomicCounterBlockSet();
+    }
+
+    // use base class function to create/expand block
+    TParseContextBase::growAtomicCounterBlock(binding, loc, memberType, memberName, typeList);
+    TQualifier& qualifier = atomicCounterBuffers[binding]->getWritableType().getQualifier();
+    qualifier.defaultBlock = true;
+
+    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {
+        // check for a Block storage override
+        TBlockStorageClass storageOverride = intermediate.getBlockStorageOverride(getAtomicCounterBlockName());
+
+        if (storageOverride != EbsNone) {
+            if (createBlock) {
+                // Remap block storage
+
+                qualifier.setBlockStorage(storageOverride);
+
+                // check that the change didn't create errors
+                blockQualifierCheck(loc, qualifier, false);
+            }
+
+            // remap meber storage as well
+            memberType.getQualifier().setBlockStorage(storageOverride);
+        }
+    }
+}
+
+const char* TParseContext::getGlobalUniformBlockName() const
+{
+    const char* name = intermediate.getGlobalUniformBlockName();
+    if (std::string(name) == "")
+        return "gl_DefaultUniformBlock";
+    else
+        return name;
+}
+void TParseContext::finalizeGlobalUniformBlockLayout(TVariable&)
+{
+}
+void TParseContext::setUniformBlockDefaults(TType& block) const
+{
+    block.getQualifier().layoutPacking = ElpStd140;
+    block.getQualifier().layoutMatrix = ElmColumnMajor;
+}
+
+
+const char* TParseContext::getAtomicCounterBlockName() const
+{
+    const char* name = intermediate.getAtomicCounterBlockName();
+    if (std::string(name) == "")
+        return "gl_AtomicCounterBlock";
+    else
+        return name;
+}
+void TParseContext::finalizeAtomicCounterBlockLayout(TVariable&)
+{
+}
+
+void TParseContext::setAtomicCounterBlockDefaults(TType& block) const
+{
+    block.getQualifier().layoutPacking = ElpStd430;
+    block.getQualifier().layoutMatrix = ElmRowMajor;
+}
+
 void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)
 {
 #ifndef GLSLANG_WEB
@@ -246,7 +352,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 +378,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 +861,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());
@@ -1124,6 +1237,14 @@
 {
     TIntermTyped* result = nullptr;
 
+    if (spvVersion.vulkan != 0 && spvVersion.vulkanRelaxed) {
+        // allow calls that are invalid in Vulkan Semantics to be invisibily
+        // remapped to equivalent valid functions
+        result = vkRelaxedRemapFunctionCall(loc, function, arguments);
+        if (result)
+            return result;
+    }
+
     if (function->getBuiltInOp() == EOpArrayLength)
         result = handleLengthMethod(loc, function, arguments);
     else if (function->getBuiltInOp() != EOpNull) {
@@ -1680,6 +1801,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();
@@ -1708,6 +1837,7 @@
     // Grab the semantics and storage class semantics from the operands, based on opcode
     switch (callNode.getOp()) {
     case EOpAtomicAdd:
+    case EOpAtomicSubtract:
     case EOpAtomicMin:
     case EOpAtomicMax:
     case EOpAtomicAnd:
@@ -1966,7 +2096,13 @@
             profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
             requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
         }
-
+        // As per GL_ARB_sparse_texture2 extension "Offsets" parameter must be constant integral expression
+        // for sparseTextureGatherOffsetsARB just as textureGatherOffsets
+        if (callNode.getOp() == EOpSparseTextureGatherOffsets) {
+            int offsetsArg = arg0->getType().getSampler().shadow ? 3 : 2;
+            if (!(*argp)[offsetsArg]->getAsConstantUnion())
+                error(loc, "argument must be compile-time constant", "offsets", "");
+        }
         break;
     }
 
@@ -2061,14 +2197,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:
@@ -2106,9 +2260,15 @@
     {
         // 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 {
             bool isImageAtomicOnFloatAllowed = ((fnCandidate.getName().compare(0, 14, "imageAtomicAdd") == 0) ||
                 (fnCandidate.getName().compare(0, 15, "imageAtomicLoad") == 0) ||
@@ -2133,6 +2293,7 @@
     }
 
     case EOpAtomicAdd:
+    case EOpAtomicSubtract:
     case EOpAtomicMin:
     case EOpAtomicMax:
     case EOpAtomicAnd:
@@ -2713,6 +2874,11 @@
     if (!(symNode && symNode->getQualifier().isWriteOnly())) // base class checks
         if (symNode && symNode->getQualifier().isExplicitInterpolation())
             error(loc, "can't read from explicitly-interpolated object: ", op, symNode->getName().c_str());
+
+    // local_size_{xyz} must be assigned or specialized before gl_WorkGroupSize can be assigned. 
+    if(node->getQualifier().builtIn == EbvWorkGroupSize &&
+       !(intermediate.isLocalSizeSet() || intermediate.isLocalSizeSpecialized()))
+        error(loc, "can't read from gl_WorkGroupSize before a fixed workgroup size has been declared", op, "");
 }
 
 //
@@ -2787,7 +2953,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 ||
@@ -2795,7 +2964,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);
@@ -3337,7 +3506,7 @@
 
     if (type.containsNonOpaque()) {
         // Vulkan doesn't allow transparent uniforms outside of blocks
-        if (spvVersion.vulkan > 0)
+        if (spvVersion.vulkan > 0 && !spvVersion.vulkanRelaxed)
             vulkanRemoved(loc, "non-opaque uniforms outside a block");
         // OpenGL wants locations on these (unless they are getting automapped)
         if (spvVersion.openGl > 0 && !type.getQualifier().hasLocation() && !intermediate.getAutoMapLocations())
@@ -3350,7 +3519,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", "");
@@ -3361,7 +3530,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;
 
@@ -3386,6 +3555,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;
     }
@@ -3393,7 +3572,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);
 }
 
 //
@@ -3404,7 +3585,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()) {
@@ -4065,6 +4246,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) {
@@ -4208,6 +4392,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"                                                     ||
@@ -4233,8 +4419,10 @@
         // If it wasn't at a built-in level, then it's already been redeclared;
         // that is, this is a redeclaration of a redeclaration; reuse that initial
         // redeclaration.  Otherwise, make the new one.
-        if (builtIn)
+        if (builtIn) {
             makeEditable(symbol);
+            symbolTable.amendSymbolIdLevel(*symbol);
+        }
 
         // Now, modify the type of the copy, as per the type of the current redeclaration.
 
@@ -4614,14 +4802,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;
 }
@@ -4763,7 +4951,7 @@
     }
 
     // get the unique id of the loop index
-    int loopIndex = binaryInit->getLeft()->getAsSymbolNode()->getId();
+    long long loopIndex = binaryInit->getLeft()->getAsSymbolNode()->getId();
     inductiveLoopIds.insert(loopIndex);
 
     // condition's form must be "loop-index relational-operator constant-expression"
@@ -4949,14 +5137,22 @@
         return;
     }
     if (id == TQualifier::getLayoutPackingString(ElpPacked)) {
-        if (spvVersion.spv != 0)
-            spvRemoved(loc, "packed");
+        if (spvVersion.spv != 0) {
+            if (spvVersion.vulkanRelaxed)
+                return; // silently ignore qualifier
+            else
+                spvRemoved(loc, "packed");
+        }
         publicType.qualifier.layoutPacking = ElpPacked;
         return;
     }
     if (id == TQualifier::getLayoutPackingString(ElpShared)) {
-        if (spvVersion.spv != 0)
-            spvRemoved(loc, "shared");
+        if (spvVersion.spv != 0) {
+            if (spvVersion.vulkanRelaxed)
+                return; // silently ignore qualifier
+            else
+                spvRemoved(loc, "shared");
+        }
         publicType.qualifier.layoutPacking = ElpShared;
         return;
     }
@@ -5406,7 +5602,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;
@@ -5697,6 +5900,8 @@
                     error(loc, "can only specify on a uniform block", "push_constant", "");
                 if (qualifier.isShaderRecord())
                     error(loc, "can only specify on a buffer block", "shaderRecordNV", "");
+                if (qualifier.hasLocation() && type.isAtomic())
+                    error(loc, "cannot specify on atomic counter", "location", "");
             }
             break;
         default:
@@ -5834,16 +6039,12 @@
         if (type.getBasicType() == EbtSampler) {
             int lastBinding = qualifier.layoutBinding;
             if (type.isArray()) {
-                if (spvVersion.vulkan > 0)
-                    lastBinding += 1;
-                else {
+                if (spvVersion.vulkan == 0) {
                     if (type.isSizedArray())
-                        lastBinding += type.getCumulativeArraySize();
+                        lastBinding += (type.getCumulativeArraySize() - 1);
                     else {
-                        lastBinding += 1;
 #ifndef GLSLANG_WEB
-                        if (spvVersion.vulkan == 0)
-                            warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", "");
+                        warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", "");
 #endif
                     }
                 }
@@ -5853,7 +6054,7 @@
                 error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : "");
 #endif
         }
-        if (type.isAtomic()) {
+        if (type.isAtomic() && !spvVersion.vulkanRelaxed) {
             if (qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) {
                 error(loc, "atomic_uint binding is too large; see gl_MaxAtomicCounterBindings", "binding", "");
                 return;
@@ -5967,12 +6168,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())
@@ -6055,7 +6272,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())
@@ -6507,6 +6724,68 @@
     return bestMatch;
 }
 
+//
+// Adjust function calls that aren't declared in Vulkan to a
+// calls with equivalent effects
+//
+TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, TFunction* function, TIntermNode* arguments)
+{
+    TIntermTyped* result = nullptr;
+
+#ifndef GLSLANG_WEB
+    if (function->getBuiltInOp() != EOpNull) {
+        return nullptr;
+    }
+
+    if (function->getName() == "atomicCounterIncrement") {
+        // change atomicCounterIncrement into an atomicAdd of 1
+        TString name("atomicAdd");
+        TType uintType(EbtUint);
+
+        TFunction realFunc(&name, function->getType());
+
+        for (int i = 0; i < function->getParamCount(); ++i) {
+            realFunc.addParameter((*function)[i]);
+        }
+
+        TParameter tmpP = { 0, &uintType };
+        realFunc.addParameter(tmpP);
+        arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(1, loc, true));
+
+        result = handleFunctionCall(loc, &realFunc, arguments);
+    } else if (function->getName() == "atomicCounterDecrement") {
+        // change atomicCounterDecrement into an atomicAdd with -1
+        // and subtract 1 from result, to return post-decrement value
+        TString name("atomicAdd");
+        TType uintType(EbtUint);
+
+        TFunction realFunc(&name, function->getType());
+
+        for (int i = 0; i < function->getParamCount(); ++i) {
+            realFunc.addParameter((*function)[i]);
+        }
+
+        TParameter tmpP = { 0, &uintType };
+        realFunc.addParameter(tmpP);
+        arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(-1, loc, true));
+
+        result = handleFunctionCall(loc, &realFunc, arguments);
+
+        // post decrement, so that it matches AtomicCounterDecrement semantics
+        if (result) {
+            result = handleBinaryMath(loc, "-", EOpSub, result, intermediate.addConstantUnion(1, loc, true));
+        }
+    } else if (function->getName() == "atomicCounter") {
+        // change atomicCounter into a direct read of the variable
+        if (arguments->getAsTyped()) {
+            result = arguments->getAsTyped();
+        }
+    }
+#endif
+
+    return result;
+}
+
 // When a declaration includes a type, but not a variable name, it can be used
 // to establish defaults.
 void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType)
@@ -6517,18 +6796,105 @@
             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
 }
 
+bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString& identifier, const TPublicType&,
+    TArraySizes*, TIntermTyped* initializer, TType& type)
+{
+    if (parsingBuiltins || symbolTable.atBuiltInLevel() || !symbolTable.atGlobalLevel() ||
+        type.getQualifier().storage != EvqUniform ||
+        !(type.containsNonOpaque()
+#ifndef GLSLANG_WEB
+            || type.getBasicType() == EbtAtomicUint
+#endif
+        )) {
+        return false;
+    }
+
+    if (type.getQualifier().hasLocation()) {
+        warn(loc, "ignoring layout qualifier for uniform", identifier.c_str(), "location");
+        type.getQualifier().layoutLocation = TQualifier::layoutLocationEnd;
+    }
+
+    if (initializer) {
+        warn(loc, "Ignoring initializer for uniform", identifier.c_str(), "");
+        initializer = nullptr;
+    }
+
+    if (type.isArray()) {
+        // do array size checks here
+        arraySizesCheck(loc, type.getQualifier(), type.getArraySizes(), initializer, false);
+
+        if (arrayQualifierError(loc, type.getQualifier()) || arrayError(loc, type)) {
+            error(loc, "array param error", identifier.c_str(), "");
+        }
+    }
+
+    // do some checking on the type as it was declared
+    layoutTypeCheck(loc, type);
+
+    int bufferBinding = TQualifier::layoutBindingEnd;
+    TVariable* updatedBlock = nullptr;
+
+#ifndef GLSLANG_WEB
+    // Convert atomic_uint into members of a buffer block
+    if (type.isAtomic()) {
+        type.setBasicType(EbtUint);
+        type.getQualifier().storage = EvqBuffer;
+
+        type.getQualifier().volatil = true;
+        type.getQualifier().coherent = true;
+
+        // xxTODO: use logic from fixOffset() to apply explicit member offset
+        bufferBinding = type.getQualifier().layoutBinding;
+        type.getQualifier().layoutBinding = TQualifier::layoutBindingEnd;
+        type.getQualifier().explicitOffset = false;
+        growAtomicCounterBlock(bufferBinding, loc, type, identifier, nullptr);
+        updatedBlock = atomicCounterBuffers[bufferBinding];
+    }
+#endif
+
+    if (!updatedBlock) {
+        growGlobalUniformBlock(loc, type, identifier, nullptr);
+        updatedBlock = globalUniformBlock;
+    }
+
+    //
+    //      don't assign explicit member offsets here
+    //      if any are assigned, need to be updated here and in the merge/link step
+    // fixBlockUniformOffsets(updatedBlock->getWritableType().getQualifier(), *updatedBlock->getWritableType().getWritableStruct());
+
+    // checks on update buffer object
+    layoutObjectCheck(loc, *updatedBlock);
+
+    TSymbol* symbol = symbolTable.find(identifier);
+
+    if (!symbol) {
+        if (updatedBlock == globalUniformBlock)
+            error(loc, "error adding uniform to default uniform block", identifier.c_str(), "");
+        else
+            error(loc, "error adding atomic counter to atomic counter block", identifier.c_str(), "");
+        return false;
+    }
+
+    // merge qualifiers
+    mergeObjectLayoutQualifiers(updatedBlock->getWritableType().getQualifier(), type.getQualifier(), true);
+
+    return true;
+}
+
 //
 // Do everything necessary to handle a variable (non-block) declaration.
 // Either redeclaring a variable, or making a new one, updating the symbol
@@ -6550,6 +6916,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();
@@ -6608,6 +6980,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)
@@ -6618,6 +7006,14 @@
     if (symbol == nullptr)
         reservedErrorCheck(loc, identifier);
 
+    if (symbol == nullptr && spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) {
+        bool remapped = vkRelaxedRemapUniformVariable(loc, identifier, publicType, arraySizes, initializer, type);
+
+        if (remapped) {
+            return nullptr;
+        }
+    }
+
     inheritGlobalDefaults(type.getQualifier());
 
     // Declare the variable
@@ -6725,6 +7121,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.
@@ -6732,9 +7133,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");
 
     //
@@ -6778,13 +7206,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;
     }
@@ -6804,7 +7234,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, "");
@@ -6818,7 +7249,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();
@@ -6930,6 +7362,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;
@@ -7305,6 +7746,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 {
@@ -7384,6 +7827,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:
@@ -7450,6 +7906,8 @@
 void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName,
     TArraySizes* arraySizes)
 {
+    if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed)
+        blockStorageRemap(loc, blockName, currentBlockQualifier);
     blockStageIoCheck(loc, currentBlockQualifier);
     blockQualifierCheck(loc, currentBlockQualifier, instanceName != nullptr);
     if (arraySizes != nullptr) {
@@ -7464,10 +7922,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)
@@ -7517,6 +7975,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;
     }
 
@@ -7738,6 +8197,17 @@
     trackLinkage(variable);
 }
 
+//
+// allow storage type of block to be remapped at compile time
+//
+void TParseContext::blockStorageRemap(const TSourceLoc&, const TString* instanceName, TQualifier& qualifier)
+{
+    TBlockStorageClass type = intermediate.getBlockStorageOverride(instanceName->c_str());
+    if (type != EbsNone) {
+        qualifier.setBlockStorage(type);
+    }
+}
+
 // Do all block-declaration checking regarding the combination of in/out/uniform/buffer
 // with a particular stage.
 void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& qualifier)
@@ -7780,6 +8250,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");
@@ -7938,7 +8414,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;
@@ -8048,8 +8524,8 @@
 }
 
 //
-// 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.
+// Spread LayoutPacking to matrix or aggregate block members. If a block member is a struct or
+// array of struct, spread LayoutPacking recursively to its matrix or aggregate members.
 //
 void TParseContext::fixBlockUniformLayoutPacking(TQualifier& qualifier, TTypeList* originTypeList,
                                                  TTypeList* tmpTypeList)
@@ -8058,11 +8534,13 @@
     for (unsigned int member = 0; member < originTypeList->size(); ++member) {
         if (qualifier.layoutPacking != ElpNone) {
             if (tmpTypeList == nullptr) {
-                if ((*originTypeList)[member].type->getQualifier().layoutPacking == ElpNone) {
+                if ((*originTypeList)[member].type->getQualifier().layoutPacking == ElpNone &&
+                    !(*originTypeList)[member].type->isScalarOrVector()) {
                     (*originTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;
                 }
             } else {
-                if ((*tmpTypeList)[member].type->getQualifier().layoutPacking == ElpNone) {
+                if ((*tmpTypeList)[member].type->getQualifier().layoutPacking == ElpNone &&
+                    !(*tmpTypeList)[member].type->isScalarOrVector()) {
                     (*tmpTypeList)[member].type->getQualifier().layoutPacking = qualifier.layoutPacking;
                 }
             }
@@ -8165,7 +8643,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 {
@@ -8452,8 +8930,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;
     }
 
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 8b262c9..6f00621 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -67,7 +67,7 @@
 class TScanContext;
 class TPpContext;
 
-typedef std::set<int> TIdSetType;
+typedef std::set<long long> TIdSetType;
 typedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;
 
 //
@@ -83,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),
@@ -91,7 +92,8 @@
             limits(resources.limits),
             globalUniformBlock(nullptr),
             globalUniformBinding(TQualifier::layoutBindingEnd),
-            globalUniformSet(TQualifier::layoutSetEnd)
+            globalUniformSet(TQualifier::layoutSetEnd),
+            atomicCounterBlockSet(TQualifier::layoutSetEnd)
     {
         if (entryPoint != nullptr)
             sourceEntryPointName = *entryPoint;
@@ -153,10 +155,11 @@
             extensionCallback(line, extension, behavior);
     }
 
-#ifdef ENABLE_HLSL
     // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)
     virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr);
-#endif
+
+    // Manage global buffer (used for backing atomic counters in GLSL when using relaxed Vulkan semantics)
+    virtual void growAtomicCounterBlock(int binding, const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr);
 
     // Potentially rename shader entry point function
     void renameShaderFunction(TString*& name) const
@@ -177,7 +180,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
@@ -228,7 +232,24 @@
     // override this to set the language-specific name
     virtual const char* getGlobalUniformBlockName() const { return ""; }
     virtual void setUniformBlockDefaults(TType&) const { }
-    virtual void finalizeGlobalUniformBlockLayout(TVariable&) { }
+    virtual void finalizeGlobalUniformBlockLayout(TVariable&) {}
+
+    // Manage the atomic counter block (used for atomic_uints with Vulkan-Relaxed)
+    TMap<int, TVariable*> atomicCounterBuffers;
+    unsigned int atomicCounterBlockSet;
+    TMap<int, int> atomicCounterBlockFirstNewMember;
+    // override this to set the language-specific name
+    virtual const char* getAtomicCounterBlockName() const { return ""; }
+    virtual void setAtomicCounterBlockDefaults(TType&) const {}
+    virtual void finalizeAtomicCounterBlockLayout(TVariable&) {}
+    bool isAtomicCounterBlock(const TSymbol& symbol) {
+        const TVariable* var = symbol.getAsVariable();
+        if (!var)
+            return false;
+        const auto& at = atomicCounterBuffers.find(var->getType().getQualifier().layoutBinding);
+        return (at != atomicCounterBuffers.end() && (*at).second->getType() == var->getType());
+    }
+
     virtual void outputMessage(const TSourceLoc&, const char* szReason, const char* szToken,
                                const char* szExtraInfoFormat, TPrefixType prefix,
                                va_list args);
@@ -291,6 +312,9 @@
     bool parseShaderStrings(TPpContext&, TInputScanner& input, bool versionWillBeError = false) override;
     void parserError(const char* s);     // for bison's yyerror
 
+    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;
+    virtual void growAtomicCounterBlock(int binding, const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;
+
     void reservedErrorCheck(const TSourceLoc&, const TString&);
     void reservedPpErrorCheck(const TSourceLoc&, const char* name, const char* op) override;
     bool lineContinuationCheck(const TSourceLoc&, bool endOfComment) override;
@@ -328,6 +352,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&);
@@ -337,6 +362,10 @@
     void checkPrecisionQualifier(const TSourceLoc&, TPrecisionQualifier);
     void memorySemanticsCheck(const TSourceLoc&, const TFunction&, const TIntermOperator& callNode);
 
+    TIntermTyped* vkRelaxedRemapFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*);
+    // returns true if the variable was remapped to something else
+    bool vkRelaxedRemapUniformVariable(const TSourceLoc&, TString&, const TPublicType&, TArraySizes*, TIntermTyped*, TType&);
+
     void assignError(const TSourceLoc&, const char* op, TString left, TString right);
     void unaryOpError(const TSourceLoc&, const char* op, TString operand);
     void binaryOpError(const TSourceLoc&, const char* op, TString left, TString right);
@@ -363,7 +392,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);
@@ -389,7 +418,7 @@
     void arrayLimitCheck(const TSourceLoc&, const TString&, int size);
     void limitCheck(const TSourceLoc&, int value, const char* limit, const char* feature);
 
-    void inductiveLoopBodyCheck(TIntermNode*, int loopIndexId, TSymbolTable&);
+    void inductiveLoopBodyCheck(TIntermNode*, long long loopIndexId, TSymbolTable&);
     void constantIndexExpressionCheck(TIntermNode*);
 
     void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&);
@@ -414,6 +443,7 @@
     TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset);
     void inheritMemoryQualifiers(const TQualifier& from, TQualifier& to);
     void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = 0, TArraySizes* arraySizes = 0);
+    void blockStorageRemap(const TSourceLoc&, const TString*, TQualifier&);
     void blockStageIoCheck(const TSourceLoc&, const TQualifier&);
     void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName);
     void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
@@ -458,6 +488,14 @@
     void finish() override;
 #endif
 
+    virtual const char* getGlobalUniformBlockName() const override;
+    virtual void finalizeGlobalUniformBlockLayout(TVariable&) override;
+    virtual void setUniformBlockDefaults(TType& block) const override;
+
+    virtual const char* getAtomicCounterBlockName() const override;
+    virtual void finalizeAtomicCounterBlockLayout(TVariable&) override;
+    virtual void setAtomicCounterBlockDefaults(TType& block) const override;
+
 public:
     //
     // Generally, bison productions, the scanner, and the PP need read/write access to these; just give them direct access
@@ -482,6 +520,7 @@
     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
diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp
index c269d7d..84c40f4 100644
--- a/glslang/MachineIndependent/PoolAlloc.cpp
+++ b/glslang/MachineIndependent/PoolAlloc.cpp
@@ -35,28 +35,34 @@
 #include "../Include/Common.h"
 #include "../Include/PoolAlloc.h"
 
+#include "../Include/InitializeGlobals.h"
+#include "../OSDependent/osinclude.h"
+
 namespace glslang {
 
-namespace {
-thread_local TPoolAllocator* threadPoolAllocator = nullptr;
-
-TPoolAllocator* GetDefaultThreadPoolAllocator()
-{
-    thread_local TPoolAllocator defaultAllocator;
-    return &defaultAllocator;
-}
-} // anonymous namespace
+// Process-wide TLS index
+OS_TLSIndex PoolIndex;
 
 // Return the thread-specific current pool.
 TPoolAllocator& GetThreadPoolAllocator()
 {
-    return *(threadPoolAllocator ? threadPoolAllocator : GetDefaultThreadPoolAllocator());
+    return *static_cast<TPoolAllocator*>(OS_GetTLSValue(PoolIndex));
 }
 
 // Set the thread-specific current pool.
 void SetThreadPoolAllocator(TPoolAllocator* poolAllocator)
 {
-    threadPoolAllocator = poolAllocator;
+    OS_SetTLSValue(PoolIndex, poolAllocator);
+}
+
+// Process-wide set up of the TLS pool storage.
+bool InitializePoolIndex()
+{
+    // Allocate a TLS index.
+    if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX)
+        return false;
+
+    return true;
 }
 
 //
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 9c8610c..d02eae6 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -159,7 +159,7 @@
     return index;
 }
 
-const int SpvVersionCount = 3;  // index range in MapSpvVersionToIndex
+const int SpvVersionCount = 4;  // index range in MapSpvVersionToIndex
 
 int MapSpvVersionToIndex(const SpvVersion& spvVersion)
 {
@@ -167,8 +167,12 @@
 
     if (spvVersion.openGl > 0)
         index = 1;
-    else if (spvVersion.vulkan > 0)
-        index = 2;
+    else if (spvVersion.vulkan > 0) {
+        if (!spvVersion.vulkanRelaxed)
+            index = 2;
+        else
+            index = 3;
+    }
 
     assert(index < SpvVersionCount);
 
@@ -294,6 +298,9 @@
 #ifdef GLSLANG_WEB
     profile = EEsProfile;
     version = 310;
+#elif defined(GLSLANG_ANGLE)
+    profile = ECoreProfile;
+    version = 450;
 #endif
 
     (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]);
@@ -315,6 +322,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));
@@ -354,7 +364,6 @@
         (profile == EEsProfile && version >= 310))
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangGeometry, source,
                                    infoSink, commonTable, symbolTables);
-#endif
 
     // check for compute
     if ((profile != EEsProfile && version >= 420) ||
@@ -362,6 +371,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,
@@ -389,6 +399,8 @@
         (profile == EEsProfile && version >= 320))
         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source,
                                    infoSink, commonTable, symbolTables);
+#endif // !GLSLANG_ANGLE
+#endif // !GLSLANG_WEB
 
     return true;
 }
@@ -490,7 +502,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);
@@ -594,7 +606,7 @@
         break;
     }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     // Correct for stage type...
     switch (stage) {
     case EShLangGeometry:
@@ -715,6 +727,7 @@
                 break;
             case EShClientVulkan:
                 spvVersion.vulkanGlsl = environment->input.dialectVersion;
+                spvVersion.vulkanRelaxed = environment->input.vulkanRulesRelaxed;
                 break;
             case EShClientOpenGL:
                 spvVersion.openGl = environment->input.dialectVersion;
@@ -870,7 +883,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 ("
@@ -893,10 +906,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)
@@ -938,6 +954,9 @@
     if (cachedTable)
         symbolTable->adoptLevels(*cachedTable);
 
+    if (intermediate.getUniqueId() != 0)
+        symbolTable->overwriteUniqueId(intermediate.getUniqueId());
+
     // Add built-in symbols that are potentially context dependent;
     // they get popped again further down.
     if (! AddContextSpecificSymbols(resources, compiler->infoSink, *symbolTable, version, profile, spvVersion,
@@ -966,7 +985,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,10 +1019,11 @@
     bool success = processingContext(*parseContext, ppContext, fullInput,
                                      versionWillBeError, *symbolTable,
                                      intermediate, optLevel, messages);
+    intermediate.setUniqueId(symbolTable->getMaxSymbolId());
     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
@@ -1226,14 +1246,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
@@ -1257,14 +1279,15 @@
     EShMessages messages,       // warnings/errors/AST; things to print out
     TShader::Includer& includer,
     TIntermediate& intermediate, // returned tree, etc.
-    std::string* outputString)
+    std::string* outputString,
+    TEnvironment* environment = nullptr)
 {
     DoPreprocessing parser(outputString);
     return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
                            preamble, optLevel, resources, defaultVersion,
                            defaultProfile, forceDefaultVersionAndProfile,
                            forwardCompatible, messages, intermediate, parser,
-                           false, includer);
+                           false, includer, "", environment);
 }
 #endif
 
@@ -1744,6 +1767,7 @@
     // clear environment (avoid constructors in them for use in a C interface)
     environment.input.languageFamily = EShSourceNone;
     environment.input.dialect = EShClientNone;
+    environment.input.vulkanRulesRelaxed = false;
     environment.client.client = EShClientNone;
     environment.target.language = EShTargetNone;
     environment.target.hlslFunctionality1 = false;
@@ -1797,6 +1821,11 @@
     intermediate->addProcesses(p);
 }
 
+void  TShader::setUniqueId(unsigned long long id)
+{
+    intermediate->setUniqueId(id);
+}
+
 void TShader::setInvertY(bool invert)                   { intermediate->setInvertY(invert); }
 void TShader::setNanMinMaxClamp(bool useNonNan)         { intermediate->setNanMinMaxClamp(useNonNan); }
 
@@ -1845,6 +1874,15 @@
 void TShader::setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { intermediate->setTextureSamplerTransformMode(mode); }
 #endif
 
+void TShader::addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { intermediate->addBlockStorageOverride(nameStr, backing); }
+
+void TShader::setGlobalUniformBlockName(const char* name) { intermediate->setGlobalUniformBlockName(name); }
+void TShader::setGlobalUniformSet(unsigned int set) { intermediate->setGlobalUniformSet(set); }
+void TShader::setGlobalUniformBinding(unsigned int binding) { intermediate->setGlobalUniformBinding(binding); }
+
+void TShader::setAtomicCounterBlockName(const char* name) { intermediate->setAtomicCounterBlockName(name); }
+void TShader::setAtomicCounterBlockSet(unsigned int set) { intermediate->setAtomicCounterBlockSet(set); }
+
 #ifdef ENABLE_HLSL
 // See comment above TDefaultHlslIoMapper in iomapper.cpp:
 void TShader::setHlslIoMapping(bool hlslIoMap)          { intermediate->setHlslIoMapping(hlslIoMap); }
@@ -1873,7 +1911,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.
 //
@@ -1896,7 +1934,8 @@
     return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,
                               EShOptNone, builtInResources, defaultVersion,
                               defaultProfile, forceDefaultVersionAndProfile,
-                              forwardCompatible, message, includer, *intermediate, output_string);
+                              forwardCompatible, message, includer, *intermediate, output_string,
+                              &environment);
 }
 #endif
 
@@ -1911,7 +1950,7 @@
 }
 
 TProgram::TProgram() :
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     reflection(0),
 #endif
     linked(false)
@@ -1927,7 +1966,7 @@
 TProgram::~TProgram()
 {
     delete infoSink;
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     delete reflection;
 #endif
 
@@ -1959,7 +1998,10 @@
             error = true;
     }
 
-    // TODO: Link: cross-stage error checking
+    if (!error) {
+        if (! crossStageCheck(messages))
+            error = true;
+    }
 
     return ! error;
 }
@@ -1974,7 +2016,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) {
@@ -2003,7 +2045,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.
@@ -2028,12 +2070,77 @@
 #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;
 }
 
+//
+// Check that there are no errors in linker objects accross stages
+//
+// Return true if no errors.
+//
+bool TProgram::crossStageCheck(EShMessages) {
+
+    // make temporary intermediates to hold the linkage symbols for each linking interface
+    // while we do the checks
+    // Independent interfaces are:
+    //                  all uniform variables and blocks
+    //                  all buffer blocks
+    //                  all in/out on a stage boundary
+
+    TVector<TIntermediate*> activeStages;
+    for (int s = 0; s < EShLangCount; ++s) {
+        if (intermediate[s])
+            activeStages.push_back(intermediate[s]);
+    }
+
+    // no extra linking if there is only one stage
+    if (! (activeStages.size() > 1))
+        return true;
+
+    // setup temporary tree to hold unfirom objects from different stages
+    TIntermediate* firstIntermediate = activeStages.front();
+    TIntermediate uniforms(EShLangCount,
+                           firstIntermediate->getVersion(),
+                           firstIntermediate->getProfile());
+    uniforms.setSpv(firstIntermediate->getSpv());
+
+    TIntermAggregate uniformObjects(EOpLinkerObjects);
+    TIntermAggregate root(EOpSequence);
+    root.getSequence().push_back(&uniformObjects);
+    uniforms.setTreeRoot(&root);
+
+    bool error = false;
+
+    // merge uniforms from all stages into a single intermediate
+    for (unsigned int i = 0; i < activeStages.size(); ++i) {
+        uniforms.mergeUniformObjects(*infoSink, *activeStages[i]);
+    }
+    error |= uniforms.getNumErrors() != 0;
+
+    // copy final definition of global block back into each stage
+    for (unsigned int i = 0; i < activeStages.size(); ++i) {
+        // We only want to merge into already existing global uniform blocks.
+        // A stage that doesn't already know about the global doesn't care about it's content.
+        // Otherwise we end up pointing to the same object between different stages
+        // and that will break binding/set remappings
+        bool mergeExistingOnly = true;
+        activeStages[i]->mergeGlobalUniformBlocks(*infoSink, uniforms, mergeExistingOnly);
+    }
+
+    // compare cross stage symbols for each stage boundary
+    for (unsigned int i = 1; i < activeStages.size(); ++i) {
+        activeStages[i - 1]->checkStageIO(*infoSink, *activeStages[i]);
+        error |= (activeStages[i - 1]->getNumErrors() != 0);
+    }
+
+    return !error;
+}
+
 const char* TProgram::getInfoLog()
 {
     return infoSink->info.c_str();
@@ -2044,7 +2151,7 @@
     return infoSink->debug.c_str();
 }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
 //
 // Reflection implementation.
@@ -2126,6 +2233,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..0e5ee19 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);
         }
@@ -166,7 +170,7 @@
         for (int i = 0; i < arraySizes->getNumDims(); ++i) {
             if (arraySizes->getDimNode(i)) {
                 if (arraySizes->getDimNode(i)->getAsSymbolNode())
-                    snprintf(buf, maxSize, "s%d", arraySizes->getDimNode(i)->getAsSymbolNode()->getId());
+                    snprintf(buf, maxSize, "s%lld", arraySizes->getDimNode(i)->getAsSymbolNode()->getId());
                 else
                     snprintf(buf, maxSize, "s%p", arraySizes->getDimNode(i));
             } else
@@ -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..152dc47 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -104,8 +104,8 @@
     virtual const TAnonMember* getAsAnonMember() const { return 0; }
     virtual const TType& getType() const = 0;
     virtual TType& getWritableType() = 0;
-    virtual void setUniqueId(int id) { uniqueId = id; }
-    virtual int getUniqueId() const { return uniqueId; }
+    virtual void setUniqueId(long long id) { uniqueId = id; }
+    virtual long long getUniqueId() const { return uniqueId; }
     virtual void setExtensions(int numExts, const char* const exts[])
     {
         assert(extensions == 0);
@@ -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
@@ -130,7 +130,7 @@
     TSymbol& operator=(const TSymbol&);
 
     const TString *name;
-    unsigned int uniqueId;      // For cross-scope comparing during code generation
+    unsigned long long uniqueId;      // For cross-scope comparing during code generation
 
     // For tracking what extensions must be present
     // (don't use if correct version/profile is present).
@@ -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;
@@ -612,21 +612,28 @@
     //   3: user-shader globals
     //
 protected:
+    static const uint32_t LevelFlagBitOffset = 56;
     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(long long uniqueId) {
+        int level = static_cast<int>(uniqueId >> LevelFlagBitOffset);
+        return isBuiltInLevel(level);
+    }
+    static constexpr uint64_t uniqueIdMask = (1LL << LevelFlagBitOffset) - 1;
+    static const uint32_t MaxLevelInUniqueID = 127;
     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 +646,7 @@
     {
         assert(thisSymbol.getName().size() == 0);
         table.push_back(new TSymbolTableLevel);
+        updateUniqueIdLevelFlag();
         table.back()->setThisLevel();
         insert(thisSymbol);
     }
@@ -648,6 +656,7 @@
         table[currentLevel()]->getPreviousDefaultPrecisions(p);
         delete table.back();
         table.pop_back();
+        updateUniqueIdLevelFlag();
     }
 
     //
@@ -685,6 +694,16 @@
         return table[currentLevel()]->amend(symbol, firstNewMember);
     }
 
+    // Update the level info in symbol's unique ID to current level
+    void amendSymbolIdLevel(TSymbol& symbol)
+    {
+        // clamp level to avoid overflow
+        uint64_t level = (uint32_t)currentLevel() > MaxLevelInUniqueID ? MaxLevelInUniqueID : currentLevel();
+        uint64_t symbolId = symbol.getUniqueId();
+        symbolId &= uniqueIdMask;
+        symbolId |= (level << LevelFlagBitOffset);
+        symbol.setUniqueId(symbolId);
+    }
     //
     // To allocate an internal temporary, which will need to be uniquely
     // identified by the consumer of the AST, but never need to
@@ -853,8 +872,8 @@
         }
     }
 
-    int getMaxSymbolId() { return uniqueId; }
-#ifndef GLSLANG_WEB
+    long long getMaxSymbolId() { return uniqueId; }
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
     void dump(TInfoSink& infoSink, bool complete = false) const;
 #endif
     void copyTable(const TSymbolTable& copyOf);
@@ -867,14 +886,27 @@
             table[level]->readOnly();
     }
 
+    // Add current level in the high-bits of unique id
+    void updateUniqueIdLevelFlag() {
+        // clamp level to avoid overflow
+        uint64_t level = (uint32_t)currentLevel() > MaxLevelInUniqueID ? MaxLevelInUniqueID : currentLevel();
+        uniqueId &= uniqueIdMask;
+        uniqueId |= (level << LevelFlagBitOffset);
+    }
+
+    void overwriteUniqueId(long long id)
+    {
+        uniqueId = id;
+        updateUniqueIdLevelFlag();
+    }
+
 protected:
     TSymbolTable(TSymbolTable&);
     TSymbolTable& operator=(TSymbolTableLevel&);
 
     int currentLevel() const { return static_cast<int>(table.size()) - 1; }
-
     std::vector<TSymbolTableLevel*> table;
-    int uniqueId;     // for unique identification in code generation
+    long long uniqueId;     // for unique identification in code generation
     bool noBuiltInRedeclarations;
     bool separateNameSpaces;
     unsigned int adoptedLevels;
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index b311024..94fe1ab 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -170,7 +170,7 @@
     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;
+            extensionMinSpv[exts[ii].extensionName] = exts[ii].minSpvVersion;
         }
     }
 
@@ -305,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;
@@ -327,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;
@@ -371,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"
@@ -404,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"
@@ -463,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"
@@ -474,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"
@@ -532,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
     }
 
@@ -558,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
@@ -762,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;
@@ -781,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;
@@ -847,12 +869,13 @@
         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);
+    extensionRequires(getCurrentLoc(), extension, behaviorString);
 
     // update the requested extension
     updateExtensionBehavior(extension, behavior);
@@ -916,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)
@@ -951,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;
         }
     }
@@ -1224,7 +1273,7 @@
 // Call for any operation removed because Vulkan SPIR-V is being generated.
 void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op)
 {
-    if (spvVersion.vulkan > 0)
+    if (spvVersion.vulkan > 0 && !spvVersion.vulkanRelaxed)
         error(loc, "not allowed when using GLSL for Vulkan", op, "");
 }
 
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index f52f605..25feb0b 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -87,11 +87,12 @@
 // The union of all requested rule sets will be applied.
 //
 struct SpvVersion {
-    SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0) {}
+    SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0), vulkanRelaxed(false) {}
     unsigned int spv; // the version of SPIR-V to target, as defined by "word 1" of the SPIR-V binary header
     int vulkanGlsl;   // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for "#define VULKAN XXX"
     int vulkan;       // the version of Vulkan, for which SPIR-V execution environment rules to use
     int openGl;       // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for "#define GL_SPIRV XXX"
+    bool vulkanRelaxed; // relax changes to GLSL for Vulkan, allowing some GL-specific to be compiled to Vulkan SPIR-V target
 };
 
 //
@@ -199,6 +200,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
 
@@ -297,6 +302,7 @@
 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";
 
diff --git a/glslang/MachineIndependent/gl_types.h b/glslang/MachineIndependent/gl_types.h
index b6f613b..d6c9393 100644
--- a/glslang/MachineIndependent/gl_types.h
+++ b/glslang/MachineIndependent/gl_types.h
@@ -49,9 +49,17 @@
 #define GL_INT64_VEC4_ARB                 0x8FEB
 
 #define GL_UNSIGNED_INT64_ARB             0x140F
-#define GL_UNSIGNED_INT64_VEC2_ARB        0x8FE5
-#define GL_UNSIGNED_INT64_VEC3_ARB        0x8FE6
-#define GL_UNSIGNED_INT64_VEC4_ARB        0x8FE7
+#define GL_UNSIGNED_INT64_VEC2_ARB        0x8FF5
+#define GL_UNSIGNED_INT64_VEC3_ARB        0x8FF6
+#define GL_UNSIGNED_INT64_VEC4_ARB        0x8FF7
+#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..c718f94 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;
@@ -882,6 +886,7 @@
     case EOpTime:                       out.debug << "time";                  break;
 
     case EOpAtomicAdd:                  out.debug << "AtomicAdd";             break;
+    case EOpAtomicSubtract:             out.debug << "AtomicSubtract";        break;
     case EOpAtomicMin:                  out.debug << "AtomicMin";             break;
     case EOpAtomicMax:                  out.debug << "AtomicMax";             break;
     case EOpAtomicAnd:                  out.debug << "AtomicAnd";             break;
@@ -1079,11 +1084,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 +1330,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 +1418,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 +1481,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 +1577,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 9859f08..7e12864 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.
@@ -82,17 +84,17 @@
         // 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->getName());
+            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;
         }
     }
 
@@ -125,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;
 
@@ -181,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:
@@ -189,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) {
@@ -206,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.resolveSet(ent.stage, ent);
+            resolver.resolveBinding(ent.stage, ent);
+            resolver.resolveUniformLocation(ent.stage, ent);
 
             if (ent.newBinding != -1) {
                 if (ent.newBinding >= int(TQualifier::layoutBindingEnd)) {
@@ -217,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)) {
@@ -225,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;
@@ -239,7 +264,7 @@
     TIoMapResolver& resolver;
     TInfoSink&      infoSink;
     bool&           error;
-
+    TVarLiveMap*    uniformVarMap[EShLangCount];
 private:
     TResolverUniformAdaptor& operator=(TResolverUniformAdaptor&) = delete;
 };
@@ -261,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);
@@ -292,21 +317,118 @@
 };
 
 // The class is used for reserving explicit uniform locations and ubo/ssbo/opaque bindings
+// xxTODO: maybe this logic should be moved into the resolver's "validateInOut" and "validateUniform"
 
 struct TSymbolValidater
 {
     TSymbolValidater(TIoMapResolver& r, TInfoSink& i, TVarLiveMap* in[EShLangCount], TVarLiveMap* out[EShLangCount],
-                     TVarLiveMap* uniform[EShLangCount], bool& hadError)
-        : preStage(EShLangCount)
-        , currentStage(EShLangCount)
-        , nextStage(EShLangCount)
-        , resolver(r)
+                     TVarLiveMap* uniform[EShLangCount], bool& hadError, EProfile profile, int version)
+        : 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) {
@@ -314,17 +436,23 @@
         TIntermSymbol* base = ent1.symbol;
         const TType& type = ent1.symbol->getType();
         const TString& name = entKey.first;
-        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) {
-                    nextStage = static_cast<EShLanguage>(i);
-                    break;
-                }
+        EShLanguage stage = ent1.stage;
+        EShLanguage preStage, currentStage, nextStage;
+
+        preStage = EShLangCount;
+        for (int i = stage - 1; i >= 0; i--) {
+            if (inVarMaps[i] != nullptr) {
+                preStage = static_cast<EShLanguage>(i);
+                break;
+            }
+        }
+        currentStage = stage;
+        nextStage = EShLangCount;
+        for (int i = stage + 1; i < EShLangCount; i++) {
+            if (inVarMaps[i] != nullptr) {
+                nextStage = static_cast<EShLanguage>(i);
+                break;
             }
         }
 
@@ -335,46 +463,86 @@
             type.appendMangledName(mangleName1);
         }
 
+
+        // basic checking that symbols match
+        // more extensive checking in the link stage
         if (base->getQualifier().storage == EvqVaryingIn) {
             // validate stage in;
             if (preStage == EShLangCount)
                 return;
-            if (name == "gl_PerVertex")
+            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()) {
+                    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 {
+                    } else {
                         ent2->second.symbol->getType().appendMangledName(mangleName2);
                     }
-                    if (mangleName1 == 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 (name == "gl_PerVertex")
+            if (TSymbolTable::isBuiltInSymbol(base->getId()))
                 return;
-            if (outVarMaps[nextStage] != nullptr) {
+            if (inVarMaps[nextStage] != nullptr) {
                 auto ent2 = inVarMaps[nextStage]->find(name);
                 if (ent2 != inVarMaps[nextStage]->end()) {
                     if (ent2->second.symbol->getType().getQualifier().isArrayedIo(nextStage)) {
                         TType subType(ent2->second.symbol->getType(), 0);
                         subType.appendMangledName(mangleName2);
-                    }
-                    else {
+                    } else {
                         ent2->second.symbol->getType().appendMangledName(mangleName2);
                     }
                     if (mangleName1 == mangleName2)
@@ -387,7 +555,7 @@
                 }
                 return;
             }
-        } else if (base->getQualifier().isUniformOrBuffer() && ! base->getQualifier().isPushConstant()) {
+        } else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant()) {
             // validate uniform type;
             for (int i = 0; i < EShLangCount; i++) {
                 if (i != currentStage && outVarMaps[i] != nullptr) {
@@ -395,26 +563,174 @@
                     if (ent2 != uniformVarMap[i]->end()) {
                         ent2->second.symbol->getType().appendMangledName(mangleName2);
                         if (mangleName1 != mangleName2) {
+                            ent2->second.symbol->getType().sameElementType(type);
                             TString err = "Invalid Uniform variable type : " + entKey.first;
                             infoSink.info.message(EPrefixInternalError, err.c_str());
                             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;
+
     // Use for mark current shader stage for resolver
     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 {
@@ -438,14 +754,18 @@
     , nextOutputLocation(0)
 {
     memset(stageMask, false, sizeof(bool) * (EShLangCount + 1));
+    memset(stageIntermediates, 0, sizeof(TIntermediate*) * (EShLangCount));
+    stageIntermediates[intermediate.getStage()] = &intermediate;
 }
 
-int TDefaultIoResolverBase::getBaseBinding(TResourceType res, unsigned int set) const {
-    return selectBaseBinding(intermediate.getShiftBinding(res), intermediate.getShiftBindingForSet(res, set));
+int TDefaultIoResolverBase::getBaseBinding(EShLanguage stage, TResourceType res, unsigned int set) const {
+    return stageIntermediates[stage] ? selectBaseBinding(stageIntermediates[stage]->getShiftBinding(res), stageIntermediates[stage]->getShiftBindingForSet(res, set))
+                                     : selectBaseBinding(intermediate.getShiftBinding(res), intermediate.getShiftBindingForSet(res, set));
 }
 
-const std::vector<std::string>& TDefaultIoResolverBase::getResourceSetBinding() const {
-    return intermediate.getResourceSetBinding();
+const std::vector<std::string>& TDefaultIoResolverBase::getResourceSetBinding(EShLanguage stage) const {
+    return stageIntermediates[stage] ? stageIntermediates[stage]->getResourceSetBinding()
+                                     : intermediate.getResourceSetBinding();
 }
 
 bool TDefaultIoResolverBase::doAutoBindingMapping() const { return intermediate.getAutoMapBindings(); }
@@ -486,21 +806,21 @@
     return reserveSlot(set, base, size);
 }
 
-int TDefaultIoResolverBase::resolveSet(EShLanguage /*stage*/, TVarEntryInfo& ent) {
+int TDefaultIoResolverBase::resolveSet(EShLanguage stage, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
     if (type.getQualifier().hasSet()) {
         return ent.newSet = type.getQualifier().layoutSet;
     }
     // If a command line or API option requested a single descriptor set, use that (if not overrided by spaceN)
-    if (getResourceSetBinding().size() == 1) {
-        return ent.newSet = atoi(getResourceSetBinding()[0].c_str());
+    if (getResourceSetBinding(stage).size() == 1) {
+        return ent.newSet = atoi(getResourceSetBinding(stage)[0].c_str());
     }
     return ent.newSet = 0;
 }
 
 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;
@@ -609,12 +929,12 @@
 
 int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     if (currentStage != stage) {
         preStage = currentStage;
         currentStage = stage;
     }
-    // kick out of not doing this
+    // kick out if not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
     }
@@ -693,7 +1013,7 @@
 
 int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     // kick out of not doing this
     if (! doAutoLocationMapping()) {
         return ent.newLocation = -1;
@@ -762,9 +1082,9 @@
     return ent.newLocation = location;
 }
 
-int TDefaultGlslIoResolver::resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) {
+int TDefaultGlslIoResolver::resolveBinding(EShLanguage stage, TVarEntryInfo& ent) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    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);
@@ -775,30 +1095,32 @@
     // There is no 'set' qualifier in OpenGL shading language, each resource has its own
     // binding name space, so remap the 'set' to resource type which make each resource
     // binding is valid from 0 to MAX_XXRESOURCE_BINDINGS
-    int set = resource;
+    int set = intermediate.getSpv().openGl != 0 ? resource : ent.newSet;
+    int resourceKey = set;
     if (resource < EResCount) {
         if (type.getQualifier().hasBinding()) {
-            ent.newBinding = reserveSlot(set, getBaseBinding(resource, set) + type.getQualifier().layoutBinding, numBindings);
-            return ent.newBinding;
-        } else if (ent.live && doAutoBindingMapping()) {
+            int newBinding = reserveSlot(resourceKey, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding, numBindings);
+            return ent.newBinding = newBinding;
+
+        } else {
             // The resource in current stage is not declared with binding, but it is possible declared
             // with explicit binding in other stages, find the resourceSlotMap firstly to check whether
             // the resource has binding, don't need to allocate if it already has a binding
             bool hasBinding = false;
-            if (! resourceSlotMap[resource].empty()) {
-                TVarSlotMap::iterator iter = resourceSlotMap[resource].find(name);
-                if (iter != resourceSlotMap[resource].end()) {
+            ent.newBinding = -1; // leave as -1 if it isn't set below
+
+            if (! resourceSlotMap[resourceKey].empty()) {
+                TVarSlotMap::iterator iter = resourceSlotMap[resourceKey].find(name);
+                if (iter != resourceSlotMap[resourceKey].end()) {
                     hasBinding = true;
                     ent.newBinding = iter->second;
                 }
             }
-            if (! hasBinding) {
-                TVarSlotMap varSlotMap;
+            if (!hasBinding && (ent.live && doAutoBindingMapping())) {
                 // find free slot, the caller did make sure it passes all vars with binding
                 // first and now all are passed that do not have a binding and needs one
-                int binding = getFreeSlot(resource, getBaseBinding(resource, set), numBindings);
-                varSlotMap[name] = binding;
-                resourceSlotMap[resource] = varSlotMap;
+                int binding = getFreeSlot(resourceKey, getBaseBinding(stage, resource, set), numBindings);
+                resourceSlotMap[resourceKey][name] = binding;
                 ent.newBinding = binding;
             }
             return ent.newBinding;
@@ -839,7 +1161,7 @@
 
 void TDefaultGlslIoResolver::reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
+    const TString& name = ent.symbol->getAccessName();
     TStorageQualifier storage = type.getQualifier().storage;
     EShLanguage stage(EShLangCount);
     switch (storage) {
@@ -899,17 +1221,21 @@
 
 void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
     const TType& type = ent.symbol->getType();
-    const TString& name = getAccessName(ent.symbol);
-    int resource = getResourceType(type);
+    const TString& name = ent.symbol->getAccessName();
+    TResourceType resource = getResourceType(type);
+    int set = intermediate.getSpv().openGl != 0 ? resource : resolveSet(ent.stage, ent);
+    int resourceKey = set;
+
     if (type.getQualifier().hasBinding()) {
-        TVarSlotMap& varSlotMap = resourceSlotMap[resource];
+        TVarSlotMap& varSlotMap = resourceSlotMap[resourceKey];
         TVarSlotMap::iterator iter = varSlotMap.find(name);
-        int binding = type.getQualifier().layoutBinding;
+        int binding = type.getQualifier().layoutBinding + getBaseBinding(ent.stage, resource, set);
+
         if (iter == varSlotMap.end()) {
             // Reserve the slots for the ubo, ssbo and opaques who has explicit binding
-            int numBindings = type.isSizedArray() ? type.getCumulativeArraySize() : 1;
+            int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;
             varSlotMap[name] = binding;
-            reserveSlot(resource, binding, numBindings);
+            reserveSlot(resourceKey, binding, numBindings);
         } else {
             // Allocate binding by name for OpenGL driver, so the resource in different
             // stages should be declared with the same binding
@@ -922,13 +1248,6 @@
     }
 }
 
-const TString& TDefaultGlslIoResolver::getAccessName(const TIntermSymbol* symbol)
-{
-    return symbol->getBasicType() == EbtBlock ?
-        symbol->getType().getTypeName() :
-        symbol->getName();
-}
-
 //TDefaultGlslIoResolver end
 
 /*
@@ -965,7 +1284,7 @@
         return EResCount;
     }
 
-    int resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) override {
+    int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) override {
         const TType& type = ent.symbol->getType();
         const int set = getLayoutSet(type);
         // On OpenGL arrays of opaque types take a seperate binding for each element
@@ -974,11 +1293,11 @@
         if (resource < EResCount) {
             if (type.getQualifier().hasBinding()) {
                 return ent.newBinding = reserveSlot(
-                           set, getBaseBinding(resource, set) + type.getQualifier().layoutBinding, numBindings);
+                           set, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding, numBindings);
             } else if (ent.live && doAutoBindingMapping()) {
                 // find free slot, the caller did make sure it passes all vars with binding
                 // first and now all are passed that do not have a binding and needs one
-                return ent.newBinding = getFreeSlot(set, getBaseBinding(resource, set), numBindings);
+                return ent.newBinding = getFreeSlot(set, getBaseBinding(stage, resource, set), numBindings);
             }
         }
         return ent.newBinding = -1;
@@ -1050,17 +1369,17 @@
         return EResCount;
     }
 
-    int resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) override {
+    int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) override {
         const TType& type = ent.symbol->getType();
         const int set = getLayoutSet(type);
         TResourceType resource = getResourceType(type);
         if (resource < EResCount) {
             if (type.getQualifier().hasBinding()) {
-                return ent.newBinding = reserveSlot(set, getBaseBinding(resource, set) + type.getQualifier().layoutBinding);
+                return ent.newBinding = reserveSlot(set, getBaseBinding(stage, resource, set) + type.getQualifier().layoutBinding);
             } else if (ent.live && doAutoBindingMapping()) {
                 // find free slot, the caller did make sure it passes all vars with binding
                 // first and now all are passed that do not have a binding and needs one
-                return ent.newBinding = getFreeSlot(set, getBaseBinding(resource, set));
+                return ent.newBinding = getFreeSlot(set, getBaseBinding(stage, resource, set));
             }
         }
         return ent.newBinding = -1;
@@ -1099,10 +1418,10 @@
         else
             resolver = &defaultResolver;
     }
-    resolver->addStage(stage);
 #else
     resolver = &defaultResolver;
 #endif
+    resolver->addStage(stage, intermediate);
 
     TVarLiveMap inVarMap, outVarMap, uniformVarMap;
     TVarLiveVector inVector, outVector, uniformVector;
@@ -1117,25 +1436,23 @@
     }
 
     // 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);
@@ -1143,22 +1460,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);
@@ -1174,9 +1491,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) {
@@ -1195,10 +1517,21 @@
     }
     // if no resolver is provided, use the default resolver with the given shifts and auto map settings
     TDefaultGlslIoResolver defaultResolver(intermediate);
+#ifdef ENABLE_HLSL
+    TDefaultHlslIoResolver defaultHlslResolver(intermediate);
+    if (resolver == nullptr) {
+        // TODO: use a passed in IO mapper for this
+        if (intermediate.usingHlslIoMapping())
+            resolver = &defaultHlslResolver;
+        else
+            resolver = &defaultResolver;
+    }
+#else
     if (resolver == nullptr) {
         resolver = &defaultResolver;
     }
-    resolver->addStage(stage);
+#endif
+    resolver->addStage(stage, intermediate);
     inVarMaps[stage] = new TVarLiveMap(); outVarMaps[stage] = new TVarLiveMap(); uniformVarMap[stage] = new TVarLiveMap();
     TVarGatherTraverser iter_binding_all(intermediate, true, *inVarMaps[stage], *outVarMaps[stage],
                                          *uniformVarMap[stage]);
@@ -1236,31 +1569,66 @@
     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 inVectors[EShLangCount];
+        TVarLiveVector outVectors[EShLangCount];
         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);
+
+                // copy vars into a sorted list
+                std::for_each(inVarMaps[stage]->begin(), inVarMaps[stage]->end(),
+                        [&inVectors, stage](TVarLivePair p) { inVectors[stage].push_back(p); });
+                std::sort(inVectors[stage].begin(), inVectors[stage].end(),
+                        [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
+                            return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
+                });
+
+                std::for_each(outVarMaps[stage]->begin(), outVarMaps[stage]->end(),
+                        [&outVectors, stage](TVarLivePair p) { outVectors[stage].push_back(p); });
+                std::sort(outVectors[stage].begin(), outVectors[stage].end(),
+                        [](const TVarLivePair& p1, const TVarLivePair& p2) -> bool {
+                            return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second);
+                });
+
+                for (auto& var : inVectors[stage]) { symbolValidater(var); }
+                for (auto& var : inVectors[stage]) { inOutResolve(var); }
+                for (auto& var : outVectors[stage]) { symbolValidater(var); }
+                for (auto& var : outVectors[stage]) { inOutResolve(var); }
+
+                // copy results back into maps
+                std::for_each(inVectors[stage].begin(), inVectors[stage].end(),
+                    [this, stage](TVarLivePair p) {
+                        auto at = inVarMaps[stage]->find(p.first);
+                        if (at != inVarMaps[stage]->end())
+                            at->second = p.second;
+                });
+
+                std::for_each(outVectors[stage].begin(), outVectors[stage].end(),
+                    [this, stage](TVarLivePair p) {
+                        auto at = outVarMaps[stage]->find(p.first);
+                        if (at != outVarMaps[stage]->end())
+                            at->second = p.second;
+                });
+
             }
             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);
+            return TVarEntryInfo::TOrderByPriorityAndLive()(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);
         });
@@ -1269,14 +1637,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);
             }
         }
@@ -1288,4 +1660,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 7ca18b8..07357c2 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
@@ -52,7 +52,7 @@
 
 class TIntermediate;
 struct TVarEntryInfo {
-    int id;
+    long long id;
     TIntermSymbol* symbol;
     bool live;
     int newBinding;
@@ -87,6 +87,35 @@
             return lPoints > rPoints;
         }
     };
+
+    struct TOrderByPriorityAndLive {
+        // ordering:
+        // 1) do live variables first
+        // 2) has both binding and set
+        // 3) has binding but no set
+        // 4) has no binding but set
+        // 5) has no binding and no set
+        inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) {
+
+            const TQualifier& lq = l.symbol->getQualifier();
+            const TQualifier& rq = r.symbol->getQualifier();
+
+            // simple rules:
+            // has binding gives 2 points
+            // has set gives 1 point
+            // who has the most points is more important.
+            int lPoints = (lq.hasBinding() ? 2 : 0) + (lq.hasSet() ? 1 : 0);
+            int rPoints = (rq.hasBinding() ? 2 : 0) + (rq.hasSet() ? 1 : 0);
+
+            if (l.live != r.live)
+                return l.live > r.live;
+
+            if (lPoints != rPoints)
+                return lPoints > rPoints;
+
+            return l.id < r.id;
+        }
+    };
 };
 
 // Base class for shared TIoMapResolver services, used by several derivations.
@@ -107,8 +136,8 @@
     void endCollect(EShLanguage) override {}
     void reserverResourceSlot(TVarEntryInfo& /*ent*/, TInfoSink& /*infoSink*/) override {}
     void reserverStorageSlot(TVarEntryInfo& /*ent*/, TInfoSink& /*infoSink*/) override {}
-    int getBaseBinding(TResourceType res, unsigned int set) const;
-    const std::vector<std::string>& getResourceSetBinding() const;
+    int getBaseBinding(EShLanguage stage, TResourceType res, unsigned int set) const;
+    const std::vector<std::string>& getResourceSetBinding(EShLanguage stage) const;
     virtual TResourceType getResourceType(const glslang::TType& type) = 0;
     bool doAutoBindingMapping() const;
     bool doAutoLocationMapping() const;
@@ -122,9 +151,11 @@
     int resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) override;
     int resolveInOutComponent(EShLanguage /*stage*/, TVarEntryInfo& ent) override;
     int resolveInOutIndex(EShLanguage /*stage*/, TVarEntryInfo& ent) override;
-    void addStage(EShLanguage stage) override {
-        if (stage < EShLangCount)
+    void addStage(EShLanguage stage, TIntermediate& stageIntermediate) override {
+        if (stage < EShLangCount) {
             stageMask[stage] = true;
+            stageIntermediates[stage] = &stageIntermediate;
+        }
     }
     uint32_t computeTypeLocationSize(const TType& type, EShLanguage stage);
 
@@ -139,6 +170,8 @@
     int nextInputLocation;
     int nextOutputLocation;
     bool stageMask[EShLangCount + 1];
+    const TIntermediate* stageIntermediates[EShLangCount];
+
     // Return descriptor set specific base if there is one, and the generic base otherwise.
     int selectBaseBinding(int base, int descriptorSetBase) const {
         return descriptorSetBase != -1 ? descriptorSetBase : base;
@@ -186,7 +219,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>
@@ -203,7 +236,6 @@
     void endCollect(EShLanguage) override;
     void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
     void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
-    const TString& getAccessName(const TIntermSymbol*);
     // in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
     // We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
     // if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
@@ -263,10 +295,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++) {
@@ -293,10 +327,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/limits.cpp b/glslang/MachineIndependent/limits.cpp
index 51d9300..3915705 100644
--- a/glslang/MachineIndependent/limits.cpp
+++ b/glslang/MachineIndependent/limits.cpp
@@ -63,14 +63,14 @@
 
 class TInductiveTraverser : public TIntermTraverser {
 public:
-    TInductiveTraverser(int id, TSymbolTable& st)
+    TInductiveTraverser(long long id, TSymbolTable& st)
     : loopId(id), symbolTable(st), bad(false)  { }
 
     virtual bool visitBinary(TVisit, TIntermBinary* node);
     virtual bool visitUnary(TVisit, TIntermUnary* node);
     virtual bool visitAggregate(TVisit, TIntermAggregate* node);
 
-    int loopId;           // unique ID of the symbol that's the loop inductive variable
+    long long loopId;           // unique ID of the symbol that's the loop inductive variable
     TSymbolTable& symbolTable;
     bool bad;
     TSourceLoc badLoc;
@@ -129,7 +129,7 @@
 //
 // External function to call for loop check.
 //
-void TParseContext::inductiveLoopBodyCheck(TIntermNode* body, int loopId, TSymbolTable& symbolTable)
+void TParseContext::inductiveLoopBodyCheck(TIntermNode* body, long long loopId, TSymbolTable& symbolTable)
 {
     TInductiveTraverser it(loopId, symbolTable);
 
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
old mode 100755
new mode 100644
index f0bede5..42b416d
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -48,6 +48,7 @@
 
 #include "localintermediate.h"
 #include "../Include/InfoSink.h"
+#include "SymbolTable.h"
 
 namespace glslang {
 
@@ -82,13 +83,63 @@
 //
 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);
 #endif
 }
 
+//
+// check that link objects between stages
+//
+void TIntermediate::mergeUniformObjects(TInfoSink& infoSink, TIntermediate& unit) {
+    if (unit.treeRoot == nullptr || treeRoot == nullptr)
+        return;
+
+    // Get the linker-object lists
+    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();
+    TIntermSequence unitLinkerObjects = unit.findLinkerObjects()->getSequence();
+
+    // filter unitLinkerObjects to only contain uniforms
+    auto end = std::remove_if(unitLinkerObjects.begin(), unitLinkerObjects.end(),
+        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqUniform &&
+                                      node->getAsSymbolNode()->getQualifier().storage != EvqBuffer; });
+    unitLinkerObjects.resize(end - unitLinkerObjects.begin());
+
+    // merge uniforms and do error checking
+    bool mergeExistingOnly = false;
+    mergeGlobalUniformBlocks(infoSink, unit, mergeExistingOnly);
+    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());
+}
+
+//
+// do error checking on the shader boundary in / out vars 
+//
+void TIntermediate::checkStageIO(TInfoSink& infoSink, TIntermediate& unit) {
+    if (unit.treeRoot == nullptr || treeRoot == nullptr)
+        return;
+
+    // Get copies of the linker-object lists
+    TIntermSequence linkerObjects = findLinkerObjects()->getSequence();
+    TIntermSequence unitLinkerObjects = unit.findLinkerObjects()->getSequence();
+
+    // filter linkerObjects to only contain out variables
+    auto end = std::remove_if(linkerObjects.begin(), linkerObjects.end(),
+        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqVaryingOut; });
+    linkerObjects.resize(end - linkerObjects.begin());
+
+    // filter unitLinkerObjects to only contain in variables
+    auto unitEnd = std::remove_if(unitLinkerObjects.begin(), unitLinkerObjects.end(),
+        [](TIntermNode* node) {return node->getAsSymbolNode()->getQualifier().storage != EvqVaryingIn; });
+    unitLinkerObjects.resize(unitEnd - unitLinkerObjects.begin());
+
+    // do matching and error checking
+    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());
+
+    // TODO: final check; make sure that any statically used `in` have matching `out` written to
+}
+
 void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)
 {
     if (unit.getNumEntryPoints() > 0) {
@@ -104,7 +155,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;
@@ -136,6 +187,7 @@
     MERGE_MAX(spvVersion.vulkanGlsl);
     MERGE_MAX(spvVersion.vulkan);
     MERGE_MAX(spvVersion.openGl);
+    MERGE_TRUE(spvVersion.vulkanRelaxed);
 
     numErrors += unit.getNumErrors();
     // Only one push_constant is allowed, mergeLinkerObjects() will ensure the push_constant
@@ -196,12 +248,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];
@@ -304,12 +358,14 @@
     // Map by global name to unique ID to rationalize the same object having
     // differing IDs in different trees.
     TIdMaps idMaps;
-    int maxId;
-    seedIdMap(idMaps, maxId);
-    remapIds(idMaps, maxId + 1, unit);
+    long long idShift;
+    seedIdMap(idMaps, idShift);
+    remapIds(idMaps, idShift + 1, unit);
 
     mergeBodies(infoSink, globals, unitGlobals);
-    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects);
+    bool mergeExistingOnly = false;
+    mergeGlobalUniformBlocks(infoSink, unit, mergeExistingOnly);
+    mergeLinkerObjects(infoSink, linkerObjects, unitLinkerObjects, unit.getStage());
     ioAccessed.insert(unit.ioAccessed.begin(), unit.ioAccessed.end());
 }
 
@@ -327,14 +383,14 @@
 
 
 // Traverser that seeds an ID map with all built-ins, and tracks the
-// maximum ID used.
+// maximum ID used, currently using (maximum ID + 1) as new symbol id shift seed.
+// Level id will keep same after shifting.
 // (It would be nice to put this in a function, but that causes warnings
 // on having no bodies for the copy-constructor/operator=.)
 class TBuiltInIdTraverser : public TIntermTraverser {
 public:
-    TBuiltInIdTraverser(TIdMaps& idMaps) : idMaps(idMaps), maxId(0) { }
+    TBuiltInIdTraverser(TIdMaps& idMaps) : idMaps(idMaps), idShift(0) { }
     // If it's a built in, add it to the map.
-    // Track the max ID.
     virtual void visitSymbol(TIntermSymbol* symbol)
     {
         const TQualifier& qualifier = symbol->getType().getQualifier();
@@ -342,14 +398,16 @@
             TShaderInterface si = symbol->getType().getShaderInterface();
             idMaps[si][getNameForIdMap(symbol)] = symbol->getId();
         }
-        maxId = std::max(maxId, symbol->getId());
+        idShift = (symbol->getId() & ~TSymbolTable::uniqueIdMask) |
+                std::max(idShift & TSymbolTable::uniqueIdMask,
+                         symbol->getId() & TSymbolTable::uniqueIdMask);
     }
-    int getMaxId() const { return maxId; }
+    long long getIdShift() const { return idShift; }
 protected:
     TBuiltInIdTraverser(TBuiltInIdTraverser&);
     TBuiltInIdTraverser& operator=(TBuiltInIdTraverser&);
     TIdMaps& idMaps;
-    int maxId;
+    long long idShift;
 };
 
 // Traverser that seeds an ID map with non-builtins.
@@ -375,12 +433,12 @@
 };
 
 // Initialize the the ID map with what we know of 'this' AST.
-void TIntermediate::seedIdMap(TIdMaps& idMaps, int& maxId)
+void TIntermediate::seedIdMap(TIdMaps& idMaps, long long& idShift)
 {
     // all built-ins everywhere need to align on IDs and contribute to the max ID
     TBuiltInIdTraverser builtInIdTraverser(idMaps);
     treeRoot->traverse(&builtInIdTraverser);
-    maxId = builtInIdTraverser.getMaxId();
+    idShift = builtInIdTraverser.getIdShift() & TSymbolTable::uniqueIdMask;
 
     // user variables in the linker object list need to align on ids
     TUserIdTraverser userIdTraverser(idMaps);
@@ -392,7 +450,7 @@
 // on having no bodies for the copy-constructor/operator=.)
 class TRemapIdTraverser : public TIntermTraverser {
 public:
-    TRemapIdTraverser(const TIdMaps& idMaps, int idShift) : idMaps(idMaps), idShift(idShift) { }
+    TRemapIdTraverser(const TIdMaps& idMaps, long long idShift) : idMaps(idMaps), idShift(idShift) { }
     // Do the mapping:
     //  - if the same symbol, adopt the 'this' ID
     //  - otherwise, ensure a unique ID by shifting to a new space
@@ -404,7 +462,9 @@
             TShaderInterface si = symbol->getType().getShaderInterface();
             auto it = idMaps[si].find(getNameForIdMap(symbol));
             if (it != idMaps[si].end()) {
-                symbol->changeId(it->second);
+                uint64_t id = (symbol->getId() & ~TSymbolTable::uniqueIdMask) |
+                    (it->second & TSymbolTable::uniqueIdMask);
+                symbol->changeId(id);
                 remapped = true;
             }
         }
@@ -415,10 +475,10 @@
     TRemapIdTraverser(TRemapIdTraverser&);
     TRemapIdTraverser& operator=(TRemapIdTraverser&);
     const TIdMaps& idMaps;
-    int idShift;
+    long long idShift;
 };
 
-void TIntermediate::remapIds(const TIdMaps& idMaps, int idShift, TIntermediate& unit)
+void TIntermediate::remapIds(const TIdMaps& idMaps, long long idShift, TIntermediate& unit)
 {
     // Remap all IDs to either share or be unique, as dictated by the idMap and idShift.
     TRemapIdTraverser idTraverser(idMaps, idShift);
@@ -449,11 +509,193 @@
     globals.insert(globals.end() - 1, unitGlobals.begin(), unitGlobals.end() - 1);
 }
 
+static inline bool isSameInterface(TIntermSymbol* symbol, EShLanguage stage, TIntermSymbol* unitSymbol, EShLanguage unitStage) {
+    return // 1) same stage and same shader interface
+        (stage == unitStage && symbol->getType().getShaderInterface() == unitSymbol->getType().getShaderInterface()) ||
+        // 2) accross stages and both are uniform or buffer
+        (symbol->getQualifier().storage == EvqUniform  && unitSymbol->getQualifier().storage == EvqUniform) ||
+        (symbol->getQualifier().storage == EvqBuffer   && unitSymbol->getQualifier().storage == EvqBuffer) ||
+        // 3) in/out matched across stage boundary
+        (stage < unitStage && symbol->getQualifier().storage == EvqVaryingOut  && unitSymbol->getQualifier().storage == EvqVaryingIn) ||
+        (unitStage < stage && symbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().storage == EvqVaryingOut);
+}
+
+//
+// Global Unfiform block stores any default uniforms (i.e. uniforms without a block)
+// If two linked stages declare the same member, they are meant to be the same uniform
+// and need to be in the same block
+// merge the members of different stages to allow them to be linked properly
+// as a single block
+//
+void TIntermediate::mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate& unit, bool mergeExistingOnly)
+{
+    TIntermSequence& linkerObjects = findLinkerObjects()->getSequence();
+    TIntermSequence& unitLinkerObjects = unit.findLinkerObjects()->getSequence();
+
+    // build lists of default blocks from the intermediates
+    TIntermSequence defaultBlocks;
+    TIntermSequence unitDefaultBlocks;
+
+    auto filter = [](TIntermSequence& list, TIntermNode* node) {
+        if (node->getAsSymbolNode()->getQualifier().defaultBlock) {
+            list.push_back(node);
+        }
+    };
+
+    std::for_each(linkerObjects.begin(), linkerObjects.end(),
+        [&defaultBlocks, &filter](TIntermNode* node) {
+            filter(defaultBlocks, node);
+        });
+    std::for_each(unitLinkerObjects.begin(), unitLinkerObjects.end(),
+        [&unitDefaultBlocks, &filter](TIntermNode* node) {
+            filter(unitDefaultBlocks, node);
+    });
+
+    auto itUnitBlock = unitDefaultBlocks.begin();
+    for (; itUnitBlock != unitDefaultBlocks.end(); itUnitBlock++) {
+
+        bool add = !mergeExistingOnly;
+        auto itBlock = defaultBlocks.begin();
+
+        for (; itBlock != defaultBlocks.end(); itBlock++) {
+            TIntermSymbol* block = (*itBlock)->getAsSymbolNode();
+            TIntermSymbol* unitBlock = (*itUnitBlock)->getAsSymbolNode();
+
+            assert(block && unitBlock);
+
+            // if the two default blocks match, then merge their definitions
+            if (block->getType().getTypeName() == unitBlock->getType().getTypeName() &&
+                block->getQualifier().storage == unitBlock->getQualifier().storage) {
+                add = false;
+                mergeBlockDefinitions(infoSink, block, unitBlock, &unit);
+            }
+        }
+        if (add) {
+            // push back on original list; won't change the size of the list we're iterating over
+            linkerObjects.push_back(*itUnitBlock);
+        }
+    }
+}
+
+void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) {
+    if (block->getType() == unitBlock->getType()) {
+        return;
+    }
+
+    if (block->getType().getTypeName() != unitBlock->getType().getTypeName() ||
+        block->getType().getBasicType() != unitBlock->getType().getBasicType() ||
+        block->getQualifier().storage != unitBlock->getQualifier().storage ||
+        block->getQualifier().layoutSet != unitBlock->getQualifier().layoutSet) {
+        // different block names likely means different blocks
+        return;
+    }
+
+    // merge the struct
+    // order of declarations doesn't matter and they matched based on member name
+    TTypeList* memberList = block->getType().getWritableStruct();
+    TTypeList* unitMemberList = unitBlock->getType().getWritableStruct();
+
+    // keep track of which members have changed position
+    // so we don't have to search the array again
+    std::map<unsigned int, unsigned int> memberIndexUpdates;
+
+    size_t memberListStartSize = memberList->size();
+    for (unsigned int i = 0; i < unitMemberList->size(); ++i) {
+        bool merge = true;
+        for (unsigned int j = 0; j < memberListStartSize; ++j) {
+            if ((*memberList)[j].type->getFieldName() == (*unitMemberList)[i].type->getFieldName()) {
+                merge = false;
+                const TType* memberType = (*memberList)[j].type;
+                const TType* unitMemberType = (*unitMemberList)[i].type;
+
+                // compare types
+                // don't need as many checks as when merging symbols, since
+                // initializers and most qualifiers are stripped when the member is moved into the block
+                if ((*memberType) != (*unitMemberType)) {
+                    error(infoSink, "Types must match:");
+                    infoSink.info << "    " << memberType->getFieldName() << ": ";
+                    infoSink.info << "\"" << memberType->getCompleteString() << "\" versus ";
+                    infoSink.info << "\"" << unitMemberType->getCompleteString() << "\"\n";
+                }
+
+                memberIndexUpdates[i] = j;
+            }
+        }
+        if (merge) {
+            memberList->push_back((*unitMemberList)[i]);
+            memberIndexUpdates[i] = (unsigned int)memberList->size() - 1;
+        }
+    }
+
+    TType unitType;
+    unitType.shallowCopy(unitBlock->getType());
+
+    // update symbol node in unit tree,
+    // and other nodes that may reference it
+    class TMergeBlockTraverser : public TIntermTraverser {
+    public:
+        TMergeBlockTraverser(const glslang::TType &type, const glslang::TType& unitType,
+                             glslang::TIntermediate& unit,
+                             const std::map<unsigned int, unsigned int>& memberIdxUpdates) :
+            newType(type), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)
+        { }
+        virtual ~TMergeBlockTraverser() { }
+
+        const glslang::TType& newType;          // type with modifications
+        const glslang::TType& unitType;         // copy of original type
+        glslang::TIntermediate& unit;           // intermediate that is being updated
+        const std::map<unsigned int, unsigned int>& memberIndexUpdates;
+
+        virtual void visitSymbol(TIntermSymbol* symbol)
+        {
+            glslang::TType& symType = symbol->getWritableType();
+
+            if (symType == unitType) {
+                // each symbol node has a local copy of the unitType
+                //  if merging involves changing properties that aren't shared objects
+                //  they should be updated in all instances
+
+                // e.g. the struct list is a ptr to an object, so it can be updated
+                // once, outside the traverser
+                //*symType.getWritableStruct() = *newType.getStruct();
+            }
+
+        }
+
+        virtual bool visitBinary(TVisit, glslang::TIntermBinary* node)
+        {
+            if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == unitType) {
+                // this is a dereference to a member of the block since the
+                // member list changed, need to update this to point to the
+                // right index
+                assert(node->getRight()->getAsConstantUnion());
+
+                glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion();
+                unsigned int memberIdx = constNode->getConstArray()[0].getUConst();
+                unsigned int newIdx = memberIndexUpdates.at(memberIdx);
+                TIntermTyped* newConstNode = unit.addConstantUnion(newIdx, node->getRight()->getLoc());
+
+                node->setRight(newConstNode);
+                delete constNode;
+
+                return true;
+            }
+            return true;
+        }
+    } finalLinkTraverser(block->getType(), unitType, *unit, memberIndexUpdates);
+
+    // update the tree to use the new type
+    unit->getTreeRoot()->traverse(&finalLinkTraverser);
+
+    // update the member list
+    (*unitMemberList) = (*memberList);
+}
+
 //
 // Merge the linker objects from unitLinkerObjects into linkerObjects.
 // Duplication is expected and filtered out, but contradictions are an error.
 //
-void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects)
+void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects, EShLanguage unitStage)
 {
     // Error check and merge the linker objects (duplicates should not be created)
     std::size_t initialNumLinkerObjects = linkerObjects.size();
@@ -468,7 +710,7 @@
             // If they are both blocks in the same shader interface,
             // match by the block-name, not the identifier name.
             if (symbol->getType().getBasicType() == EbtBlock && unitSymbol->getType().getBasicType() == EbtBlock) {
-                if (symbol->getType().getShaderInterface() == unitSymbol->getType().getShaderInterface()) {
+                if (isSameInterface(symbol, getStage(), unitSymbol, unitStage)) {
                     isSameSymbol = symbol->getType().getTypeName() == unitSymbol->getType().getTypeName();
                 }
             }
@@ -488,18 +730,54 @@
                 if (! symbol->getQualifier().hasBinding() && unitSymbol->getQualifier().hasBinding())
                     symbol->getQualifier().layoutBinding = unitSymbol->getQualifier().layoutBinding;
 
+                // Similarly for location
+                if (!symbol->getQualifier().hasLocation() && unitSymbol->getQualifier().hasLocation()) {
+                    symbol->getQualifier().layoutLocation = unitSymbol->getQualifier().layoutLocation;
+                }
+
                 // Update implicit array sizes
                 mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType());
 
                 // Check for consistent types/qualification/initializers etc.
-                mergeErrorCheck(infoSink, *symbol, *unitSymbol, false);
+                mergeErrorCheck(infoSink, *symbol, *unitSymbol, unitStage);
             }
             // If different symbols, verify they arn't push_constant since there can only be one per stage
-            else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant())
+            else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant() && getStage() == unitStage)
                 error(infoSink, "Only one push_constant block is allowed per stage");
         }
-        if (merge)
+        if (merge) {
             linkerObjects.push_back(unitLinkerObjects[unitLinkObj]);
+
+            // for anonymous blocks, check that their members don't conflict with other names
+            if (unitLinkerObjects[unitLinkObj]->getAsSymbolNode()->getBasicType() == EbtBlock &&
+                IsAnonymous(unitLinkerObjects[unitLinkObj]->getAsSymbolNode()->getName())) {
+                for (std::size_t linkObj = 0; linkObj < initialNumLinkerObjects; ++linkObj) {
+                    TIntermSymbol* symbol = linkerObjects[linkObj]->getAsSymbolNode();
+                    TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode();
+                    assert(symbol && unitSymbol);
+
+                    auto checkName = [this, unitSymbol, &infoSink](const TString& name) {
+                        for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) {
+                            if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()) {
+                                error(infoSink, "Anonymous member name used for global variable or other anonymous member: ");
+                                infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << "\n";
+                            }
+                        }
+                    };
+
+                    if (isSameInterface(symbol, getStage(), unitSymbol, unitStage)) {
+                        checkName(symbol->getName());
+
+                        // check members of other anonymous blocks
+                        if (symbol->getBasicType() == EbtBlock && IsAnonymous(symbol->getName())) {
+                            for (unsigned int i = 0; i < symbol->getType().getStruct()->size(); ++i) {
+                                checkName((*symbol->getType().getStruct())[i].type->getFieldName());
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 }
 
@@ -531,26 +809,75 @@
 //
 // This function only does one of intra- or cross-stage matching per call.
 //
-void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, bool crossStage)
+void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, EShLanguage unitStage)
 {
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
+    bool crossStage = getStage() != unitStage;
     bool writeTypeComparison = false;
 
     // Types have to match
-    if (symbol.getType() != unitSymbol.getType()) {
+    {
         // but, we make an exception if one is an implicit array and the other is sized
-        if (! (symbol.getType().isArray() && unitSymbol.getType().isArray() &&
-                symbol.getType().sameElementType(unitSymbol.getType()) &&
-                (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()))) {
-            error(infoSink, "Types must match:");
+        // or if the array sizes differ because of the extra array dimension on some in/out boundaries
+        bool arraysMatch = false;
+        if (isIoResizeArray(symbol.getType(), getStage()) || isIoResizeArray(unitSymbol.getType(), unitStage)) {
+            // if the arrays have an extra dimension because of the stage.
+            // compare dimensions while ignoring the outer dimension
+            unsigned int firstDim = isIoResizeArray(symbol.getType(), getStage()) ? 1 : 0;
+            unsigned int numDim = symbol.getArraySizes()
+                ? symbol.getArraySizes()->getNumDims() : 0;
+            unsigned int unitFirstDim = isIoResizeArray(unitSymbol.getType(), unitStage) ? 1 : 0;
+            unsigned int unitNumDim = unitSymbol.getArraySizes()
+                ? unitSymbol.getArraySizes()->getNumDims() : 0;
+            arraysMatch = (numDim - firstDim) == (unitNumDim - unitFirstDim);
+            // check that array sizes match as well
+            for (unsigned int i = 0; i < (numDim - firstDim) && arraysMatch; i++) {
+                if (symbol.getArraySizes()->getDimSize(firstDim + i) !=
+                    unitSymbol.getArraySizes()->getDimSize(unitFirstDim + i)) {
+                    arraysMatch = false;
+                    break;
+                }
+            }
+        }
+        else {
+            arraysMatch = symbol.getType().sameArrayness(unitSymbol.getType()) ||
+                (symbol.getType().isArray() && unitSymbol.getType().isArray() &&
+                (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
+        }
+
+        if (!symbol.getType().sameElementType(unitSymbol.getType()) ||
+            !symbol.getType().sameTypeParameters(unitSymbol.getType()) ||
+            !arraysMatch ) {
             writeTypeComparison = true;
+            error(infoSink, "Types must match:");
         }
     }
 
-    // Qualifiers have to (almost) match
+    // Interface block  member-wise layout qualifiers have to match
+    if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&
+        symbol.getType().getStruct() && unitSymbol.getType().getStruct() &&
+        symbol.getType().sameStructType(unitSymbol.getType())) {
+        for (unsigned int i = 0; i < symbol.getType().getStruct()->size(); ++i) {
+            const TQualifier& qualifier = (*symbol.getType().getStruct())[i].type->getQualifier();
+            const TQualifier& unitQualifier = (*unitSymbol.getType().getStruct())[i].type->getQualifier();
+            if (qualifier.layoutMatrix     != unitQualifier.layoutMatrix ||
+                qualifier.layoutOffset     != unitQualifier.layoutOffset ||
+                qualifier.layoutAlign      != unitQualifier.layoutAlign ||
+                qualifier.layoutLocation   != unitQualifier.layoutLocation ||
+                qualifier.layoutComponent  != unitQualifier.layoutComponent) {
+                error(infoSink, "Interface block member layout qualifiers must match:");
+                writeTypeComparison = true;
+            }
+        }
+    }
 
+    bool isInOut = crossStage &&
+                   ((symbol.getQualifier().storage == EvqVaryingIn && unitSymbol.getQualifier().storage == EvqVaryingOut) ||
+                   (symbol.getQualifier().storage == EvqVaryingOut && unitSymbol.getQualifier().storage == EvqVaryingIn));
+
+    // Qualifiers have to (almost) match
     // Storage...
-    if (symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {
+    if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {
         error(infoSink, "Storage qualifiers must match:");
         writeTypeComparison = true;
     }
@@ -572,7 +899,7 @@
     }
 
     // Precision...
-    if (symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {
+    if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {
         error(infoSink, "Precision qualifiers must match:");
         writeTypeComparison = true;
     }
@@ -590,12 +917,16 @@
     }
 
     // Auxiliary and interpolation...
-    if (symbol.getQualifier().centroid  != unitSymbol.getQualifier().centroid ||
+    // "interpolation qualification (e.g., flat) and auxiliary qualification (e.g. centroid) may differ.  
+    //  These mismatches are allowed between any pair of stages ...
+    //  those provided in the fragment shader supersede those provided in previous stages."
+    if (!crossStage &&
+        (symbol.getQualifier().centroid  != unitSymbol.getQualifier().centroid ||
         symbol.getQualifier().smooth    != unitSymbol.getQualifier().smooth ||
         symbol.getQualifier().flat      != unitSymbol.getQualifier().flat ||
         symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() ||
         symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() ||
-        symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective()) {
+        symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) {
         error(infoSink, "Interpolation and auxiliary storage qualifiers must match:");
         writeTypeComparison = true;
     }
@@ -651,6 +982,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 +1086,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 +1126,7 @@
             error(infoSink, "post_depth_coverage requires early_fragment_tests");
         break;
     case EShLangCompute:
+        sharedBlockCheck(infoSink);
         break;
     case EShLangRayGen:
     case EShLangIntersect:
@@ -808,6 +1159,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 +1407,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 +1420,7 @@
     typeCollision = false;
 
     int set;
+    int setRT;
     if (qualifier.isPipeInput())
         set = 0;
     else if (qualifier.isPipeOutput())
@@ -1076,11 +1429,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 +1467,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 +1553,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.
 //
@@ -1778,4 +2154,17 @@
     return size;
 }
 
+#ifndef GLSLANG_WEB
+bool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) {
+    return type.isArray() &&
+            ((language == EShLangGeometry    && type.getQualifier().storage == EvqVaryingIn) ||
+            (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut &&
+                ! type.getQualifier().patch) ||
+            (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn &&
+                type.getQualifier().pervertexNV) ||
+            (language == EShLangMeshNV && type.getQualifier().storage == EvqVaryingOut &&
+                !type.getQualifier().perTaskNV));
+}
+#endif // not GLSLANG_WEB
+
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index a3ff886..c9a1d81 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -227,12 +227,54 @@
 
 class TIdMaps {
 public:
-    TMap<TString, int>& operator[](int i) { return maps[i]; }
-    const TMap<TString, int>& operator[](int i) const { return maps[i]; }
+    TMap<TString, long long>& operator[](long long i) { return maps[i]; }
+    const TMap<TString, long long>& operator[](long long i) const { return maps[i]; }
 private:
-    TMap<TString, int> maps[EsiCount];
+    TMap<TString, long long> 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,12 +283,22 @@
 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),
         nanMinMaxClamp(false),
-        depthReplacing(false)
+        depthReplacing(false),
+        uniqueId(0),
+        globalUniformBlockName(""),
+        atomicCounterBlockName(""),
+        globalUniformBlockSet(TQualifier::layoutSetEnd),
+        globalUniformBlockBinding(TQualifier::layoutBindingEnd),
+        atomicCounterBlockSet(TQualifier::layoutSetEnd)
 #ifndef GLSLANG_WEB
         ,
         implicitThisName("@this"), implicitCounterName("@count"),
@@ -295,9 +347,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)
     {
@@ -357,16 +420,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; }
@@ -374,6 +433,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();
@@ -411,15 +471,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;
@@ -433,7 +493,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&);
@@ -462,10 +522,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);
@@ -479,12 +540,22 @@
     // 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 setGlobalUniformBlockName(const char* name) { globalUniformBlockName = std::string(name); }
+    const char* getGlobalUniformBlockName() const { return globalUniformBlockName.c_str(); }
+    void setGlobalUniformSet(unsigned int set) { globalUniformBlockSet = set; }
+    unsigned int getGlobalUniformSet() const { return globalUniformBlockSet; }
+    void setGlobalUniformBinding(unsigned int binding) { globalUniformBlockBinding = binding; }
+    unsigned int getGlobalUniformBinding() const { return globalUniformBlockBinding; }
+
+    void setAtomicCounterBlockName(const char* name) { atomicCounterBlockName = std::string(name); }
+    const char* getAtomicCounterBlockName() const { return atomicCounterBlockName.c_str(); }
+    void setAtomicCounterBlockSet(unsigned int set) { atomicCounterBlockSet = set; }
+    unsigned int getAtomicCounterBlockSet() const { return atomicCounterBlockSet; }
+
+
+    void setUseStorageBuffer() { useStorageBuffer = true; }
     bool usingStorageBuffer() const { return useStorageBuffer; }
     void setDepthReplacing() { depthReplacing = true; }
     bool isDepthReplacing() const { return depthReplacing; }
@@ -497,6 +568,11 @@
         return true;
     }
     unsigned int getLocalSize(int dim) const { return localSize[dim]; }
+    bool isLocalSizeSet() const
+    {
+        // Return true if any component has been set (i.e. any component is not default).
+        return localSizeNotDefault[0] || localSizeNotDefault[1] || localSizeNotDefault[2];
+    }
     bool setLocalSizeSpecId(int dim, int id)
     {
         if (localSizeSpecId[dim] != TQualifier::layoutNotSet)
@@ -505,6 +581,13 @@
         return true;
     }
     int getLocalSizeSpecId(int dim) const { return localSizeSpecId[dim]; }
+    bool isLocalSizeSpecialized() const
+    {
+        // Return true if any component has been specialized.
+        return localSizeSpecId[0] != TQualifier::layoutNotSet ||
+               localSizeSpecId[1] != TQualifier::layoutNotSet ||
+               localSizeSpecId[2] != TQualifier::layoutNotSet;
+    }
 #ifdef GLSLANG_WEB
     void output(TInfoSink&, bool tree) { }
 
@@ -783,6 +866,20 @@
     bool getBinaryDoubleOutput() { return binaryDoubleOutput; }
 #endif // GLSLANG_WEB
 
+    void addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing)
+    {
+        std::string name(nameStr);
+        blockBackingOverrides[name] = backing;
+    }
+    TBlockStorageClass getBlockStorageOverride(const char* nameStr) const
+    {
+        std::string name = nameStr;
+        auto pos = blockBackingOverrides.find(name);
+        if (pos == blockBackingOverrides.end())
+            return EbsNone;
+        else
+            return pos->second;
+    }
 #ifdef ENABLE_HLSL
     void setHlslFunctionality1() { hlslFunctionality1 = true; }
     bool getHlslFunctionality1() const { return hlslFunctionality1; }
@@ -806,10 +903,22 @@
     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);
 
+    void mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate& unit, bool mergeExistingOnly);
+    void mergeUniformObjects(TInfoSink& infoSink, TIntermediate& unit);
+    void checkStageIO(TInfoSink&, TIntermediate&);
+
     bool buildConvertOp(TBasicType dst, TBasicType src, TOperator& convertOp) const;
     TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
 
@@ -818,6 +927,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);
@@ -832,6 +942,8 @@
     static int getOffset(const TType& type, int index);
     static int getBlockSize(const TType& blockType);
     static int computeBufferReferenceTypeSize(const TType&);
+    static bool isIoResizeArray(const TType& type, EShLanguage language);
+
     bool promote(TIntermOperator*);
     void setNanMinMaxClamp(bool setting) { nanMinMaxClamp = setting; }
     bool getNanMinMaxClamp() const { return nanMinMaxClamp; }
@@ -850,47 +962,53 @@
     void addProcess(const std::string& process) { processes.addProcess(process); }
     void addProcessArgument(const std::string& arg) { processes.addArgument(arg); }
     const std::vector<std::string>& getProcesses() const { return processes.getProcesses(); }
+    unsigned long long getUniqueId() const { return uniqueId; }
+    void setUniqueId(unsigned long long id) { uniqueId = id; }
 
     // Certain explicit conversions are allowed conditionally
 #ifdef GLSLANG_WEB
     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:
-    TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
+    TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
     void error(TInfoSink& infoSink, const char*);
     void warn(TInfoSink& infoSink, const char*);
     void mergeCallGraphs(TInfoSink&, TIntermediate&);
     void mergeModes(TInfoSink&, TIntermediate&);
     void mergeTrees(TInfoSink&, TIntermediate&);
-    void seedIdMap(TIdMaps& idMaps, int& maxId);
-    void remapIds(const TIdMaps& idMaps, int idShift, TIntermediate&);
+    void seedIdMap(TIdMaps& idMaps, long long& IdShift);
+    void remapIds(const TIdMaps& idMaps, long long idShift, TIntermediate&);
     void mergeBodies(TInfoSink&, TIntermSequence& globals, const TIntermSequence& unitGlobals);
-    void mergeLinkerObjects(TInfoSink&, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects);
+    void mergeLinkerObjects(TInfoSink&, TIntermSequence& linkerObjects, const TIntermSequence& unitLinkerObjects, EShLanguage);
+    void mergeBlockDefinitions(TInfoSink&, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unitRoot);
     void mergeImplicitArraySizes(TType&, const TType&);
-    void mergeErrorCheck(TInfoSink&, const TIntermSymbol&, const TIntermSymbol&, bool crossStage);
+    void mergeErrorCheck(TInfoSink&, const TIntermSymbol&, const TIntermSymbol&, EShLanguage);
     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;
@@ -903,23 +1021,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);
 
@@ -929,12 +1031,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;
@@ -946,6 +1053,14 @@
     int localSize[3];
     bool localSizeNotDefault[3];
     int localSizeSpecId[3];
+    unsigned long long uniqueId;
+
+    std::string globalUniformBlockName;
+    std::string atomicCounterBlockName;
+    unsigned int globalUniformBlockSet;
+    unsigned int globalUniformBlockBinding;
+    unsigned int atomicCounterBlockSet;
+
 #ifndef GLSLANG_WEB
 public:
     const char* const implicitThisName;
@@ -1004,11 +1119,15 @@
 
     std::unordered_map<std::string, int> uniformLocationOverrides;
     int uniformLocationBase;
+    TNumericFeatures numericFeatures;
 #endif
+    std::unordered_map<std::string, TBlockStorageClass> blockBackingOverrides;
 
     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 0d006a7..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
@@ -117,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,
@@ -224,7 +229,7 @@
     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
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 03d6fe1..9ea48c4 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"
@@ -639,7 +639,7 @@
 
     int addBlockName(const TString& name, const TType& type, int size)
     {
-        int blockIndex;
+        int blockIndex = 0;
         if (type.isArray()) {
             TType derefType(type, 0);
             for (int e = 0; e < type.getOuterArraySize(); ++e) {
@@ -658,14 +658,17 @@
 
                 blocks.back().numMembers = countAggregateMembers(type);
 
-                EShLanguageMask& stages = blocks.back().stages;
-                stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks.back().stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
             }
             else {
                 blockIndex = it->second;
-
-                EShLanguageMask& stages = blocks[blockIndex].stages;
-                stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                if (updateStageMasks) {
+                    EShLanguageMask& stages = blocks[blockIndex].stages;
+                    stages = static_cast<EShLanguageMask>(stages | 1 << intermediate.getStage());
+                }
             }
         }
 
@@ -904,8 +907,8 @@
             case EbtFloat16:    return GL_FLOAT16_VEC2_NV             + offset;
             case EbtInt:        return GL_INT_VEC2                    + offset;
             case EbtUint:       return GL_UNSIGNED_INT_VEC2           + offset;
-            case EbtInt64:      return GL_INT64_ARB                   + offset;
-            case EbtUint64:     return GL_UNSIGNED_INT64_ARB          + offset;
+            case EbtInt64:      return GL_INT64_VEC2_ARB              + offset;
+            case EbtUint64:     return GL_UNSIGNED_INT64_VEC2_ARB     + offset;
             case EbtBool:       return GL_BOOL_VEC2                   + offset;
             case EbtAtomicUint: return GL_UNSIGNED_INT_ATOMIC_COUNTER + offset;
             default:            return 0;
@@ -1135,6 +1138,8 @@
         if (index >= 0)
             indexToUniformBlock[i].counterIndex = index;
     }
+#else
+    (void)intermediate;
 #endif
 }
 
@@ -1266,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/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
index e3909f6..14683da 100644
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -167,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;
@@ -179,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 {
@@ -187,6 +187,7 @@
     EShLanguage stage;        // redundant information with other input, this one overrides when not EShSourceNone
     EShClient dialect;
     int dialectVersion;       // version of client's language definition, not the client (when not EShClientNone)
+    bool vulkanRulesRelaxed;
 };
 
 struct TClient {
@@ -427,6 +428,14 @@
     EResCount
 };
 
+enum TBlockStorageClass
+{
+    EbsUniform = 0,
+    EbsStorageBuffer,
+    EbsPushConstant,
+    EbsNone,    // not a uniform or buffer variable
+    EbsCount,
+};
 
 // Make one TShader per shader that you will link into a program. Then
 //  - provide the shader through setStrings() or setStringsWithLengths()
@@ -458,6 +467,7 @@
     GLSLANG_EXPORT void setEntryPoint(const char* entryPoint);
     GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);
     GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
+    GLSLANG_EXPORT void setUniqueId(unsigned long long id);
 
     // IO resolver binding data: see comments in ShaderLang.cpp
     GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
@@ -482,6 +492,14 @@
     GLSLANG_EXPORT void setNoStorageFormat(bool useUnknownFormat);
     GLSLANG_EXPORT void setNanMinMaxClamp(bool nanMinMaxClamp);
     GLSLANG_EXPORT void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);
+    GLSLANG_EXPORT void addBlockStorageOverride(const char* nameStr, glslang::TBlockStorageClass backing);
+
+    GLSLANG_EXPORT void setGlobalUniformBlockName(const char* name);
+    GLSLANG_EXPORT void setAtomicCounterBlockName(const char* name);
+    GLSLANG_EXPORT void setGlobalUniformSet(unsigned int set);
+    GLSLANG_EXPORT void setGlobalUniformBinding(unsigned int binding);
+    GLSLANG_EXPORT void setAtomicCounterBlockSet(unsigned int set);
+    GLSLANG_EXPORT void setAtomicCounterBlockBinding(unsigned int binding);
 
     // 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
@@ -538,6 +556,9 @@
     bool getEnvTargetHlslFunctionality1() const { return false; }
 #endif
 
+    void setEnvInputVulkanRulesRelaxed() { environment.input.vulkanRulesRelaxed = true; }
+    bool getEnvInputVulkanRulesRelaxed() const { return environment.input.vulkanRulesRelaxed; }
+
     // Interface to #include handlers.
     //
     // To support #include, a client of Glslang does the following:
@@ -690,7 +711,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.
@@ -805,10 +826,10 @@
     // Called by TSlotCollector to resolve resource locations or bindings
     virtual void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) = 0;
     // Called by mapIO.addStage to set shader stage mask to mark a stage be added to this pipeline
-    virtual void addStage(EShLanguage stage) = 0;
+    virtual void addStage(EShLanguage stage, TIntermediate& stageIntermediate) = 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()
@@ -829,7 +850,7 @@
 
     TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; }
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
 
     // Reflection Interface
 
@@ -923,17 +944,18 @@
     // If resolver is not provided it uses the previous approach
     // and respects auto assignment and offsets.
     GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr);
-#endif
+#endif // !GLSLANG_WEB && !GLSLANG_ANGLE
 
 protected:
     GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages);
+    GLSLANG_EXPORT bool crossStageCheck(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/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index 7627137..8885b29 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",
@@ -278,11 +278,14 @@
         "glsl.es320.subgroupShuffleRelative.comp",
         "glsl.es320.subgroupQuad.comp",
         "glsl.es320.subgroupVote.comp",
+        "terminate.frag",
+        "terminate.vert",
+        "negativeWorkGroupSize.comp",
     })),
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileToAstTestNV,
     ::testing::ValuesIn(std::vector<std::string>({
         "nvShaderNoperspectiveInterpolation.frag",
diff --git a/gtests/CMakeLists.txt b/gtests/CMakeLists.txt
index 6c48d9c..74c9809 100644
--- a/gtests/CMakeLists.txt
+++ b/gtests/CMakeLists.txt
@@ -53,7 +53,9 @@
             ${CMAKE_CURRENT_SOURCE_DIR}/Link.FromFile.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/Link.FromFile.Vk.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/Pp.FromFile.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/Spv.FromFile.cpp)
+            ${CMAKE_CURRENT_SOURCE_DIR}/Spv.FromFile.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/VkRelaxed.FromFile.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/GlslMapIO.FromFile.cpp)
 
         if(ENABLE_SPVREMAPPER)
             set(TEST_SOURCES ${TEST_SOURCES}
@@ -83,6 +85,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/GlslMapIO.FromFile.cpp b/gtests/GlslMapIO.FromFile.cpp
new file mode 100644
index 0000000..574e905
--- /dev/null
+++ b/gtests/GlslMapIO.FromFile.cpp
@@ -0,0 +1,306 @@
+//
+// Copyright (C) 2016-2017 Google, Inc.
+// 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 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 <algorithm>
+
+#include <gtest/gtest.h>
+
+#include "TestFixture.h"
+
+#include "glslang/MachineIndependent/iomapper.h"
+#include "glslang/MachineIndependent/reflection.h"
+
+#ifndef GLSLANG_WEB
+namespace glslangtest {
+namespace {
+
+struct IoMapData {
+    std::vector<std::string> fileNames;
+    Semantics semantics;
+};
+
+using GlslMapIOTest = GlslangTest <::testing::TestWithParam<IoMapData>>;
+
+template<class T>
+std::string interfaceName(T symbol) {
+    return symbol.getType()->getBasicType() == glslang::EbtBlock ? std::string(symbol.getType()->getTypeName().c_str()) : symbol.name;
+}
+
+bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
+    bool success = true;
+
+    // Verify IO Mapping by generating reflection for each stage individually
+    // and comparing layout qualifiers on the results
+
+
+    int reflectionOptions = EShReflectionDefault;
+    //reflectionOptions |= EShReflectionStrictArraySuffix;
+    //reflectionOptions |= EShReflectionBasicArraySuffix;
+    reflectionOptions |= EShReflectionIntermediateIO;
+    reflectionOptions |= EShReflectionSeparateBuffers;
+    reflectionOptions |= EShReflectionAllBlockVariables;
+    //reflectionOptions |= EShReflectionUnwrapIOBlocks;
+
+    success &= program.buildReflection(reflectionOptions);
+
+    // check that the reflection output from the individual stages all makes sense..
+    std::vector<glslang::TReflection> stageReflections;
+    for (int s = 0; s < EShLangCount; ++s) {
+        if (program.getIntermediate((EShLanguage)s)) {
+            stageReflections.emplace_back((EShReflectionOptions)reflectionOptions, (EShLanguage)s, (EShLanguage)s);
+            success &= stageReflections.back().addStage((EShLanguage)s, *program.getIntermediate((EShLanguage)s));
+        }
+    }
+
+    // check that input/output locations match between stages
+    auto it = stageReflections.begin();
+    auto nextIt = it + 1;
+    for (; nextIt != stageReflections.end(); it++, nextIt++) {
+        int numOut = it->getNumPipeOutputs();
+        std::map<std::string, const glslang::TObjectReflection*> pipeOut;
+
+        for (int i = 0; i < numOut; i++) {
+            const glslang::TObjectReflection& out = it->getPipeOutput(i);
+            std::string name = interfaceName(out);
+            pipeOut[name] = &out;
+        }
+
+        int numIn = nextIt->getNumPipeInputs();
+        for (int i = 0; i < numIn; i++) {
+            auto in = nextIt->getPipeInput(i);
+            std::string name = interfaceName(in);
+            auto out = pipeOut.find(name);
+
+            if (out != pipeOut.end()) {
+                auto inQualifier = in.getType()->getQualifier();
+                auto outQualifier = out->second->getType()->getQualifier();
+                success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
+            }
+            else {
+                success &= false;
+            }
+        }
+    }
+
+    // compare uniforms in each stage to the program
+    {
+        int totalUniforms = program.getNumUniformVariables();
+        std::map<std::string, const glslang::TObjectReflection*> programUniforms;
+        for (int i = 0; i < totalUniforms; i++) {
+            const glslang::TObjectReflection& uniform = program.getUniform(i);
+            std::string name = interfaceName(uniform);
+            programUniforms[name] = &uniform;
+        }
+        it = stageReflections.begin();
+        for (; it != stageReflections.end(); it++) {
+            int numUniform = it->getNumUniforms();
+            std::map<std::string, glslang::TObjectReflection> uniforms;
+
+            for (int i = 0; i < numUniform; i++) {
+                glslang::TObjectReflection uniform = it->getUniform(i);
+                std::string name = interfaceName(uniform);
+                auto programUniform = programUniforms.find(name);
+
+                if (programUniform != programUniforms.end()) {
+                    auto stageQualifier = uniform.getType()->getQualifier();
+                    auto programQualifier = programUniform->second->getType()->getQualifier();
+
+                    success &= stageQualifier.layoutLocation == programQualifier.layoutLocation;
+                    success &= stageQualifier.layoutBinding == programQualifier.layoutBinding;
+                    success &= stageQualifier.layoutSet == programQualifier.layoutSet;
+                }
+                else {
+                    success &= false;
+                }
+            }
+        }
+    }
+
+    // compare uniform blocks in each stage to the program table
+    {
+        int totalUniforms = program.getNumUniformBlocks();
+        std::map<std::string, const glslang::TObjectReflection*> programUniforms;
+        for (int i = 0; i < totalUniforms; i++) {
+            const glslang::TObjectReflection& uniform = program.getUniformBlock(i);
+            std::string name = interfaceName(uniform);
+            programUniforms[name] = &uniform;
+        }
+        it = stageReflections.begin();
+        for (; it != stageReflections.end(); it++) {
+            int numUniform = it->getNumUniformBlocks();
+            std::map<std::string, glslang::TObjectReflection> uniforms;
+
+            for (int i = 0; i < numUniform; i++) {
+                glslang::TObjectReflection uniform = it->getUniformBlock(i);
+                std::string name = interfaceName(uniform);
+                auto programUniform = programUniforms.find(name);
+
+                if (programUniform != programUniforms.end()) {
+                    auto stageQualifier = uniform.getType()->getQualifier();
+                    auto programQualifier = programUniform->second->getType()->getQualifier();
+
+                    success &= stageQualifier.layoutLocation == programQualifier.layoutLocation;
+                    success &= stageQualifier.layoutBinding == programQualifier.layoutBinding;
+                    success &= stageQualifier.layoutSet == programQualifier.layoutSet;
+                }
+                else {
+                    success &= false;
+                }
+            }
+        }
+    }
+
+    if (!success) {
+        linkingError += "Mismatched cross-stage IO\n";
+    }
+
+    return success;
+}
+
+TEST_P(GlslMapIOTest, FromFile)
+{
+    const auto& fileNames = GetParam().fileNames;
+    Semantics semantics = GetParam().semantics;
+    const size_t fileCount = fileNames.size();
+    const EShMessages controls = DeriveOptions(Source::GLSL, semantics, Target::BothASTAndSpv);
+    GlslangResult result;
+
+    // Compile each input shader file.
+    bool success = true;
+    std::vector<std::unique_ptr<glslang::TShader>> shaders;
+    for (size_t i = 0; i < fileCount; ++i) {
+        std::string contents;
+        tryLoadFile(GlobalTestSettings.testRoot + "/" + fileNames[i],
+            "input", &contents);
+        shaders.emplace_back(
+            new glslang::TShader(GetShaderStage(GetSuffix(fileNames[i]))));
+        auto* shader = shaders.back().get();
+        
+        shader->setAutoMapLocations(true);
+        shader->setAutoMapBindings(true);
+        
+        if (controls & EShMsgSpvRules) {
+            if (controls & EShMsgVulkanRules) {
+                shader->setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
+                                                               : glslang::EShSourceGlsl,
+                                    shader->getStage(), glslang::EShClientVulkan, 100);
+                shader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_1);
+                shader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_0);
+            } else {
+                shader->setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
+                                                               : glslang::EShSourceGlsl,
+                                    shader->getStage(), glslang::EShClientOpenGL, 100);
+                shader->setEnvClient(glslang::EShClientOpenGL, glslang::EShTargetOpenGL_450);
+                shader->setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetSpv_1_0);
+            }
+        }
+
+        success &= compile(shader, contents, "", controls);
+        
+        result.shaderResults.push_back(
+            { fileNames[i], shader->getInfoLog(), shader->getInfoDebugLog() });
+    }
+
+    // Link all of them.
+    glslang::TProgram program;
+    for (const auto& shader : shaders) program.addShader(shader.get());
+    success &= program.link(controls);
+    result.linkingOutput = program.getInfoLog();
+    result.linkingError = program.getInfoDebugLog();
+
+    unsigned int stage = 0;
+    glslang::TIntermediate* firstIntermediate = nullptr;
+    while (!program.getIntermediate((EShLanguage)stage) && stage < EShLangCount) { stage++; }
+    firstIntermediate = program.getIntermediate((EShLanguage)stage);
+
+    glslang::TDefaultGlslIoResolver resolver(*firstIntermediate);
+    glslang::TGlslIoMapper ioMapper;
+
+    if (success) {
+        success &= program.mapIO(&resolver, &ioMapper);
+        result.linkingOutput = program.getInfoLog();
+        result.linkingError = program.getInfoDebugLog();
+    }
+
+    success &= verifyIOMapping(result.linkingError, program);
+    result.validationResult = success;
+
+    if (success && (controls & EShMsgSpvRules)) {
+        for (int stage = 0; stage < EShLangCount; ++stage) {
+            if (program.getIntermediate((EShLanguage)stage)) {
+                spv::SpvBuildLogger logger;
+                std::vector<uint32_t> spirv_binary;
+                options().disableOptimizer = false;
+                glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage),
+                    spirv_binary, &logger, &options());
+
+                std::ostringstream disassembly_stream;
+                spv::Parameterize();
+                spv::Disassemble(disassembly_stream, spirv_binary);
+                result.spirvWarningsErrors += logger.getAllMessages();
+                result.spirv += disassembly_stream.str();
+                result.validationResult &= !options().validate || logger.getAllMessages().empty();
+            }
+        }
+    }
+
+    std::ostringstream stream;
+    outputResultToStream(&stream, result, controls);
+
+    // Check with expected results.
+    const std::string expectedOutputFname =
+        GlobalTestSettings.testRoot + "/baseResults/" + fileNames.front() + ".out";
+    std::string expectedOutput;
+    tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+    checkEqAndUpdateIfRequested(expectedOutput, stream.str(), expectedOutputFname,
+        result.spirvWarningsErrors);
+}
+
+// clang-format off
+INSTANTIATE_TEST_SUITE_P(
+    Glsl, GlslMapIOTest,
+    ::testing::ValuesIn(std::vector<IoMapData>({
+        {{"iomap.crossStage.vert", "iomap.crossStage.frag" }, Semantics::OpenGL},
+        {{"iomap.crossStage.2.vert", "iomap.crossStage.2.geom", "iomap.crossStage.2.frag" }, Semantics::OpenGL},
+        // vulkan semantics
+        {{"iomap.crossStage.vk.vert", "iomap.crossStage.vk.geom", "iomap.crossStage.vk.frag" }, Semantics::Vulkan},
+    }))
+);
+// clang-format on
+
+}  // anonymous namespace
+}  // namespace glslangtest
+#endif 
\ No newline at end of file
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 f3ca0b5..33deef5
--- 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"},
@@ -245,7 +245,6 @@
         {"hlsl.isfinite.frag", "main"},
         {"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"},
         {"hlsl.intrinsics.comp", "ComputeShaderFunction"},
-        {"hlsl.intrinsics.evalfns.frag", "main"},
         {"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"},
         {"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.f1632.frag", "main"},
@@ -308,10 +307,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"},
@@ -430,7 +431,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"},
@@ -448,7 +449,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"},
@@ -460,7 +461,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"},
@@ -469,6 +470,7 @@
         {"hlsl.flattenOpaqueInitMix.vert", "main"},
         {"hlsl.flattenSubset.frag", "main"},
         {"hlsl.flattenSubset2.frag", "main"},
+        {"hlsl.intrinsics.evalfns.frag", "main"},
         {"hlsl.partialFlattenLocal.vert", "main"},
         {"hlsl.partialFlattenMixed.vert", "main"}
     }),
@@ -478,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"}
@@ -486,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"},
     }),
@@ -496,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 ee868c2..4db71c2
--- a/gtests/Link.FromFile.Vk.cpp
+++ b/gtests/Link.FromFile.Vk.cpp
@@ -75,7 +75,7 @@
     result.linkingOutput = program.getInfoLog();
     result.linkingError = program.getInfoDebugLog();
 
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         if (success)
             program.mapIO();
 #endif
@@ -109,21 +109,22 @@
 }
 
 // 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"},
         {"spv.unit1.frag", "spv.unit2.frag", "spv.unit3.frag"},
-		{"link.vk.matchingPC.0.0.frag", "link.vk.matchingPC.0.1.frag",
-			"link.vk.matchingPC.0.2.frag"},
-		{"link.vk.differentPC.0.0.frag", "link.vk.differentPC.0.1.frag",
-			"link.vk.differentPC.0.2.frag"},
-		{"link.vk.differentPC.1.0.frag", "link.vk.differentPC.1.1.frag",
-			"link.vk.differentPC.1.2.frag"},
+        {"link.vk.matchingPC.0.0.frag", "link.vk.matchingPC.0.1.frag",
+            "link.vk.matchingPC.0.2.frag"},
+           {"link.vk.differentPC.0.0.frag", "link.vk.differentPC.0.1.frag",
+            "link.vk.differentPC.0.2.frag"},
+        {"link.vk.differentPC.1.0.frag", "link.vk.differentPC.1.1.frag",
+            "link.vk.differentPC.1.2.frag"},
         {"link.vk.pcNamingValid.0.0.vert", "link.vk.pcNamingValid.0.1.vert"},
         {"link.vk.pcNamingInvalid.0.0.vert", "link.vk.pcNamingInvalid.0.1.vert"},
         {"link.vk.multiBlocksValid.0.0.vert", "link.vk.multiBlocksValid.0.1.vert"},
         {"link.vk.multiBlocksValid.1.0.geom", "link.vk.multiBlocksValid.1.1.geom"},
+        {"link.vk.inconsistentGLPerVertex.0.vert", "link.vk.inconsistentGLPerVertex.0.geom"},
     }))
 );
 // clang-format on
diff --git a/gtests/Link.FromFile.cpp b/gtests/Link.FromFile.cpp
old mode 100755
new mode 100644
index 3e16207..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"},
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 af1409b..5456fb8 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",
@@ -324,6 +328,7 @@
         "spv.demoteDisabled.frag",
         "spv.deepRvalue.frag",
         "spv.depthOut.frag",
+        "spv.depthUnchanged.frag",
         "spv.discard-dce.frag",
         "spv.doWhileLoop.frag",
         "spv.earlyReturnDiscard.frag",
@@ -350,6 +355,7 @@
         "spv.int64.frag",
         "spv.intcoopmat.comp",
         "spv.intOps.vert",
+        "spv.layer.tese",
         "spv.layoutNested.vert",
         "spv.length.frag",
         "spv.localAggregates.frag",
@@ -371,9 +377,11 @@
         "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",
@@ -408,6 +416,7 @@
         "spv.texture.vert",
         "spv.textureBuffer.vert",
         "spv.image.frag",
+        "spv.imageAtomic64.frag",
         "spv.types.frag",
         "spv.uint.frag",
         "spv.uniformArray.frag",
@@ -432,8 +441,10 @@
         "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",
@@ -443,6 +454,8 @@
         "spv.samplerlessTextureFunctions.frag",
         "spv.smBuiltins.vert",
         "spv.smBuiltins.frag",
+        "spv.builtin.PrimitiveShadingRateEXT.vert",
+        "spv.builtin.ShadingRateEXT.frag",
     })),
     FileNameAsCustomTestSuffix
 );
@@ -450,7 +463,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",
@@ -465,7 +478,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToDebugSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.pp.line.frag",
@@ -474,7 +487,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",
@@ -491,6 +504,7 @@
         "spv.memoryScopeSemantics.comp",
         "spv.memoryScopeSemantics_Error.comp",
         "spv.multiView.frag",
+        "spv.queueFamilyScope.comp",
         "spv.RayGenShader11.rgen",
         "spv.subgroup.frag",
         "spv.subgroup.geom",
@@ -530,7 +544,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileToSpirv14Test,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.1.4.LoopControl.frag",
@@ -548,6 +562,7 @@
         "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",
@@ -558,15 +573,33 @@
         "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 },
@@ -586,7 +619,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 },
@@ -596,7 +629,7 @@
 );
 
 // clang-format off
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileOpenGLToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.460.frag",
@@ -621,7 +654,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, VulkanSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "vulkan.frag",
@@ -633,7 +666,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, OpenGLSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "glspv.esversion.vert",
@@ -645,7 +678,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, VulkanAstSemantics,
     ::testing::ValuesIn(std::vector<std::string>({
         "vulkan.ast.vert",
@@ -653,7 +686,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToSpirvTestAMD,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.16bitxfb.vert",
@@ -669,7 +702,7 @@
     FileNameAsCustomTestSuffix
 );
 
-INSTANTIATE_TEST_CASE_P(
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileVulkanToSpirvTestNV,
     ::testing::ValuesIn(std::vector<std::string>({
     "spv.sampleMaskOverrideCoverage.frag",
@@ -681,6 +714,7 @@
     "spv.multiviewPerViewAttributes.vert",
     "spv.multiviewPerViewAttributes.tesc",
     "spv.atomicInt64.comp",
+    "spv.atomicStoreInt64.comp",
     "spv.shadingRate.frag",
     "spv.RayGenShader.rgen",
     "spv.RayGenShaderArray.rgen",
@@ -717,7 +751,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 c8e72d3..2b057dc
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -253,7 +253,7 @@
         glslang::TProgram program;
         program.addShader(&shader);
         success &= program.link(controls);
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         if (success)
             program.mapIO();
 #endif
@@ -315,7 +315,7 @@
         program.addShader(&shader);
         
         success &= program.link(controls);
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         if (success)
             program.mapIO();
 #endif
@@ -360,7 +360,7 @@
         glslang::TProgram program;
         program.addShader(&shader);
         success &= program.link(controls);
-#ifndef GLSLANG_WEB
+#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
         if (success)
             program.mapIO();
 #endif
diff --git a/gtests/VkRelaxed.FromFile.cpp b/gtests/VkRelaxed.FromFile.cpp
new file mode 100644
index 0000000..777134d
--- /dev/null
+++ b/gtests/VkRelaxed.FromFile.cpp
@@ -0,0 +1,305 @@
+//
+// Copyright (C) 2016-2017 Google, Inc.
+// 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 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 <algorithm>
+
+#include <gtest/gtest.h>
+
+#include "TestFixture.h"
+
+#include "glslang/MachineIndependent/iomapper.h"
+#include "glslang/MachineIndependent/reflection.h"
+
+#ifndef GLSLANG_WEB
+namespace glslangtest {
+namespace {
+
+struct vkRelaxedData {
+    std::vector<std::string> fileNames;
+    std::vector<std::vector<std::string>> resourceSetBindings;
+};
+
+using VulkanRelaxedTest = GlslangTest <::testing::TestWithParam<vkRelaxedData>>;
+
+template<class T>
+std::string interfaceName(T symbol) {
+    return symbol.getType()->getBasicType() == glslang::EbtBlock ? std::string(symbol.getType()->getTypeName().c_str()) : symbol.name;
+}
+
+bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
+    bool success = true;
+
+    // Verify IO Mapping by generating reflection for each stage individually
+    // and comparing layout qualifiers on the results
+
+
+    int reflectionOptions = EShReflectionDefault;
+    //reflectionOptions |= EShReflectionStrictArraySuffix;
+    //reflectionOptions |= EShReflectionBasicArraySuffix;
+    reflectionOptions |= EShReflectionIntermediateIO;
+    reflectionOptions |= EShReflectionSeparateBuffers;
+    reflectionOptions |= EShReflectionAllBlockVariables;
+    //reflectionOptions |= EShReflectionUnwrapIOBlocks;
+
+    success &= program.buildReflection(reflectionOptions);
+
+    // check that the reflection output from the individual stages all makes sense..
+    std::vector<glslang::TReflection> stageReflections;
+    for (int s = 0; s < EShLangCount; ++s) {
+        if (program.getIntermediate((EShLanguage)s)) {
+            stageReflections.emplace_back((EShReflectionOptions)reflectionOptions, (EShLanguage)s, (EShLanguage)s);
+            success &= stageReflections.back().addStage((EShLanguage)s, *program.getIntermediate((EShLanguage)s));
+        }
+    }
+
+    // check that input/output locations match between stages
+    auto it = stageReflections.begin();
+    auto nextIt = it + 1;
+    for (; nextIt != stageReflections.end(); it++, nextIt++) {
+        int numOut = it->getNumPipeOutputs();
+        std::map<std::string, const glslang::TObjectReflection*> pipeOut;
+
+        for (int i = 0; i < numOut; i++) {
+            const glslang::TObjectReflection& out = it->getPipeOutput(i);
+            std::string name = interfaceName(out);
+            pipeOut[name] = &out;
+        }
+
+        int numIn = nextIt->getNumPipeInputs();
+        for (int i = 0; i < numIn; i++) {
+            auto in = nextIt->getPipeInput(i);
+            std::string name = interfaceName(in);
+            auto out = pipeOut.find(name);
+
+            if (out != pipeOut.end()) {
+                auto inQualifier = in.getType()->getQualifier();
+                auto outQualifier = out->second->getType()->getQualifier();
+                success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
+            }
+            else {
+                success &= false;
+            }
+        }
+    }
+
+    // compare uniforms in each stage to the program
+    {
+        int totalUniforms = program.getNumUniformVariables();
+        std::map<std::string, const glslang::TObjectReflection*> programUniforms;
+        for (int i = 0; i < totalUniforms; i++) {
+            const glslang::TObjectReflection& uniform = program.getUniform(i);
+            std::string name = interfaceName(uniform);
+            programUniforms[name] = &uniform;
+        }
+        it = stageReflections.begin();
+        for (; it != stageReflections.end(); it++) {
+            int numUniform = it->getNumUniforms();
+            std::map<std::string, glslang::TObjectReflection> uniforms;
+
+            for (int i = 0; i < numUniform; i++) {
+                glslang::TObjectReflection uniform = it->getUniform(i);
+                std::string name = interfaceName(uniform);
+                auto programUniform = programUniforms.find(name);
+
+                if (programUniform != programUniforms.end()) {
+                    auto stageQualifier = uniform.getType()->getQualifier();
+                    auto programQualifier = programUniform->second->getType()->getQualifier();
+
+                    success &= stageQualifier.layoutLocation == programQualifier.layoutLocation;
+                    success &= stageQualifier.layoutBinding == programQualifier.layoutBinding;
+                    success &= stageQualifier.layoutSet == programQualifier.layoutSet;
+                }
+                else {
+                    success &= false;
+                }
+            }
+        }
+    }
+
+    // compare uniform blocks in each stage to the program table
+    {
+        int totalUniforms = program.getNumUniformBlocks();
+        std::map<std::string, const glslang::TObjectReflection*> programUniforms;
+        for (int i = 0; i < totalUniforms; i++) {
+            const glslang::TObjectReflection& uniform = program.getUniformBlock(i);
+            std::string name = interfaceName(uniform);
+            programUniforms[name] = &uniform;
+        }
+        it = stageReflections.begin();
+        for (; it != stageReflections.end(); it++) {
+            int numUniform = it->getNumUniformBlocks();
+            std::map<std::string, glslang::TObjectReflection> uniforms;
+
+            for (int i = 0; i < numUniform; i++) {
+                glslang::TObjectReflection uniform = it->getUniformBlock(i);
+                std::string name = interfaceName(uniform);
+                auto programUniform = programUniforms.find(name);
+
+                if (programUniform != programUniforms.end()) {
+                    auto stageQualifier = uniform.getType()->getQualifier();
+                    auto programQualifier = programUniform->second->getType()->getQualifier();
+
+                    success &= stageQualifier.layoutLocation == programQualifier.layoutLocation;
+                    success &= stageQualifier.layoutBinding == programQualifier.layoutBinding;
+                    success &= stageQualifier.layoutSet == programQualifier.layoutSet;
+                }
+                else {
+                    success &= false;
+                }
+            }
+        }
+    }
+
+    if (!success) {
+        linkingError += "Mismatched cross-stage IO\n";
+    }
+
+    return success;
+}
+
+TEST_P(VulkanRelaxedTest, FromFile)
+{
+    const auto& fileNames = GetParam().fileNames;
+    const auto& resourceSetBindings = GetParam().resourceSetBindings;
+    Semantics semantics = Semantics::Vulkan;
+    const size_t fileCount = fileNames.size();
+    const EShMessages controls = DeriveOptions(Source::GLSL, semantics, Target::BothASTAndSpv);
+    GlslangResult result;
+
+    // Compile each input shader file.
+    bool success = true;
+    std::vector<std::unique_ptr<glslang::TShader>> shaders;
+    for (size_t i = 0; i < fileCount; ++i) {
+        std::string contents;
+        tryLoadFile(GlobalTestSettings.testRoot + "/" + fileNames[i],
+            "input", &contents);
+        shaders.emplace_back(
+            new glslang::TShader(GetShaderStage(GetSuffix(fileNames[i]))));
+        auto* shader = shaders.back().get();
+        
+        shader->setAutoMapLocations(true);
+        shader->setAutoMapBindings(true);
+
+        shader->setEnvInput(glslang::EShSourceGlsl, shader->getStage(), glslang::EShClientVulkan, 100);
+        shader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_1);
+        shader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_0);
+
+        // Use vulkan relaxed option
+        shader->setEnvInputVulkanRulesRelaxed();
+
+        success &= compile(shader, contents, "", controls);
+        
+        result.shaderResults.push_back(
+            { fileNames[i], shader->getInfoLog(), shader->getInfoDebugLog() });
+    }
+
+    // Link all of them.
+    glslang::TProgram program;
+    for (const auto& shader : shaders) program.addShader(shader.get());
+    success &= program.link(controls);
+    result.linkingOutput = program.getInfoLog();
+    result.linkingError = program.getInfoDebugLog();
+
+    if (!resourceSetBindings.empty()) {
+        assert(resourceSetBindings.size() == fileNames.size());
+        for (size_t i = 0; i < shaders.size(); i++)
+            shaders[i]->setResourceSetBinding(resourceSetBindings[i]);
+    }
+
+    unsigned int stage = 0;
+    glslang::TIntermediate* firstIntermediate = nullptr;
+    while (!program.getIntermediate((EShLanguage)stage) && stage < EShLangCount) { stage++; }
+    firstIntermediate = program.getIntermediate((EShLanguage)stage);
+
+    glslang::TDefaultGlslIoResolver resolver(*firstIntermediate);
+    glslang::TGlslIoMapper ioMapper;
+
+    if (success) {
+        success &= program.mapIO(&resolver, &ioMapper);
+        result.linkingOutput = program.getInfoLog();
+        result.linkingError = program.getInfoDebugLog();
+    }
+
+    success &= verifyIOMapping(result.linkingError, program);
+    result.validationResult = success;
+
+    if (success && (controls & EShMsgSpvRules)) {
+        for (int stage = 0; stage < EShLangCount; ++stage) {
+            if (program.getIntermediate((EShLanguage)stage)) {
+                spv::SpvBuildLogger logger;
+                std::vector<uint32_t> spirv_binary;
+                options().disableOptimizer = false;
+                glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage),
+                    spirv_binary, &logger, &options());
+
+                std::ostringstream disassembly_stream;
+                spv::Parameterize();
+                spv::Disassemble(disassembly_stream, spirv_binary);
+                result.spirvWarningsErrors += logger.getAllMessages();
+                result.spirv += disassembly_stream.str();
+                result.validationResult &= !options().validate || logger.getAllMessages().empty();
+            }
+        }
+    }
+
+    std::ostringstream stream;
+    outputResultToStream(&stream, result, controls);
+
+    // Check with expected results.
+    const std::string expectedOutputFname =
+        GlobalTestSettings.testRoot + "/baseResults/" + fileNames.front() + ".out";
+    std::string expectedOutput;
+    tryLoadFile(expectedOutputFname, "expected output", &expectedOutput);
+
+    checkEqAndUpdateIfRequested(expectedOutput, stream.str(), expectedOutputFname,
+        result.spirvWarningsErrors);
+}
+
+// clang-format off
+INSTANTIATE_TEST_SUITE_P(
+    Glsl, VulkanRelaxedTest,
+    ::testing::ValuesIn(std::vector<vkRelaxedData>({
+        {{"vk.relaxed.frag"}},
+        {{"vk.relaxed.link1.frag", "vk.relaxed.link2.frag"}},
+        {{"vk.relaxed.stagelink.vert", "vk.relaxed.stagelink.frag"}},
+        {{"vk.relaxed.errorcheck.vert", "vk.relaxed.errorcheck.frag"}},
+        {{"vk.relaxed.changeSet.vert", "vk.relaxed.changeSet.frag" }, { {"0"}, {"1"} } },
+    }))
+);
+// clang-format on
+
+}  // anonymous namespace
+}  // namespace glslangtest
+#endif 
diff --git a/known_good.json b/known_good.json
index eca209a..e69a3ae 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "895927bd3f2d653f40cebab55aa6c7eabde30a86"
+      "commit" : "48007a5c7f7cc671b391bebd46e87fd6edc6c24b"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "979924c8bc839e4cb1b69d03d48398551f369ce7"
+      "commit" : "f88a1f98fa7a44ccfcf33d810c72b200e7d9a78a"
     }
   ]
 }
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/license-checker.cfg b/license-checker.cfg
index 886b335..409f18e 100644
--- a/license-checker.cfg
+++ b/license-checker.cfg
@@ -1,6 +1,7 @@
 [

     {

         "licenses": [

+            "Apache-2.0",

             "Apache-2.0-Header",

             "BSD-2-Clause",

             "BSD-3-Clause",

@@ -29,14 +30,19 @@
                     "build/**",

                     "out/**",

                     "Test/**",

-                    "External/spirv-tools/**"

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

+

+                    "SPIRV/GLSL.*.h",

+                    "SPIRV/NonSemanticDebugPrintf.h",

+                    "SPIRV/spirv.hpp"

                 ]

             }

         ]

     },

     {

         "licenses": [

-            "GPL-Header"

+            "GPL-Header",

+            "GPL-3.0-or-later"

         ],

         "paths": [

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

diff --git a/parse_version.cmake b/parse_version.cmake
new file mode 100644
index 0000000..b9ba413
--- /dev/null
+++ b/parse_version.cmake
@@ -0,0 +1,41 @@
+# 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
+#
+#     https://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.
+
+# parse_version() reads and parses the version string from FILE, assigning the
+# version string to ${PROJECT}_VERSION and the parsed version to
+# ${PROJECT}_VERSION_MAJOR, ${PROJECT}_VERSION_MINOR, ${PROJECT}_VERSION_PATCH,
+# and the optional ${PROJECT}_VERSION_FLAVOR.
+#
+# The version string take one of the forms:
+#    <major>.<minor>.<patch>
+#    <major>.<minor>.<patch>-<flavor>
+function(parse_version FILE PROJECT)
+    configure_file(${FILE} "${CMAKE_CURRENT_BINARY_DIR}/CHANGES.md") # Required to re-run cmake on version change
+    file(READ ${FILE} CHANGES)
+    if(${CHANGES} MATCHES "#+ *([0-9]+)\\.([0-9]+)\\.([0-9]+)(-[a-zA-Z0-9]+)?")
+        set(FLAVOR "")
+        if(NOT "${CMAKE_MATCH_4}" STREQUAL "")
+            string(SUBSTRING ${CMAKE_MATCH_4} 1 -1 FLAVOR)
+        endif()
+        set("${PROJECT}_VERSION_MAJOR"  ${CMAKE_MATCH_1} PARENT_SCOPE)
+        set("${PROJECT}_VERSION_MINOR"  ${CMAKE_MATCH_2} PARENT_SCOPE)
+        set("${PROJECT}_VERSION_PATCH"  ${CMAKE_MATCH_3} PARENT_SCOPE)
+        set("${PROJECT}_VERSION_FLAVOR" ${FLAVOR}        PARENT_SCOPE)
+        set("${PROJECT}_VERSION"
+            "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}${CMAKE_MATCH_4}"
+            PARENT_SCOPE)
+    else()
+        message(FATAL_ERROR "Unable to parse version from '${FILE}'")
+    endif()
+endfunction()
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" : {
+    },
+  },
+]