diff --git a/src/librustdoc/html/escape.rs b/src/librustdoc/html/escape.rs
index 691f86847b5..31a2701f06a 100644
--- a/src/librustdoc/html/escape.rs
+++ b/src/librustdoc/html/escape.rs
@@ -108,7 +108,17 @@ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|| pk.map_or(true, |(_, t)| t.chars().any(|c| c.is_uppercase()));
let next_is_underscore = || pk.map_or(true, |(_, t)| t.contains('_'));
let next_is_colon = || pk.map_or(true, |(_, t)| t.contains(':'));
- if i - last > 3 && is_uppercase() && !next_is_uppercase() {
+ // Check for CamelCase.
+ //
+ // `i - last > 3` avoids turning FmRadio into FmRadio, which is technically
+ // correct, but needlessly bloated.
+ //
+ // is_uppercase && !next_is_uppercase checks for camelCase. HTTPSProxy,
+ // for example, should become HTTPSProxy.
+ //
+ // !next_is_underscore avoids turning TEST_RUN into TEST_RUN, which is also
+ // needlessly bloated.
+ if i - last > 3 && is_uppercase() && !next_is_uppercase() && !next_is_underscore() {
EscapeBodyText(&text[last..i]).fmt(fmt)?;
fmt.write_str("")?;
last = i;
diff --git a/src/librustdoc/html/escape/tests.rs b/src/librustdoc/html/escape/tests.rs
index a09649e9e18..de702e16063 100644
--- a/src/librustdoc/html/escape/tests.rs
+++ b/src/librustdoc/html/escape/tests.rs
@@ -24,6 +24,10 @@ fn escape_body_text_with_wbr() {
assert_eq!(&E("first:second").to_string(), "first:second");
assert_eq!(&E("first::second").to_string(), "first::second");
assert_eq!(&E("MY_CONSTANT").to_string(), "MY_CONSTANT");
+ assert_eq!(
+ &E("_SIDD_MASKED_NEGATIVE_POLARITY").to_string(),
+ "_SIDD_MASKED_NEGATIVE_POLARITY"
+ );
// a string won't get wrapped if it's less than 8 bytes
assert_eq!(&E("HashSet").to_string(), "HashSet");
// an individual word won't get wrapped if it's less than 4 bytes