Add conversion folding when the source is a constant.

This change adds unary conversion folding when the source is a constant.
This fixes an ISV issue whereby:

```
const float16_t f = float16_t(42.0);
```

Wouldn't compile because the conversion operator would always produce an
EvqTemporary when it could have produced an EvqConst.

I've also added a test case that proves out that all basic-type to
basic-type conversions work.
diff --git a/Test/baseResults/constantUnaryConversion.comp.out b/Test/baseResults/constantUnaryConversion.comp.out
new file mode 100644
index 0000000..de705e4
--- /dev/null
+++ b/Test/baseResults/constantUnaryConversion.comp.out
@@ -0,0 +1,645 @@
+constantUnaryConversion.comp
+Shader version: 450
+Requested GL_KHX_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
+
+Linked compute stage:
+
+
+Shader version: 450
+Requested GL_KHX_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
diff --git a/Test/baseResults/spv.16bitstorage-int.frag.out b/Test/baseResults/spv.16bitstorage-int.frag.out
index 1b2a16b..3f0fffd 100644
--- a/Test/baseResults/spv.16bitstorage-int.frag.out
+++ b/Test/baseResults/spv.16bitstorage-int.frag.out
@@ -1,7 +1,7 @@
 spv.16bitstorage-int.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 171
+// Id's are bound by 172
 
                               Capability Shader
                               Capability StorageUniformBufferBlock16
