diff --git a/Test/baseResults/hlsl.identifier.sample.frag.out b/Test/baseResults/hlsl.identifier.sample.frag.out
index 8e7408197fcfd2c8e111bf9707f2b3499539181b..35e88e93c227a2af46fa0f4b0637fe0a2a490a24 100644
--- a/Test/baseResults/hlsl.identifier.sample.frag.out
+++ b/Test/baseResults/hlsl.identifier.sample.frag.out
@@ -12,18 +12,27 @@ gl_FragCoord origin is upper left
 0:12    Function Parameters: 
 0:?     Sequence
 0:15      Sequence
-0:15        move second child to first child (temp int)
-0:15          'sample' (temp int)
-0:15          Constant:
-0:15            3 (const int)
+0:15        move second child to first child (temp 4-component vector of float)
+0:15          'sample' (temp 4-component vector of float)
+0:?           Constant:
+0:?             3.000000
+0:?             4.000000
+0:?             5.000000
+0:?             6.000000
 0:17      Sequence
 0:17        move second child to first child (temp 4-component vector of float)
 0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:?           Constant:
-0:?             0.000000
-0:?             0.000000
-0:?             0.000000
-0:?             0.000000
+0:17          vector swizzle (temp 4-component vector of float)
+0:17            'sample' (temp 4-component vector of float)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17              Constant:
+0:17                3 (const int)
 0:17        Branch: Return
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
@@ -45,54 +54,67 @@ gl_FragCoord origin is upper left
 0:12    Function Parameters: 
 0:?     Sequence
 0:15      Sequence
-0:15        move second child to first child (temp int)
-0:15          'sample' (temp int)
-0:15          Constant:
-0:15            3 (const int)
+0:15        move second child to first child (temp 4-component vector of float)
+0:15          'sample' (temp 4-component vector of float)
+0:?           Constant:
+0:?             3.000000
+0:?             4.000000
+0:?             5.000000
+0:?             6.000000
 0:17      Sequence
 0:17        move second child to first child (temp 4-component vector of float)
 0:?           '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:?           Constant:
-0:?             0.000000
-0:?             0.000000
-0:?             0.000000
-0:?             0.000000
+0:17          vector swizzle (temp 4-component vector of float)
+0:17            'sample' (temp 4-component vector of float)
+0:17            Sequence
+0:17              Constant:
+0:17                0 (const int)
+0:17              Constant:
+0:17                1 (const int)
+0:17              Constant:
+0:17                2 (const int)
+0:17              Constant:
+0:17                3 (const int)
 0:17        Branch: Return
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 24
+// Id's are bound by 28
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 20
+                              EntryPoint Fragment 4  "main" 25
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "main"
                               Name 10  "sample(i1;"
                               Name 9  "x"
-                              Name 15  "sample"
-                              Name 20  "@entryPointOutput"
-                              Decorate 20(@entryPointOutput) Location 0
+                              Name 18  "sample"
+                              Name 25  "@entryPointOutput"
+                              Decorate 25(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
                7:             TypePointer Function 6(int)
                8:             TypeFunction 6(int) 7(ptr)
-              16:      6(int) Constant 3
-              17:             TypeFloat 32
-              18:             TypeVector 17(float) 4
-              19:             TypePointer Output 18(fvec4)
-20(@entryPointOutput):     19(ptr) Variable Output
-              21:   17(float) Constant 0
-              22:   18(fvec4) ConstantComposite 21 21 21 21
+              15:             TypeFloat 32
+              16:             TypeVector 15(float) 4
+              17:             TypePointer Function 16(fvec4)
+              19:   15(float) Constant 1077936128
+              20:   15(float) Constant 1082130432
+              21:   15(float) Constant 1084227584
+              22:   15(float) Constant 1086324736
+              23:   16(fvec4) ConstantComposite 19 20 21 22
+              24:             TypePointer Output 16(fvec4)
+25(@entryPointOutput):     24(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-      15(sample):      7(ptr) Variable Function
-                              Store 15(sample) 16
-                              Store 20(@entryPointOutput) 22
+      18(sample):     17(ptr) Variable Function
+                              Store 18(sample) 23
+              26:   16(fvec4) Load 18(sample)
+                              Store 25(@entryPointOutput) 26
                               Return
                               FunctionEnd
   10(sample(i1;):      6(int) Function None 8
diff --git a/Test/hlsl.identifier.sample.frag b/Test/hlsl.identifier.sample.frag
index 3281a9ac66779d7a9493fe7b0cc4286347e5163b..d3f824272f390955b128b351590757ca20822093 100644
--- a/Test/hlsl.identifier.sample.frag
+++ b/Test/hlsl.identifier.sample.frag
@@ -12,7 +12,7 @@ float4 main() : SV_Target0
 {
     // HLSL allows this as an identifier as well.
     // However, this is not true of other qualifier keywords such as "linear".
-    int sample = 3;
+    float4 sample = float4(3,4,5,6);
 
-    return float4(0,0,0,0);
+    return sample.rgba; // 'sample' can participate in an expression.
 }
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
index e676e95e104410b567ee47657a9e5065ebe6466f..b874aa8c9cb433008747a115cb14b8111e7660b7 100755
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -90,10 +90,11 @@ bool HlslGrammar::acceptIdentifier(HlslToken& idToken)
     // as "linear" or "centroid" NOT valid identifiers.  This code special cases "sample",
     // so e.g, "int sample;" is accepted.
     if (peekTokenClass(EHTokSample)) {
-        idToken.string     = NewPoolTString("sample");
-        idToken.tokenClass = EHTokIdentifier;
-        idToken.symbol     = nullptr;
-        idToken.loc        = token.loc;
+        token.string     = NewPoolTString("sample");
+        token.tokenClass = EHTokIdentifier;
+        token.symbol     = nullptr;
+
+        idToken          = token;
         advanceToken();
         return true;
     }
@@ -475,8 +476,15 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
     TSourceLoc loc = token.loc;
 
     // type_specifier
-    if (! acceptType(type))
+    if (! acceptType(type)) {
+        // If this is not a type, we may have inadvertently gone down a wrong path
+        // py parsing "sample", which can be treated like either an identifier or a
+        // qualifier.  Back it out, if we did.
+        if (qualifier.sample)
+            recedeToken();
+
         return false;
+    }
     if (type.getBasicType() == EbtBlock) {
         // the type was a block, which set some parts of the qualifier
         parseContext.mergeQualifiers(type.getQualifier(), qualifier);
@@ -2203,7 +2211,7 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
     } else if (acceptIdentifier(idToken)) {
         // identifier or function_call name
         if (! peekTokenClass(EHTokLeftParen)) {
-            node = parseContext.handleVariable(idToken.loc, idToken.symbol, token.string);
+            node = parseContext.handleVariable(idToken.loc, idToken.symbol, idToken.string);
         } else if (acceptFunctionCall(idToken, node)) {
             // function_call (nothing else to do yet)
         } else {