diff options
| author | Yong He <yonghe@outlook.com> | 2025-02-06 22:02:43 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-06 22:02:43 -0800 |
| commit | bae87afb20f95f9f27c64c4955bbc4464c576509 (patch) | |
| tree | 44d079bd76002d69be20efdbd03ac6ff62ef8caf /source/slang/slang-check-stmt.cpp | |
| parent | 075b10e69055acc6536d74c1cb3399e0fe75338d (diff) | |
Support stage_switch. (#6311)
* Support stage_switch.
* Update proposal status.
* Fix gl_InstanceID.
* Fix.
Diffstat (limited to 'source/slang/slang-check-stmt.cpp')
| -rw-r--r-- | source/slang/slang-check-stmt.cpp | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/source/slang/slang-check-stmt.cpp b/source/slang/slang-check-stmt.cpp index 151c9324a..db6f00d23 100644 --- a/source/slang/slang-check-stmt.cpp +++ b/source/slang/slang-check-stmt.cpp @@ -367,6 +367,40 @@ void SemanticsStmtVisitor::visitTargetSwitchStmt(TargetSwitchStmt* stmt) HashSet<Stmt*> checkedStmt; for (auto caseStmt : stmt->targetCases) { + CapabilitySet set((CapabilityName)caseStmt->capability); + + CapabilityName canonicalStage = CapabilityName::Invalid; + bool isStage = isStageAtom((CapabilityName)caseStmt->capability, canonicalStage); + if (as<StageSwitchStmt>(stmt)) + { + if (!isStage && caseStmt->capability != 0) + { + getSink()->diagnose( + caseStmt->capabilityToken.loc, + Diagnostics::unknownStageName, + caseStmt->capabilityToken); + } + caseStmt->capability = (int)canonicalStage; + } + else + { + if (isStage) + { + getSink()->diagnose( + caseStmt->capabilityToken.loc, + Diagnostics::targetSwitchCaseCannotBeAStage); + } + else if ( + caseStmt->capabilityToken.getContentLength() != 0 && + (set.getCapabilityTargetSets().getCount() != 1 || set.isInvalid() || set.isEmpty())) + { + getSink()->diagnose( + caseStmt->capabilityToken.loc, + Diagnostics::invalidTargetSwitchCase, + capabilityNameToString((CapabilityName)caseStmt->capability)); + } + } + if (checkedStmt.contains(caseStmt->body)) continue; subContext.checkStmt(caseStmt); @@ -377,7 +411,6 @@ void SemanticsStmtVisitor::visitTargetSwitchStmt(TargetSwitchStmt* stmt) void SemanticsStmtVisitor::visitTargetCaseStmt(TargetCaseStmt* stmt) { auto switchStmt = FindOuterStmt<TargetSwitchStmt>(); - CapabilitySet set((CapabilityName)stmt->capability); if (getShared()->isInLanguageServer() && getShared()->getSession()->getCompletionRequestTokenName() == stmt->capabilityToken.getName()) @@ -385,15 +418,6 @@ void SemanticsStmtVisitor::visitTargetCaseStmt(TargetCaseStmt* stmt) getShared()->getLinkage()->contentAssistInfo.completionSuggestions.scopeKind = CompletionSuggestions::ScopeKind::Capabilities; } - - if (stmt->capabilityToken.getContentLength() != 0 && - (set.getCapabilityTargetSets().getCount() != 1 || set.isInvalid() || set.isEmpty())) - { - getSink()->diagnose( - stmt->capabilityToken.loc, - Diagnostics::invalidTargetSwitchCase, - capabilityNameToString((CapabilityName)stmt->capability)); - } if (!switchStmt) { getSink()->diagnose(stmt, Diagnostics::caseOutsideSwitch); |
