diff options
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); |
