https://github.com/a-tarasyuk created https://github.com/llvm/llvm-project/pull/154369
Reverts llvm/llvm-project#154018 >From 68f6b7663bee98487f3a854c4bd386e098fef38c Mon Sep 17 00:00:00 2001 From: "Oleksandr T." <oleksandr.taras...@outlook.com> Date: Tue, 19 Aug 2025 19:02:07 +0300 Subject: [PATCH] =?UTF-8?q?Revert=20"[Clang]=20improve=20-Wstring-concaten?= =?UTF-8?q?ation=20to=20warn=20on=20every=20missing=20comma=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c2eb895c200220c8a870b046c5b05957131b40e2. --- clang/docs/ReleaseNotes.rst | 2 -- clang/lib/Sema/SemaDecl.cpp | 43 +++++++++++++++------------------ clang/test/Sema/string-concat.c | 28 --------------------- 3 files changed, 19 insertions(+), 54 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8f80b4cd49bd7..8ee1586e72e01 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -184,8 +184,6 @@ Improvements to Clang's diagnostics an override of a virtual method. - Fixed fix-it hint for fold expressions. Clang now correctly places the suggested right parenthesis when diagnosing malformed fold expressions. (#GH151787) -- ``-Wstring-concatenation`` now diagnoses every missing comma in an initializer list, - rather than stopping after the first. (#GH153745) - Fixed an issue where emitted format-signedness diagnostics were not associated with an appropriate diagnostic id. Besides being incorrect from an API standpoint, this was user visible, e.g.: diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 5e62c0cf01510..b37a3ffe24f72 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -14708,14 +14708,7 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { isa<InitListExpr>(var->getInit())) { const auto *ILE = cast<InitListExpr>(var->getInit()); unsigned NumInits = ILE->getNumInits(); - if (NumInits > 2) { - auto concatenatedPartsAt = [&](unsigned Index) -> unsigned { - if (const Expr *E = ILE->getInit(Index)) - if (const auto *S = dyn_cast<StringLiteral>(E->IgnoreImpCasts())) - return S->getNumConcatenated(); - return 0; - }; - + if (NumInits > 2) for (unsigned I = 0; I < NumInits; ++I) { const auto *Init = ILE->getInit(I); if (!Init) @@ -14728,23 +14721,24 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { // Diagnose missing comma in string array initialization. // Do not warn when all the elements in the initializer are concatenated // together. Do not warn for macros too. - if (NumConcat == 2) { - if (SL->getBeginLoc().isMacroID()) - continue; - - unsigned L = I > 0 ? concatenatedPartsAt(I - 1) : 0; - unsigned R = I + 1 < NumInits ? concatenatedPartsAt(I + 1) : 0; - - // Skip neighbors with multi-part concatenations. - if (R > 1) - continue; + if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) { + bool OnlyOneMissingComma = true; + for (unsigned J = I + 1; J < NumInits; ++J) { + const auto *Init = ILE->getInit(J); + if (!Init) + break; + const auto *SLJ = dyn_cast<StringLiteral>(Init->IgnoreImpCasts()); + if (!SLJ || SLJ->getNumConcatenated() > 1) { + OnlyOneMissingComma = false; + break; + } + } - // Diagnose when at least one neighbor is a single literal. - if (R == 1 || L == 1) { + if (OnlyOneMissingComma) { SmallVector<FixItHint, 1> Hints; - // Insert a comma between the two tokens of this element. - Hints.push_back(FixItHint::CreateInsertion( - PP.getLocForEndOfToken(SL->getStrTokenLoc(0)), ", ")); + for (unsigned i = 0; i < NumConcat - 1; ++i) + Hints.push_back(FixItHint::CreateInsertion( + PP.getLocForEndOfToken(SL->getStrTokenLoc(i)), ",")); Diag(SL->getStrTokenLoc(1), diag::warn_concatenated_literal_array_init) @@ -14752,9 +14746,10 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { Diag(SL->getBeginLoc(), diag::note_concatenated_string_literal_silence); } + // In any case, stop now. + break; } } - } } diff --git a/clang/test/Sema/string-concat.c b/clang/test/Sema/string-concat.c index 4b52a74116b49..63abf100c020f 100644 --- a/clang/test/Sema/string-concat.c +++ b/clang/test/Sema/string-concat.c @@ -168,31 +168,3 @@ const char *extra_parens_to_suppress_warning[] = { "promise"), "shared_future" }; - -const char *multiple_missing_commas1[] = { - "1", - "2" // expected-note {{place parentheses around the string literal to silence warning}} - "3", // expected-warning {{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} - "4", - "5", - "6" // expected-note {{place parentheses around the string literal to silence warning}} - "7", // expected-warning {{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} - "8", - "9", - "10", - "11", -}; - -const char *multiple_missing_commas2[] = { - "1", - "2" - "3" - "4" - "5", - "6" // expected-note {{place parentheses around the string literal to silence warning}} - "7", // expected-warning {{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} - "8", - "9", - "10", - "11", -}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits