diff options
| -rw-r--r-- | slang.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 39 | ||||
| -rw-r--r-- | source/slang/slang-check-impl.h | 11 | ||||
| -rw-r--r-- | source/slang/slang-check-shader.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-options.cpp | 2 | ||||
| -rw-r--r-- | tests/language-feature/capability/capability1.slang | 2 | ||||
| -rw-r--r-- | tests/language-feature/capability/capability2.slang | 2 | ||||
| -rw-r--r-- | tests/language-feature/capability/capability3.slang | 2 | ||||
| -rw-r--r-- | tests/language-feature/capability/capability4.slang | 2 |
9 files changed, 48 insertions, 17 deletions
@@ -842,6 +842,7 @@ extern "C" Language, MatrixLayoutColumn, // bool MatrixLayoutRow, // bool + IgnoreCapabilities, // bool ModuleName, // stringValue0: module name. Output, Profile, // intValue0: profile diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 131d30d98..d819121bc 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -9760,7 +9760,9 @@ namespace Slang // then the decl is using things that require conflicting set of capabilities, and we should diagnose an error. if (referencedDecl && decl) { - visitor->getSink()->diagnose( + diagnoseCapabilityErrors( + visitor->getSink(), + visitor->getOptionSet(), referenceLoc, Diagnostics::conflictingCapabilityDueToUseOfDecl, referencedDecl, @@ -9770,7 +9772,9 @@ namespace Slang } else if (decl) { - visitor->getSink()->diagnose( + diagnoseCapabilityErrors( + visitor->getSink(), + visitor->getOptionSet(), referenceLoc, Diagnostics::conflictingCapabilityDueToStatement, nodeCaps, @@ -9779,7 +9783,9 @@ namespace Slang } else { - visitor->getSink()->diagnose( + diagnoseCapabilityErrors( + visitor->getSink(), + visitor->getOptionSet(), referenceLoc, Diagnostics::conflictingCapabilityDueToStatementEnclosingFunc, nodeCaps, @@ -9807,8 +9813,11 @@ namespace Slang typedef SemanticsDeclReferenceVisitor<CapabilityDeclReferenceVisitor<ProcessFunc>> Base; const ProcessFunc& handleReferenceFunc; - CapabilityDeclReferenceVisitor(const ProcessFunc& processFunc, SemanticsContext const& outer) + + SemanticsContext& outerContext; + CapabilityDeclReferenceVisitor(const ProcessFunc& processFunc, SemanticsContext& outer) : handleReferenceFunc(processFunc) + , outerContext(outer) , SemanticsDeclReferenceVisitor<CapabilityDeclReferenceVisitor<ProcessFunc>>(outer) { } @@ -9834,7 +9843,7 @@ namespace Slang targetCap.join(bodyCap); if (targetCap.isInvalid()) { - Base::getSink()->diagnose(targetCase->body->loc, Diagnostics::conflictingCapabilityDueToStatement, bodyCap, "target_switch", oldCap); + diagnoseCapabilityErrors(Base::getSink(), outerContext.getOptionSet(), targetCase->body->loc, Diagnostics::conflictingCapabilityDueToStatement, bodyCap, "target_switch", oldCap); } for (auto& conjunction : targetCap.getExpandedAtoms()) set.unionWith(conjunction); @@ -9974,7 +9983,7 @@ namespace Slang auto stageCaps = CapabilitySet(Profile(entryPointAttr->stage).getCapabilityName()); if (declaredCaps.isIncompatibleWith(stageCaps)) { - getSink()->diagnose(funcDecl->loc, Diagnostics::stageIsInCompatibleWithCapabilityDefinition, funcDecl, stageCaps, declaredCaps); + diagnoseCapabilityErrors(getSink(), this->getOptionSet(), funcDecl->loc, Diagnostics::stageIsInCompatibleWithCapabilityDefinition, funcDecl, stageCaps, declaredCaps); } else { @@ -9994,7 +10003,9 @@ namespace Slang { if (funcDecl->inferredCapabilityRequirements != getAnyPlatformCapabilitySet()) { - getSink()->diagnose( + diagnoseCapabilityErrors( + getSink(), + this->getOptionSet(), funcDecl->loc, Diagnostics::missingCapabilityRequirementOnPublicDecl, funcDecl, funcDecl->inferredCapabilityRequirements); @@ -10110,7 +10121,7 @@ namespace Slang return defaultVis; } - void diagnoseCapabilityProvenance(DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom) + void diagnoseCapabilityProvenance(CompilerOptionSet& optionSet, DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom) { HashSet<Decl*> printedDecls; auto thisModule = getModuleDecl(decl); @@ -10141,7 +10152,7 @@ namespace Slang } if (declToPrint) { - sink->diagnose(declToPrint->loc, Diagnostics::seeDefinitionOf, declToPrint); + diagnoseCapabilityErrors(sink, optionSet, declToPrint->loc, Diagnostics::seeDefinitionOf, declToPrint); } } @@ -10164,14 +10175,14 @@ namespace Slang loc = refLoc; } else - sink->diagnose(refLoc, Diagnostics::seeDefinitionOf, "statement"); + diagnoseCapabilityErrors(sink, visitor->getOptionSet(), refLoc, Diagnostics::seeDefinitionOf, "statement"); } }); if (!refDecl) break; if (printedDecls.add(refDecl)) { - sink->diagnose(loc, Diagnostics::seeUsingOf, refDecl); + diagnoseCapabilityErrors(sink, visitor->getOptionSet(), loc, Diagnostics::seeUsingOf, refDecl); decl = refDecl; } else @@ -10220,7 +10231,7 @@ namespace Slang continue; if (decl->inferredCapabilityRequirements.isIncompatibleWith(atom)) { - getSink()->diagnose(decl->loc, Diagnostics::declHasDependenciesNotDefinedOnTarget, decl, atom); + diagnoseCapabilityErrors(getSink(), this->getOptionSet(), decl->loc, Diagnostics::declHasDependenciesNotDefinedOnTarget, decl, atom); diagnoseIncompatibleAtomProvenance(this, getSink(), decl, atom); return; } @@ -10279,10 +10290,10 @@ namespace Slang } } - getSink()->diagnose(decl->loc, diagnosticInfo, decl, missingAtom); + diagnoseCapabilityErrors(getSink(), this->getOptionSet(), decl->loc, diagnosticInfo, decl, missingAtom); // Print provenances. - diagnoseCapabilityProvenance(getSink(), decl, missingAtom); + diagnoseCapabilityProvenance(this->getOptionSet(), getSink(), decl, missingAtom); } } diff --git a/source/slang/slang-check-impl.h b/source/slang/slang-check-impl.h index 2f8565f7f..f0c6d693d 100644 --- a/source/slang/slang-check-impl.h +++ b/source/slang/slang-check-impl.h @@ -11,6 +11,14 @@ namespace Slang { + template<typename P, typename... Args> + bool diagnoseCapabilityErrors(DiagnosticSink* sink, CompilerOptionSet& optionSet, P const& pos, DiagnosticInfo const& info, Args const&... args) + { + if (optionSet.getBoolOption(CompilerOptionName::IgnoreCapabilities)) + return false; + return sink->diagnose(pos, info, args...); + } + /// Should the given `decl` be treated as a static rather than instance declaration? bool isEffectivelyStatic( Decl* decl); @@ -793,6 +801,7 @@ namespace Slang {} SharedSemanticsContext* getShared() { return m_shared; } + CompilerOptionSet& getOptionSet() { return getShared()->getOptionSet(); } ASTBuilder* getASTBuilder() { return m_astBuilder; } DiagnosticSink* getSink() { return m_sink; } @@ -2768,7 +2777,7 @@ namespace Slang DeclVisibility getDeclVisibility(Decl* decl); - void diagnoseCapabilityProvenance(DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom); + void diagnoseCapabilityProvenance(CompilerOptionSet& optionSet, DiagnosticSink* sink, Decl* decl, CapabilityAtom missingAtom); void _ensureAllDeclsRec( SemanticsDeclVisitorBase* visitor, diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp index 77a57d71e..d4e8bda6f 100644 --- a/source/slang/slang-check-shader.cpp +++ b/source/slang/slang-check-shader.cpp @@ -519,7 +519,7 @@ namespace Slang targetCaps.join(stageCapabilitySet); if (targetCaps.isIncompatibleWith(entryPointFuncDecl->inferredCapabilityRequirements)) { - sink->diagnose(entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps); + diagnoseCapabilityErrors(sink, linkage->m_optionSet, entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps); auto& interredCapConjunctions = entryPointFuncDecl->inferredCapabilityRequirements.getExpandedAtoms(); // Find out what exactly is incompatible and print out a trace of provenance to @@ -533,7 +533,7 @@ namespace Slang { if (CapabilityConjunctionSet(inferredAtom).isIncompatibleWith(atom)) { - diagnoseCapabilityProvenance(sink, entryPointFuncDecl, inferredAtom); + diagnoseCapabilityProvenance(linkage->m_optionSet, sink, entryPointFuncDecl, inferredAtom); goto breakLabel; } } diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index 3f17d6d44..896388db0 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -289,6 +289,7 @@ void initCommandOptions(CommandOptions& options) { OptionKind::Language, "-lang", "-lang <language>", "Set the language for the following input files."}, { OptionKind::MatrixLayoutColumn, "-matrix-layout-column-major", nullptr, "Set the default matrix layout to column-major."}, { OptionKind::MatrixLayoutRow,"-matrix-layout-row-major", nullptr, "Set the default matrix layout to row-major."}, + { OptionKind::IgnoreCapabilities,"-ignore-capabilities", nullptr, "Do not warn or error if capabilities are violated"}, { OptionKind::ModuleName, "-module-name", "-module-name <name>", "Set the module name to use when compiling multiple .slang source files into a single module."}, { OptionKind::Output, "-o", "-o <path>", @@ -1682,6 +1683,7 @@ SlangResult OptionsParser::_parse( case OptionKind::VulkanUseEntryPointName: case OptionKind::VulkanUseGLLayout: case OptionKind::VulkanEmitReflection: + case OptionKind::IgnoreCapabilities: case OptionKind::DefaultImageFormatUnknown: case OptionKind::Obfuscate: case OptionKind::OutputIncludes: diff --git a/tests/language-feature/capability/capability1.slang b/tests/language-feature/capability/capability1.slang index bccccb964..b340f5025 100644 --- a/tests/language-feature/capability/capability1.slang +++ b/tests/language-feature/capability/capability1.slang @@ -1,4 +1,6 @@ //TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly -entry main2 -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target spirv -emit-spirv-directly -entry main2 -stage compute -ignore-capabilities +// CHECK_IGNORE_CAPS-NOT: error 36104 [require(spvShaderClockKHR)] void leafFunc1() {} diff --git a/tests/language-feature/capability/capability2.slang b/tests/language-feature/capability/capability2.slang index 743f998cf..b66da4563 100644 --- a/tests/language-feature/capability/capability2.slang +++ b/tests/language-feature/capability/capability2.slang @@ -1,4 +1,6 @@ //TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly -entry main -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target spirv -emit-spirv-directly -entry main -stage compute -ignore-capabilities +// CHECK_IGNORE_CAPS-NOT: error 36104 module test; [require(spvAtomicFloat16AddEXT)] diff --git a/tests/language-feature/capability/capability3.slang b/tests/language-feature/capability/capability3.slang index f7ba1d793..02eb7d495 100644 --- a/tests/language-feature/capability/capability3.slang +++ b/tests/language-feature/capability/capability3.slang @@ -1,4 +1,6 @@ //TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly -entry main -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target spirv -emit-spirv-directly -entry main -stage compute -ignore-capabilities +// CHECK_IGNORE_CAPS-NOT: error 36108 // Test that capabilities can be declared on module. diff --git a/tests/language-feature/capability/capability4.slang b/tests/language-feature/capability/capability4.slang index fce1f78ac..f6ee30339 100644 --- a/tests/language-feature/capability/capability4.slang +++ b/tests/language-feature/capability/capability4.slang @@ -1,4 +1,6 @@ //TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly -entry main -stage compute +//TEST:SIMPLE(filecheck=CHECK_IGNORE_CAPS): -target spirv -emit-spirv-directly -entry main -stage compute -ignore-capabilities +// CHECK_IGNORE_CAPS-NOT: error 36108 // Check that a non-static member method implictly requires capabilities // defined in ThisType. |
