HLSL: Support the constructor idiom "(struct type)0".

This highly leverages the previous commit to handle partial initializers.
diff --git a/Test/baseResults/hlsl.partialInit.frag.out b/Test/baseResults/hlsl.partialInit.frag.out
index bac9237..5bf838a 100755
--- a/Test/baseResults/hlsl.partialInit.frag.out
+++ b/Test/baseResults/hlsl.partialInit.frag.out
@@ -17,79 +17,124 @@
 0:9        0.000000
 0:9        0.000000
 0:9        0.000000
-0:12  Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:12    Function Parameters: 
-0:12      'input' (layout(location=0 ) in 4-component vector of float)
+0:18  Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:18    Function Parameters: 
+0:18      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:13      Sequence
-0:13        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:13          'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:13          Constant:
-0:13            3 (const int)
-0:13            0.000000
-0:13            false (const bool)
-0:13            0.000000
-0:13            0.000000
-0:13            0.000000
-0:13            0.000000
-0:15      move second child to first child (temp 4-component vector of float)
-0:15        v: direct index for structure (temp 4-component vector of float)
-0:15          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:15          Constant:
-0:15            3 (const int)
-0:15        vector-scale (temp 4-component vector of float)
-0:15          'gv' (global 4-component vector of float)
-0:15          direct index (temp float)
-0:15            'gfa' (global 3-element array of float)
-0:15            Constant:
-0:15              2 (const int)
-0:16      Sequence
-0:16        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:16          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:16          Constant:
-0:16            0 (const int)
-0:16            0.000000
-0:16            false (const bool)
-0:16            0.000000
-0:16            0.000000
-0:16            0.000000
-0:16            0.000000
-0:19      move second child to first child (temp bool)
-0:19        c: direct index for structure (temp bool)
-0:19          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:19      Sequence
+0:19        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:19          'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
 0:19          Constant:
