== Why is this an issue?

For completeness, a ``++switch++`` over the values of an ``++enum++`` must either address each value in the ``++enum++`` or contain a ``++default++`` case. ``++switch++`` statements that are not over ``++enum++`` must end with a ``++default++`` case.

This rule is a more nuanced version of S131.
Use S131 if you want to require a `++default++` case for every `++switch++`
even if it already handles all enumerators of an `++enum++`.
Otherwise, use this rule.

=== Noncompliant code example

[source,cpp]
----
typedef enum {APPLE, GRAPE, KIWI} fruit;

void example(fruit f, int i) {
  switch (f) {  // Noncompliant; no case for KIWI
    case APPLE:
      //...
    case GRAPE:
      //...
    case 3: // Noncompliant; case value not in enum
      // ...
  }

  switch (i) { // Noncompliant; no default
    case 0:
      // ...
    case 1:
      // ...
  }
}
----


=== Compliant solution

[source,cpp]
----
typedef enum {APPLE, GRAPE, KIWI} fruit;

void example(fruit f) {
  switch (f) {
    case APPLE:
      //...
    case GRAPE:
      //...
    default:
      // ...
  }

  switch (i) {
    case 0:
      // ...
    case 1:
      // ...
    default:
      // ...
  }
}
----
or

[source,cpp]
----
typedef enum {APPLE, GRAPE, KIWI} fruit;

void example(fruit f) {
  switch (f) {
    case APPLE:
      //...
    case GRAPE:
      //...
    case KIWI:
      //...
  }

  switch (i) {
    case 0:
    case 1:
      // ...
    default:
      // ...
  }
}
----


== Resources

* {cpp} Core Guidelines - https://github.com/isocpp/CppCoreGuidelines/blob/e49158a/CppCoreGuidelines.md#enum2-use-enumerations-to-represent-sets-of-related-named-constants[Enum.2: Use enumerations to represent sets of related named constants]

=== Related rules

* S131

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

* Add a "default" case to this switch or cover all values of the enum.
* Case value not in enum.
* Add a "default" case to this switch.


=== Highlighting

``++switch++`` or ``++case++`` keyword


'''
== Comments And Links
(visible only on this page)

=== relates to: S131

=== on 13 Jun 2017, 08:50:16 Freddy Mallet wrote:
For some implementation details, RSPEC-131 can't support in C/{cpp} the following exception and so a dedicated rule has been created:

* If the switch parameter is an enum and if all the constants of this enum are used in the case statements, then no default clause is expected
This RSPEC must not be covered by any language except C/{cpp} and Objective-C

endif::env-github,rspecator-view[]
