Enable Clang warning implicit-fallthrough and annotate the code.

BUG=4242
R=henrik.lundin@webrtc.org, stefan@webrtc.org, tommi@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/34899004

Cr-Commit-Position: refs/heads/master@{#8187}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8187 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/base/httpbase.cc b/webrtc/base/httpbase.cc
index 5de2b79..7649c42 100644
--- a/webrtc/base/httpbase.cc
+++ b/webrtc/base/httpbase.cc
@@ -11,9 +11,9 @@
 
 #if defined(WEBRTC_WIN)
 #include "webrtc/base/win32.h"
-#else  // !WEBRTC_WIN 
+#else  // !WEBRTC_WIN
 #define SEC_E_CERT_EXPIRED (-2146893016)
-#endif  // !WEBRTC_WIN 
+#endif  // !WEBRTC_WIN
 
 #include "webrtc/base/common.h"
 #include "webrtc/base/httpbase.h"
@@ -528,8 +528,9 @@
         // Attempt to process the data already in our buffer.
         break;
       case SR_EOS:
-        // Clean close, with no error.  Fall through to HandleStreamClose.
+        // Clean close, with no error.
         read_error = 0;
+        FALLTHROUGH();  // Fall through to HandleStreamClose.
       case SR_ERROR:
         *error = HandleStreamClose(read_error);
         return true;
diff --git a/webrtc/base/httpclient.cc b/webrtc/base/httpclient.cc
index fe34f7c..0c4919f 100644
--- a/webrtc/base/httpclient.cc
+++ b/webrtc/base/httpclient.cc
@@ -540,6 +540,7 @@
         return false;
       }
       // Couldn't validate, fall through.
+      FALLTHROUGH();
     case HCS_NONE:
       // Cache content is not useable.  Issue a regular request.
       response().clear(false);
diff --git a/webrtc/base/nssstreamadapter.cc b/webrtc/base/nssstreamadapter.cc
index 40c017f..7152eda 100644
--- a/webrtc/base/nssstreamadapter.cc
+++ b/webrtc/base/nssstreamadapter.cc
@@ -569,7 +569,7 @@
         return -1;
       } else {
         LOG(LS_INFO) << "Malformed DTLS message. Ignoring.";
-        // Fall through
+        FALLTHROUGH();  // Fall through
       }
     case PR_WOULD_BLOCK_ERROR:
       LOG(LS_INFO) << "Would have blocked";
diff --git a/webrtc/build/common.gypi b/webrtc/build/common.gypi
index ffadbbf..4fe255a 100644
--- a/webrtc/build/common.gypi
+++ b/webrtc/build/common.gypi
@@ -244,6 +244,7 @@
           }],
           ['clang==1', {
             'cflags': [
+              '-Wimplicit-fallthrough',
               '-Wthread-safety',
             ],
           }],
diff --git a/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc b/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc
index 035275f..221cbde 100644
--- a/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc
+++ b/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc
@@ -92,6 +92,7 @@
       EXPECT_EQ("", handler_->StanzaActivity());
       if (endstage == XLTT_STAGE_CONNECT)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_STREAMSTART: {
@@ -104,6 +105,7 @@
       EXPECT_EQ("", handler_->OutputActivity());
       if (endstage == XLTT_STAGE_STREAMSTART)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_TLS_FEATURES: {
@@ -117,6 +119,7 @@
       EXPECT_EQ("", handler_->SessionActivity());
       if (endstage == XLTT_STAGE_TLS_FEATURES)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_TLS_PROCEED: {
@@ -128,8 +131,9 @@
           "xmlns=\"jabber:client\">\r\n", handler_->OutputActivity());
       EXPECT_EQ("", handler_->StanzaActivity());
       EXPECT_EQ("", handler_->SessionActivity());
-       if (endstage == XLTT_STAGE_TLS_PROCEED)
+      if (endstage == XLTT_STAGE_TLS_PROCEED)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_ENCRYPTED_START: {
@@ -142,6 +146,7 @@
       EXPECT_EQ("", handler_->OutputActivity());
       if (endstage == XLTT_STAGE_ENCRYPTED_START)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_AUTH_FEATURES: {
@@ -161,8 +166,9 @@
           handler_->OutputActivity());
       EXPECT_EQ("", handler_->StanzaActivity());
       EXPECT_EQ("", handler_->SessionActivity());
-       if (endstage == XLTT_STAGE_AUTH_FEATURES)
+      if (endstage == XLTT_STAGE_AUTH_FEATURES)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_AUTH_SUCCESS: {
@@ -173,8 +179,9 @@
           "xmlns=\"jabber:client\">\r\n", handler_->OutputActivity());
       EXPECT_EQ("", handler_->StanzaActivity());
       EXPECT_EQ("", handler_->SessionActivity());
-       if (endstage == XLTT_STAGE_AUTH_SUCCESS)
+      if (endstage == XLTT_STAGE_AUTH_SUCCESS)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_AUTHENTICATED_START: {
@@ -187,6 +194,7 @@
       EXPECT_EQ("", handler_->OutputActivity());
       if (endstage == XLTT_STAGE_AUTHENTICATED_START)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_BIND_FEATURES: {
@@ -202,6 +210,7 @@
       EXPECT_EQ("", handler_->SessionActivity());
       if (endstage == XLTT_STAGE_BIND_FEATURES)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_BIND_SUCCESS: {
@@ -216,6 +225,7 @@
       EXPECT_EQ("", handler_->SessionActivity());
       if (endstage == XLTT_STAGE_BIND_SUCCESS)
         return;
+      FALLTHROUGH();
     }
 
     case XLTT_STAGE_SESSION_SUCCESS: {
@@ -227,7 +237,10 @@
       EXPECT_EQ("", handler_->StanzaActivity());
       if (endstage == XLTT_STAGE_SESSION_SUCCESS)
         return;
+      FALLTHROUGH();
     }
+    default:
+      break;
   }
 }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
index a6b3091..1899abb 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
@@ -19,6 +19,7 @@
 
 #include <assert.h>
 
+#include "webrtc/base/checks.h"
 #include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h"
 #include "webrtc/system_wrappers/interface/trace.h"
 
@@ -626,9 +627,10 @@
           default: {
             return NULL;
           }
-          return new ACMG722_1(codec_id);
         }
+        return new ACMG722_1(codec_id);
 #endif
+        FALLTHROUGH();
       }
       case 32000: {
 #ifdef WEBRTC_CODEC_G722_1C
@@ -649,10 +651,13 @@
           default: {
             return NULL;
           }
-          return new ACMG722_1C(codec_id);
         }
+        return new ACMG722_1C(codec_id);
 #endif
+        FALLTHROUGH();
       }