-0:19            2 (const int)
-0:19        c: direct index for structure (temp bool)
-0:19          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:19          Constant:
-0:19            2 (const int)
-0:21      Sequence
-0:21        Sequence
-0:21          move second child to first child (temp int)
+0:19            3 (const int)
+0:19            0.000000
+0:19            false (const bool)
+0:19            0.000000
+0:19            0.000000
+0:19            0.000000
+0:19            0.000000
+0:21      move second child to first child (temp 4-component vector of float)
+0:21        v: direct index for structure (temp 4-component vector of float)
+0:21          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:21          Constant:
+0:21            3 (const int)
+0:21        vector-scale (temp 4-component vector of float)
+0:21          'gv' (global 4-component vector of float)
+0:21          direct index (temp float)
+0:21            'gfa' (global 3-element array of float)
+0:21            Constant:
+0:21              2 (const int)
+0:22      Sequence
+0:22        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:22          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:22          Constant:
+0:22            0 (const int)
+0:22            0.000000
+0:22            false (const bool)
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:23          'o3' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:23          Constant:
+0:23            0 (const int)
+0:23            0.000000
+0:23            false (const bool)
+0:23            0.000000
+0:23            0.000000
+0:23            0.000000
+0:23            0.000000
+0:24      move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:24        'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:24        Constant:
+0:24          0 (const int)
+0:24          0.000000
+0:24          false (const bool)
+0:24          0.000000
+0:24          0.000000
+0:24          0.000000
+0:24          0.000000
+0:25      move second child to first child (temp bool)
+0:25        c: direct index for structure (temp bool)
+0:25          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:25          Constant:
+0:25            2 (const int)
+0:25        c: direct index for structure (temp bool)
+0:25          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:25          Constant:
+0:25            2 (const int)
+0:26      Sequence
+0:26        move second child to first child (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b})
+0:26          'nest' (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0 (const int)
+0:26            0.000000
+0:26            false (const bool)
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            false (const bool)
+0:28      Sequence
+0:28        Sequence
+0:28          move second child to first child (temp int)
 0:?             'a' (layout(location=0 ) out int)
-0:21            a: direct index for structure (temp int)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                0 (const int)
-0:21          move second child to first child (temp float)
+0:28            a: direct index for structure (temp int)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                0 (const int)
+0:28          move second child to first child (temp float)
 0:?             'b' (layout(location=1 ) out float)
-0:21            b: direct index for structure (temp float)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                1 (const int)
-0:21          move second child to first child (temp bool)
+0:28            b: direct index for structure (temp float)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                1 (const int)
+0:28          move second child to first child (temp bool)
 0:?             'c' (layout(location=2 ) out bool)
-0:21            c: direct index for structure (temp bool)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                2 (const int)
-0:21          move second child to first child (temp 4-component vector of float)
+0:28            c: direct index for structure (temp bool)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                2 (const int)
+0:28          move second child to first child (temp 4-component vector of float)
 0:?             'v' (layout(location=3 ) out 4-component vector of float)
-0:21            v: direct index for structure (temp 4-component vector of float)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                3 (const int)
-0:21        Branch: Return
+0:28            v: direct index for structure (temp 4-component vector of float)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                3 (const int)
+0:28        Branch: Return
 0:?   Linker Objects
 0:?     'a' (layout(location=0 ) out int)
 0:?     'b' (layout(location=1 ) out float)
@@ -121,79 +166,124 @@
 0:9        0.000000
 0:9        0.000000
 0:9        0.000000
-0:12  Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:12    Function Parameters: 
-0:12      'input' (layout(location=0 ) in 4-component vector of float)
+0:18  Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:18    Function Parameters: 
+0:18      'input' (layout(location=0 ) in 4-component vector of float)
 0:?     Sequence
-0:13      Sequence
-0:13        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:13          'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:13          Constant:
-0:13            3 (const int)
-0:13            0.000000
-0:13            false (const bool)
-0:13            0.000000
-0:13            0.000000
-0:13            0.000000
-0:13            0.000000
-0:15      move second child to first child (temp 4-component vector of float)
-0:15        v: direct index for structure (temp 4-component vector of float)
-0:15          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:15          Constant:
-0:15            3 (const int)
-0:15        vector-scale (temp 4-component vector of float)
-0:15          'gv' (global 4-component vector of float)
-0:15          direct index (temp float)
-0:15            'gfa' (global 3-element array of float)
-0:15            Constant:
-0:15              2 (const int)
-0:16      Sequence
-0:16        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:16          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:16          Constant:
-0:16            0 (const int)
-0:16            0.000000
-0:16            false (const bool)
-0:16            0.000000
-0:16            0.000000
-0:16            0.000000
-0:16            0.000000
-0:19      move second child to first child (temp bool)
-0:19        c: direct index for structure (temp bool)
-0:19          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:19      Sequence
+0:19        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:19          'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
 0:19          Constant:
-0:19            2 (const int)
-0:19        c: direct index for structure (temp bool)
-0:19          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:19          Constant:
-0:19            2 (const int)
-0:21      Sequence
-0:21        Sequence
-0:21          move second child to first child (temp int)
+0:19            3 (const int)
+0:19            0.000000
+0:19            false (const bool)
+0:19            0.000000
+0:19            0.000000
+0:19            0.000000
+0:19            0.000000
+0:21      move second child to first child (temp 4-component vector of float)
+0:21        v: direct index for structure (temp 4-component vector of float)
+0:21          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:21          Constant:
+0:21            3 (const int)
+0:21        vector-scale (temp 4-component vector of float)
+0:21          'gv' (global 4-component vector of float)
+0:21          direct index (temp float)
+0:21            'gfa' (global 3-element array of float)
+0:21            Constant:
+0:21              2 (const int)
+0:22      Sequence
+0:22        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:22          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:22          Constant:
+0:22            0 (const int)
+0:22            0.000000
+0:22            false (const bool)
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:23          'o3' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:23          Constant:
+0:23            0 (const int)
+0:23            0.000000
+0:23            false (const bool)
+0:23            0.000000
+0:23            0.000000
+0:23            0.000000
+0:23            0.000000
+0:24      move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:24        'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:24        Constant:
+0:24          0 (const int)
+0:24          0.000000
+0:24          false (const bool)
+0:24          0.000000
+0:24          0.000000
+0:24          0.000000
+0:24          0.000000
+0:25      move second child to first child (temp bool)
+0:25        c: direct index for structure (temp bool)
+0:25          'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:25          Constant:
+0:25            2 (const int)
+0:25        c: direct index for structure (temp bool)
+0:25          'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:25          Constant:
+0:25            2 (const int)
+0:26      Sequence
+0:26        move second child to first child (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b})
+0:26          'nest' (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b})
+0:26          Constant:
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0 (const int)
+0:26            0.000000
+0:26            false (const bool)
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            0.000000
+0:26            false (const bool)
+0:28      Sequence
+0:28        Sequence
+0:28          move second child to first child (temp int)
 0:?             'a' (layout(location=0 ) out int)
