A ``++Select++`` or a chain of ``++If++``/``++Elseif++`` statements is evaluated from top to bottom. At most, only one branch will be executed: the first one with a condition that evaluates to ``++true++``. 


Therefore, duplicating a condition automatically leads to dead code. Usually, this is due to a copy/paste error. At best, it's simply dead code and at worst, it's a bug that is likely to induce further bugs as the code is maintained, and obviously it could lead to unexpected behavior. 

== Noncompliant Code Example

----
     C                   IF        X = 1
     C                   EXSR      SR01
     C                   ELSEIF    X = 1                                       Noncompliant
     C                   EXSR      SR02
     C                   ENDIF
----

----
/free
     IF param = 1;
        doX();
     ELSEIF param = 2;
        doY();
     ELSEIF param = 1; // Noncompliant
        doZ();
     ENDIF;

     SELECT;
       WHEN param = 1;
         doX();
       WHEN param = 2;
         doY();
       WHEN param = 1; // Noncompliant
         doZ();
     ENDSL;
/end-free
----

== Compliant Solution

----
     C                   IF        X = 1
     C                   EXSR      SR01
     C                   ELSEIF    X = 2
     C                   EXSR      SR02
     C                   ENDIF
----

----
/free
     IF param = 1;
        doX();
     ELSEIF param = 2;
        doY();
     ELSEIF param = 3;
        doZ();
     ENDIF;

     SELECT;
       WHEN param = 1;
         doX();
       WHEN param = 2;
         doY();
       WHEN param = 3; 
         doZ();
     ENDSL;
/end-free
----

include::../see.adoc[]
