diff --git a/flang/lib/Semantics/check-case.cpp b/flang/lib/Semantics/check-case.cpp --- a/flang/lib/Semantics/check-case.cpp +++ b/flang/lib/Semantics/check-case.cpp @@ -9,6 +9,7 @@ #include "check-case.h" #include "flang/Common/idioms.h" #include "flang/Common/reference.h" +#include "flang/Common/template.h" #include "flang/Evaluate/fold.h" #include "flang/Evaluate/type.h" #include "flang/Parser/parse-tree.h" @@ -201,6 +202,22 @@ bool hasErrors_{false}; }; +template struct TypeVisitor { + using Result = bool; + using Types = evaluate::CategoryTypes; + template Result Test() { + if (T::kind == exprType.kind()) { + CaseValues(context, exprType).Check(caseList); + return true; + } else { + return false; + } + } + SemanticsContext &context; + const evaluate::DynamicType &exprType; + const std::list &caseList; +}; + void CaseChecker::Enter(const parser::CaseConstruct &construct) { const auto &selectCaseStmt{ std::get>(construct.t)}; @@ -216,32 +233,17 @@ std::get>(construct.t)}; switch (exprType->category()) { case TypeCategory::Integer: - CaseValues>{context_, *exprType} - .Check(caseList); + common::SearchTypes( + TypeVisitor{context_, *exprType, caseList}); return; case TypeCategory::Logical: CaseValues>{context_, *exprType} .Check(caseList); return; case TypeCategory::Character: - switch (exprType->kind()) { - SWITCH_COVERS_ALL_CASES - case 1: - CaseValues>{ - context_, *exprType} - .Check(caseList); - return; - case 2: - CaseValues>{ - context_, *exprType} - .Check(caseList); - return; - case 4: - CaseValues>{ - context_, *exprType} - .Check(caseList); - return; - } + common::SearchTypes( + TypeVisitor{context_, *exprType, caseList}); + return; default: break; } diff --git a/flang/test/Semantics/case01.f90 b/flang/test/Semantics/case01.f90 --- a/flang/test/Semantics/case01.f90 +++ b/flang/test/Semantics/case01.f90 @@ -135,11 +135,11 @@ case (40) case (90) case (91:99) - !ERROR: CASE (81_16:90_16) conflicts with previous cases + !ERROR: CASE (81_4:90_4) conflicts with previous cases case (81:90) - !ERROR: CASE (:80_16) conflicts with previous cases + !ERROR: CASE (:80_4) conflicts with previous cases case (:80) - !ERROR: CASE (200_16) conflicts with previous cases + !ERROR: CASE (200_4) conflicts with previous cases case (200) case default end select