-0:21            a: direct index for structure (temp int)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                0 (const int)
-0:21          move second child to first child (temp float)
+0:28            a: direct index for structure (temp int)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                0 (const int)
+0:28          move second child to first child (temp float)
 0:?             'b' (layout(location=1 ) out float)
-0:21            b: direct index for structure (temp float)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                1 (const int)
-0:21          move second child to first child (temp bool)
+0:28            b: direct index for structure (temp float)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                1 (const int)
+0:28          move second child to first child (temp bool)
 0:?             'c' (layout(location=2 ) out bool)
-0:21            c: direct index for structure (temp bool)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                2 (const int)
-0:21          move second child to first child (temp 4-component vector of float)
+0:28            c: direct index for structure (temp bool)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                2 (const int)
+0:28          move second child to first child (temp 4-component vector of float)
 0:?             'v' (layout(location=3 ) out 4-component vector of float)
-0:21            v: direct index for structure (temp 4-component vector of float)
-0:21              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
-0:21              Constant:
-0:21                3 (const int)
-0:21        Branch: Return
+0:28            v: direct index for structure (temp 4-component vector of float)
+0:28              'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v})
+0:28              Constant:
+0:28                3 (const int)
+0:28        Branch: Return
 0:?   Linker Objects
 0:?     'a' (layout(location=0 ) out int)
 0:?     'b' (layout(location=1 ) out float)
@@ -205,12 +295,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 66
+// Id's are bound by 75
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 45 50 56 60 65
+                              EntryPoint Fragment 4  "PixelShaderFunction" 54 59 65 69 74
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "PixelShaderFunction"
                               Name 9  "gv"
@@ -223,16 +313,22 @@
                               Name 23  "o2"
                               Name 28  "o4"
                               Name 37  "o1"
-                              Name 45  "a"
-                              Name 50  "b"
-                              Name 56  "c"
-                              Name 60  "v"
-                              Name 65  "input"
-                              Decorate 45(a) Location 0
-                              Decorate 50(b) Location 1
-                              Decorate 56(c) Location 2
-                              Decorate 60(v) Location 3
-                              Decorate 65(input) Location 0
+                              Name 40  "o3"
+                              Name 47  "Nest"
+                              MemberName 47(Nest) 0  "m"
+                              MemberName 47(Nest) 1  "os"
+                              MemberName 47(Nest) 2  "b"
+                              Name 49  "nest"
+                              Name 54  "a"
+                              Name 59  "b"
+                              Name 65  "c"
+                              Name 69  "v"
+                              Name 74  "input"
+                              Decorate 54(a) Location 0
+                              Decorate 59(b) Location 1
+                              Decorate 65(c) Location 2
+                              Decorate 69(v) Location 3
+                              Decorate 74(input) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -261,25 +357,34 @@
               35:             TypePointer Function 7(fvec4)
               38:     19(int) Constant 0
               39:    21(outs) ConstantComposite 38 10 25 26