+      default:
+        FATAL();
     }
   } else if (!STR_CASE_CMP(codec_inst.plname, "CN")) {
     // For CN we need to check sampling frequency to know what codec to create.
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
index 4060a02..4dd8a6a 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
@@ -764,6 +764,7 @@
       sync_buffer_->IncreaseEndTimestamp(output_size_samples_);
       // Skipping break on purpose. Execution should move on into the
       // next case.
+      FALLTHROUGH();
     }
     case kAudioRepetition: {
       // TODO(hlundin): Write test for this.
diff --git a/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc b/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
index 1809324..11d5a20 100644
--- a/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
+++ b/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
@@ -56,6 +56,7 @@
       // full 48 kHz support.
       numerator_ = 2;
       denominator_ = 3;
+      break;
     }
     case kDecoderAVT:
     case kDecoderCNGnb:
diff --git a/webrtc/modules/audio_device/test/func_test_manager.cc b/webrtc/modules/audio_device/test/func_test_manager.cc
index 49ceca5..3599873 100644
--- a/webrtc/modules/audio_device/test/func_test_manager.cc
+++ b/webrtc/modules/audio_device/test/func_test_manager.cc
@@ -664,6 +664,7 @@
             TestSpeakerVolume();
             TestMicrophoneVolume();
             TestLoopback();
+            FALLTHROUGH();
         case TTAudioLayerSelection:
             TestAudioLayerSelection();
             break;
@@ -702,6 +703,7 @@
             break;
         case TTMobileAPI:
             TestAdvancedMBAPI();
+            FALLTHROUGH();
         case TTTest:
             TestExtra();
             break;
diff --git a/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
index a92a87a..da6008b 100644
--- a/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
+++ b/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
@@ -183,6 +183,7 @@
     case kTemporalUpdateGoldenWithoutDependency:
       flags |= VP8_EFLAG_NO_REF_GF;
       // Deliberately no break here.
+      FALLTHROUGH();
     case kTemporalUpdateGolden:
       flags |= VP8_EFLAG_NO_REF_ARF;
       flags |= VP8_EFLAG_NO_UPD_ARF;
@@ -192,6 +193,7 @@
       flags |= VP8_EFLAG_NO_REF_ARF;
       flags |= VP8_EFLAG_NO_REF_GF;
       // Deliberately no break here.
+      FALLTHROUGH();
     case kTemporalUpdateAltref:
       flags |= VP8_EFLAG_NO_UPD_GF;
       flags |= VP8_EFLAG_NO_UPD_LAST;
@@ -199,6 +201,7 @@
     case kTemporalUpdateNoneNoRefAltref:
       flags |= VP8_EFLAG_NO_REF_ARF;
       // Deliberately no break here.
+      FALLTHROUGH();
     case kTemporalUpdateNone:
       flags |= VP8_EFLAG_NO_UPD_GF;
       flags |= VP8_EFLAG_NO_UPD_ARF;
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
index 14f33ff..5a40ac7 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
@@ -674,6 +674,7 @@
           frame_event_->Set();
         }
       }
+      FALLTHROUGH();
     }
     // Note: There is no break here - continuing to kDecodableSession.
     case kDecodableSession: {
diff --git a/webrtc/modules/video_coding/main/source/video_receiver.cc b/webrtc/modules/video_coding/main/source/video_receiver.cc
index 5d87553..f4533da 100644
--- a/webrtc/modules/video_coding/main/source/video_receiver.cc
+++ b/webrtc/modules/video_coding/main/source/video_receiver.cc
@@ -467,6 +467,7 @@
       case kKeyOnLoss: {
         request_key_frame = true;
         ret = VCM_OK;
+        break;
       }
       default:
         break;
diff --git a/webrtc/typedefs.h b/webrtc/typedefs.h
index 6694516..51d8992 100644
--- a/webrtc/typedefs.h
+++ b/webrtc/typedefs.h
@@ -120,6 +120,16 @@
 #endif
 #endif
 
+// Macro to be used for switch-case fallthrough (required for enabling
+// -Wimplicit-fallthrough warning on Clang).
+#ifndef FALLTHROUGH
+#if defined(__clang__)
+#define FALLTHROUGH() [[clang::fallthrough]]
+#else
+#define FALLTHROUGH() do { } while (0)
+#endif
+#endif
+
 // Annotate a function that will not return control flow to the caller.
 #if defined(_MSC_VER)
 #define NO_RETURN __declspec(noreturn)