[clang] eefc3d2 - [clang][diagnostics] Fix fix-it hint parenthesis placement for fold expressions (#151790)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 2 01:53:09 PDT 2025
Author: Iris Shi
Date: 2025-08-02T16:53:06+08:00
New Revision: eefc3d275f1e089cb400e697659c55d3ae05006d
URL: https://github.com/llvm/llvm-project/commit/eefc3d275f1e089cb400e697659c55d3ae05006d
DIFF: https://github.com/llvm/llvm-project/commit/eefc3d275f1e089cb400e697659c55d3ae05006d.diff
LOG: [clang][diagnostics] Fix fix-it hint parenthesis placement for fold expressions (#151790)
- Closes #151787
Insert the right parenthesis one token later to correctly enclose the
expression.
---------
Co-authored-by: Corentin Jabot <corentinjabot at gmail.com>
Added:
clang/test/FixIt/fixit-c++17.cpp
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaTemplateVariadic.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 247d784739f4d..0bd4857077879 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -123,6 +123,8 @@ Improvements to Clang's diagnostics
Moved the warning for a missing (though implied) attribute on a redeclaration into this group.
Added a new warning in this group for the case where the attribute is missing/implicit on
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)
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index 572dbf2e7393f..b0a673d2f270b 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -1387,7 +1387,8 @@ static void CheckFoldOperand(Sema &S, Expr *E) {
S.Diag(E->getExprLoc(), diag::err_fold_expression_bad_operand)
<< E->getSourceRange()
<< FixItHint::CreateInsertion(E->getBeginLoc(), "(")
- << FixItHint::CreateInsertion(E->getEndLoc(), ")");
+ << FixItHint::CreateInsertion(S.getLocForEndOfToken(E->getEndLoc()),
+ ")");
}
}
diff --git a/clang/test/FixIt/fixit-c++17.cpp b/clang/test/FixIt/fixit-c++17.cpp
new file mode 100644
index 0000000000000..26c3bb94d8f7d
--- /dev/null
+++ b/clang/test/FixIt/fixit-c++17.cpp
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -verify -std=c++17 -pedantic-errors %s
+// RUN: cp %s %t
+// RUN: not %clang_cc1 -x c++ -std=c++17 -fixit %t
+// RUN: %clang_cc1 -Wall -pedantic-errors -x c++ -std=c++17 %t
+
+/* This is a test of the various code modification hints that only
+ apply in C++17. */
+template<int... args>
+int foo() {
+ int a = (args + 1 + ...); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:22-[[@LINE-2]]:22}:")"
+ int b = (args + 123 + ...); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:24-[[@LINE-2]]:24}:")"
+ int c = (args + 1 + 2 + ...); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:26-[[@LINE-2]]:26}:")"
+ int e = (... + 1 + args); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:20-[[@LINE-1]]:20}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:28-[[@LINE-2]]:28}:")"
+ int f = (1 + ... + args + 1); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:24-[[@LINE-1]]:24}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:32-[[@LINE-2]]:32}:")"
+ int g = (args + 1 + ... + 1); // expected-error {{expression not permitted as operand of fold expression}}
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"("
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:22-[[@LINE-2]]:22}:")"
+ return a + b + c + e + f + g;
+}
More information about the cfe-commits
mailing list