Rule. When deprecating or replacing public API constructors, methods, functions, enum values, type aliases, or header transition shims in C++ headers, do not annotate legacy declarations with raw [[deprecated]] or ABSL_DEPRECATED while downstream consumers (such as Chromium) still invoke or reference them under -Werror, and do not add #pragma clang diagnostic ignored "-Wdeprecated-declarations" suppression blocks around header delegating fallbacks.
Instead:
// TODO(bugs.webrtc.org/12345): Deprecated in favor of ...).ABSL_DEPRECATE_AND_INLINE() for inline functions, signature modernizations (such as migrating raw pointer and length pairs to ArrayView or span), and type aliases (using Foo ABSL_DEPRECATE_AND_INLINE() = Bar;). When doing so, include "absl/base/macros.h" and add //third_party/abseil-cpp/absl/base:core_headers to BUILD.gn deps.Why. Downstream consumers such as Chromium compile against WebRTC public headers with compiler warnings treated as errors (-Werror). Marking active public symbols, methods, enum values, type aliases, or header transition shims with raw [[deprecated]] or ABSL_DEPRECATED triggers immediate compilation failures (-Wdeprecated-declarations) upon dependency rolls before downstream callers migrate, or introduces unsightly compiler pragma suppression blocks into public headers. Retaining unannotated shims with tracking TODOs or using ABSL_DEPRECATE_AND_INLINE() (which is patched in Chromium and WebRTC not to emit [[deprecated]]) enables clean, safe, multi-step migrations without breaking downstream builds.
Bad:
// Bad: Raw [[deprecated]] breaks downstream -Werror builds: [[deprecated("Use Timestamp overload instead")]] RTCStats(std::string id, int64_t timestamp_us); // Bad: Adding deprecation attributes and #pragma suppressions to header shims: ABSL_DEPRECATED("Use SendPacketWithStatus instead") virtual void SendPacket(rtc::ArrayView<const uint8_t> data) {} virtual SendPacketStatus SendPacketWithStatus(rtc::ArrayView<const uint8_t> data) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" SendPacket(data); #pragma clang diagnostic pop return SendPacketStatus::kSuccess; } // Bad: Modernizing signature without preserving legacy delegating wrapper: std::vector<uint8_t> ParseRbsp(rtc::ArrayView<const uint8_t> data);
Good:
// Good: Retain unannotated delegating shim with tracking TODO: // TODO(webrtc:12345): Remove once downstream consumers migrate. RTCStats(std::string id, int64_t timestamp_us) : RTCStats(std::move(id), Timestamp::Micros(timestamp_us)) {} // Good: Document deprecation in TODO comment without compiler attributes or #pragma: // TODO(bugs.webrtc.org/12345): Deprecated in favor of SendPacketWithStatus. virtual void SendPacket(rtc::ArrayView<const uint8_t> data) {} virtual SendPacketStatus SendPacketWithStatus(rtc::ArrayView<const uint8_t> data) { SendPacket(data); return SendPacketStatus::kSuccess; } // Good: Use ABSL_DEPRECATE_AND_INLINE wrapper forwarding to modernized signature: #include "absl/base/macros.h" std::vector<uint8_t> ParseRbsp(rtc::ArrayView<const uint8_t> data); ABSL_DEPRECATE_AND_INLINE() inline std::vector<uint8_t> ParseRbsp(const uint8_t* data, size_t length) { return ParseRbsp(rtc::MakeArrayView(data, length)); }