PP: Fix issue #426, recover from bad-source macro expansion.
authorJohn Kessenich <cepheus@frii.com>
Tue, 3 Jan 2017 00:56:08 +0000 (17:56 -0700)
committerJohn Kessenich <cepheus@frii.com>
Tue, 3 Jan 2017 00:56:08 +0000 (17:56 -0700)
Test/baseResults/cppBad2.vert.out [new file with mode: 0755]
Test/cppBad2.vert [new file with mode: 0755]
glslang/Include/revision.h
glslang/MachineIndependent/preprocessor/Pp.cpp
gtests/AST.FromFile.cpp

diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out
new file mode 100755 (executable)
index 0000000..0398e5e
--- /dev/null
@@ -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 (executable)
index 0000000..5e61b49
--- /dev/null
@@ -0,0 +1,3 @@
+#define a b(\r
+#define b(x)\r
+b(a)
\ No newline at end of file
index 4d96825..cccc796 100644 (file)
@@ -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"
index 595b729..eb2f3df 100644 (file)
@@ -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;
index 7070533..d8a5ef9 100644 (file)
@@ -79,6 +79,7 @@ INSTANTIATE_TEST_CASE_P(
         "cppIndent.vert",
         "cppNest.vert",
         "cppBad.vert",
+        "cppBad2.vert",
         "cppComplexExpr.vert",
         "badChars.frag",
         "pointCoord.frag",