diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index 4ea96138..37313fd0 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -582,7 +582,7 @@ void CompileAndLinkShaderUnits(std::vector compUnits) if (Options & EOptionOutputPreprocessed) { std::string str; - glslang::TShader::ForbidInclude includer; + glslang::TShader::Includer includer; if (shader->preprocess(&Resources, defaultVersion, ENoProfile, false, false, messages, &str, includer)) { PutsIfNonEmpty(str.c_str()); diff --git a/Test/baseResults/preprocessor.include.disabled.vert.err b/Test/baseResults/preprocessor.include.disabled.vert.err index 836a3d67..14192046 100644 --- a/Test/baseResults/preprocessor.include.disabled.vert.err +++ b/Test/baseResults/preprocessor.include.disabled.vert.err @@ -3,7 +3,7 @@ ERROR: 0:8000: '#include' : must be followed by a header name ERROR: 0:8001: '#include' : required extension not requested: GL_GOOGLE_include_directive ERROR: 0:8001: '#include' : must be followed by a header name ERROR: 0:8002: '#include' : required extension not requested: GL_GOOGLE_include_directive -ERROR: 0:8002: '#include' : unexpected include directive for header name: foo +ERROR: 0:8002: '#include' : Could not process include directive for header name: foo ERROR: 0:8003: '#include' : required extension not requested: GL_GOOGLE_include_directive ERROR: 0:8003: '#include' : extra content after header name: foo ERROR: 0:8004: '#include' : required extension not requested: GL_GOOGLE_include_directive diff --git a/Test/baseResults/preprocessor.include.enabled.vert.err b/Test/baseResults/preprocessor.include.enabled.vert.err index 0b0cbae1..252e661f 100644 --- a/Test/baseResults/preprocessor.include.enabled.vert.err +++ b/Test/baseResults/preprocessor.include.enabled.vert.err @@ -1,19 +1,19 @@ ERROR: 0:8000: '#include' : must be followed by a header name ERROR: 0:8001: '#include' : must be followed by a header name -ERROR: 0:8002: '#include' : unexpected include directive for header name: foo.oeu -ERROR: 0:8003: '#include' : unexpected include directive for header name: foo.oeu/ao eu/ao.h -ERROR: 0:8004: '#include' : unexpected include directive for header name: foo -ERROR: 0:8006: '#include' : unexpected include directive for header name: foo.oe -ERROR: 0:8007: '#include' : unexpected include directive for header name: foo"bar" -ERROR: 0:8008: '#include' : unexpected include directive for header name: foo\bar -ERROR: 0:8009: '#include' : unexpected include directive for header name: foo.oe> -ERROR: 0:8010: '#include' : unexpected include directive for header name: foo +ERROR: 0:8002: '#include' : Could not process include directive for header name: foo.oeu +ERROR: 0:8003: '#include' : Could not process include directive for header name: foo.oeu/ao eu/ao.h +ERROR: 0:8004: '#include' : Could not process include directive for header name: foo +ERROR: 0:8006: '#include' : Could not process include directive for header name: foo.oe +ERROR: 0:8007: '#include' : Could not process include directive for header name: foo"bar" +ERROR: 0:8008: '#include' : Could not process include directive for header name: foo\bar +ERROR: 0:8009: '#include' : Could not process include directive for header name: foo.oe> +ERROR: 0:8010: '#include' : Could not process include directive for header name: foo ERROR: 0:8011: '#include' : extra content after header name: foo2.h ERROR: 0:8012: '#include' : extra content after header name: foo.h -ERROR: 0:8014: '#include' : unexpected include directive for header name: ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 +ERROR: 0:8014: '#include' : Could not process include directive for header name: ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 ERROR: 0:8016: '' : header name too long -ERROR: 0:8016: '#include' : unexpected include directive for header name: ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 +ERROR: 0:8016: '#include' : Could not process include directive for header name: ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 ERROR: 0:8017: '#include' : expected newline after header name: no-eol ERROR: 17 compilation errors. No code generated. diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 020d6971..852dd2e5 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.1748" +#define GLSLANG_REVISION "Overload400-PrecQual.1750" #define GLSLANG_DATE "06-Jan-2017" diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index b5e08a7e..ac1156e4 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -221,7 +221,7 @@ bool InitializeSymbolTable(const TString& builtIns, int version, EProfile profil language, infoSink, spvVersion, true, EShMsgDefault, true)); - TShader::ForbidInclude includer; + TShader::Includer includer; TPpContext ppContext(*parseContext, "", includer); TScanContext scanContext(*parseContext); parseContext->setScanContext(&scanContext); @@ -1217,7 +1217,7 @@ int ShCompile( compiler->infoSink.debug.erase(); TIntermediate intermediate(compiler->getLanguage()); - TShader::ForbidInclude includer; + TShader::Includer includer; bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr, "", optLevel, resources, defaultVersion, ENoProfile, false, forwardCompatible, messages, intermediate, includer); diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index ca949f55..411806f4 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -576,12 +576,12 @@ int TPpContext::CPPifdef(int defined, TPpToken* ppToken) int TPpContext::CPPinclude(TPpToken* ppToken) { const TSourceLoc directiveLoc = ppToken->loc; - TShader::Includer::IncludeType includeType = TShader::Includer::EIncludeRelative; + bool addLocalSearch = true; // to additionally include the extra "" paths int token = scanToken(ppToken); // handle -style #include if (token == '<') { - includeType = TShader::Includer::EIncludeStandard; + addLocalSearch = false; token = scanHeaderName(ppToken, '>'); } // otherwise ppToken already has the header name and it was "header-name" style @@ -605,8 +605,18 @@ int TPpContext::CPPinclude(TPpToken* ppToken) } // Process well-formed directive - TShader::Includer::IncludeResult* res = includer.include(filename.c_str(), includeType, currentSourceFile.c_str(), - includeStack.size() + 1); + + // Find the inclusion, first look in "Local" ("") paths, if requested, + // otherwise, only search the "System" (<>) paths. + TShader::Includer::IncludeResult* res = nullptr; + if (addLocalSearch) + res = includer.includeLocal(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1); + if (! res || res->headerName.empty()) { + includer.releaseInclude(res); + res = includer.includeSystem(filename.c_str(), currentSourceFile.c_str(), includeStack.size() + 1); + } + + // Process the results if (res && !res->headerName.empty()) { if (res->headerData && res->headerLength) { // path for processing one or more tokens from an included header, hand off 'res' diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index 76ded8de..4b3b1f60 100644 --- a/glslang/Public/ShaderLang.h +++ b/glslang/Public/ShaderLang.h @@ -331,11 +331,6 @@ public: // release the IncludeResult object. class Includer { public: - typedef enum { - EIncludeRelative, // For #include "something" - EIncludeStandard // Reserved. For #include - } IncludeType; - // An IncludeResult contains the resolved name and content of a source // inclusion. struct IncludeResult { @@ -360,7 +355,9 @@ public: IncludeResult(); }; - // Resolves an inclusion request by name, type, current source name, + // For both include methods below: + // + // Resolves an inclusion request by name, current source name, // and include depth. // On success, returns an IncludeResult containing the resolved name // and content of the include. On failure, returns an IncludeResult @@ -369,34 +366,33 @@ public: // of the returned IncludeResult value, and those contents must // remain valid until the releaseInclude method is called on that // IncludeResult object. - virtual IncludeResult* include(const char* headerName, - IncludeType type, - const char* includerName, - size_t inclusionDepth) = 0; + // + // Note "local" vs. "system" is not an "either/or": "local" is an + // extra thing to do over "system". Both might get called, as per + // the C++ specification. + + // For the "system" or <>-style includes; search the "system" paths. + virtual IncludeResult* includeSystem(const char* headerName, + const char* includerName, + size_t inclusionDepth) { return nullptr; } + + // For the "local"-only aspect of a "" include. Should not search in the + // "system" paths, because on returning a failure, the parser will + // call includeSystem() to look in the "system" locations. + virtual IncludeResult* includeLocal(const char* headerName, + const char* includerName, + size_t inclusionDepth) { return nullptr; } + // Signals that the parser will no longer use the contents of the // specified IncludeResult. - virtual void releaseInclude(IncludeResult* result) = 0; + virtual void releaseInclude(IncludeResult* result) { } virtual ~Includer() {} }; - // Returns an error message for any #include directive. - class ForbidInclude : public Includer { - public: - IncludeResult* include(const char*, IncludeType, const char*, size_t) override - { - const char* unexpected_include = "unexpected include directive"; - return new IncludeResult(std::string(""), unexpected_include, strlen(unexpected_include), nullptr); - } - virtual void releaseInclude(IncludeResult* result) override - { - delete result; - } - }; - bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile, bool forwardCompatible, EShMessages messages) { - TShader::ForbidInclude includer; + TShader::Includer includer; return parse(res, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, includer); } diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h index e795e8dc..ea377141 100644 --- a/gtests/TestFixture.h +++ b/gtests/TestFixture.h @@ -521,7 +521,7 @@ public: glslang::TShader shader(EShLangVertex); shader.setStringsWithLengths(&shaderStrings, &shaderLengths, 1); std::string ppShader; - glslang::TShader::ForbidInclude includer; + glslang::TShader::Includer includer; const bool success = shader.preprocess( &glslang::DefaultTBuiltInResource, defaultVersion, defaultProfile, forceVersionProfile, isForwardCompatible, (EShMessages)(EShMsgOnlyPreprocessor | EShMsgCascadingErrors),