diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out
new file mode 100755
index 0000000000000000000000000000000000000000..0398e5e484c40b13767cd601542a7aaa8485b383
--- /dev/null
+++ b/Test/baseResults/cppBad2.vert.out
@@ -0,0 +1,19 @@
+cppBad2.vert
+ERROR: 0:3: 'macro expansion' : End of input in macro b
+ERROR: 0:3: '' : compilation terminated 
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
+
+Linked vertex stage:
+
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 100
+ERROR: node is still EOpNull!
+0:?   Linker Objects
+
diff --git a/Test/cppBad2.vert b/Test/cppBad2.vert
new file mode 100755
index 0000000000000000000000000000000000000000..5e61b49ef353a0460364398255417e222352f534
--- /dev/null
+++ b/Test/cppBad2.vert
@@ -0,0 +1,3 @@
+#define a b(
+#define b(x)
+b(a)
\ No newline at end of file
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 4d9682526baf742f0ad5738f1db81f7f0bf34cb4..cccc79677f72190355198d5ce251e31553ec968c 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "Overload400-PrecQual.1727"
+#define GLSLANG_REVISION "Overload400-PrecQual.1728"
 #define GLSLANG_DATE "02-Jan-2017"
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
index 595b7295d5a753cb90175ba02c7622442184bafd..eb2f3dfaf99697e91c67d3118798f598f5613639 100644
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -934,12 +934,20 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken*
     TokenStream* expandedArg = new TokenStream;
     pushInput(new tMarkerInput(this));
     pushTokenStreamInput(arg);
-    while ((token = scanToken(ppToken)) != tMarkerInput::marker) {
+    while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
         if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
             continue;
         RecordToken(*expandedArg, token, ppToken);
     }
-    popInput();
+
+    if (token == EndOfInput) {
+        // MacroExpand ate the marker, so had bad input, recover
+        delete expandedArg;
+        expandedArg = nullptr;
+    } else {
+        // remove the marker
+        popInput();
+    }
 
     return expandedArg;
 }
@@ -1133,7 +1141,7 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka
             depth = 0;
             while (1) {
                 token = scanToken(ppToken);
-                if (token == EndOfInput) {
+                if (token == EndOfInput || token == tMarkerInput::marker) {
                     parseContext.ppError(loc, "End of input in macro", "macro expansion", atomStrings.getString(macroAtom));
                     delete in;
                     return 0;
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index 70705337f52a8bb14862536fa85ebfed262d69e1..d8a5ef94c92fa29b9bd3366a44d4643b5e3a710c 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -79,6 +79,7 @@ INSTANTIATE_TEST_CASE_P(
         "cppIndent.vert",
         "cppNest.vert",
         "cppBad.vert",
+        "cppBad2.vert",
         "cppComplexExpr.vert",
         "badChars.frag",
         "pointCoord.frag",