-              40:             TypePointer Function 20(bool)
-              44:             TypePointer Output 19(int)
-           45(a):     44(ptr) Variable Output
-              46:             TypePointer Function 19(int)
-              49:             TypePointer Output 6(float)
-           50(b):     49(ptr) Variable Output
-              51:     19(int) Constant 1
-              52:             TypePointer Function 6(float)
-              55:             TypePointer Output 20(bool)
-           56(c):     55(ptr) Variable Output
-              59:             TypePointer Output 7(fvec4)
-           60(v):     59(ptr) Variable Output
-              64:             TypePointer Input 7(fvec4)
-       65(input):     64(ptr) Variable Input
+              41:             TypePointer Function 20(bool)
+              45:             TypeVector 6(float) 3
+              46:             TypeMatrix 45(fvec3) 4
+        47(Nest):             TypeStruct 46 21(outs) 20(bool)
+              48:             TypePointer Function 47(Nest)
+              50:   45(fvec3) ConstantComposite 10 10 10
+              51:          46 ConstantComposite 50 50 50 50
+              52:    47(Nest) ConstantComposite 51 39 25
+              53:             TypePointer Output 19(int)
+           54(a):     53(ptr) Variable Output
+              55:             TypePointer Function 19(int)
+              58:             TypePointer Output 6(float)
+           59(b):     58(ptr) Variable Output
+              60:     19(int) Constant 1
+              61:             TypePointer Function 6(float)
+              64:             TypePointer Output 20(bool)
+           65(c):     64(ptr) Variable Output
+              68:             TypePointer Output 7(fvec4)
+           69(v):     68(ptr) Variable Output
+              73:             TypePointer Input 7(fvec4)
+       74(input):     73(ptr) Variable Input
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
           23(o2):     22(ptr) Variable Function
           28(o4):     22(ptr) Variable Function
           37(o1):     22(ptr) Variable Function
+          40(o3):     22(ptr) Variable Function
+        49(nest):     48(ptr) Variable Function
                               Store 9(gv) 12
                               Store 17(gfa) 18
                               Store 23(o2) 27
@@ -290,21 +395,24 @@
               36:     35(ptr) AccessChain 28(o4) 24
                               Store 36 34
                               Store 37(o1) 39
-              41:     40(ptr) AccessChain 37(o1) 30
-              42:    20(bool) Load 41
-              43:     40(ptr) AccessChain 28(o4) 30
-                              Store 43 42
-              47:     46(ptr) AccessChain 28(o4) 38
-              48:     19(int) Load 47
-                              Store 45(a) 48
-              53:     52(ptr) AccessChain 28(o4) 51
-              54:    6(float) Load 53
-                              Store 50(b) 54
-              57:     40(ptr) AccessChain 28(o4) 30
-              58:    20(bool) Load 57
-                              Store 56(c) 58
-              61:     35(ptr) AccessChain 28(o4) 24
-              62:    7(fvec4) Load 61
-                              Store 60(v) 62
+                              Store 40(o3) 39
+                              Store 28(o4) 39
+              42:     41(ptr) AccessChain 37(o1) 30
+              43:    20(bool) Load 42
+              44:     41(ptr) AccessChain 28(o4) 30
+                              Store 44 43
+                              Store 49(nest) 52
+              56:     55(ptr) AccessChain 28(o4) 38
+              57:     19(int) Load 56
+                              Store 54(a) 57
+              62:     61(ptr) AccessChain 28(o4) 60
+              63:    6(float) Load 62
+                              Store 59(b) 63
+              66:     41(ptr) AccessChain 28(o4) 30
+              67:    20(bool) Load 66
+                              Store 65(c) 67
+              70:     35(ptr) AccessChain 28(o4) 24
+              71:    7(fvec4) Load 70
+                              Store 69(v) 71
                               Return
                               FunctionEnd
