diff --git a/Test/130.frag b/Test/130.frag
index fd81bbfd219fd13d80c236cb2e62baa03f7c4fad..a5903928042dfd632221e70ed98b548893e68c4d 100644
--- a/Test/130.frag
+++ b/Test/130.frag
@@ -117,6 +117,9 @@ void bar235()
     c = textureGrad(Isca, i, vec3(0.1), vec3(0.2));
 }
 
+int \
+    x;  // ERROR until 420pack is turned on
+
 #extension GL_ARB_shading_language_420pack : enable
 
 const int ai[3] = { 10, 23, 32 };
@@ -125,11 +128,19 @@ uniform layout(binding=0) sampler2D bounds;
 
 void bar23444()
 {
-    mat4x3 m43;
+    mat4x3 m43;  \
     float a1 = m43[3].y;
-    int a2 = m43.length();  // ERROR until shading_language_420pack is fully implemented
+    vec3 v3;
+    int a2 = m43.length();
+    a2 += m43[1].length();
+    a2 += v3.length();
     const float b = 2 * a1;
-    a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset;    // ERROR until shading_language_420pack is fully implemented
+    a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset;
+    bool boolb;
+    boolb.length();     // ERROR
+    m43[3][1].length(); // ERROR
+    v3.length;          // ERROR
+    v3.length(b);       // ERROR
 }
 
 in float gl_FogFragCoord;
diff --git a/Test/420.vert b/Test/420.vert
index 6343a005deb767707339725bd958b2e1ced15de8..9acc8021ac21669f2fda04b6e72d6f9ed6d5452a 100644
--- a/Test/420.vert
+++ b/Test/420.vert
@@ -83,4 +83,16 @@ out gl_PerVertex {
 };
 
 patch in vec4 patchIn;              // ERROR
-patch out vec4 patchOut;            // ERROR
\ No newline at end of file
+patch out vec4 patchOut;            // ERROR
+
+void bar23444()
+{
+    mat4x3 m43;  \
+    float a1 = m43[3].y;
+    vec3 v3;
+    int a2 = m43.length();
+    a2 += m43[1].length();
+    a2 += v3.length();
+    const float b = 2 * a1;
+    int a = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset;
+}
diff --git a/Test/baseResults/120.vert.out b/Test/baseResults/120.vert.out
index 301f0775ae9c71d54197d35b5aebaa384ce13989..1111c073d515bb4e2804c4086f942e1f84fa44ce 100644
--- a/Test/baseResults/120.vert.out
+++ b/Test/baseResults/120.vert.out
@@ -11,9 +11,9 @@ ERROR: 0:21: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:28: 'length' :  array must be declared with a size before using this method
 ERROR: 0:31: 'length' : incomplete method syntax 
 ERROR: 0:32: 'length' : method does not accept any arguments 
-ERROR: 0:33: 'flizbit' : only the length method is supported for array 
+ERROR: 0:33: 'flizbit' : does not apply to this type: 7-element array of float
 ERROR: 0:33: '=' :  cannot convert from '7-element array of float' to 'int'
-ERROR: 0:34: 'flizbit' : only the length method is supported for array 
+ERROR: 0:34: 'flizbit' : does not apply to this type: 7-element array of float
 ERROR: 0:34: 'f' : can't use function syntax on variable 
 ERROR: 0:34: 'a4' : redefinition 
 ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none
@@ -123,7 +123,7 @@ ERROR: node is still EOpNull!
 0:32        move second child to first child (int)
 0:32          'a3' (int)
 0:32          Constant:
-0:32            12 (const int)
+0:32            1 (const int)
 0:43      move second child to first child (float)
 0:43        'gl_PointSize' (invariant gl_PointSize float)
 0:43        Constant:
@@ -442,7 +442,7 @@ ERROR: node is still EOpNull!
 0:32        move second child to first child (int)
 0:32          'a3' (int)
 0:32          Constant:
-0:32            12 (const int)
+0:32            1 (const int)
 0:43      move second child to first child (float)
 0:43        'gl_PointSize' (invariant gl_PointSize float)
 0:43        Constant:
