diff --git a/Test/baseResults/hlsl.pp.expand.frag.out b/Test/baseResults/hlsl.pp.expand.frag.out
index 71978916d6de4e0f6fdea19fb16e19afe46ef016..adfe02c12ea40638a435b15ed8705d5bab7b3f49 100644
--- a/Test/baseResults/hlsl.pp.expand.frag.out
+++ b/Test/baseResults/hlsl.pp.expand.frag.out
@@ -14,5 +14,6 @@ struct A
 
 void main()
 {
+    "a string"
 }
 
diff --git a/Test/hlsl.pp.expand.frag b/Test/hlsl.pp.expand.frag
old mode 100644
new mode 100755
index 765d17e44118904d592136f86c45598d5fc23010..d5318a0277a98b4ca9523f6600757364015d0ff1
--- a/Test/hlsl.pp.expand.frag
+++ b/Test/hlsl.pp.expand.frag
@@ -14,4 +14,5 @@ struct A
 
 void main()
 {
+    "a string"
 }
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
old mode 100644
new mode 100755
index dd3e159a2270ab6be0c77f8a949c7162f26c94a3..c99f958115ca95a458e6c4973aa6076daba77e9f
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -67,6 +67,11 @@
 #include "iomapper.h"
 #include "Initialize.h"
 
+// TODO: this really shouldn't be here, it is only because of the trial addition
+// of printing pre-processed tokens, which requires knowing the string literal
+// token to print ", but none of that seems appropriate for this file.
+#include "preprocessor/PpTokens.h"
+
 namespace { // anonymous namespace for file-local functions and symbols
 
 // Total number of successful initializers of glslang: a refcount
@@ -965,6 +970,8 @@ private:
 // DoPreprocessing is a valid ProcessingContext template argument,
 // which only performs the preprocessing step of compilation.
 // It places the result in the "string" argument to its constructor.
+//
+// This is not an officially supported or fully working path.
 struct DoPreprocessing {
     explicit DoPreprocessing(std::string* string): outputString(string) {}
     bool operator()(TParseContextBase& parseContext, TPpContext& ppContext,
@@ -1072,7 +1079,11 @@ struct DoPreprocessing {
                 outputBuffer += ' ';
             }
             lastToken = token;
+            if (token == PpAtomConstString)
+                outputBuffer += "\"";
             outputBuffer += ppToken.name;
+            if (token == PpAtomConstString)
+                outputBuffer += "\"";
         } while (true);
         outputBuffer += '\n';
         *outputString = std::move(outputBuffer);
@@ -1122,6 +1133,9 @@ struct DoFullParse{
 // Return: True if there were no issues found in preprocessing,
 //         False if during preprocessing any unknown version, pragmas or
 //         extensions were found.
+//
+// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+// is not an officially supported or fully working path.
 bool PreprocessDeferred(
     TCompiler* compiler,
     const char* const shaderStrings[],
@@ -1726,6 +1740,9 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion
 
 // Fill in a string with the result of preprocessing ShaderStrings
 // Returns true if all extensions, pragmas and version strings were valid.
+//
+// NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+// is not an officially supported or fully working path.
 bool TShader::preprocess(const TBuiltInResource* builtInResources,
                          int defaultVersion, EProfile defaultProfile,
                          bool forceDefaultVersionAndProfile,
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
old mode 100644
new mode 100755
index 3c833f836efff5bf01f6b80a9b592c1c8cce630e..7fc2ca3465be0bc0f41343cd20de355815dbbe3b
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -532,6 +532,8 @@ public:
         return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages, includer);
     }
 
+    // NOTE: Doing just preprocessing to obtain a correct preprocessed shader string
+    // is not an officially supported or fully working path.
     bool preprocess(const TBuiltInResource* builtInResources,
                     int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile,
                     bool forwardCompatible, EShMessages message, std::string* outputString,