diff --git a/Test/baseResults/hlsl.struct.split.assign.frag.out b/Test/baseResults/hlsl.struct.split.assign.frag.out
index 4906678d8e33c1bf8c5e21f6f75766404768241d..fca9751be2296beef17fa88bec98fdfabd9ff5b0 100644
--- a/Test/baseResults/hlsl.struct.split.assign.frag.out
+++ b/Test/baseResults/hlsl.struct.split.assign.frag.out
@@ -11,10 +11,13 @@ gl_FragCoord origin is upper left
 0:9        'input' ( in 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:9        'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:11      Branch: Return with expression
-0:11        Constant:
-0:11          1.000000
-0:11          1.000000
-0:11          1.000000
+0:11        pos: direct index for structure ( temp 4-component vector of float)
+0:11          direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
+0:11            'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
+0:11            Constant:
+0:11              1 (const int)
+0:11          Constant:
+0:11            1 (const int)
 0:7  Function Definition: main( ( temp void)
 0:7    Function Parameters: 
 0:?     Sequence
@@ -114,10 +117,13 @@ gl_FragCoord origin is upper left
 0:9        'input' ( in 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:9        'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
 0:11      Branch: Return with expression
-0:11        Constant:
-0:11          1.000000
-0:11          1.000000
-0:11          1.000000
+0:11        pos: direct index for structure ( temp 4-component vector of float)
+0:11          direct index ( temp structure{ temp float f,  temp 4-component vector of float pos})
+0:11            'a' ( temp 3-element array of structure{ temp float f,  temp 4-component vector of float pos})
+0:11            Constant:
+0:11              1 (const int)
+0:11          Constant:
+0:11            1 (const int)
 0:7  Function Definition: main( ( temp void)
 0:7    Function Parameters: 
 0:?     Sequence
@@ -203,12 +209,12 @@ gl_FragCoord origin is upper left
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 69
+// Id's are bound by 66
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 32 37 44 49 56 63
+                              EntryPoint Fragment 4  "main" 30 35 41 46 53 60
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -219,23 +225,23 @@ gl_FragCoord origin is upper left
                               Name 16  "i"
                               Name 17  "input"
                               Name 20  "a"
+                              Name 28  "i"
                               Name 30  "i"
-                              Name 32  "i"
-                              Name 34  "input"
-                              Name 37  "input[0].f"
-                              Name 44  "input.pos"
-                              Name 49  "input[1].f"
-                              Name 56  "input[2].f"
-                              Name 63  "@entryPointOutput"
-                              Name 64  "param"
-                              Name 66  "param"
-                              Decorate 32(i) Flat
-                              Decorate 32(i) Location 0
-                              Decorate 37(input[0].f) Location 1
-                              Decorate 44(input.pos) BuiltIn FragCoord
-                              Decorate 49(input[1].f) Location 2
-                              Decorate 56(input[2].f) Location 3
-                              Decorate 63(@entryPointOutput) Location 0
+                              Name 32  "input"
+                              Name 35  "input[0].f"
+                              Name 41  "input.pos"
+                              Name 46  "input[1].f"
+                              Name 53  "input[2].f"
+                              Name 60  "@entryPointOutput"
+                              Name 61  "param"
+                              Name 63  "param"
+                              Decorate 30(i) Flat
+                              Decorate 30(i) Location 0
+                              Decorate 35(input[0].f) Location 1
+                              Decorate 41(input.pos) BuiltIn FragCoord
+                              Decorate 46(input[1].f) Location 2
+                              Decorate 53(input[2].f) Location 3
+                              Decorate 60(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -248,61 +254,58 @@ gl_FragCoord origin is upper left
               13:             TypeArray 10(S) 12
               14:             TypePointer Function 13
               15:             TypeFunction 9(fvec4) 7(ptr) 14(ptr)
-              22:             TypeVector 8(float) 3
-              23:    8(float) Constant 1065353216
-              24:   22(fvec3) ConstantComposite 23 23 23
-              25:             TypePointer Function 9(fvec4)
-              31:             TypePointer Input 6(int)
-           32(i):     31(ptr) Variable Input
-              35:      6(int) Constant 0
-              36:             TypePointer Input 8(float)
-  37(input[0].f):     36(ptr) Variable Input
-              39:             TypePointer Function 8(float)
-              41:      6(int) Constant 1
-              42:             TypeArray 9(fvec4) 12
-              43:             TypePointer Input 42
-   44(input.pos):     43(ptr) Variable Input
-              45:             TypePointer Input 9(fvec4)
-  49(input[1].f):     36(ptr) Variable Input
-              55:      6(int) Constant 2
-  56(input[2].f):     36(ptr) Variable Input
-              62:             TypePointer Output 9(fvec4)
-63(@entryPointOutput):     62(ptr) Variable Output
+              22:      6(int) Constant 1
+              23:             TypePointer Function 9(fvec4)
+              29:             TypePointer Input 6(int)
+           30(i):     29(ptr) Variable Input
+              33:      6(int) Constant 0
+              34:             TypePointer Input 8(float)
+  35(input[0].f):     34(ptr) Variable Input
+              37:             TypePointer Function 8(float)
+              39:             TypeArray 9(fvec4) 12
+              40:             TypePointer Input 39
+   41(input.pos):     40(ptr) Variable Input
+              42:             TypePointer Input 9(fvec4)
+  46(input[1].f):     34(ptr) Variable Input
+              52:      6(int) Constant 2
+  53(input[2].f):     34(ptr) Variable Input
+              59:             TypePointer Output 9(fvec4)
+60(@entryPointOutput):     59(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-           30(i):      7(ptr) Variable Function
-       34(input):     14(ptr) Variable Function
-       64(param):      7(ptr) Variable Function
-       66(param):     14(ptr) Variable Function
-              33:      6(int) Load 32(i)
-                              Store 30(i) 33
-              38:    8(float) Load 37(input[0].f)
-              40:     39(ptr) AccessChain 34(input) 35 35
-                              Store 40 38
-              46:     45(ptr) AccessChain 44(input.pos) 35
-              47:    9(fvec4) Load 46
-              48:     25(ptr) AccessChain 34(input) 35 41
+           28(i):      7(ptr) Variable Function
+       32(input):     14(ptr) Variable Function
+       61(param):      7(ptr) Variable Function
+       63(param):     14(ptr) Variable Function
+              31:      6(int) Load 30(i)
+                              Store 28(i) 31
+              36:    8(float) Load 35(input[0].f)
+              38:     37(ptr) AccessChain 32(input) 33 33
+                              Store 38 36
+              43:     42(ptr) AccessChain 41(input.pos) 33
+              44:    9(fvec4) Load 43
+              45:     23(ptr) AccessChain 32(input) 33 22
+                              Store 45 44
+              47:    8(float) Load 46(input[1].f)
+              48:     37(ptr) AccessChain 32(input) 22 33
                               Store 48 47
-              50:    8(float) Load 49(input[1].f)
-              51:     39(ptr) AccessChain 34(input) 41 35
+              49:     42(ptr) AccessChain 41(input.pos) 22
+              50:    9(fvec4) Load 49
+              51:     23(ptr) AccessChain 32(input) 22 22
                               Store 51 50
-              52:     45(ptr) AccessChain 44(input.pos) 41
-              53:    9(fvec4) Load 52
-              54:     25(ptr) AccessChain 34(input) 41 41
-                              Store 54 53
-              57:    8(float) Load 56(input[2].f)
-              58:     39(ptr) AccessChain 34(input) 55 35
+              54:    8(float) Load 53(input[2].f)
+              55:     37(ptr) AccessChain 32(input) 52 33
+                              Store 55 54
+              56:     42(ptr) AccessChain 41(input.pos) 52
+              57:    9(fvec4) Load 56
+              58:     23(ptr) AccessChain 32(input) 52 22
                               Store 58 57
-              59:     45(ptr) AccessChain 44(input.pos) 55
-              60:    9(fvec4) Load 59
-              61:     25(ptr) AccessChain 34(input) 55 41
-                              Store 61 60
-              65:      6(int) Load 30(i)
-                              Store 64(param) 65
-              67:          13 Load 34(input)
-                              Store 66(param) 67
-              68:    9(fvec4) FunctionCall 18(@main(i1;struct-S-f1-vf41[3];) 64(param) 66(param)
-                              Store 63(@entryPointOutput) 68
+              62:      6(int) Load 28(i)
+                              Store 61(param) 62
+              64:          13 Load 32(input)
+                              Store 63(param) 64
+              65:    9(fvec4) FunctionCall 18(@main(i1;struct-S-f1-vf41[3];) 61(param) 63(param)
+                              Store 60(@entryPointOutput) 65
                               Return
                               FunctionEnd
 18(@main(i1;struct-S-f1-vf41[3];):    9(fvec4) Function None 15
@@ -310,10 +313,9 @@ gl_FragCoord origin is upper left
        17(input):     14(ptr) FunctionParameter
               19:             Label
            20(a):     14(ptr) Variable Function
-              26:     25(ptr) Variable Function
               21:          13 Load 20(a)
                               Store 17(input) 21
-                              Store 26 24
-              27:    9(fvec4) Load 26
-                              ReturnValue 27
+              24:     23(ptr) AccessChain 20(a) 22 22
+              25:    9(fvec4) Load 24
+                              ReturnValue 25
                               FunctionEnd
diff --git a/Test/hlsl.struct.split.assign.frag b/Test/hlsl.struct.split.assign.frag
index e7fe028870c768a9663ba6512064f3096d6ab688..d9921f30e6ea8bca269194be69231a87bce4255d 100644
--- a/Test/hlsl.struct.split.assign.frag
+++ b/Test/hlsl.struct.split.assign.frag
@@ -8,5 +8,5 @@ float4 main(int i, S input[3]) : COLOR0
     S a[3];
     input = a;
 
-    return float3(1.0);
+    return a[1].pos;
 }
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 14de3ba3f24b976b372e9393d5b144a9e291cec3..5eb5e67acf7468f7d289427c85b645a798658357 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -2239,7 +2239,7 @@ TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermT
         value = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
         if (value && *currentFunctionType != value->getType())
             value = intermediate.addUniShapeConversion(EOpReturn, *currentFunctionType, value);
-        if (value == nullptr) {
+        if (value == nullptr || *currentFunctionType != value->getType()) {
             error(loc, "type does not match, or is not convertible to, the function's return type", "return", "");
             return value;
         }