diff --git a/Test/hlsl.partialInit.frag b/Test/hlsl.partialInit.frag
index b5b0a58..59e8a52 100755
--- a/Test/hlsl.partialInit.frag
+++ b/Test/hlsl.partialInit.frag
@@ -8,15 +8,22 @@
 static float4 gv = {0,0,1};

 static float gfa[3] = {0,0};

 

+struct Nest {

+    float4x3 m;

+    outs os;

+    bool b;

+};

+

 outs PixelShaderFunction(float4 input) : COLOR0

 {

     outs o2 = { 3 };

     outs o4;

     o4.v = gv * gfa[2];

     outs o1 = { };

-//    outs o3 = (outs)0;

-//    o4 = (outs)0;

+    outs o3 = (outs)0;

+    o4 = (outs)0;

     o4.c = o1.c;

+    Nest nest = (Nest)0;

 

     return o4;

 }
\ No newline at end of file
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 4d1ea9d..480953e 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "Overload400-PrecQual.1665"
+#define GLSLANG_REVISION "Overload400-PrecQual.1666"
 #define GLSLANG_DATE "27-Nov-2016"
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 0ed259a..8685dcd 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -3285,7 +3285,7 @@
 //
 // Returns true if there was an error in construction.
 //
-bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* /*node*/, TFunction& function,
+bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function,
                                         TOperator op, TType& type)
 {
     type.shallowCopy(function.getType());
@@ -3411,6 +3411,9 @@
         return true;
     }
 
+    if (op == EOpConstructStruct && ! type.isArray() && isZeroConstructor(node))
+        return false;
+
     if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
         error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
         return true;
@@ -3422,11 +3425,15 @@
         return true;
     }
 
-    // TIntermTyped* typed = node->getAsTyped();
-
     return false;
 }
 
+bool HlslParseContext::isZeroConstructor(const TIntermNode* node)
+{
+    return node->getAsTyped()->isScalar() && node->getAsConstantUnion() &&
+           node->getAsConstantUnion()->getConstArray()[0].getIConst() == 0;
+}
+
 // Verify all the correct semantics for constructing a combined texture/sampler.
 // Return true if the semantics are incorrect.
 bool HlslParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const TFunction& function)
@@ -4672,6 +4679,11 @@
 // creating a constructor-style initializer, ensuring we get the
 // same form.
 //
+// Returns a node representing an expression for the initializer list expressed
+// as the correct type.
+//
+// Returns nullptr if there is an error.
+//
 TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, const TType& type, TIntermTyped* initializer)
 {
     // Will operate recursively.  Once a subtree is found that is constructor style,
@@ -4808,6 +4820,10 @@
     if (node == nullptr || node->getAsTyped() == nullptr)
         return nullptr;
 
+    // Handle the idiom "(struct type)0"
+    if (type.isStruct() && isZeroConstructor(node))
+        return convertInitializerList(loc, type, intermediate.makeAggregate(loc));
+
     TIntermAggregate* aggrNode = node->getAsAggregate();
     TOperator op = intermediate.mapTypeToConstructorOp(type);
 
diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h
index ca93767..02e6981 100755
--- a/hlsl/hlslParseHelper.h
+++ b/hlsl/hlslParseHelper.h
@@ -172,6 +172,7 @@
     void declareArray(const TSourceLoc&, TString& identifier, const TType&, TSymbol*&, bool track);
     TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);
     TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer);
+    bool HlslParseContext::isZeroConstructor(const TIntermNode*);
     TOperator mapAtomicOp(const TSourceLoc& loc, TOperator op, bool isImage);
 
     // Return true if this node requires L-value conversion (e.g, to an imageStore).