@@ -204,7 +204,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   39(ivec2) ConstantComposite 32 33
+             166:  6(int16_t) Constant 1
+             167:  6(int16_t) Constant 2
+             168:  7(i16vec2) ConstantComposite 166 167
+             170:  6(int16_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -324,11 +327,9 @@
              164:  6(int16_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             167:  7(i16vec2) SConvert 166
-             168:     42(ptr) AccessChain 19(b2) 32
-                              Store 168 167
-             169:  6(int16_t) SConvert 58
-             170:     28(ptr) AccessChain 19(b2) 21
-                              Store 170 169
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.16bitstorage-uint.frag.out b/Test/baseResults/spv.16bitstorage-uint.frag.out
index f935f26..c07edaa 100644
--- a/Test/baseResults/spv.16bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.16bitstorage-uint.frag.out
@@ -205,8 +205,10 @@
              115:     20(int) Constant 7
              116:     20(int) Constant 6
              117:             TypePointer Uniform 9(int)
-             167:   39(ivec2) ConstantComposite 82 10
-             170:      9(int) Constant 3
+             167:  6(int16_t) Constant 1
+             168:  6(int16_t) Constant 2
+             169:  7(i16vec2) ConstantComposite 167 168
+             171:  6(int16_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -326,10 +328,8 @@
              165:  6(int16_t) Load 164
              166:     28(ptr) AccessChain 19(b2) 21
                               Store 166 165
-             168:  7(i16vec2) UConvert 167
-             169:     42(ptr) AccessChain 19(b2) 32
-                              Store 169 168
-             171:  6(int16_t) UConvert 170
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
              172:     28(ptr) AccessChain 19(b2) 21
                               Store 172 171
                               Return
diff --git a/Test/baseResults/spv.16bitstorage.frag.out b/Test/baseResults/spv.16bitstorage.frag.out
index d2a83ba..2d5487f 100644
--- a/Test/baseResults/spv.16bitstorage.frag.out
+++ b/Test/baseResults/spv.16bitstorage.frag.out
@@ -1,7 +1,7 @@
 spv.16bitstorage.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 173
+// Id's are bound by 172
 
                               Capability Shader
                               Capability StorageUniformBufferBlock16
@@ -204,9 +204,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   37(float) Constant 1073741824
-             167:   40(fvec2) ConstantComposite 83 166
-             170:   37(float) Constant 1077936128
+             166:6(float16_t) Constant 15360
+             167:6(float16_t) Constant 16384
+             168:  7(f16vec2) ConstantComposite 166 167
+             170:6(float16_t) Constant 16896
          4(main):           2 Function None 3
                5:             Label
           70(x0):     69(ptr) Variable Function
@@ -326,11 +327,9 @@
              164:6(float16_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             168:  7(f16vec2) FConvert 167
              169:     43(ptr) AccessChain 19(b2) 32
                               Store 169 168
-             171:6(float16_t) FConvert 170
-             172:     28(ptr) AccessChain 19(b2) 21
-                              Store 172 171
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-int.frag.out b/Test/baseResults/spv.8bitstorage-int.frag.out
index 96cb2ae..a0af75a 100644
--- a/Test/baseResults/spv.8bitstorage-int.frag.out
+++ b/Test/baseResults/spv.8bitstorage-int.frag.out
@@ -1,7 +1,7 @@
 spv.8bitstorage-int.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 171
+// Id's are bound by 172
 
                               Capability Shader
                               Capability CapabilityUniformAndStorageBuffer8BitAccess
@@ -203,7 +203,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   39(ivec2) ConstantComposite 32 33
+             166:   6(int8_t) Constant 1
+             167:   6(int8_t) Constant 2
+             168:   7(i8vec2) ConstantComposite 166 167
+             170:   6(int8_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -323,11 +326,9 @@
              164:   6(int8_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             167:   7(i8vec2) SConvert 166
-             168:     42(ptr) AccessChain 19(b2) 32
-                              Store 168 167
-             169:   6(int8_t) SConvert 58
-             170:     28(ptr) AccessChain 19(b2) 21
-                              Store 170 169
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-uint.frag.out b/Test/baseResults/spv.8bitstorage-uint.frag.out
index 415bada..12c390a 100644
--- a/Test/baseResults/spv.8bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.8bitstorage-uint.frag.out
@@ -204,8 +204,10 @@
              115:     20(int) Constant 7
              116:     20(int) Constant 6
              117:             TypePointer Uniform 9(int)
-             167:   39(ivec2) ConstantComposite 82 10
-             170:      9(int) Constant 3
+             167:   6(int8_t) Constant 1
+             168:   6(int8_t) Constant 2
+             169:   7(i8vec2) ConstantComposite 167 168
+             171:   6(int8_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -325,10 +327,8 @@
              165:   6(int8_t) Load 164
              166:     28(ptr) AccessChain 19(b2) 21
                               Store 166 165
-             168:   7(i8vec2) UConvert 167
-             169:     42(ptr) AccessChain 19(b2) 32
-                              Store 169 168
-             171:   6(int8_t) UConvert 170
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
              172:     28(ptr) AccessChain 19(b2) 21
                               Store 172 171
                               Return
diff --git a/Test/constantUnaryConversion.comp b/Test/constantUnaryConversion.comp
new file mode 100644
index 0000000..467b6f6
--- /dev/null
+++ b/Test/constantUnaryConversion.comp
@@ -0,0 +1,48 @@
+#version 450

+

+#extension GL_KHX_shader_explicit_arithmetic_types : require

+

+const bool bool_init = true;

+const int8_t int8_t_init = int8_t(-1);

+const int16_t int16_t_init = int16_t(-2);

+const int32_t int32_t_init = int32_t(-3);

+const int64_t int64_t_init = int64_t(-4);

+const uint8_t uint8_t_init = uint8_t(1);

+const uint16_t uint16_t_init = uint16_t(2);

+const uint32_t uint32_t_init = uint32_t(3);

+const uint64_t uint64_t_init = uint64_t(4);

+const float16_t float16_t_init = float16_t(42.0);

+const float32_t float32_t_init = float32_t(13.0);

+const float64_t float64_t_init = float64_t(-4.0);

+

+#define TYPE_TO_TYPE(x, y) \

+    const x y##_to_##x = x(y##_init)

+

+#define TYPE_TO(x)              \

+    TYPE_TO_TYPE(x, bool);      \

+    TYPE_TO_TYPE(x, int8_t);    \

+    TYPE_TO_TYPE(x, int16_t);   \

+    TYPE_TO_TYPE(x, int32_t);   \

+    TYPE_TO_TYPE(x, int64_t);   \

+    TYPE_TO_TYPE(x, uint8_t);   \

+    TYPE_TO_TYPE(x, uint16_t);  \

+    TYPE_TO_TYPE(x, uint32_t);  \

+    TYPE_TO_TYPE(x, uint64_t);  \

+    TYPE_TO_TYPE(x, float16_t); \

+    TYPE_TO_TYPE(x, float32_t); \

+    TYPE_TO_TYPE(x, float64_t)

+

+TYPE_TO(bool);

+TYPE_TO(int8_t);

+TYPE_TO(int16_t);

+TYPE_TO(int32_t);

+TYPE_TO(int64_t);

+TYPE_TO(uint8_t);

+TYPE_TO(uint16_t);

+TYPE_TO(uint32_t);

+TYPE_TO(uint64_t);

+TYPE_TO(float16_t);

+TYPE_TO(float32_t);

+TYPE_TO(float64_t);

+

+void main() {}

diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index b33af84..2c5aea8 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -670,6 +670,279 @@
             break;
         }
 
+        case EOpConvInt8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU8Const()); break;
+        case EOpConvInt16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU16Const()); break;
+        case EOpConvIntToBool:
+            newConstArray[i].setBConst(unionArray[i].getIConst()); break;
+        case EOpConvUintToBool:
+            newConstArray[i].setBConst(unionArray[i].getUConst()); break;
+        case EOpConvInt64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
+        case EOpConvUint64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
+        case EOpConvFloat16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+
+        case EOpConvBoolToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt:
+            newConstArray[i].setIConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint:
+            newConstArray[i].setUConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToDouble:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+
+        case EOpConvInt8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU8Const()); break;
+        case EOpConvInt8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+
+        case EOpConvInt16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU16Const())); break;
+        case EOpConvUint16ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU16Const())); break;
+
+        case EOpConvUint16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU16Const()); break;
+        case EOpConvInt16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+
+        case EOpConvIntToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint:
+            newConstArray[i].setUConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getIConst()); break;
+
+        case EOpConvUintToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt:
+            newConstArray[i].setIConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getUConst()); break;
+        case EOpConvIntToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToFloat:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToDouble:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvUintToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToFloat:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToDouble:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvInt64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI64Const()); break;
+        case EOpConvUint64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU64Const()); break;
+        case EOpConvUint64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvInt64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvUint64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvFloat16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloat16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+
+
+
         // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
 
         case EOpSinh:
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 6355f30..46d4812 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -489,7 +489,7 @@
 // This is 'mechanism' here, it does any conversion told.
 // It is about basic type, not about shape.
 // The policy comes from the shader or the calling code.
-TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
+TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
 {
     //
     // Add a new newNode for the conversion.
@@ -712,7 +712,11 @@
     TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows());
     newNode = addUnaryNode(newOp, node, node->getLoc(), newType);
 
-    // TODO: it seems that some unary folding operations should occur here, but are not
+    if (node->getAsConstantUnion()) {
+        TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType);
+        if (folded)
+            return folded;
+    }
 
     // Propagate specialization-constant-ness, if allowed
     if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode))
@@ -1021,7 +1025,7 @@
     //
     // Add a new newNode for the conversion.
     //
-    TIntermUnary* newNode = createConversion(promoteTo, node);
+    TIntermTyped* newNode = createConversion(promoteTo, node);
 
     return newNode;
 }
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 762b310..ff28c0e 100755
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -732,7 +732,7 @@
     bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);
     void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);
     bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
-    TIntermUnary* createConversion(TBasicType convertTo, TIntermTyped* node) const;
+    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
     std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
     bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
     static const char* getResourceName(TResourceType);
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index b89fc51..00bb433 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -231,6 +231,7 @@
         "precise_struct_block.vert",
         "maxClipDistances.vert",
         "findFunction.frag",
+        "constantUnaryConversion.comp"
     })),
     FileNameAsCustomTestSuffix
 );