From 64bcb105c93a56ce165075b7ccdb7fcac7292dd4 Mon Sep 17 00:00:00 2001 From: John Kessenich <cepheus@frii.com> Date: Fri, 6 Dec 2013 21:45:15 +0000 Subject: [PATCH] Made '\' at end of C++ comments be a warning. It is line continuation for some versions, but not others. git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24396 e7fa87d3-cd2b-0410-9028-fcbf551c1848 --- Test/baseResults/comment.frag.out | 2 ++ Test/baseResults/lineContinuation.vert.out | 2 ++ Test/baseResults/lineContinuation100.vert.out | 6 +++--- Test/lineContinuation.vert | 6 ++++++ Test/lineContinuation100.vert | 6 +++--- glslang/Include/revision.h | 4 ++-- glslang/MachineIndependent/ParseHelper.cpp | 19 ++++++++++++++----- glslang/MachineIndependent/ParseHelper.h | 2 +- .../MachineIndependent/preprocessor/Pp.cpp | 2 +- .../preprocessor/PpScanner.cpp | 19 +++++++++++-------- 10 files changed, 45 insertions(+), 23 deletions(-) diff --git a/Test/baseResults/comment.frag.out b/Test/baseResults/comment.frag.out index 0daf7575b..c3a548c1b 100644 --- a/Test/baseResults/comment.frag.out +++ b/Test/baseResults/comment.frag.out @@ -1,5 +1,7 @@ comment.frag Warning, version 430 is not yet complete; some version-specific features are present, but many are missing. +WARNING: 0:10: 'line continuation' : used at end of comment; the following line is still part of the comment +WARNING: 0:12: 'line continuation' : used at end of comment; the following line is still part of the comment 0:? Sequence 0:17 Function Definition: main( (void) diff --git a/Test/baseResults/lineContinuation.vert.out b/Test/baseResults/lineContinuation.vert.out index 0982a25e1..344099b82 100644 --- a/Test/baseResults/lineContinuation.vert.out +++ b/Test/baseResults/lineContinuation.vert.out @@ -1,4 +1,5 @@ lineContinuation.vert +WARNING: 0:3: 'line continuation' : used at end of comment; the following line is still part of the comment ERROR: 0:6: '#error' : e1 ERROR: 0:11: '#error' : e2 ERROR: 0:18: '#error' : e3 @@ -25,6 +26,7 @@ ERROR: node is still EOpNull! 0:25 'b' (highp 4-component vector of float) 0:? Linker Objects 0:? 'foo' (highp float) +0:? 'goodDecl' (highp int) 0:? 'gl_VertexID' (gl_VertexId highp int) 0:? 'gl_InstanceID' (gl_InstanceId highp int) diff --git a/Test/baseResults/lineContinuation100.vert.out b/Test/baseResults/lineContinuation100.vert.out index 9e20998c2..75191464b 100644 --- a/Test/baseResults/lineContinuation100.vert.out +++ b/Test/baseResults/lineContinuation100.vert.out @@ -1,6 +1,6 @@ lineContinuation100.vert -ERROR: 0:3: 'line continuation' : not supported for this version or the enabled extensions -ERROR: 0:6: '#error' : e1 +WARNING: 0:3: 'line continuation' : used at end of comment, but this version does not provide line continuation +ERROR: 0:4: '#error' : good error ERROR: 0:8: 'line continuation' : not supported for this version or the enabled extensions ERROR: 0:11: '#error' : e2 ERROR: 0:13: 'line continuation' : not supported for this version or the enabled extensions @@ -8,7 +8,7 @@ ERROR: 0:14: 'line continuation' : not supported for this version or the enabled ERROR: 0:15: 'line continuation' : not supported for this version or the enabled extensions ERROR: 0:18: '#error' : e3 ERROR: 0:24: 'line continuation' : not supported for this version or the enabled extensions -ERROR: 9 compilation errors. No code generated. +ERROR: 8 compilation errors. No code generated. ERROR: node is still EOpNull! diff --git a/Test/lineContinuation.vert b/Test/lineContinuation.vert index 7909bf251..a70b625c3 100644 --- a/Test/lineContinuation.vert +++ b/Test/lineContinuation.vert @@ -28,3 +28,9 @@ vec4 foo2(vec4 a) // aoeuntheo unatehutna \ antaehnathe // anteonuth $ natohe " ' // anteonuth natohe + +#define FOO int /* \ +*/ goodDecl; + +FOO + diff --git a/Test/lineContinuation100.vert b/Test/lineContinuation100.vert index 8b164e7b7..b68b71547 100644 --- a/Test/lineContinuation100.vert +++ b/Test/lineContinuation100.vert @@ -1,9 +1,9 @@ #version 100 -// this file cont\ -ains no errors other than the #error which are there to see if line numbering for errors is correct +// non-line continuation comment \ +#error good error + -#error e1 float f\ oo; // same as 'float foo;' diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 8d866e5c4..396267d04 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -9,5 +9,5 @@ // source have to figure out how to create revision.h just to get a build // going. However, if it is not updated, it can be a version behind. -#define GLSLANG_REVISION "24390" -#define GLSLANG_DATE "2013/12/06 11:19:22" +#define GLSLANG_REVISION "24391" +#define GLSLANG_DATE "2013/12/06 11:24:47" diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 9d80e3ea0..cd15136d9 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -1410,13 +1410,22 @@ void TParseContext::reservedPpErrorCheck(TSourceLoc loc, const char* identifier, // // See if this version/profile allows use of the line-continuation character '\'. // -void TParseContext::lineContinuationCheck(TSourceLoc loc) +bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment) { - if ((profile == EEsProfile && version >= 300) || - (profile != EEsProfile && version >= 420)) - return; - const char* message = "line continuation"; + + bool lineContinuationAllowed = (profile == EEsProfile && version >= 300) || + (profile != EEsProfile && version >= 420); + + if (endOfComment) { + if (lineContinuationAllowed) + warn(loc, "used at end of comment; the following line is still part of the comment", message, ""); + else + warn(loc, "used at end of comment, but this version does not provide line continuation", message, ""); + + return lineContinuationAllowed; + } + if (messages & EShMsgRelaxedErrors) { warn(loc, "not allowed in this version", message, ""); } else { diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h index ca4778eeb..ddbf0f75b 100644 --- a/glslang/MachineIndependent/ParseHelper.h +++ b/glslang/MachineIndependent/ParseHelper.h @@ -76,7 +76,7 @@ public: const char *szExtraInfoFormat, ...); bool reservedErrorCheck(TSourceLoc, const TString&); void reservedPpErrorCheck(TSourceLoc, const char* name, const char* op); - void lineContinuationCheck(TSourceLoc); + bool lineContinuationCheck(TSourceLoc, bool endOfComment); bool builtInName(const TString&); void handlePragma(TSourceLoc, const TVector<TString>&); diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 30df40377..9214c7fdb 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -191,7 +191,7 @@ int TPpContext::CPPdefine(TPpToken* ppToken) mac.body = new TokenStream; while (token != '\n') { if (token == '\\') { - parseContext.lineContinuationCheck(ppToken->loc); + parseContext.lineContinuationCheck(ppToken->loc, false); token = currentInput->scan(this, currentInput, ppToken); if (token == '\n' || token == '\r') token = currentInput->scan(this, currentInput, ppToken); diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp index c62fff0e6..d29ac10e4 100644 --- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp +++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp @@ -285,7 +285,7 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken) do { if (ch == '\\') { // escaped character - pp->parseContext.lineContinuationCheck(ppToken->loc); + pp->parseContext.lineContinuationCheck(ppToken->loc, false); ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); if (ch == '\r' || ch == '\n') { int nextch = pp->currentInput->getch(pp, pp->currentInput, ppToken); @@ -641,12 +641,15 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken) // allow an escaped newline, otherwise escapes in comments are meaningless ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); if (ch == '\r' || ch == '\n') { - pp->parseContext.lineContinuationCheck(ppToken->loc); - int nextch = pp->currentInput->getch(pp, pp->currentInput, ppToken); - if (ch == '\r' && nextch == '\n') - ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); - else - ch = nextch; + if (! pp->parseContext.lineContinuationCheck(ppToken->loc, true)) + pp->currentInput->ungetch(pp, pp->currentInput, ch, ppToken); + else { + int nextch = pp->currentInput->getch(pp, pp->currentInput, ppToken); + if (ch == '\r' && nextch == '\n') + ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); + else + ch = nextch; + } } } } while (ch != '\n' && ch != EOF); @@ -684,7 +687,7 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken) ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); while (ch != '"' && ch != '\n' && ch != EOF) { if (ch == '\\') { - pp->parseContext.lineContinuationCheck(ppToken->loc); + pp->parseContext.lineContinuationCheck(ppToken->loc, false); ch = pp->currentInput->getch(pp, pp->currentInput, ppToken); if (ch == '\n' || ch == '\r' || ch == EOF) break; -- GitLab