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)