From 97cb85c7d6751f81b7036c2fc6fdc2034d7fefd1 Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Tue, 4 Apr 2017 12:28:20 -0600
Subject: [PATCH] PP: Fix #783: Catch end-of-argument expansion in token
 pasting.

---
 Test/baseResults/tokenPaste.vert.out                  | 3 ++-
 Test/tokenPaste.vert                                  | 6 +++++-
 glslang/Include/revision.h                            | 2 +-
 glslang/MachineIndependent/preprocessor/PpScanner.cpp | 7 +++++++
 4 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Test/baseResults/tokenPaste.vert.out b/Test/baseResults/tokenPaste.vert.out
index e544d9ee3..acc2ced1a 100755
--- a/Test/baseResults/tokenPaste.vert.out
+++ b/Test/baseResults/tokenPaste.vert.out
@@ -8,7 +8,8 @@ ERROR: 0:69: '##' : combined token is invalid
 ERROR: 0:82: 'macro expansion' : Too few args in Macro rec
 ERROR: 0:82: '##' : unexpected location 
 ERROR: 0:82: '##' : unexpected location 
-ERROR: 8 compilation errors.  No code generated.
+ERROR: 0:86: '##' : unexpected location; end of argument 
+ERROR: 9 compilation errors.  No code generated.
 
 
 Shader version: 450
diff --git a/Test/tokenPaste.vert b/Test/tokenPaste.vert
index 7aa113a29..40de6f921 100644
--- a/Test/tokenPaste.vert
+++ b/Test/tokenPaste.vert
@@ -79,4 +79,8 @@ uniform M_OUTER(argPaste);
 uniform M_OUTER2(argPaste);
 
 #define rec(x)##
-rec(rec())
\ No newline at end of file
+rec(rec())
+
+#define bax(bay)
+#define baz bax(/##)
+baz
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 0b72b5b1e..2704df3a2 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.1971"
+#define GLSLANG_REVISION "Overload400-PrecQual.1974"
 #define GLSLANG_DATE "04-Apr-2017"
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index b9e7a5b54..dd1626932 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -799,6 +799,7 @@ int TPpContext::tokenPaste(int token, TPpToken& ppToken)
         token = scanToken(&pastedPpToken);
         assert(token == PpAtomPaste);
 
+        // This covers end of macro expansion
         if (endOfReplacementList()) {
             parseContext.ppError(ppToken.loc, "unexpected location; end of replacement list", "##", "");
             break;
@@ -807,6 +808,12 @@ int TPpContext::tokenPaste(int token, TPpToken& ppToken)
         // get the token after the ##
         token = scanToken(&pastedPpToken);
 
+        // This covers end of argument expansion
+        if (token == tMarkerInput::marker) {
+            parseContext.ppError(ppToken.loc, "unexpected location; end of argument", "##", "");
+            break;
+        }
+
         // get the token text
         switch (resultToken) {
         case PpAtomIdentifier:
-- 
GitLab