summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--slang.h1
-rw-r--r--source/slang/slang-check-decl.cpp39
-rw-r--r--source/slang/slang-check-impl.h11
-rw-r--r--source/slang/slang-check-shader.cpp4
-rw-r--r--source/slang/slang-options.cpp2
-rw-r--r--tests/language-feature/capability/capability1.slang2
-rw-r--r--tests/language-feature/capability/capability2.slang2
-rw-r--r--tests/language-feature/capability/capability3.slang2
-rw-r--r--tests/language-feature/capability/capability4.slang2
9 files changed, 48 insertions, 17 deletions
diff --git a/slang.h b/slang.h
index 7ee7c2697..1b7737f18 100644
--- a/slang.h
+++ b/slang.h
@@ -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.