mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 19:40:06 +00:00
PP: Don't report certain error about '#' when #if'd out
Don't report the following error when scanning inactive code (e.g. code inside #if 0): "error: '#' : (#) can be preceded in its line only by spaces or horizontal tab" Adds a variable to PpContext to say whether we're currently skipping over an inactive #if/#ifdef/#elif/#else, and don't report the error inside scanToken if true. fixes 3704
This commit is contained in:
parent
45f2b112ce
commit
9cd7ca26a2
29
Test/baseResults/preprocess.inactive_stringify.vert.out
Executable file
29
Test/baseResults/preprocess.inactive_stringify.vert.out
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#version 460
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(1.0);
|
||||||
|
}
|
||||||
|
|
28
Test/preprocess.inactive_stringify.vert
Executable file
28
Test/preprocess.inactive_stringify.vert
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#version 460
|
||||||
|
|
||||||
|
// This tests that the preprocessor error
|
||||||
|
// "error: '#' : (#) can be preceded in its line only by spaces or horizontal tab"
|
||||||
|
// isn't enforced when inactive (e.g. inside #if 0)
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define STRINGIFY(X) #X
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define C 0
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
#ifdef A
|
||||||
|
#elif defined B
|
||||||
|
#elif C
|
||||||
|
// OK, since preprocessor evaluates to inactive
|
||||||
|
#define STRINGIFY(X) #X
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// OK in comments
|
||||||
|
// #define STRINGIFY(X) #X
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(1.0);
|
||||||
|
}
|
@ -241,6 +241,7 @@ int TPpContext::CPPundef(TPpToken* ppToken)
|
|||||||
*/
|
*/
|
||||||
int TPpContext::CPPelse(int matchelse, TPpToken* ppToken)
|
int TPpContext::CPPelse(int matchelse, TPpToken* ppToken)
|
||||||
{
|
{
|
||||||
|
inElseSkip = true;
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
int token = scanToken(ppToken);
|
int token = scanToken(ppToken);
|
||||||
|
|
||||||
@ -297,7 +298,7 @@ int TPpContext::CPPelse(int matchelse, TPpToken* ppToken)
|
|||||||
elseSeen[elsetracker] = false;
|
elseSeen[elsetracker] = false;
|
||||||
--elsetracker;
|
--elsetracker;
|
||||||
}
|
}
|
||||||
|
inElseSkip = false;
|
||||||
return CPPif(ppToken);
|
return CPPif(ppToken);
|
||||||
}
|
}
|
||||||
} else if (nextAtom == PpAtomElse) {
|
} else if (nextAtom == PpAtomElse) {
|
||||||
@ -312,6 +313,7 @@ int TPpContext::CPPelse(int matchelse, TPpToken* ppToken)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inElseSkip = false;
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,8 @@ TPpContext::TPpContext(TParseContextBase& pc, const std::string& rootFileName, T
|
|||||||
preamble(nullptr), strings(nullptr), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false),
|
preamble(nullptr), strings(nullptr), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false),
|
||||||
rootFileName(rootFileName),
|
rootFileName(rootFileName),
|
||||||
currentSourceFile(rootFileName),
|
currentSourceFile(rootFileName),
|
||||||
disableEscapeSequences(false)
|
disableEscapeSequences(false),
|
||||||
|
inElseSkip(false)
|
||||||
{
|
{
|
||||||
ifdepth = 0;
|
ifdepth = 0;
|
||||||
for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)
|
for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)
|
||||||
|
@ -371,7 +371,7 @@ protected:
|
|||||||
break;
|
break;
|
||||||
popInput();
|
popInput();
|
||||||
}
|
}
|
||||||
if (!inputStack.empty() && inputStack.back()->isStringInput()) {
|
if (!inputStack.empty() && inputStack.back()->isStringInput() && !inElseSkip) {
|
||||||
if (token == '\n') {
|
if (token == '\n') {
|
||||||
bool seenNumSign = false;
|
bool seenNumSign = false;
|
||||||
for (int i = 0; i < (int)lastLineTokens.size() - 1;) {
|
for (int i = 0; i < (int)lastLineTokens.size() - 1;) {
|
||||||
@ -732,6 +732,9 @@ protected:
|
|||||||
|
|
||||||
std::istringstream strtodStream;
|
std::istringstream strtodStream;
|
||||||
bool disableEscapeSequences;
|
bool disableEscapeSequences;
|
||||||
|
// True if we're skipping a section enclosed by #if/#ifdef/#elif/#else which was evaluated to
|
||||||
|
// be inactive, e.g. #if 0
|
||||||
|
bool inElseSkip;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
@ -69,6 +69,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"preprocessor.eof_missing.vert",
|
"preprocessor.eof_missing.vert",
|
||||||
"preprocess.arb_shading_language_include.vert",
|
"preprocess.arb_shading_language_include.vert",
|
||||||
"preprocess.include_directive_missing_extension.vert",
|
"preprocess.include_directive_missing_extension.vert",
|
||||||
|
"preprocess.inactive_stringify.vert"
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user