GLSL/SPV: Propagaet precision qualifier from function to return value.

When a return value's type has no precision qualification (e.g., the return
expression is formed from a constructor), and the formal function return type
has a precision qualification, back propagate that from the return type to the
type of the return value's expression.
diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out
index 451cc0b..eec22cc 100644
--- a/Test/baseResults/310AofA.vert.out
+++ b/Test/baseResults/310AofA.vert.out
@@ -61,7 +61,7 @@
 0:49      Constant:
 0:49        0.000000
 0:50      Branch: Return with expression
-0:50        Construct float ( temp 4-element array of 7-element array of float)
+0:50        Construct float ( temp 4-element array of 7-element array of highp float)
 0:50          direct index ( temp 7-element array of highp float)
 0:50            'a' ( in 5-element array of 7-element array of highp float)
 0:50            Constant:
@@ -76,7 +76,7 @@
 0:50            Constant:
 0:50              3 (const int)
 0:51      Branch: Return with expression
-0:51        Construct float ( temp 4-element array of 7-element array of float)
+0:51        Construct float ( temp 4-element array of 7-element array of highp float)
 0:51          direct index ( temp 7-element array of highp float)
 0:51            'a' ( in 5-element array of 7-element array of highp float)
 0:51            Constant:
@@ -91,7 +91,7 @@
 0:51            Constant:
 0:51              3 (const int)
 0:52      Branch: Return with expression
-0:52        Construct float ( temp 4-element array of 7-element array of float)
+0:52        Construct float ( temp 4-element array of 7-element array of highp float)
 0:52          direct index ( temp 7-element array of highp float)
 0:52            'a' ( in 5-element array of 7-element array of highp float)
 0:52            Constant:
diff --git a/Test/baseResults/array100.frag.out b/Test/baseResults/array100.frag.out
index e6f9f8d..ecb55f9 100644
--- a/Test/baseResults/array100.frag.out
+++ b/Test/baseResults/array100.frag.out
@@ -31,7 +31,7 @@
 0:9      'a' ( in 5-element array of mediump float)
 0:11    Sequence
 0:11      Branch: Return with expression
-0:11        Construct float ( temp 4-element array of float)
+0:11        Construct float ( temp 4-element array of mediump float)
 0:11          direct index ( temp mediump float)
 0:11            'a' ( in 5-element array of mediump float)
 0:11            Constant:
@@ -168,7 +168,7 @@
 0:9      'a' ( in 5-element array of mediump float)
 0:11    Sequence
 0:11      Branch: Return with expression
-0:11        Construct float ( temp 4-element array of float)
+0:11        Construct float ( temp 4-element array of mediump float)
 0:11          direct index ( temp mediump float)
 0:11            'a' ( in 5-element array of mediump float)
 0:11            Constant:
diff --git a/Test/baseResults/spv.forwardFun.frag.out b/Test/baseResults/spv.forwardFun.frag.out
index acec2c4..f166286 100644
--- a/Test/baseResults/spv.forwardFun.frag.out
+++ b/Test/baseResults/spv.forwardFun.frag.out
@@ -1,12 +1,12 @@
 spv.forwardFun.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 64
+// Id's are bound by 60
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 20 30 36 63
+                              EntryPoint Fragment 4  "main" 20 30 36 59
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
@@ -20,7 +20,7 @@
                               Name 27  "f"
                               Name 30  "gl_FragColor"
                               Name 36  "d"