diff --git a/Test/baseResults/130.frag.out b/Test/baseResults/130.frag.out
index 8ab00fd94af76c619a4b0ea4a174809fccde3392..31900941d67fb9d8c354c160b9a498c56288681f 100644
--- a/Test/baseResults/130.frag.out
+++ b/Test/baseResults/130.frag.out
@@ -13,17 +13,22 @@ ERROR: 0:81: 'textureGatherOffset(...)' : not supported for this version or the
 ERROR: 0:84: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
 ERROR: 0:85: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
 WARNING: 0:88: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
-WARNING: 0:120: '#extension' : extension is only partially supported: GL_ARB_shading_language_420pack
-ERROR: 0:123: 'uniform block' : not supported for this version or the enabled extensions 
-ERROR: 0:130: '.' : field selection not allowed on matrix 
-ERROR: 0:130: 'm43' : can't use function syntax on variable 
-ERROR: 0:130: '=' :  cannot convert from 'const float' to 'int'
-ERROR: 0:132: 'gl_MinProgramTexelOffset' : undeclared identifier 
-ERROR: 0:132: 'gl_MaxProgramTexelOffset' : undeclared identifier 
-ERROR: 0:135: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved 
-ERROR: 0:140: 'int' : must be qualified as flat in
-ERROR: 0:140: 'redeclaration' : cannot change the type of gl_FogFragCoord
-ERROR: 21 compilation errors.  No code generated.
+ERROR: 0:120: 'line continuation' : not supported for this version or the enabled extensions 
+WARNING: 0:123: '#extension' : extension is only partially supported: GL_ARB_shading_language_420pack
+ERROR: 0:126: 'uniform block' : not supported for this version or the enabled extensions 
+ERROR: 0:138: 'gl_MinProgramTexelOffset' : undeclared identifier 
+ERROR: 0:138: 'gl_MaxProgramTexelOffset' : undeclared identifier 
+ERROR: 0:140: 'length' : does not operate on this type: bool
+ERROR: 0:140: 'boolb' : can't use function syntax on variable 
+ERROR: 0:141: 'length' : does not operate on this type: float
+ERROR: 0:141: '' : function call, method, or subroutine call expected 
+ERROR: 0:141: '' : no matching overloaded function found 
+ERROR: 0:142: 'length' : incomplete method syntax 
+ERROR: 0:143: 'length' : method does not accept any arguments 
+ERROR: 0:146: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved 
+ERROR: 0:151: 'int' : must be qualified as flat in
+ERROR: 0:151: 'redeclaration' : cannot change the type of gl_FogFragCoord
+ERROR: 26 compilation errors.  No code generated.
 
 
 Shader version: 130
@@ -300,34 +305,53 @@ ERROR: node is still EOpNull!
 0:117            0.200000
 0:117            0.200000
 0:117            0.200000
