diff --git a/src/Magnum/ShaderTools/AbstractConverter.cpp b/src/Magnum/ShaderTools/AbstractConverter.cpp index 820f1e9ae..8e70275d0 100644 --- a/src/Magnum/ShaderTools/AbstractConverter.cpp +++ b/src/Magnum/ShaderTools/AbstractConverter.cpp @@ -84,6 +84,8 @@ ConverterFeatures AbstractConverter::features() const { } void AbstractConverter::setFlags(const ConverterFlags flags) { + CORRADE_ASSERT(!(flags & ConverterFlag::Quiet) != !(flags & ConverterFlag::Verbose), + "ShaderTools::AbstractConverter::setFeatures(): can't have both Quiet and Verbose set", ); _flags = flags; doSetFlags(flags); } @@ -642,7 +644,9 @@ Debug& operator<<(Debug& debug, const ConverterFlag value) { switch(value) { /* LCOV_EXCL_START */ #define _c(v) case ConverterFlag::v: return debug << "::" #v; + _c(Quiet) _c(Verbose) + _c(WarningAsError) #undef _c /* LCOV_EXCL_STOP */ } @@ -652,7 +656,10 @@ Debug& operator<<(Debug& debug, const ConverterFlag value) { Debug& operator<<(Debug& debug, const ConverterFlags value) { return Containers::enumSetDebugOutput(debug, value, "ShaderTools::ConverterFlags{}", { - ConverterFlag::Verbose}); + ConverterFlag::Quiet, + ConverterFlag::Verbose, + ConverterFlag::WarningAsError + }); } Debug& operator<<(Debug& debug, const Format value) { diff --git a/src/Magnum/ShaderTools/AbstractConverter.h b/src/Magnum/ShaderTools/AbstractConverter.h index 5d77c569f..85abd2109 100644 --- a/src/Magnum/ShaderTools/AbstractConverter.h +++ b/src/Magnum/ShaderTools/AbstractConverter.h @@ -126,11 +126,25 @@ MAGNUM_SHADERTOOLS_EXPORT Debug& operator<<(Debug& debug, ConverterFeatures valu @see @ref ConverterFlags, @ref AbstractConverter::setFlags() */ enum class ConverterFlag: UnsignedInt { + /** + * Suppress warnings, print just errors. By default the converter prints + * both warnings and errors. + * @see @ref ConverterFlag::WarningAsError + */ + Quiet = 1 << 0, + /** * Print verbose diagnostic. By default the converter only prints warnings * and errors. */ - Verbose = 1 << 0 + Verbose = 1 << 1, + + /** + * Treat warnings as error. By default, if a warning occurs, + * validation or conversion succeeds. With this flag set, it fails. + * @see @ref ConverterFlag::Quiet + */ + WarningAsError = 1 << 2 }; /** diff --git a/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp b/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp index ee732b525..fad87e037 100644 --- a/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp +++ b/src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp @@ -47,6 +47,7 @@ struct AbstractConverterTest: TestSuite::Tester { void featuresNone(); void setFlags(); + void setFlagsBothQuietAndVerbose(); void setFlagsNotImplemented(); void setInputOutputFormat(); @@ -166,6 +167,7 @@ AbstractConverterTest::AbstractConverterTest() { addTests({&AbstractConverterTest::featuresNone, &AbstractConverterTest::setFlags, + &AbstractConverterTest::setFlagsBothQuietAndVerbose, &AbstractConverterTest::setFlagsNotImplemented, &AbstractConverterTest::setInputOutputFormat, @@ -326,6 +328,25 @@ void AbstractConverterTest::setFlags() { CORRADE_COMPARE(converter._flags, ConverterFlag::Verbose); } +void AbstractConverterTest::setFlagsBothQuietAndVerbose() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractConverter { + ConverterFeatures doFeatures() const override { + return ConverterFeature::ValidateData; + } + void doSetInputFormat(Format, Containers::StringView) override {} + void doSetOutputFormat(Format, Containers::StringView) override {} + } converter; + + std::ostringstream out; + Error redirectError{&out}; + converter.setFlags(ConverterFlag::Quiet|ConverterFlag::Verbose); + CORRADE_COMPARE(out.str(), "ShaderTools::AbstractConverter::setFlags(): can't have both Quiet and Verbose set\n"); +} + void AbstractConverterTest::setFlagsNotImplemented() { struct: AbstractConverter { ConverterFeatures doFeatures() const override {