-                              Name 63  "bigColor"
+                              Name 59  "bigColor"
                               Decorate 10(unreachableReturn() RelaxedPrecision
                               Decorate 16(foo(vf4;) RelaxedPrecision
                               Decorate 15(bar) RelaxedPrecision
@@ -41,15 +41,11 @@
                               Decorate 36(d) RelaxedPrecision
                               Decorate 36(d) Location 2
                               Decorate 37 RelaxedPrecision
-                              Decorate 44 RelaxedPrecision
-                              Decorate 45 RelaxedPrecision
-                              Decorate 49 RelaxedPrecision
-                              Decorate 50 RelaxedPrecision
+                              Decorate 52 RelaxedPrecision
+                              Decorate 55 RelaxedPrecision
                               Decorate 56 RelaxedPrecision
-                              Decorate 59 RelaxedPrecision
-                              Decorate 60 RelaxedPrecision
-                              Decorate 63(bigColor) RelaxedPrecision
-                              Decorate 63(bigColor) Location 0
+                              Decorate 59(bigColor) RelaxedPrecision
+                              Decorate 59(bigColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                8:             TypeFloat 32
@@ -67,11 +63,11 @@
               38:    8(float) Constant 1082549862
               39:             TypeBool
               43:    8(float) Constant 1067030938
-              48:    8(float) Constant 1083179008
-              53:             TypeInt 32 0
-              54:     53(int) Constant 0
-              57:     53(int) Constant 1
-    63(bigColor):     19(ptr) Variable Input
+              46:    8(float) Constant 1083179008
+              49:             TypeInt 32 0
+              50:     49(int) Constant 0
+              53:     49(int) Constant 1
+    59(bigColor):     19(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
        18(color):     13(ptr) Variable Function
@@ -97,31 +93,25 @@
                               FunctionEnd
 10(unreachableReturn():    8(float) Function None 9
               11:             Label
-              44:     26(ptr) Variable Function
-              49:     26(ptr) Variable Function
               34:           2 FunctionCall 6(bar()
               37:    8(float) Load 36(d)
               40:    39(bool) FOrdLessThan 37 38
                               SelectionMerge 42 None
-                              BranchConditional 40 41 47
+                              BranchConditional 40 41 45
               41:               Label
-                                Store 44 43
-              45:    8(float)   Load 44
-                                ReturnValue 45
-              47:               Label
-                                Store 49 48
-              50:    8(float)   Load 49
-                                ReturnValue 50
+                                ReturnValue 43
+              45:               Label
+                                ReturnValue 46
               42:             Label
                               Unreachable
                               FunctionEnd
     16(foo(vf4;):    8(float) Function None 14
          15(bar):     13(ptr) FunctionParameter
               17:             Label
-              55:     26(ptr) AccessChain 15(bar) 54
-              56:    8(float) Load 55
-              58:     26(ptr) AccessChain 15(bar) 57
-              59:    8(float) Load 58
-              60:    8(float) FAdd 56 59
-                              ReturnValue 60
+              51:     26(ptr) AccessChain 15(bar) 50
+              52:    8(float) Load 51
+              54:     26(ptr) AccessChain 15(bar) 53
+              55:    8(float) Load 54
+              56:    8(float) FAdd 52 55
+                              ReturnValue 56
                               FunctionEnd
diff --git a/Test/baseResults/spv.switch.frag.out b/Test/baseResults/spv.switch.frag.out
index 7612f5f..9c68657 100644
--- a/Test/baseResults/spv.switch.frag.out
+++ b/Test/baseResults/spv.switch.frag.out
@@ -5,12 +5,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 275
+// Id's are bound by 269
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 68 81 135 233 239
+                              EntryPoint Fragment 4  "main" 62 75 129 227 233
                               ExecutionMode 4 OriginUpperLeft
                               Source ESSL 310
                               Name 4  "main"
@@ -22,21 +22,21 @@
                               Name 17  "v1"
                               Name 18  "v2"
                               Name 19  "i1"
-                              Name 66  "local"
-                              Name 68  "c"
-                              Name 79  "f"
-                              Name 81  "x"
-                              Name 135  "d"
-                              Name 161  "i"
-                              Name 181  "j"
-                              Name 233  "color"
-                              Name 239  "v"
-                              Name 240  "param"
-                              Name 242  "param"
-                              Name 244  "param"
-                              Name 252  "param"
-                              Name 254  "param"
-                              Name 256  "param"
+                              Name 60  "local"
+                              Name 62  "c"
+                              Name 73  "f"
+                              Name 75  "x"
+                              Name 129  "d"
+                              Name 155  "i"
+                              Name 175  "j"
+                              Name 227  "color"
+                              Name 233  "v"
+                              Name 234  "param"
+                              Name 236  "param"
+                              Name 238  "param"
+                              Name 246  "param"
+                              Name 248  "param"
+                              Name 250  "param"
                               Decorate 15(foo1(vf4;vf4;i1;) RelaxedPrecision
                               Decorate 12(v1) RelaxedPrecision
                               Decorate 13(v2) RelaxedPrecision
@@ -51,142 +51,136 @@
                               Decorate 31 RelaxedPrecision
                               Decorate 32 RelaxedPrecision
                               Decorate 33 RelaxedPrecision
-                              Decorate 38 RelaxedPrecision
-                              Decorate 39 RelaxedPrecision
-                              Decorate 42 RelaxedPrecision
-                              Decorate 48 RelaxedPrecision
-                              Decorate 52 RelaxedPrecision
+                              Decorate 40 RelaxedPrecision
+                              Decorate 46 RelaxedPrecision
+                              Decorate 51 RelaxedPrecision
                               Decorate 53 RelaxedPrecision
+                              Decorate 54 RelaxedPrecision
                               Decorate 55 RelaxedPrecision
-                              Decorate 57 RelaxedPrecision
-                              Decorate 58 RelaxedPrecision
-                              Decorate 59 RelaxedPrecision
-                              Decorate 62 RelaxedPrecision
+                              Decorate 60(local) RelaxedPrecision
+                              Decorate 62(c) RelaxedPrecision
+                              Decorate 62(c) Flat
+                              Decorate 62(c) Location 0
                               Decorate 63 RelaxedPrecision
-                              Decorate 66(local) RelaxedPrecision
-                              Decorate 68(c) RelaxedPrecision
-                              Decorate 68(c) Flat
-                              Decorate 68(c) Location 0
-                              Decorate 69 RelaxedPrecision
-                              Decorate 70 RelaxedPrecision
-                              Decorate 72 RelaxedPrecision
-                              Decorate 73 RelaxedPrecision
-                              Decorate 79(f) RelaxedPrecision
-                              Decorate 81(x) RelaxedPrecision
-                              Decorate 81(x) Location 2
+                              Decorate 64 RelaxedPrecision
+                              Decorate 66 RelaxedPrecision
+                              Decorate 67 RelaxedPrecision
+                              Decorate 73(f) RelaxedPrecision
+                              Decorate 75(x) RelaxedPrecision
+                              Decorate 75(x) Location 2
+                              Decorate 76 RelaxedPrecision
+                              Decorate 77 RelaxedPrecision
+                              Decorate 79 RelaxedPrecision
+                              Decorate 80 RelaxedPrecision
                               Decorate 82 RelaxedPrecision
                               Decorate 83 RelaxedPrecision
                               Decorate 85 RelaxedPrecision
-                              Decorate 86 RelaxedPrecision
-                              Decorate 88 RelaxedPrecision
-                              Decorate 89 RelaxedPrecision
+                              Decorate 90 RelaxedPrecision
                               Decorate 91 RelaxedPrecision
+                              Decorate 92 RelaxedPrecision
+                              Decorate 93 RelaxedPrecision
+                              Decorate 94 RelaxedPrecision
+                              Decorate 95 RelaxedPrecision
                               Decorate 96 RelaxedPrecision
                               Decorate 97 RelaxedPrecision
-                              Decorate 98 RelaxedPrecision
                               Decorate 99 RelaxedPrecision
                               Decorate 100 RelaxedPrecision
                               Decorate 101 RelaxedPrecision
                               Decorate 102 RelaxedPrecision
-                              Decorate 103 RelaxedPrecision
-                              Decorate 105 RelaxedPrecision
-                              Decorate 106 RelaxedPrecision
-                              Decorate 107 RelaxedPrecision
+                              Decorate 104 RelaxedPrecision
                               Decorate 108 RelaxedPrecision
+                              Decorate 109 RelaxedPrecision
                               Decorate 110 RelaxedPrecision
+                              Decorate 111 RelaxedPrecision
+                              Decorate 113 RelaxedPrecision
                               Decorate 114 RelaxedPrecision
                               Decorate 115 RelaxedPrecision
                               Decorate 116 RelaxedPrecision
-                              Decorate 117 RelaxedPrecision
                               Decorate 119 RelaxedPrecision
-                              Decorate 120 RelaxedPrecision
-                              Decorate 121 RelaxedPrecision
-                              Decorate 122 RelaxedPrecision
+                              Decorate 124 RelaxedPrecision
                               Decorate 125 RelaxedPrecision
+                              Decorate 126 RelaxedPrecision
+                              Decorate 127 RelaxedPrecision
+                              Decorate 129(d) RelaxedPrecision
+                              Decorate 129(d) Flat
+                              Decorate 129(d) Location 1
                               Decorate 130 RelaxedPrecision
-                              Decorate 131 RelaxedPrecision
-                              Decorate 132 RelaxedPrecision
-                              Decorate 133 RelaxedPrecision
-                              Decorate 135(d) RelaxedPrecision
-                              Decorate 135(d) Flat
-                              Decorate 135(d) Location 1
+                              Decorate 134 RelaxedPrecision
+                              Decorate 135 RelaxedPrecision
                               Decorate 136 RelaxedPrecision
+                              Decorate 137 RelaxedPrecision
+                              Decorate 138 RelaxedPrecision
+                              Decorate 139 RelaxedPrecision
                               Decorate 140 RelaxedPrecision
-                              Decorate 141 RelaxedPrecision
                               Decorate 142 RelaxedPrecision
                               Decorate 143 RelaxedPrecision
                               Decorate 144 RelaxedPrecision
                               Decorate 145 RelaxedPrecision
                               Decorate 146 RelaxedPrecision
-                              Decorate 148 RelaxedPrecision
-                              Decorate 149 RelaxedPrecision
                               Decorate 150 RelaxedPrecision
                               Decorate 151 RelaxedPrecision
                               Decorate 152 RelaxedPrecision
-                              Decorate 156 RelaxedPrecision
-                              Decorate 157 RelaxedPrecision
-                              Decorate 158 RelaxedPrecision
-                              Decorate 159 RelaxedPrecision
-                              Decorate 161(i) RelaxedPrecision
-                              Decorate 168 RelaxedPrecision
+                              Decorate 153 RelaxedPrecision
+                              Decorate 155(i) RelaxedPrecision
+                              Decorate 162 RelaxedPrecision
+                              Decorate 166 RelaxedPrecision
+                              Decorate 171 RelaxedPrecision
                               Decorate 172 RelaxedPrecision
-                              Decorate 177 RelaxedPrecision
-                              Decorate 178 RelaxedPrecision
-                              Decorate 179 RelaxedPrecision
-                              Decorate 180 RelaxedPrecision
-                              Decorate 181(j) RelaxedPrecision
-                              Decorate 188 RelaxedPrecision
-                              Decorate 191 RelaxedPrecision
-                              Decorate 192 RelaxedPrecision
+                              Decorate 173 RelaxedPrecision
+                              Decorate 174 RelaxedPrecision
+                              Decorate 175(j) RelaxedPrecision
+                              Decorate 182 RelaxedPrecision
+                              Decorate 185 RelaxedPrecision
+                              Decorate 186 RelaxedPrecision
+                              Decorate 187 RelaxedPrecision
                               Decorate 193 RelaxedPrecision
+                              Decorate 194 RelaxedPrecision
+                              Decorate 196 RelaxedPrecision
+                              Decorate 197 RelaxedPrecision
+                              Decorate 198 RelaxedPrecision
                               Decorate 199 RelaxedPrecision
-                              Decorate 200 RelaxedPrecision
                               Decorate 202 RelaxedPrecision
                               Decorate 203 RelaxedPrecision
                               Decorate 204 RelaxedPrecision
                               Decorate 205 RelaxedPrecision
-                              Decorate 208 RelaxedPrecision
-                              Decorate 209 RelaxedPrecision
-                              Decorate 210 RelaxedPrecision
-                              Decorate 211 RelaxedPrecision
+                              Decorate 207 RelaxedPrecision
                               Decorate 213 RelaxedPrecision
+                              Decorate 214 RelaxedPrecision
+                              Decorate 215 RelaxedPrecision
                               Decorate 219 RelaxedPrecision
                               Decorate 220 RelaxedPrecision
                               Decorate 221 RelaxedPrecision
-                              Decorate 225 RelaxedPrecision
-                              Decorate 226 RelaxedPrecision
-                              Decorate 227 RelaxedPrecision
+                              Decorate 222 RelaxedPrecision
+                              Decorate 227(color) RelaxedPrecision
+                              Decorate 227(color) Location 0
                               Decorate 228 RelaxedPrecision
-                              Decorate 233(color) RelaxedPrecision
-                              Decorate 233(color) Location 0
-                              Decorate 234 RelaxedPrecision
+                              Decorate 229 RelaxedPrecision
+                              Decorate 230 RelaxedPrecision
+                              Decorate 231 RelaxedPrecision
+                              Decorate 233(v) RelaxedPrecision
+                              Decorate 233(v) Location 3
+                              Decorate 234(param) RelaxedPrecision
                               Decorate 235 RelaxedPrecision
-                              Decorate 236 RelaxedPrecision
+                              Decorate 236(param) RelaxedPrecision
                               Decorate 237 RelaxedPrecision
-                              Decorate 239(v) RelaxedPrecision
-                              Decorate 239(v) Location 3
-                              Decorate 240(param) RelaxedPrecision
-                              Decorate 241 RelaxedPrecision
-                              Decorate 242(param) RelaxedPrecision
+                              Decorate 238(param) RelaxedPrecision
+                              Decorate 239 RelaxedPrecision
+                              Decorate 240 RelaxedPrecision
                               Decorate 243 RelaxedPrecision
-                              Decorate 244(param) RelaxedPrecision
+                              Decorate 244 RelaxedPrecision
                               Decorate 245 RelaxedPrecision
-                              Decorate 246 RelaxedPrecision
+                              Decorate 246(param) RelaxedPrecision
+                              Decorate 247 RelaxedPrecision
+                              Decorate 248(param) RelaxedPrecision
                               Decorate 249 RelaxedPrecision
-                              Decorate 250 RelaxedPrecision
+                              Decorate 250(param) RelaxedPrecision
                               Decorate 251 RelaxedPrecision
-                              Decorate 252(param) RelaxedPrecision
-                              Decorate 253 RelaxedPrecision
-                              Decorate 254(param) RelaxedPrecision
+                              Decorate 252 RelaxedPrecision
+                              Decorate 254 RelaxedPrecision
                               Decorate 255 RelaxedPrecision
-                              Decorate 256(param) RelaxedPrecision
+                              Decorate 256 RelaxedPrecision
                               Decorate 257 RelaxedPrecision
-                              Decorate 258 RelaxedPrecision
-                              Decorate 260 RelaxedPrecision
-                              Decorate 261 RelaxedPrecision
-                              Decorate 262 RelaxedPrecision
-                              Decorate 263 RelaxedPrecision
-                              Decorate 270 RelaxedPrecision
+                              Decorate 264 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -197,295 +191,295 @@
               11:             TypeFunction 7(fvec4) 8(ptr) 8(ptr) 10(ptr)
               36:    6(float) Constant 0
               37:    7(fvec4) ConstantComposite 36 36 36 36
-              50:    6(float) Constant 1065353216
-              51:    7(fvec4) ConstantComposite 50 50 50 50
-              67:             TypePointer Input 9(int)
-           68(c):     67(ptr) Variable Input
-              71:      9(int) Constant 1
-              78:             TypePointer Function 6(float)
-              80:             TypePointer Input 6(float)
-           81(x):     80(ptr) Variable Input
-          135(d):     67(ptr) Variable Input
-             162:      9(int) Constant 0
-             169:      9(int) Constant 10
-             170:             TypeBool
-             182:      9(int) Constant 20
-             189:      9(int) Constant 30
-             194:    6(float) Constant 1120429670
-             214:    6(float) Constant 1079739679
-             232:             TypePointer Output 6(float)
-      233(color):    232(ptr) Variable Output
-             238:             TypePointer Input 7(fvec4)
-          239(v):    238(ptr) Variable Input
-             247:             TypeInt 32 0
-             248:    247(int) Constant 1
-             259:    247(int) Constant 2
+              48:    6(float) Constant 1065353216
+              49:    7(fvec4) ConstantComposite 48 48 48 48
+              61:             TypePointer Input 9(int)
+           62(c):     61(ptr) Variable Input
+              65:      9(int) Constant 1
+              72:             TypePointer Function 6(float)
+              74:             TypePointer Input 6(float)
+           75(x):     74(ptr) Variable Input
+          129(d):     61(ptr) Variable Input
+             156:      9(int) Constant 0
+             163:      9(int) Constant 10
+             164:             TypeBool
+             176:      9(int) Constant 20
+             183:      9(int) Constant 30
+             188:    6(float) Constant 1120429670
+             208:    6(float) Constant 1079739679
+             226:             TypePointer Output 6(float)
+      227(color):    226(ptr) Variable Output
+             232:             TypePointer Input 7(fvec4)
+          233(v):    232(ptr) Variable Input
+             241:             TypeInt 32 0
+             242:    241(int) Constant 1
+             253:    241(int) Constant 2
          4(main):           2 Function None 3
                5:             Label
-       66(local):     10(ptr) Variable Function
-           79(f):     78(ptr) Variable Function
-          161(i):     10(ptr) Variable Function
-          181(j):     10(ptr) Variable Function
-      240(param):      8(ptr) Variable Function
-      242(param):      8(ptr) Variable Function
-      244(param):     10(ptr) Variable Function
-      252(param):      8(ptr) Variable Function
-      254(param):      8(ptr) Variable Function
-      256(param):     10(ptr) Variable Function
-              69:      9(int) Load 68(c)
-                              Store 66(local) 69
-              70:      9(int) Load 66(local)
-              72:      9(int) IAdd 70 71
-                              Store 66(local) 72
-              73:      9(int) Load 68(c)
-                              SelectionMerge 77 None
-                              Switch 73 76 
-                                     case 1: 74
-                                     case 2: 75
-              76:               Label
-              88:    6(float)   Load 81(x)
-              89:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 88
-                                Store 79(f) 89
-                                Branch 77
-              74:               Label
-              82:    6(float)   Load 81(x)
-              83:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 82
-                                Store 79(f) 83
-                                Branch 77
-              75:               Label
-              85:    6(float)   Load 81(x)
-              86:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 85
-                                Store 79(f) 86
-                                Branch 77
-              77:             Label
-              91:      9(int) Load 68(c)
-                              SelectionMerge 95 None
-                              Switch 91 94 
-                                     case 1: 92
-                                     case 2: 93
-              94:               Label
-             105:    6(float)   Load 81(x)
-             106:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 105
-             107:    6(float)   Load 79(f)
-             108:    6(float)   FAdd 107 106
-                                Store 79(f) 108
-                                Branch 95
-              92:               Label
-              96:    6(float)   Load 81(x)
-              97:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 96
-              98:    6(float)   Load 79(f)
-              99:    6(float)   FAdd 98 97
-                                Store 79(f) 99
-                                Branch 93
-              93:               Label
-             100:    6(float)   Load 81(x)
-             101:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 100
-             102:    6(float)   Load 79(f)
-             103:    6(float)   FAdd 102 101
-                                Store 79(f) 103
-                                Branch 95
-              95:             Label
-             110:      9(int) Load 68(c)
-                              SelectionMerge 113 None
-                              Switch 110 113 
-                                     case 1: 111
-                                     case 2: 112
-             111:               Label
-             114:    6(float)   Load 81(x)
-             115:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 114
-             116:    6(float)   Load 79(f)
-             117:    6(float)   FAdd 116 115
-                                Store 79(f) 117
-                                Branch 113
-             112:               Label
-             119:    6(float)   Load 81(x)
-             120:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 119
-             121:    6(float)   Load 79(f)
-             122:    6(float)   FAdd 121 120
-                                Store 79(f) 122
-                                Branch 113
-             113:             Label
-             125:      9(int) Load 68(c)
-                              SelectionMerge 129 None
-                              Switch 125 128 
-                                     case 1: 126
-                                     case 2: 127
-             128:               Label
-             156:    6(float)   Load 81(x)
-             157:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 156
-             158:    6(float)   Load 79(f)
-             159:    6(float)   FAdd 158 157
-                                Store 79(f) 159
-                                Branch 129
-             126:               Label
-             130:    6(float)   Load 81(x)
-             131:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 130
-             132:    6(float)   Load 79(f)
-             133:    6(float)   FAdd 132 131
-                                Store 79(f) 133
-                                Branch 129
-             127:               Label
-             136:      9(int)   Load 135(d)
-                                SelectionMerge 139 None
-                                Switch 136 139 
-                                       case 1: 137
-                                       case 2: 138
-             137:                 Label
-             140:    6(float)     Load 81(x)
-             141:    6(float)     Load 81(x)
-             142:    6(float)     FMul 140 141
-             143:    6(float)     Load 81(x)
+       60(local):     10(ptr) Variable Function
+           73(f):     72(ptr) Variable Function
+          155(i):     10(ptr) Variable Function
+          175(j):     10(ptr) Variable Function
+      234(param):      8(ptr) Variable Function
+      236(param):      8(ptr) Variable Function
+      238(param):     10(ptr) Variable Function
+      246(param):      8(ptr) Variable Function
+      248(param):      8(ptr) Variable Function
+      250(param):     10(ptr) Variable Function
+              63:      9(int) Load 62(c)
+                              Store 60(local) 63
+              64:      9(int) Load 60(local)
+              66:      9(int) IAdd 64 65
+                              Store 60(local) 66
+              67:      9(int) Load 62(c)
+                              SelectionMerge 71 None
+                              Switch 67 70 
+                                     case 1: 68
+                                     case 2: 69
+              70:               Label
+              82:    6(float)   Load 75(x)
+              83:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 82
+                                Store 73(f) 83
+                                Branch 71
+              68:               Label
+              76:    6(float)   Load 75(x)
+              77:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 76
+                                Store 73(f) 77
+                                Branch 71
+              69:               Label
+              79:    6(float)   Load 75(x)
+              80:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 79
+                                Store 73(f) 80
+                                Branch 71
+              71:             Label
+              85:      9(int) Load 62(c)
+                              SelectionMerge 89 None
+                              Switch 85 88 
+                                     case 1: 86
+                                     case 2: 87
+              88:               Label
+              99:    6(float)   Load 75(x)
+             100:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 99
+             101:    6(float)   Load 73(f)
+             102:    6(float)   FAdd 101 100
+                                Store 73(f) 102
+                                Branch 89
+              86:               Label
+              90:    6(float)   Load 75(x)
+              91:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 90
+              92:    6(float)   Load 73(f)
+              93:    6(float)   FAdd 92 91
+                                Store 73(f) 93
+                                Branch 87
+              87:               Label
+              94:    6(float)   Load 75(x)
+              95:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 94
+              96:    6(float)   Load 73(f)
+              97:    6(float)   FAdd 96 95
+                                Store 73(f) 97
+                                Branch 89
+              89:             Label
+             104:      9(int) Load 62(c)
+                              SelectionMerge 107 None
+                              Switch 104 107 
+                                     case 1: 105
+                                     case 2: 106
+             105:               Label
+             108:    6(float)   Load 75(x)
+             109:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 108
+             110:    6(float)   Load 73(f)
+             111:    6(float)   FAdd 110 109
+                                Store 73(f) 111
+                                Branch 107
+             106:               Label
+             113:    6(float)   Load 75(x)
+             114:    6(float)   ExtInst 1(GLSL.std.450) 14(Cos) 113
+             115:    6(float)   Load 73(f)
+             116:    6(float)   FAdd 115 114
+                                Store 73(f) 116
+                                Branch 107
+             107:             Label
+             119:      9(int) Load 62(c)
+                              SelectionMerge 123 None
+                              Switch 119 122 
+                                     case 1: 120
+                                     case 2: 121
+             122:               Label
+             150:    6(float)   Load 75(x)
+             151:    6(float)   ExtInst 1(GLSL.std.450) 15(Tan) 150
+             152:    6(float)   Load 73(f)
+             153:    6(float)   FAdd 152 151
+                                Store 73(f) 153
+                                Branch 123
+             120:               Label
+             124:    6(float)   Load 75(x)
+             125:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 124
+             126:    6(float)   Load 73(f)
+             127:    6(float)   FAdd 126 125
+                                Store 73(f) 127
+                                Branch 123
+             121:               Label
+             130:      9(int)   Load 129(d)
+                                SelectionMerge 133 None
+                                Switch 130 133 
+                                       case 1: 131
+                                       case 2: 132
+             131:                 Label
+             134:    6(float)     Load 75(x)
+             135:    6(float)     Load 75(x)
+             136:    6(float)     FMul 134 135
+             137:    6(float)     Load 75(x)
+             138:    6(float)     FMul 136 137
+             139:    6(float)     Load 73(f)
+             140:    6(float)     FAdd 139 138
+                                  Store 73(f) 140
+                                  Branch 133
+             132:                 Label
+             142:    6(float)     Load 75(x)
+             143:    6(float)     Load 75(x)
              144:    6(float)     FMul 142 143
-             145:    6(float)     Load 79(f)
+             145:    6(float)     Load 73(f)
              146:    6(float)     FAdd 145 144
-                                  Store 79(f) 146
-                                  Branch 139
-             138:                 Label
-             148:    6(float)     Load 81(x)
-             149:    6(float)     Load 81(x)
-             150:    6(float)     FMul 148 149
-             151:    6(float)     Load 79(f)
-             152:    6(float)     FAdd 151 150
-                                  Store 79(f) 152
-                                  Branch 139
-             139:               Label
-                                Branch 129
-             129:             Label
-                              Store 161(i) 162
-                              Branch 163
-             163:             Label
-                              LoopMerge 165 166 None
-                              Branch 167
-             167:             Label
-             168:      9(int) Load 161(i)
-             171:   170(bool) SLessThan 168 169
-                              BranchConditional 171 164 165
-             164:               Label
-             172:      9(int)   Load 68(c)
-                                SelectionMerge 176 None
-                                Switch 172 175 
-                                       case 1: 173
-                                       case 2: 174
-             175:                 Label
-             208:    6(float)     Load 81(x)
-             209:    6(float)     ExtInst 1(GLSL.std.450) 15(Tan) 208
-             210:    6(float)     Load 79(f)
-             211:    6(float)     FAdd 210 209
-                                  Store 79(f) 211
-                                  Branch 176
-             173:                 Label
-             177:    6(float)     Load 81(x)
-             178:    6(float)     ExtInst 1(GLSL.std.450) 13(Sin) 177
-             179:    6(float)     Load 79(f)
-             180:    6(float)     FAdd 179 178
-                                  Store 79(f) 180
-                                  Store 181(j) 182
-                                  Branch 183
-             183:                 Label
-                                  LoopMerge 185 186 None
-                                  Branch 187
-             187:                 Label
-             188:      9(int)     Load 181(j)
-             190:   170(bool)     SLessThan 188 189
-                                  BranchConditional 190 184 185
-             184:                   Label
-             191:    6(float)       Load 79(f)
-             192:    6(float)       FAdd 191 50
-                                    Store 79(f) 192
-             193:    6(float)       Load 79(f)
-             195:   170(bool)       FOrdLessThan 193 194
-                                    SelectionMerge 197 None
-                                    BranchConditional 195 196 197
-             196:                     Label
-                                      Branch 185
-             197:                   Label
-                                    Branch 186
-             186:                   Label
-             199:      9(int)       Load 181(j)
-             200:      9(int)       IAdd 199 71
-                                    Store 181(j) 200
-                                    Branch 183
-             185:                 Label
-                                  Branch 176
-             174:                 Label
-             202:    6(float)     Load 81(x)
-             203:    6(float)     ExtInst 1(GLSL.std.450) 14(Cos) 202
-             204:    6(float)     Load 79(f)
+                                  Store 73(f) 146
+                                  Branch 133
+             133:               Label
+                                Branch 123
+             123:             Label
+                              Store 155(i) 156
+                              Branch 157
+             157:             Label
+                              LoopMerge 159 160 None
+                              Branch 161
+             161:             Label
+             162:      9(int) Load 155(i)
+             165:   164(bool) SLessThan 162 163
+                              BranchConditional 165 158 159
+             158:               Label
+             166:      9(int)   Load 62(c)
+                                SelectionMerge 170 None
+                                Switch 166 169 
+                                       case 1: 167
+                                       case 2: 168
+             169:                 Label
+             202:    6(float)     Load 75(x)
+             203:    6(float)     ExtInst 1(GLSL.std.450) 15(Tan) 202
+             204:    6(float)     Load 73(f)
              205:    6(float)     FAdd 204 203
-                                  Store 79(f) 205
-                                  Branch 176
-             176:               Label
-             213:    6(float)   Load 79(f)
-             215:   170(bool)   FOrdLessThan 213 214
-                                SelectionMerge 217 None
-                                BranchConditional 215 216 217
-             216:                 Label
-                                  Branch 165
+                                  Store 73(f) 205
+                                  Branch 170
+             167:                 Label
+             171:    6(float)     Load 75(x)
+             172:    6(float)     ExtInst 1(GLSL.std.450) 13(Sin) 171
+             173:    6(float)     Load 73(f)
+             174:    6(float)     FAdd 173 172
+                                  Store 73(f) 174
+                                  Store 175(j) 176
+                                  Branch 177
+             177:                 Label
+                                  LoopMerge 179 180 None
+                                  Branch 181
+             181:                 Label
+             182:      9(int)     Load 175(j)
+             184:   164(bool)     SLessThan 182 183
+                                  BranchConditional 184 178 179
+             178:                   Label
+             185:    6(float)       Load 73(f)
+             186:    6(float)       FAdd 185 48
+                                    Store 73(f) 186
+             187:    6(float)       Load 73(f)
+             189:   164(bool)       FOrdLessThan 187 188
+                                    SelectionMerge 191 None
+                                    BranchConditional 189 190 191
+             190:                     Label
+                                      Branch 179
+             191:                   Label
+                                    Branch 180
+             180:                   Label
+             193:      9(int)       Load 175(j)
+             194:      9(int)       IAdd 193 65
+                                    Store 175(j) 194
+                                    Branch 177
+             179:                 Label
+                                  Branch 170
+             168:                 Label
+             196:    6(float)     Load 75(x)
+             197:    6(float)     ExtInst 1(GLSL.std.450) 14(Cos) 196
+             198:    6(float)     Load 73(f)
+             199:    6(float)     FAdd 198 197
+                                  Store 73(f) 199
+                                  Branch 170
+             170:               Label
+             207:    6(float)   Load 73(f)
+             209:   164(bool)   FOrdLessThan 207 208
+                                SelectionMerge 211 None
+                                BranchConditional 209 210 211
+             210:                 Label
+                                  Branch 159
+             211:               Label
+                                Branch 160
+             160:               Label
+             213:      9(int)   Load 155(i)
+             214:      9(int)   IAdd 213 65
+                                Store 155(i) 214
+                                Branch 157
+             159:             Label
+             215:      9(int) Load 62(c)
+                              SelectionMerge 218 None
+                              Switch 215 218 
+                                     case 1: 216
+                                     case 2: 217
+             216:               Label
+             219:    6(float)   Load 75(x)
+             220:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 219
+             221:    6(float)   Load 73(f)
+             222:    6(float)   FAdd 221 220
+                                Store 73(f) 222
+                                Branch 218
              217:               Label
-                                Branch 166
-             166:               Label
-             219:      9(int)   Load 161(i)
-             220:      9(int)   IAdd 219 71
-                                Store 161(i) 220
-                                Branch 163
-             165:             Label
-             221:      9(int) Load 68(c)
-                              SelectionMerge 224 None
-                              Switch 221 224 
-                                     case 1: 222
-                                     case 2: 223
-             222:               Label
-             225:    6(float)   Load 81(x)
-             226:    6(float)   ExtInst 1(GLSL.std.450) 13(Sin) 225
-             227:    6(float)   Load 79(f)
-             228:    6(float)   FAdd 227 226
-                                Store 79(f) 228
-                                Branch 224
-             223:               Label
-                                Branch 224
-             224:             Label
-             234:    6(float) Load 79(f)
-             235:      9(int) Load 66(local)
-             236:    6(float) ConvertSToF 235
-             237:    6(float) FAdd 234 236
-                              Store 233(color) 237
-             241:    7(fvec4) Load 239(v)
-                              Store 240(param) 241
-             243:    7(fvec4) Load 239(v)
-                              Store 242(param) 243
-             245:      9(int) Load 68(c)
-                              Store 244(param) 245
-             246:    7(fvec4) FunctionCall 15(foo1(vf4;vf4;i1;) 240(param) 242(param) 244(param)
-             249:    6(float) CompositeExtract 246 1
-             250:    6(float) Load 233(color)
-             251:    6(float) FAdd 250 249
-                              Store 233(color) 251
-             253:    7(fvec4) Load 239(v)
-                              Store 252(param) 253
-             255:    7(fvec4) Load 239(v)
-                              Store 254(param) 255
-             257:      9(int) Load 68(c)
-                              Store 256(param) 257
-             258:    7(fvec4) FunctionCall 20(foo2(vf4;vf4;i1;) 252(param) 254(param) 256(param)
-             260:    6(float) CompositeExtract 258 2
-             261:    6(float) Load 233(color)
-             262:    6(float) FAdd 261 260
-                              Store 233(color) 262
-             263:      9(int) Load 68(c)
+                                Branch 218
+             218:             Label
+             228:    6(float) Load 73(f)
+             229:      9(int) Load 60(local)
+             230:    6(float) ConvertSToF 229
+             231:    6(float) FAdd 228 230
+                              Store 227(color) 231
+             235:    7(fvec4) Load 233(v)
+                              Store 234(param) 235
+             237:    7(fvec4) Load 233(v)
+                              Store 236(param) 237
+             239:      9(int) Load 62(c)
+                              Store 238(param) 239
+             240:    7(fvec4) FunctionCall 15(foo1(vf4;vf4;i1;) 234(param) 236(param) 238(param)
+             243:    6(float) CompositeExtract 240 1
+             244:    6(float) Load 227(color)
+             245:    6(float) FAdd 244 243
+                              Store 227(color) 245
+             247:    7(fvec4) Load 233(v)
+                              Store 246(param) 247
+             249:    7(fvec4) Load 233(v)
+                              Store 248(param) 249
+             251:      9(int) Load 62(c)
+                              Store 250(param) 251
+             252:    7(fvec4) FunctionCall 20(foo2(vf4;vf4;i1;) 246(param) 248(param) 250(param)
+             254:    6(float) CompositeExtract 252 2
+             255:    6(float) Load 227(color)
+             256:    6(float) FAdd 255 254
+                              Store 227(color) 256
+             257:      9(int) Load 62(c)
+                              SelectionMerge 260 None
+                              Switch 257 259 
+                                     case 0: 258
+             259:               Label
+                                Branch 260
+             258:               Label
+                                Branch 260
+             260:             Label
+             264:      9(int) Load 62(c)
                               SelectionMerge 266 None
-                              Switch 263 265 
-                                     case 0: 264
+                              Switch 264 265
              265:               Label
                                 Branch 266
-             264:               Label
-                                Branch 266
              266:             Label
-             270:      9(int) Load 68(c)
-                              SelectionMerge 272 None
-                              Switch 270 271
-             271:               Label
-                                Branch 272
-             272:             Label
                               Return
                               FunctionEnd
 15(foo1(vf4;vf4;i1;):    7(fvec4) Function None 11
@@ -493,7 +487,6 @@
           13(v2):      8(ptr) FunctionParameter
           14(i1):     10(ptr) FunctionParameter
               16:             Label
-              38:      8(ptr) Variable Function
               22:      9(int) Load 14(i1)
                               SelectionMerge 26 None
                               Switch 22 26 
@@ -513,41 +506,33 @@
               33:    7(fvec4)   FMul 31 32
                                 ReturnValue 33
               26:             Label
-                              Store 38 37
-              39:    7(fvec4) Load 38
-                              ReturnValue 39
+                              ReturnValue 37
                               FunctionEnd
 20(foo2(vf4;vf4;i1;):    7(fvec4) Function None 11
           17(v1):      8(ptr) FunctionParameter
           18(v2):      8(ptr) FunctionParameter
           19(i1):     10(ptr) FunctionParameter
               21:             Label
-              52:      8(ptr) Variable Function
-              62:      8(ptr) Variable Function
-              42:      9(int) Load 19(i1)
-                              SelectionMerge 47 None
-                              Switch 42 47 
-                                     case 0: 43
-                                     case 2: 44
-                                     case 1: 45
-                                     case 3: 46
+              40:      9(int) Load 19(i1)
+                              SelectionMerge 45 None
+                              Switch 40 45 
+                                     case 0: 41
+                                     case 2: 42
+                                     case 1: 43
+                                     case 3: 44
+              41:               Label
+              46:    7(fvec4)   Load 17(v1)
+                                ReturnValue 46
+              42:               Label
+                                ReturnValue 49
               43:               Label
-              48:    7(fvec4)   Load 17(v1)
-                                ReturnValue 48
+              51:    7(fvec4)   Load 18(v2)
+                                ReturnValue 51
               44:               Label
-                                Store 52 51
-              53:    7(fvec4)   Load 52
-                                ReturnValue 53
-              45:               Label
-              55:    7(fvec4)   Load 18(v2)
+              53:    7(fvec4)   Load 17(v1)
+              54:    7(fvec4)   Load 18(v2)
+              55:    7(fvec4)   FMul 53 54
                                 ReturnValue 55
-              46:               Label
-              57:    7(fvec4)   Load 17(v1)
-              58:    7(fvec4)   Load 18(v2)
-              59:    7(fvec4)   FMul 57 58
-                                ReturnValue 59
-              47:             Label
-                              Store 62 37
-              63:    7(fvec4) Load 62
-                              ReturnValue 63
+              45:             Label
+                              ReturnValue 37
                               FunctionEnd
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index bf12fcf..30cb6fb 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -1231,6 +1231,7 @@
     TOperator getFlowOp() const { return flowOp; }
     TIntermTyped* getExpression() const { return expression; }
     void setExpression(TIntermTyped* pExpression) { expression = pExpression; }
+    void updatePrecision(TPrecisionQualifier parentPrecision);
 protected:
     TOperator flowOp;
     TIntermTyped* expression;
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 52ec611..bb03aa0 100755
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -2777,6 +2777,22 @@
     return node;
 }
 
+// Propagate precision from formal function return type to actual return type,
+// and on to its subtree.
+void TIntermBranch::updatePrecision(TPrecisionQualifier parentPrecision)
+{
+    TIntermTyped* exp = getExpression();
+    if (exp == nullptr)
+        return;
+
+    if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||
+        exp->getBasicType() == EbtFloat || exp->getBasicType() == EbtFloat16) {
+        if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {
+            exp->propagatePrecision(parentPrecision);
+        }
+    }
+}
+
 //
 // This is to be executed after the final root is put on top by the parsing
 // process.
@@ -3284,9 +3300,11 @@
     return true;
 }
 
+// Propagate precision qualifiers *up* from children to parent.
 void TIntermUnary::updatePrecision()
 {
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
         if (operand->getQualifier().precision > getQualifier().precision)
             getQualifier().precision = operand->getQualifier().precision;
     }
@@ -3782,9 +3800,12 @@
     return false;
 }
 
+// Propagate precision qualifiers *up* from children to parent, and then
+// back *down* again to the children's subtrees.
 void TIntermBinary::updatePrecision()
 {
-    if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+     if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+         getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
         getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision);
         if (getQualifier().precision != EpqNone) {
             left->propagatePrecision(getQualifier().precision);
@@ -3793,9 +3814,14 @@
     }
 }
 
+// Recursively propagate precision qualifiers *down* the subtree of the current node,
+// until reaching a node that already has a precision qualifier or otherwise does
+// not participate in precision propagation.
 void TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision)
 {
-    if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat && getBasicType() != EbtFloat16))
+    if (getQualifier().precision != EpqNone ||
+        (getBasicType() != EbtInt && getBasicType() != EbtUint &&
+         getBasicType() != EbtFloat && getBasicType() != EbtFloat16))
         return;
 
     getQualifier().precision = newPrecision;
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index acdb0a4..3d0f329 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1415,23 +1415,28 @@
 #endif
 
     functionReturnsValue = true;
+    TIntermBranch* branch = nullptr;
     if (currentFunctionType->getBasicType() == EbtVoid) {
         error(loc, "void function cannot return a value", "return", "");
-        return intermediate.addBranch(EOpReturn, loc);
+        branch = intermediate.addBranch(EOpReturn, loc);
     } else if (*currentFunctionType != value->getType()) {
         TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
         if (converted) {
             if (*currentFunctionType != converted->getType())
                 error(loc, "cannot convert return value to function return type", "return", "");
             if (version < 420)
-                warn(loc, "type conversion on return values was not explicitly allowed until version 420", "return", "");
-            return intermediate.addBranch(EOpReturn, converted, loc);
+                warn(loc, "type conversion on return values was not explicitly allowed until version 420",
+                     "return", "");
+            branch = intermediate.addBranch(EOpReturn, converted, loc);
         } else {
             error(loc, "type does not match, or is not convertible to, the function's return type", "return", "");
-            return intermediate.addBranch(EOpReturn, value, loc);
+            branch = intermediate.addBranch(EOpReturn, value, loc);
         }
     } else
-        return intermediate.addBranch(EOpReturn, value, loc);
+        branch = intermediate.addBranch(EOpReturn, value, loc);
+
+    branch->updatePrecision(currentFunctionType->getQualifier().precision);
+    return branch;
 }
 
 // See if the operation is being done in an illegal location.