-0:126  Function Definition: bar23444( (void)
-0:126    Function Parameters: 
+0:129  Function Definition: bar23444( (void)
+0:129    Function Parameters: 
 0:?     Sequence
-0:129      Sequence
-0:129        move second child to first child (float)
-0:129          'a1' (float)
-0:129          direct index (float)
-0:129            direct index (3-component vector of float)
-0:129              'm43' (4X3 matrix of float)
-0:129              Constant:
-0:129                3 (const int)
-0:129            Constant:
-0:129              1 (const int)
-0:131      Sequence
-0:131        move second child to first child (float)
-0:131          'b' (const (read only) float)
-0:131          component-wise multiply (float)
-0:131            Constant:
-0:131              2.000000
-0:131            'a1' (float)
-0:132      move second child to first child (float)
-0:132        direct index (float)
-0:132          'a' (3-component vector of float)
-0:132          Constant:
-0:132            0 (const int)
-0:132        add (float)
-0:132          'gl_MinProgramTexelOffset' (float)
-0:132          'gl_MaxProgramTexelOffset' (float)
+0:132      Sequence
+0:132        move second child to first child (float)
+0:132          'a1' (float)
+0:132          direct index (float)
+0:132            direct index (3-component vector of float)
+0:132              'm43' (4X3 matrix of float)
+0:132              Constant:
+0:132                3 (const int)
+0:132            Constant:
+0:132              1 (const int)
+0:134      Sequence
+0:134        move second child to first child (int)
+0:134          'a2' (int)
+0:134          Constant:
+0:134            4 (const int)
+0:135      add second child into first child (int)
+0:135        'a2' (int)
+0:135        Constant:
+0:135          3 (const int)
+0:136      add second child into first child (int)
+0:136        'a2' (int)
+0:136        Constant:
+0:136          3 (const int)
+0:137      Sequence
+0:137        move second child to first child (float)
+0:137          'b' (const (read only) float)
+0:137          component-wise multiply (float)
+0:137            Constant:
+0:137              2.000000
+0:137            'a1' (float)
+0:138      move second child to first child (float)
+0:138        direct index (float)
+0:138          'a' (3-component vector of float)
+0:138          Constant:
+0:138            0 (const int)
+0:138        add (float)
+0:138          'gl_MinProgramTexelOffset' (float)
+0:138          'gl_MaxProgramTexelOffset' (float)
+0:140      Constant:
+0:140        0.000000
+0:141      Constant:
+0:141        0.000000
+0:143      Constant:
+0:143        1 (const int)
 0:?   Linker Objects
 0:?     'a' (3-component vector of float)
 0:?     'b' (float)
@@ -349,6 +373,7 @@ ERROR: node is still EOpNull!
 0:?     'Isca' (uniform isamplerCubeArray)
 0:?     'Usca' (uniform usamplerCubeArray)
 0:?     'Scas' (uniform samplerCubeArrayShadow)
+0:?     'x' (int)
 0:?     'ai' (const 3-element array of int)
 0:?       10 (const int)
 0:?       23 (const int)
@@ -635,34 +660,53 @@ ERROR: node is still EOpNull!
 0:117            0.200000
 0:117            0.200000
 0:117            0.200000
-0:126  Function Definition: bar23444( (void)
-0:126    Function Parameters: 
+0:129  Function Definition: bar23444( (void)
+0:129    Function Parameters: 
 0:?     Sequence
-0:129      Sequence
-0:129        move second child to first child (float)
-0:129          'a1' (float)
-0:129          direct index (float)
-0:129            direct index (3-component vector of float)
-0:129              'm43' (4X3 matrix of float)
-0:129              Constant:
-0:129                3 (const int)
-0:129            Constant:
-0:129              1 (const int)
-0:131      Sequence
-0:131        move second child to first child (float)
-0:131          'b' (const (read only) float)
-0:131          component-wise multiply (float)
-0:131            Constant:
-0:131              2.000000
-0:131            'a1' (float)
-0:132      move second child to first child (float)
-0:132        direct index (float)
-0:132          'a' (3-component vector of float)
-0:132          Constant:
-0:132            0 (const int)
-0:132        add (float)
-0:132          'gl_MinProgramTexelOffset' (float)
-0:132          'gl_MaxProgramTexelOffset' (float)
+0:132      Sequence
+0:132        move second child to first child (float)
+0:132          'a1' (float)
+0:132          direct index (float)
+0:132            direct index (3-component vector of float)
+0:132              'm43' (4X3 matrix of float)
+0:132              Constant:
+0:132                3 (const int)
+0:132            Constant:
+0:132              1 (const int)
+0:134      Sequence
+0:134        move second child to first child (int)
+0:134          'a2' (int)
+0:134          Constant:
+0:134            4 (const int)
+0:135      add second child into first child (int)
+0:135        'a2' (int)
+0:135        Constant:
+0:135          3 (const int)
+0:136      add second child into first child (int)
+0:136        'a2' (int)
+0:136        Constant:
+0:136          3 (const int)
+0:137      Sequence
+0:137        move second child to first child (float)
+0:137          'b' (const (read only) float)
+0:137          component-wise multiply (float)
+0:137            Constant:
+0:137              2.000000
+0:137            'a1' (float)
+0:138      move second child to first child (float)
+0:138        direct index (float)
+0:138          'a' (3-component vector of float)
+0:138          Constant:
+0:138            0 (const int)
+0:138        add (float)
+0:138          'gl_MinProgramTexelOffset' (float)
+0:138          'gl_MaxProgramTexelOffset' (float)
+0:140      Constant:
+0:140        0.000000
+0:141      Constant:
+0:141        0.000000
+0:143      Constant:
+0:143        1 (const int)
 0:?   Linker Objects
 0:?     'a' (3-component vector of float)
 0:?     'b' (float)
@@ -684,6 +728,7 @@ ERROR: node is still EOpNull!
 0:?     'Isca' (uniform isamplerCubeArray)
 0:?     'Usca' (uniform usamplerCubeArray)
 0:?     'Scas' (uniform samplerCubeArrayShadow)
+0:?     'x' (int)
 0:?     'ai' (const 3-element array of int)
 0:?       10 (const int)
 0:?       23 (const int)
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 003179ec7b173f41f0f2546fb989b0f85ecec639..e9b54974c45259659437ee1ad3579f4f90269107 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -533,7 +533,7 @@ Warning, version 400 is not yet complete; most version-specific features are pre
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
-ERROR: 0:26: 'gl_PointSize' :  no such field in structure 
+ERROR: 0:26: 'gl_PointSize' : no such field in structure 
 ERROR: 0:26: 'assign' :  cannot convert from 'float' to 'block{out 4-component vector of float gl_Position}'
 ERROR: 0:29: 'out' : type must be an array: outf
 ERROR: 6 compilation errors.  No code generated.
diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out
index 0e7c7cccabcf120d1ceeb9456176c4fbc3789f87..e3ca9161c3b88a430c8c410b604ede2e1b3d2b7b 100644
--- a/Test/baseResults/410.geom.out
+++ b/Test/baseResults/410.geom.out
@@ -3,7 +3,7 @@ Warning, version 410 is not yet complete; most version-specific features are pre
 ERROR: 0:8: 'myIn' : cannot redeclare a built-in block with a user name 
 ERROR: 0:12: 'gl_myIn' : no declaration found for redeclaration 
 ERROR: 0:20: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use 
-ERROR: 0:32: 'gl_Position' :  no such field in structure 
+ERROR: 0:32: 'gl_Position' : no such field in structure 
 ERROR: 0:32: '=' :  cannot convert from 'block{in float gl_PointSize}' to '4-component vector of float'
 ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared 
 ERROR: 0:33: 'assign' :  cannot convert from 'const 4-component vector of float' to 'layout(stream=0 ) gl_Position void'
diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out
index 2ceeb407d54d39296a053f993e5912bdda677e5f..c7754a6ec5bcee714386619e60cb1e9305bd740f 100644
--- a/Test/baseResults/420.tesc.out
+++ b/Test/baseResults/420.tesc.out
@@ -3,7 +3,7 @@ Warning, version 400 is not yet complete; most version-specific features are pre
 ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out
 ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a
 ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb
-ERROR: 0:26: 'gl_PointSize' :  no such field in structure 
+ERROR: 0:26: 'gl_PointSize' : no such field in structure 
 ERROR: 0:26: 'assign' :  cannot convert from 'float' to 'block{out 4-component vector of float gl_Position}'
 ERROR: 0:29: 'out' : type must be an array: outf
 ERROR: 6 compilation errors.  No code generated.
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index 93a649cd003b2b1659ce45e6317e8f8312346b1f..b065ffc3a5b5d504c9f68aa11f14c4d4dc6edb21 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -31,7 +31,10 @@ ERROR: 0:76: 'binding' : sampler binding not less than gl_MaxCombinedTextureImag
 ERROR: 0:85: 'patch' : not supported in this stage: vertex
 ERROR: 0:85: '' : vertex input cannot be further qualified 
 ERROR: 0:86: 'patch' : not supported in this stage: vertex
-ERROR: 30 compilation errors.  No code generated.
+ERROR: 0:97: 'gl_MinProgramTexelOffset' : undeclared identifier 
+ERROR: 0:97: 'gl_MaxProgramTexelOffset' : undeclared identifier 
+ERROR: 0:97: '=' :  cannot convert from 'float' to 'int'
+ERROR: 33 compilation errors.  No code generated.
 
 
 Shader version: 420
@@ -105,6 +108,39 @@ ERROR: node is still EOpNull!
 0:61            'f' (float)
 0:62      'f' (float)
 0:63      'f' (float)
+0:88  Function Definition: bar23444( (void)
+0:88    Function Parameters: 
+0:?     Sequence
+0:91      Sequence
+0:91        move second child to first child (float)
+0:91          'a1' (float)
+0:91          direct index (float)
+0:91            direct index (3-component vector of float)
+0:91              'm43' (4X3 matrix of float)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:93      Sequence
+0:93        move second child to first child (int)
+0:93          'a2' (int)
+0:93          Constant:
+0:93            4 (const int)
+0:94      add second child into first child (int)
+0:94        'a2' (int)
+0:94        Constant:
+0:94          3 (const int)
+0:95      add second child into first child (int)
+0:95        'a2' (int)
+0:95        Constant:
+0:95          3 (const int)
+0:96      Sequence
+0:96        move second child to first child (float)
+0:96          'b' (const (read only) float)
+0:96          component-wise multiply (float)
+0:96            Constant:
+0:96              2.000000
+0:96            'a1' (float)
 0:?   Linker Objects
 0:?     'v2' (smooth out 2-component vector of float)
 0:?     'bad' (in 10-element array of 4-component vector of float)
@@ -215,6 +251,39 @@ ERROR: node is still EOpNull!
 0:61            'f' (float)
 0:62      'f' (float)
 0:63      'f' (float)
+0:88  Function Definition: bar23444( (void)
+0:88    Function Parameters: 
+0:?     Sequence
+0:91      Sequence
+0:91        move second child to first child (float)
+0:91          'a1' (float)
+0:91          direct index (float)
+0:91            direct index (3-component vector of float)
+0:91              'm43' (4X3 matrix of float)
+0:91              Constant:
+0:91                3 (const int)
+0:91            Constant:
+0:91              1 (const int)
+0:93      Sequence
+0:93        move second child to first child (int)
+0:93          'a2' (int)
+0:93          Constant:
+0:93            4 (const int)
+0:94      add second child into first child (int)
+0:94        'a2' (int)
+0:94        Constant:
+0:94          3 (const int)
+0:95      add second child into first child (int)
+0:95        'a2' (int)
+0:95        Constant:
+0:95          3 (const int)
+0:96      Sequence
+0:96        move second child to first child (float)
+0:96          'b' (const (read only) float)
+0:96          component-wise multiply (float)
+0:96            Constant:
+0:96              2.000000
+0:96            'a1' (float)
 0:?   Linker Objects
 0:?     'v2' (smooth out 2-component vector of float)
 0:?     'bad' (in 10-element array of 4-component vector of float)
diff --git a/Test/baseResults/matrixError.vert.out b/Test/baseResults/matrixError.vert.out
index 1b0e8e39313591df9cf2cc5a0f1cb99f3a47ab59..d60f156cf0ba4c69f3162bccf2c8708e244035aa 100644
--- a/Test/baseResults/matrixError.vert.out
+++ b/Test/baseResults/matrixError.vert.out
@@ -3,7 +3,7 @@ ERROR: 0:10: 'constructor' : too many arguments
 ERROR: 0:7: 'const' : non-matching or non-convertible constant type for const initializer 
 ERROR: 0:17: 'assign' :  cannot convert from '2-component vector of float' to '3-component vector of float'
 ERROR: 0:18: 'assign' :  cannot convert from '2-component vector of float' to '3-component vector of float'
-ERROR: 0:19: '.' : field selection not allowed on matrix 
+ERROR: 0:19: 'xy' : does not apply to this type: 2X3 matrix of float
 ERROR: 0:21: '[' :  matrix index out of range '2'
 ERROR: 0:21: '[' :  vector index out of range '4'
 ERROR: 7 compilation errors.  No code generated.
diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out
index 88b86498fbc6da7a0f2429a0ece18cd35931f057..3d1ef00786bbc31e84e2038d87b1c8e471ad5393 100644
--- a/Test/baseResults/specExamples.frag.out
+++ b/Test/baseResults/specExamples.frag.out
@@ -27,21 +27,18 @@ ERROR: 0:150: '=' :  cannot convert from 'const float' to '3-element array of 4-
 ERROR: 0:152: 'constructor' :  cannot convert parameter 1 from 'const 2-element array of 4-component vector of float' to '4-component vector of float'
 ERROR: 0:172: 'x' : undeclared identifier 
 ERROR: 0:172: '[]' : scalar integer expression required 
-ERROR: 0:172: 'length' : illegal vector field selection 
-ERROR: 0:172: '' : function call, method, or subroutine call expected 
-ERROR: 0:172: '' : no matching overloaded function found 
 ERROR: 0:175: 'x' : undeclared identifier 
 ERROR: 0:175: '[]' : scalar integer expression required 
 ERROR: 0:175: 'b' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:175: 'a' : vector field selection out of range 
-ERROR: 0:175: 'length' : illegal vector field selection 
+ERROR: 0:175: 'length' : does not operate on this type: const float
 ERROR: 0:175: '' : function call, method, or subroutine call expected 
 ERROR: 0:175: '' : no matching overloaded function found 
 ERROR: 0:178: '[]' : scalar integer expression required 
 ERROR: 0:178: 's' : undeclared identifier 
 ERROR: 0:178: 's' :  left of '[' is not of type array, matrix, or vector  
 ERROR: 0:178: 'a' : vector field selection out of range 
-ERROR: 0:178: 'length' : illegal vector field selection 
+ERROR: 0:178: 'length' : does not operate on this type: const float
 ERROR: 0:178: '' : function call, method, or subroutine call expected 
 ERROR: 0:178: '' : no matching overloaded function found 
 ERROR: 0:198: 'e' : redefinition 
@@ -49,7 +46,7 @@ ERROR: 0:226: 'in' : not allowed in nested scope
 ERROR: 0:227: 'in' : not allowed in nested scope 
 ERROR: 0:228: 'in' : not allowed in nested scope 
 ERROR: 0:232: 'out' : not allowed in nested scope 
-ERROR: 49 compilation errors.  No code generated.
+ERROR: 46 compilation errors.  No code generated.
 
 
 Shader version: 430
@@ -196,7 +193,7 @@ ERROR: node is still EOpNull!
 0:171        Constant:
 0:171          3 (const int)
 0:172        Constant:
-0:172          0.000000
+0:172          4 (const int)
 0:175      Constant:
 0:175        0.000000
 0:178      Constant:
@@ -448,7 +445,7 @@ ERROR: node is still EOpNull!
 0:171        Constant:
 0:171          3 (const int)
 0:172        Constant:
-0:172          0.000000
+0:172          4 (const int)
 0:175      Constant:
 0:175        0.000000
 0:178      Constant:
diff --git a/Todo.txt b/Todo.txt
index a516949bf1cc6719b37d7d5d8b815ea5e243eaea..db4d4a3b7077286dd99067f28336f8bd5cb42c81 100644
--- a/Todo.txt
+++ b/Todo.txt
@@ -172,7 +172,7 @@ Shader Functionality to Implement/Finish
         - qualifiers can act independently on the opaque shader variable and the backing image, so extra qualifiers can be used to separately qualify these
       + Variables declared in if and else statements are scoped only to the end of those statements, especially for non-compound statements
         Note, this is not backward compatible, it may depend on #version.
-      - Allow implicit conversions of return values to the declared type of the function.
+      + Allow implicit conversions of return values to the declared type of the function.
       + The const keyword can be used to declare variables within a function body with initializer expressions that are not constant expressions.
       + Qualifiers on variable declarations no longer have to follow a strict order. The layout qualifier can be used multiple times, and multiple parameter qualifiers can be used.
       + Parameter qualifiers can include precision and memory qualifiers.
@@ -184,7 +184,7 @@ Shader Functionality to Implement/Finish
         - packSnorm2x16and unpackSnorm2x16
       - Add gl_FragDepth layout qualifiers to communicate what kind of changes will be made to gl_FragDepth (GL_AMD_conservative depth).
       + Add C-style curly brace initializer lists syntax for initializers. Full initialization of aggregates is required when these are used.
-      - Allow .length() to be applied to vectors and matrices, returning the number of components or columns.
+      + Allow .length() to be applied to vectors and matrices, returning the number of components or columns.
       + Clarify that .length() returns an int type and can be used as a constant integer expression.
       + Allow swizzle operations on scalars.
       + Positive signed decimal literals, as well as octal and hexadecimal, can set all 32 bits. This includes setting the sign bit to create a negative value.
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 66f8891af9bd5e5472a9351361b8eac9c1c89548..2ce2409be20d8df5f77e34dbb42a9a9b3d3f2507 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -312,7 +312,7 @@ enum TOperator {
     // Array operators
     //
 
-    EOpArrayLength,
+    EOpArrayLength,      // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well.
 };
 
 class TIntermTraverser;
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 0f5f81b590da4976680020399f6807a1c684a71d..c0fe1970b6bda8f340046d5c1ee6a082bedd46fb 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -669,22 +669,32 @@ void TParseContext::checkIoArrayConsistency(TSourceLoc loc, int requiredSize, co
 //
 TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* base, TString& field)
 {
-    TIntermTyped* result = base;
-
     variableCheck(base);
-    if (base->isArray()) {
-        //
-        // It can only be a method (e.g., length), which can't be resolved until
-        // we later see the function calling syntax.  Save away the name for now.
-        //
 
-        if (field == "length") {
+    //
+    // .length() can't be resolved until we later see the function-calling syntax.
+    // Save away the name in the AST for now.  Processing is compeleted in 
+    // handleLengthMethod().
+    //
+    if (field == "length") {
+        if (base->isArray()) {
             profileRequires(loc, ENoProfile, 120, GL_3DL_array_objects, ".length");
             profileRequires(loc, EEsProfile, 300, 0, ".length");
-            result = intermediate.addMethod(base, TType(EbtInt), &field, loc);
-        } else
-        error(loc, "only the length method is supported for array", field.c_str(), "");
-    } else if (base->isVector() || base->isScalar()) {
+        } else if (base->isVector() || base->isMatrix()) {
+            const char* feature = ".length() on vectors and matrices";
+            requireProfile(loc, ~EEsProfile, feature);
+            profileRequires(loc, ~EEsProfile, 420, GL_ARB_shading_language_420pack, feature);
+        } else {
+            error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString().c_str());
+
+            return base;
+        }
+
+        return intermediate.addMethod(base, TType(EbtInt), &field, loc);
+    }
+
+    TIntermTyped* result = base;
+    if (base->isVector() || base->isScalar()) {
         if (base->isScalar()) {
             const char* dotFeature = "scalar swizzle";
             requireProfile(loc, ~EEsProfile, dotFeature);
@@ -720,9 +730,7 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped*
                 result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, (int) vectorString.size()));
             }
         }
-    } else if (base->isMatrix())
-        error(loc, "field selection not allowed on matrix", ".", "");
-    else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) {
+    } else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) {
         const TTypeList* fields = base->getType().getStruct();
         bool fieldFound = false;
         int member;
@@ -741,9 +749,9 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped*
                 result->setType(*(*fields)[member].type);
             }
         } else
-            error(loc, " no such field in structure", field.c_str(), "");
+            error(loc, "no such field in structure", field.c_str(), "");
     } else
