diff --git a/webrtc/base/httpbase.cc b/webrtc/base/httpbase.cc index 5de2b79d77..7649c42a01 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 @@ bool HttpBase::DoReceiveLoop(HttpError* error) { // 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 fe34f7c9b4..0c4919f685 100644 --- a/webrtc/base/httpclient.cc +++ b/webrtc/base/httpclient.cc @@ -540,6 +540,7 @@ bool HttpClient::CheckCache() { 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 40c017fb48..7152eda5c6 100644 --- a/webrtc/base/nssstreamadapter.cc +++ b/webrtc/base/nssstreamadapter.cc @@ -569,7 +569,7 @@ int NSSStreamAdapter::ContinueSSL() { 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 ffadbbf78e..4fe255a0a7 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 035275feaf..221cbdeaf5 100644 --- a/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc +++ b/webrtc/libjingle/xmpp/xmpplogintask_unittest.cc @@ -92,6 +92,7 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->StanzaActivity()); if (endstage == XLTT_STAGE_CONNECT) return; + FALLTHROUGH(); } case XLTT_STAGE_STREAMSTART: { @@ -104,6 +105,7 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->OutputActivity()); if (endstage == XLTT_STAGE_STREAMSTART) return; + FALLTHROUGH(); } case XLTT_STAGE_TLS_FEATURES: { @@ -117,6 +119,7 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->SessionActivity()); if (endstage == XLTT_STAGE_TLS_FEATURES) return; + FALLTHROUGH(); } case XLTT_STAGE_TLS_PROCEED: { @@ -128,8 +131,9 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, "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 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->OutputActivity()); if (endstage == XLTT_STAGE_ENCRYPTED_START) return; + FALLTHROUGH(); } case XLTT_STAGE_AUTH_FEATURES: { @@ -161,8 +166,9 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, 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 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, "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 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->OutputActivity()); if (endstage == XLTT_STAGE_AUTHENTICATED_START) return; + FALLTHROUGH(); } case XLTT_STAGE_BIND_FEATURES: { @@ -202,6 +210,7 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->SessionActivity()); if (endstage == XLTT_STAGE_BIND_FEATURES) return; + FALLTHROUGH(); } case XLTT_STAGE_BIND_SUCCESS: { @@ -216,6 +225,7 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, EXPECT_EQ("", handler_->SessionActivity()); if (endstage == XLTT_STAGE_BIND_SUCCESS) return; + FALLTHROUGH(); } case XLTT_STAGE_SESSION_SUCCESS: { @@ -227,7 +237,10 @@ void XmppLoginTaskTest::RunPartialLogin(XlttStage startstage, 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 a6b3091751..1899abb851 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 +#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 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) { 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 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) { 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 4060a02120..4dd8a6afcb 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc @@ -764,6 +764,7 @@ int NetEqImpl::GetAudioInternal(size_t max_length, int16_t* output, 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 1809324bd3..11d5a20dd6 100644 --- a/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc +++ b/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc @@ -56,6 +56,7 @@ uint32_t TimestampScaler::ToInternal(uint32_t external_timestamp, // 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 49ceca51e6..3599873f3e 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 @@ int32_t FuncTestManager::DoTest(const TestType testType) TestSpeakerVolume(); TestMicrophoneVolume(); TestLoopback(); + FALLTHROUGH(); case TTAudioLayerSelection: TestAudioLayerSelection(); break; @@ -702,6 +703,7 @@ int32_t FuncTestManager::DoTest(const TestType testType) 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 a92a87afc0..da6008ba3d 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 @@ int DefaultTemporalLayers::EncodeFlags(uint32_t timestamp) { 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 @@ int DefaultTemporalLayers::EncodeFlags(uint32_t timestamp) { 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 @@ int DefaultTemporalLayers::EncodeFlags(uint32_t timestamp) { 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 14f33ff332..5a40ac7ad5 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 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, 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 5d87553eed..f4533da20a 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 @@ int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) { case kKeyOnLoss: { request_key_frame = true; ret = VCM_OK; + break; } default: break; diff --git a/webrtc/typedefs.h b/webrtc/typedefs.h index 669451626b..51d89927f7 100644 --- a/webrtc/typedefs.h +++ b/webrtc/typedefs.h @@ -120,6 +120,16 @@ typedef unsigned __int64 uint64_t; #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)