-        error(loc, " dot operator does not operater on this type:", field.c_str(), base->getType().getCompleteString().c_str());
+        error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString().c_str());
 
     return result;
 }
@@ -1013,7 +1021,10 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct
     return result;
 }
 
-// Do all processing handling object.length().
+// Finish processing object.length(). This started earlier in handleDotDereference(), where
+// the ".length" part was recognized and semantically checked, and finished here where the 
+// function syntax "()" is recognized.
+//
 // Return resulting tree node.
 TIntermTyped* TParseContext::handleLengthMethod(TSourceLoc loc, TFunction* function, TIntermNode* intermNode)
 {
@@ -1021,26 +1032,36 @@ TIntermTyped* TParseContext::handleLengthMethod(TSourceLoc loc, TFunction* funct
 
     if (function->getParamCount() > 0)
         error(loc, "method does not accept any arguments", function->getName().c_str(), "");
-    if (intermNode->getAsTyped() == 0 || ! intermNode->getAsTyped()->getType().isArray())
-        error(loc, "", function->getName().c_str(), "can only be applied to an array");
-    else if (intermNode->getAsTyped()->getType().isImplicitlySizedArray()) {
-        if (intermNode->getAsSymbolNode() && isIoResizeArray(intermNode->getAsTyped()->getType())) {
-            // We could be between a layout declaration that gives a built-in io array implicit size and 
-            // a user redeclaration of that array, meaning we have to substitute its implicit size here 
-            // without actually redeclaring the array.  (It is an error to use a member before the
-            // redeclaration, but not an error to use the array name itself.)
-            const TString& name = intermNode->getAsSymbolNode()->getName();
-            if (name == "gl_in" || name == "gl_out")
-                length = getIoArrayImplicitSize();
-        }
-        if (length == 0) {
-            if (intermNode->getAsSymbolNode() && isIoResizeArray(intermNode->getAsTyped()->getType()))
-                error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier");
-            else
-                error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method");
+    else {
+        const TType& type = intermNode->getAsTyped()->getType();
+        if (type.isArray()) {
+            if (type.isImplicitlySizedArray()) {
+                if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) {
+                    // We could be between a layout declaration that gives a built-in io array implicit size and 
+                    // a user redeclaration of that array, meaning we have to substitute its implicit size here 
+                    // without actually redeclaring the array.  (It is an error to use a member before the
+                    // redeclaration, but not an error to use the array name itself.)
+                    const TString& name = intermNode->getAsSymbolNode()->getName();
+                    if (name == "gl_in" || name == "gl_out")
+                        length = getIoArrayImplicitSize();
+                }
+                if (length == 0) {
+                    if (intermNode->getAsSymbolNode() && isIoResizeArray(type))
+                        error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier");
+                    else
+                        error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method");
+                }
+            } else
+                length = type.getArraySize();
+        } else if (type.isMatrix())
+            length = type.getMatrixCols();
+        else if (type.isVector())
+            length = type.getVectorSize();
+        else {
+            // we should not get here, because earlier semantic checking should have prevented this path
+            error(loc, ".length()", "unexpected use of .length()", "");
         }
-    } else
-        length = intermNode->getAsTyped()->getType().getArraySize();
+    }
 
     if (length == 0)
         length = 1;
@@ -1633,7 +1654,7 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment)
     const char* message = "line continuation";
 
     bool lineContinuationAllowed = (profile == EEsProfile && version >= 300) ||
-                                   (profile != EEsProfile && version >= 420);
+                                   (profile != EEsProfile && (version >= 420 || extensionsTurnedOn(1, &GL_ARB_shading_language_420pack)));
 
     if (endOfComment) {
         if (lineContinuationAllowed)
@@ -1645,12 +1666,12 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment)
     }
 
     if (messages & EShMsgRelaxedErrors) {
+        if (! lineContinuationAllowed)
             warn(loc, "not allowed in this version", message, "");
         return true;
     } else {
-        requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, message);
         profileRequires(loc, EEsProfile, 300, 0, message);
-        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 0, message);
+        profileRequires(loc, ~EEsProfile, 420, GL_ARB_shading_language_420pack, message);
     }
 
     return lineContinuationAllowed;
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 6292bb9172742cfa5a44d4dcf34d6fb608c477d5..912bd03e373bf6e22864775454608b9a9213c38c 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -362,11 +362,8 @@ function_identifier
 
         TIntermMethod* method = $1->getAsMethodNode();
         if (method) {
-            if (method->getObject()->isArray()) {
-                $$.function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength);
-                $$.intermNode = method->getObject();
-            } else
-                parseContext.error(method->getLoc(), "only arrays have methods", "", "");
+            $$.function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength);
+            $$.intermNode = method->getObject();
         } else {
             TIntermSymbol* symbol = $1->getAsSymbolNode();
             if (symbol) {